DB 마이그레이션 MySQL to ORACLE
1. 개요
이 문서는 Spring Boot 애플리케이션에서 MySQL 데이터베이스를 Oracle 데이터베이스로 변경하는 방법에 대해 설명합니다.
로컬 셋팅 테스트를 위해 Oracle11g XE 버전으로 설치하였음
- 윈도우, 리눅스, MacOS(intel)
# docker 이미지 다운로드
docker pull wnameless/oracle-xe-11g-r2
# docker 컨테이너 실행
docker run --name oracle-xe-11g-r2 -d -p 49161:1521 wnameless/oracle-xe-11g-r2
- MacOS(M1, M2칩) :
여기서 삽질 반나절..
# 아래의 블로그를 참조해서 colima 설치 후 docker 로 oracle 실행 필요
https://shanepark.tistory.com/400
# colima 설치
brew install colima
# docker context 확인
docker context list
# colima 정지
colima stop
# colima 시작
colima start
- 오라클 테이블스페이스 관리
# 참고 : 오라클 테이블스페이스 생성 및 관리
https://roxxy.tistory.com/entry/Oracle-Tablespace-%EC%83%9D%EC%84%B1-User-%EC%83%9D%EC%84%B1-%EB%B0%A9%EB%B2%95
2. Oracle 드라이버 의존성 추가
Oracle 데이터베이스를 사용하기 위해서는 먼저 해당 데이터베이스에 접근하기 위한 드라이버를 추가해야 합니다. build.gradle 파일에 다음 의존성을 추가합니다:
implementation group: 'com.oracle.ojdbc', name: 'ojdbc8', version: '19.3.0.0'
3. application.properties 수정
데이터베이스 연결 정보를 설정하기 위해 application.properties 파일을 수정합니다. MySQL에서 Oracle로 변경하기 위해서는 다음과 같은 설정이 필요합니다:
# MySQL 설정
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/{MySQL DB 이름}
spring.datasource.username={MySQL 사용자 이름}
spring.datasource.password={MySQL 사용자 비밀번호}
# Oracle 설정
spring.datasource.url=jdbc:oracle:thin:@localhost:1521:XE
spring.datasource.username=system
spring.datasource.password=pass
spring.jpa.database-platform=org.hibernate.dialect.Oracle10gDialect
spring.jpa.show-sql=true
spring.jpa.hibernate.ddl-auto=update
4. Entity 클래스 수정
MySQL과 Oracle은 데이터 타입이 다르기 때문에 해당 데이터베이스에서 사용하는 Entity 클래스의 필드 타입도 변경해주어야 합니다.
- 날짜 타입 변경 Date → Timestamp 로 변경MySQL과 Oracle은 데이터 타입이 다르기 때문에 Entity 클래스에서 사용하는 데이터 타입도 변경해주어야 합니다. 이는 @Column 어노테이션의 columnDefinition 속성을 이용하여 변경할 수 있습니다. 예를 들어, MySQL에서는 DATETIME 타입을 사용하지만 Oracle에서는 TIMESTAMP 타입을 사용합니다.이 경우, Entity 클래스의 필드를 java.util.Date에서 java.sql.Timestamp로 변경하고, @Column 어노테이션에 columnDefinition = "TIMESTAMP"를 추가해주면 됩니다.
@Column(name = "created_at", **columnDefinition = "TIMESTAMP"**) private Timestamp createdAt;
- DB별 PK전략이 상이함
# mysql
@GeneratedValue(strategy = GenerationType.IDENTITY)
# oracle
@GeneratedValue(strategy = GenerationType.AUTO)
참고 : https://gmlwjd9405.github.io/2019/08/12/primary-key-mapping.html
3. DB별 테이블 컬럼명으로 사용할 수 없는 컬럼명칭이 상이함
# 'name'과 'size' .. 와 같은 컬럼명을 사용할 수 없다.
# 변경 전
@Column(name = "name", nullable = false)
private String name;
@Column(name = "size", nullable = false)
private Long size;
# 변경 후
@Column(name = "file_name", nullable = false)
private String name;
@Column(name = "file_size", nullable = false)
private Long size;
5. Repository 인터페이스에서의 쿼리 수정
MySQL과 Oracle은 쿼리 문법이 다르기 때문에 Repository 인터페이스에서 사용하는 쿼리도 변경해주어야 합니다. 이는 @Query 어노테이션을 이용하여 변경할 수 있습니다.
예를 들어, MySQL에서는 LIMIT을 사용하지만 Oracle에서는 ROWNUM을 사용합니다. 이 경우, Repository 인터페이스에서 다음과 같이 쿼리를 변경해주면 됩니다.
@Query(value = "SELECT * FROM table_name WHERE ROWNUM <= ?1", nativeQuery = true)
List<Entity> findTopN(int n);
6. QueryDSL에서의 데이터 타입 변경
예를 들어, MySQL에서는 DATETIME 타입을 사용하지만 Oracle에서는 TIMESTAMP 타입을 사용합니다. 이 경우, QueryDSL의 필드를 java.util.Date에서 java.sql.Timestamp로 변경해주면 됩니다.
QEntity entity = QEntity.entity;
**Date date = new Date();
Timestamp timestamp = new Timestamp(date.getTime());**
JPAQueryFactory queryFactory = new JPAQueryFactory(entityManager);
queryFactory
.selectFrom(entity)
.where(entity.createdAt.eq(**timestamp**))
.fetch();
7. 결론
이 문서에서는 Spring Boot 애플리케이션에서 MySQL 데이터베이스를 Oracle 데이터베이스로 변경하는 방법에 대해 설명했습니다. 위의 과정을 차례대로 따라가면 간단하게 데이터베이스 변경이 가능합니다.
'SpringBoot' 카테고리의 다른 글
[SpringBoot] Springboot tar 파일 생성 (0) | 2023.03.09 |
---|---|
[JSON]JAVA에서 JSON 파싱하는 방법 (0) | 2023.03.02 |
[Lombok] Using Lombok UtilityClass (0) | 2023.03.02 |
[SpringBoot] CIDR 주소체계 계산을 도와주는 SubnetUtils (0) | 2023.01.19 |
[Pinpoint] Pinpoint APM 적용하기 (0) | 2022.08.24 |
댓글