[MySQL] Oracle 프로젝트 MySQL로 변경하기

2021. 3. 8. 18:15·DataBase/MySQL
728x90

기존 Oracle DB를 사용했던 Spring 프로젝트를 MySQL로 변경해서 적용해보려고 한다.

먼저 Toaf For MySQL에 새로 데이터베이스, 사용자를 만들어주고 기존 테이블 및 데이터를 MySQL에 맞게 변형해주었다.


1. pom.xml

MySQL Connector/J dependency 추가하기

🔹 빌드도구를 사용하는 경우

  1. MySQL 과 JAVA를 연결하기 위한 dependency 를 추가하기 위해
    메이븐 원격 레포지토리에서 MySQL Connector/J 검색
    mvnrepository.com/artifact/mysql/mysql-connector-java
  2. 원하는 Version 클릭 ( 8.0.23 버전 사용 )

3. 해당하는 빌드 툴(Maven)의 dependency 코드 복사 ➡ pom.xml 에 붙여넣기

4. Maven Dependency에서 jar 파일 정상 주입 확인

5. 해당 jar파일을 톰캣경로\lib로 복사함 (만약, 톰캣이 실행중이라면 톰캣 재시작 )

 

mysql-connector-java-8.0.23.zip
4.59MB

 

 

🔹 빌드도구를 사용하지 않는 경우

: Java MySQL 연결을 위한 MySQL Connector 설치방법

 

2. context-database.xml

경로 : src/main/resources > config.spring > context-database.xml 

수정 : mybatis/ 경로를 ${Globals.DbType} 로 지정

이유 : mysql, oracle로 정해두지 않고 해당 타입에 맞춰 들어오게 하기 위함 (유지보수 ↑)

타입은 하단 database.properties에서 지정

    <!-- DataSource -->	
    <alias name="dataSource-${Globals.DbType}" alias="dataSource"/>

	<!-- MySQL -->
	<bean id="dataSource-mysql" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
		<property name="driverClassName" value="${Globals.DriverClassName}"/>
		<property name="url" value="${Globals.Url}" />
		<property name="username" value="${Globals.UserName}"/>
		<property name="password" value="${Globals.Password}"/>
	</bean>

	<!-- Oracle -->
	<bean id="dataSource-oracle" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
		<property name="driverClassName" value="${Globals.DriverClassName}"/>
		<property name="url" value="${Globals.Url}" />
		<property name="username" value="${Globals.UserName}"/>
		<property name="password" value="${Globals.Password}"/>
	</bean>
    
    <bean id="sqlSessionFactoryBean" class="org.mybatis.spring.SqlSessionFactoryBean">		
		<property name="dataSource" ref="dataSource" />
		<property name="configLocation" 
			value="classpath:/config/mybatis/${Globals.DbType}/mybatis-config.xml" />
		<property name="typeAliasesPackage" value="com.it.herb" />
		<property name="mapperLocations">
			<array>
				<value>classpath*:/config/mybatis/mapper/${Globals.DbType}/**/*.xml</value>
			</array>
		</property>		
	</bean>

 

3. database.properties

경로 : src/main/resources > config.props> database.properties

수정 : 기존 oracle에서 mysql로 변경

 

Oracle

Globals.DbType = oracle
Globals.DriverClassName=oracle.jdbc.driver.OracleDriver
Globals.Url=jdbc:oracle:thin:@HOST주소:1521:xe
Globals.UserName=herb
Globals.Password=herb123

MySQL

Globals.DbType = mysql
Globals.DriverClassName=com.mysql.jdbc.Driver
Globals.Url=jdbc:mysql://localhost:3306/herbmall
Globals.UserName=herb
Globals.Password=herb123

 

4. mapper 추가 및 config.mybatis.mysql 생성

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
  PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
	<!-- 마이바티스의 작동 규칙정의 mysql은 useGeneratedKeys value가 반드시 true여야 한다-->
	<settings>
	  <setting name="cacheEnabled" value="true"/>
	  <setting name="useGeneratedKeys" value="true"/>
	  <setting name="mapUnderscoreToCamelCase" value="true"/>
	</settings>
</configuration>

 

5. mapper 내 SQL문 수정

1. 문자열 '||' 연산자 ➡ CONCAT() 함수

