DataBase/MySQL

[MySQL] Oracle 프로젝트 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