구현한 프로젝트를 AWS를 통해 배포할 예정이기 때문에 DB 구성을 Oracle에서 MySQL로 변경했습니다.
배포 작업을 할 때 AWS RDS를 통해 DB 정보도 함께 가져와야 하는데 Oracle은 프리티어를 제공하지 않습니다. 예전에는 프리티어를 제공했지만 더 이상 제공하지 않습니다. 그래서 구글에 돌아다니는 Oracle 프리티어를 사용한 AWS RDS 포스트는 그림의 떡이 되었습니다. 그래서 이클립스에서 Docker Image를 생성해서 Docker Hub를 통해 AWS 인스턴스로 가져오는 방식으로 배포하려고 했으나 이클립스에서 Docker Image 생성하는 방법을 아직 잘 모르겠습니다. Docker Hub에서 Image를 생성하는 방법도 있지만 사용료를 지불해야 합니다. 그래서 카드 번호를 입력하고 결제 버튼을 눌렀지만, 무슨 일인지 결제가 되지 않더군요. 그렇다면 남은 방법은? 네, MySQL로 넘어가는 방법입니다.
먼저 이동할 Oracle DB의 테이블 정보를 가져와야 합니다. Oralce SQL Developer에서 데이터베이스 익스포트로 이동합니다.
옮길 테이블 정보를 가지고 있는 사용자를 선택합니다.
DDL 익스포트를 체크합니다. 아마 자동으로 체크되어 있을 것입니다.
기본적으로 DDL 익스포트에서 BYTE 키워드 추가, 권한 부여, 분할 등등 이것저것 체크되어 있습니다. 체크되어 있는 상태로 익스포트 작업을 하고 MySQL에 이식하면 오류가 발생할 수 있기 때문에 체크를 모두 해제합니다.
그리고 파일 탭에서 찾아보기를 누른 후 익스포트 파일인 .sql 파일이 저장될 위치를 지정합니다.
다음을 누르면 익스포트할 유형을 선택하는 화면으로 이동합니다.
이것저것 많이 체크되어 있지만 저는 테이블 하나만 체크했습니다. 테이블만 가져가서 MySQL 방식으로 구성하는 것이 경제적인 방법이라고 판단했기 때문입니다.
객체 지정입니다. '조회'를 누르면 테이블이 출력되는데, 익스포트 할 테이블을 오른쪽으로 옮기면 됩니다.
이곳에서 별다른 작업을 하지 않고 바로 넘어갔습니다. 익스포트 요약도 확인 후 넘어갔습니다.
완료를 누르면 이렇게 익스포트 결과가 출력됩니다.
익스포트 결과를 복사합니다. 그리고 아래 사이트로 이동합니다.
이 사이트는 DB 끼리의 Converting 작업을 버튼 하나로 할 수 있도록 도와줍니다. 저도 언젠가 이렇게 사소하지만, 있다면 정말 반가운 서비스를 만들고 싶습니다.
변경하면 이렇게 됩니다. 변경된 오른쪽의 MySQL 쿼리문을 가지고 WorkBench로 이동해서 테이블을 삽입하면 됩니다.
만약 MySQL이 설치되지 않았다면 MySQL을 설치합니다.
설치 후 WorkBench에서 스키마 및 유저 생성하는 부분은 생략하겠습니다. 구글링을 통해 관련 정보를 얻을 수 있습니다.
https://dev.mysql.com/downloads/windows/installer/8.0.html
여기까지 왔다면 MySQL 테이블 삽입, 제약조건 설정 등의 작업까지 모두 마쳤을 겁니다. 이제 프로젝트의 DB 연결 정보를 MySQL로 변경해야 합니다. 변경한 프로젝트 내용은 다음과 같습닌다.
- Spring 5
- Spring Legacy Project(MVC)
- Maven
- Java 1.8
저는 XML 파일로 설정 내용을 작성했습니다.
메이븐 프로젝트이기 때문에 우선 pom.xml 파일에 mysql-connector-java 의존성을 추가했습니다.
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.19</version>
</dependency>
DB 연결 정보를 관리하는 xml 파일에서 아래와 같이 변경했습니다.
한눈에 비교하기 위해 Oracle과 MySQL 설정 내용을 함께 첨부했습니다.
저는 Hikari와 log4j를 적용했기 때문에 아래와 같은 형태로 작성되었습니다. 본인이 설정한 내용에 따라 작성 방식이 조금씩 다르다는 것을 생각하면서 보면 됩니다.
mysql-connector-java 5.1 버전 이후부터 KST 타임존을 인식하지 못하는 이슈가 있다고 합니다. 그래서 아래와 같이 serverTimezone=UTC를 추가했습니다. 처음 MySQL을 사용했고, Oracle 방식과 사뭇 달랐기 때문에 흥미로웠습니다.
// Oracle(Before)
<bean id="hikariConfig" class="com.zaxxer.hikari.HikariConfig">
<property name="driverClassName" value="net.sf.log4jdbc.sql.jdbcapi.DriverSpy"></property>
<property name="jdbcUrl" value="jdbc:log4jdbc:oracle:thin:@localhost:1521:XE"></property>
<property name="username" value="이름"></property>
<property name="password" value="비밀번호"></property>
</bean>
// MySQL(After)
<bean id="hikariConfig" class="com.zaxxer.hikari.HikariConfig">
<property name="driverClassName" value="net.sf.log4jdbc.sql.jdbcapi.DriverSpy"></property>
<property name="jdbcUrl" value="jdbc:log4jdbc:mysql://localhost:3306/스키마이름?characterEncoding=UTF-8&serverTimezone=UTC"/>
<property name="username" value="이름"/>
<property name="password" value="비밀번호"/>
</bean>
이렇게 Oracle에서 MySQL로 이동하는 작업이 끝났습니다. 아니, 이제 시작입니다. 이미 작성된 Oracle 쿼리문을 MySQL 방식으로 수정해야 하기 때문입니다. 예를 들면,
- Oracle의 sysdate -> MySQL에서는 now()
- Oracle은 아니지만, MySQL에서는 서브쿼리마다 별칭을 달아줘야 한다.
상황에 맞게 MySQL 방식으로 쿼리문을 수정하면 됩니다.
'Programming > 개인 프로젝트' 카테고리의 다른 글
[중고거래장터 - Study&Refactoring] Spring Rest Docs 적용을 통한 API 문서 작성 (0) | 2022.04.01 |
---|---|
[중고거래장터 - Study&Refactoring] 캐싱 기능 적용(Spring MVC + Redis + Jedis) Java 클래스 방식 (0) | 2022.03.31 |
[중고거래장터 - Study&Refactoring] 캐싱 기능 적용(Spring MVC + Redis + Jedis) XML 방식 (0) | 2022.03.15 |
[중고거래장터 -5] URL 디자인 그리고 Spring Security (0) | 2022.02.16 |
[중고거래사이트 - 4] 제대로 만든다는 것은 무엇일까 (0) | 2022.02.12 |