기존

	<sql id="searchWhere">
		<where>
			<if test="searchKeyword != null and searchKeyword != ''">
				${searchCondition} like '%' || #{searchKeyword} || '%'
			</if>
		</where>	
	</sql>

변경

	<sql id="searchWhere">
		<where>
			<if test="searchKeyword != null and searchKeyword != ''">
				${searchCondition} like CONCAT('%',#{searchKeyword},'%')
			</if>
		</where>	
	</sql>

2. 시퀀스 SelectKey ➡ LAST_INSERT_ID() 함수

기존

	<insert id="insertBoard" parameterType="boardVo">
		<selectKey keyProperty="no" resultType="int" order="BEFORE">
			select board_seq.nextval from dual 
		</selectKey>
		
		insert into board(no,name, pwd, title, email, content)
		values(#{no} ,#{name}, #{pwd}, #{title}, #{email}, #{content})
	</insert>

변경

	<insert id="insertBoard" parameterType="boardVo">		
		insert into board(no,name, pwd, title, email, content)
		values(#{no} ,#{name}, #{pwd}, #{title}, #{email}, #{content})
        
		<selectKey keyProperty="no" resultType="int" order="AFTER">
			SELECT LAST_INSERT_ID() 
		</selectKey>
	</insert>

3. 개수 제한 Rownum ➡ LIMIT

기존

	<select id="selectMainNotice" resultType="boardVo">
		select *
		from( 
		   select no, title from board order by no desc
		    ) 
		<![CDATA[
		where rownum<=6 ]]>
	</select>

변경

	<select id="selectMainNotice" resultType="boardVo">
   		select no, title from board order by no desc LIMIT 6
	</select>

4. (1) 날짜 처리 (SYSDATE-regdate)*24 ➡ DATEDIFF(NOW(),regdate)*24

4. (2) 페이징 처리 RNUM ➡ LIMIT

기존

	<select id="selectAll" parameterType="searchVo" resultType="boardVo">
		SELECT *
		FROM
		(
		    SELECT A.*, rownum as RNUM
		    FROM
		    (
		        SELECT no, name, pwd, title, email, regdate,
					readcount, content, (sysdate-regdate)*24 as newImgTerm 
		        FROM board 
				<include refid="searchWhere" />	        
		        ORDER BY no DESC
		    )A
		)
		<![CDATA[
		WHERE RNUM > #{firstRecordIndex} 
		AND RNUM <= #{firstRecordIndex} + #{recordCountPerPage}
		]]>
	</select>

변경

	<select id="selectAll" parameterType="searchVo" resultType="boardVo">
		SELECT no, name, pwd, title, email, content,regdate, readcount, 
			DATEDIFF(NOW(), regdate)*24 as newImgTerm
		FROM board 
		<include refid="searchWhere"/>
		ORDER BY no DESC
		LIMIT #{recordCountPerPage} OFFSET #{firstRecordIndex}
	</select>

 

🔍 LIMIT (결과값 제한)

더보기

1. 숫자만큼의 행 출력

SELECT *FROM 테이블명 ORDER BY 필드명 ASC OR DESC LIMIT 숫자;

예) 5행 출력

select * from board order by no LIMIT 5;

 

2. 정해진 행 부터 N개의 행 출력 - 페이징

SELECT *FROM 테이블명 ORDER BY 필드명 ASC OR DESC LIMIT 숫자 N OFFSET 숫자 S;

LIMIT 숫자(N) : 출력할 행의 수
OFFSET 숫자(S) : 몇번째 row부터 출력할 지 지정 - 첫번째 행이면 0

예) 한 페이지에 레코드 5개씩만 출력

1페이지 : select * from board order by no desc LIMIT 5 OFFSET 0;
2페이지 : select * from board order by no desc LIMIT 5 OFFSET 5;

 

3. 정해진 행 부터 N개의 행 출력 - 페이징

SELECT *FROM 테이블명 ORDER BY 필드명 ASC OR DESC LIMIT 숫자1(S), 숫자2(N);

숫자1 : S번째 행부터 출력
숫자2 : N개의 행 출력

예) 한 페이지에 레코드 5개씩만 출력

1페이지 : select * from board order by no desc LIMIT 0, 5;
2페이지 : select * from board order by no desc LIMIT 5, 5;

 

