기존 Oracle DB를 사용했던 Spring 프로젝트를 MySQL로 변경해서 적용해보려고 한다.
먼저 Toaf For MySQL에 새로 데이터베이스, 사용자를 만들어주고 기존 테이블 및 데이터를 MySQL에 맞게 변형해주었다.
1. pom.xml
MySQL Connector/J dependency 추가하기
🔹 빌드도구를 사용하는 경우
- MySQL 과 JAVA를 연결하기 위한 dependency 를 추가하기 위해
메이븐 원격 레포지토리에서 MySQL Connector/J 검색
mvnrepository.com/artifact/mysql/mysql-connector-java - 원하는 Version 클릭 ( 8.0.23 버전 사용 )
3. 해당하는 빌드 툴(Maven)의 dependency 코드 복사 ➡ pom.xml 에 붙여넣기
4. Maven Dependency에서 jar 파일 정상 주입 확인
5. 해당 jar파일을 톰캣경로\lib로 복사함 (만약, 톰캣이 실행중이라면 톰캣 재시작 )
🔹 빌드도구를 사용하지 않는 경우
: 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;
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
'DataBase > MySQL' 카테고리의 다른 글
[MySQL] 저장 프로시저 (Stored Procedure) (0) | 2021.03.08 |
---|---|
[MySQL] 내장 함수 정리 (2) | 2021.03.07 |
[MySQL] 데이터 한번에 입력하기 (Data import) (0) | 2021.03.07 |
[MySQL] 테이블 분리와 JOIN - 데이터 중복 최소화 (2) | 2021.03.06 |
[MySQL] CRUD - Create, Select, Insert, Update, Delete (2) | 2021.03.04 |