본문 바로가기
SpringBoot

[SpringBoot] 스프링DB 마이그레이션

by 띵앤띵 2023. 3. 7.
728x90
반응형

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 클래스의 필드 타입도 변경해주어야 합니다.

  1. 날짜 타입 변경 Date → Timestamp 로 변경MySQL과 Oracle은 데이터 타입이 다르기 때문에 Entity 클래스에서 사용하는 데이터 타입도 변경해주어야 합니다. 이는 @Column 어노테이션의 columnDefinition 속성을 이용하여 변경할 수 있습니다. 예를 들어, MySQL에서는 DATETIME 타입을 사용하지만 Oracle에서는 TIMESTAMP 타입을 사용합니다.이 경우, Entity 클래스의 필드를 java.util.Date에서 java.sql.Timestamp로 변경하고, @Column 어노테이션에 columnDefinition = "TIMESTAMP"를 추가해주면 됩니다.
  2. @Column(name = "created_at", **columnDefinition = "TIMESTAMP"**) private Timestamp createdAt;
  3. 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 데이터베이스로 변경하는 방법에 대해 설명했습니다. 위의 과정을 차례대로 따라가면 간단하게 데이터베이스 변경이 가능합니다.

 

반응형

댓글