출처 : itnewvom.tistory.com/21

 

5. 날짜 처리 to_date(#{endDay})+1 ➡ DATE_ADD(#{endDay}, INTERVAL 1 DAY)

기존

	<select id="selectOrderList" parameterType="dateSearchVo" resultMap="orderListResultMap">
		select *
		from
		(
		    select A.*, rownum as RNUM
		    from
		    (
	            select * from orders        
	            where orderdate >= #{startDay} 
            <![CDATA[
          		and orderdate < to_date(#{endDay})+1
          	]]>
	            <if test="customerId!=null and customerId!=''">
	         	   and customerId=#{customerId}
	            </if>
	            order by orderNo desc
		    )A
		)
		<![CDATA[
		where RNUM > #{firstRecordIndex} 
		and RNUM <= #{firstRecordIndex} + #{recordCountPerPage}
		]]>
	</select>

변경

	<select id="selectOrderList" parameterType="dateSearchVo" resultMap="orderListResultMap">
		<![CDATA[
			select * from orders
			where orderdate>=#{startDay}
			and orderdate<DATE_ADD(#{endDay}, INTERVAL 1 DAY)
		]]> 
		<if test="customerId != null and customerId != '' ">
			and customerId=#{customerId}
		</if>
		order by orderNo desc
		LIMIT #{recordCountPerPage} OFFSET #{firstRecordIndex}
	</select>

 


이렇게 해서 기존에 oracle로 작동하던 웹 사이트를 mysql로 성공적으로 바꿔서 구동해보았다.

Toad For Oracle 에는 port 3306 이고, Tomcat 서버에는 port 9090 인데도 잘 된다.

이거 맞춰야 되는 줄 알고 Tomcat 서버 바꿨는데 port 사용중이라고 해서 별 난리를 다쳤는데 상관없었다..!

중간에 Maven > Update Project 했더니 메이븐 dependency가 사라져서 해결해줬더니 잘 작동했다.

 

오류 해결 참고 : jaeu0608.tistory.com/155

728x90
저작자표시 (새창열림)

'DataBase > MySQL' 카테고리의 다른 글

[MySQL] 저장 프로시저 (Stored Procedure)  (0) 2021.03.08
[MySQL] 내장 함수 정리  (2) 2021.03.07
[MySQL] 데이터 한번에 입력하기 (Data import)  (2) 2021.03.07
[MySQL] 테이블 분리와 JOIN - 데이터 중복 최소화  (3) 2021.03.06
[MySQL] CRUD - Create, Select, Insert, Update, Delete  (2) 2021.03.04
'DataBase/MySQL' 카테고리의 다른 글
  • [MySQL] 저장 프로시저 (Stored Procedure)
  • [MySQL] 내장 함수 정리
  • [MySQL] 데이터 한번에 입력하기 (Data import)
  • [MySQL] 테이블 분리와 JOIN - 데이터 중복 최소화
heestory217
heestory217
Done is better than Perfect! 좌충우돌 개발일지💻
    250x250
  • heestory217
    Heello World
    heestory217
  • 전체
    오늘
    어제
    • 분류 전체보기 (120)
      • 컴퓨터일반 (0)
      • WEB (1)
      • JAVA (3)
      • Python (9)
      • C (1)
      • DataBase (17)
        • Oracle (2)
        • MySQL (9)
        • SAP HANA (4)
        • PostgreSQL (0)
      • 디버깅∕오류해결 (14)
      • 코딩테스트 (54)
        • 자료구조∕알고리즘 (3)
      • 정보처리기사 (10)
      • Git∕GitHub (7)
      • 기타 (3)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    인텔리제이
    정처기 수제비
    파이썬 포맷팅
    treemap
    정처기 실기
    정처기 수제비 데일리 문제
    hashmap sort
    leetcode
    IntelliJ
    프로그래머스 카카오
    배열 정렬하기
    SAP HANA Studio
    Guava library
    정처기 수제비 실기문제
    코딩테스트
    treeset
    MySQL
    정처기 실기 예상문제
    Sort a HashMap in Java
    HashMap
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.1
heestory217
[MySQL] Oracle 프로젝트 MySQL로 변경하기
상단으로

티스토리툴바