2022 01 07 - oneso123456789/2022 GitHub Wiki
SQLSessionFactory๋ฅผ ์ด์ฉํด์ ์ฝ๋๋ฅผ ์์ฑํด๋ ์ง์ Connection์ ์ป์ด์ JDBC์ฝ๋ฉ์ด ๊ฐ๋ฅํ์ง๋ง,
๋ ํธํํ ์์
์ ํ๊ธฐ ์ํด์ SQL์ ์ด๋ป๊ฒ ์ฒ๋ฆฌํ ๊ฒ์ธ์ง๋ฅผ ๋ณ๋์ ์ค์ ์ ๋ถ๋ฆฌํด ์ฃผ๊ณ ,
์๋์ผ๋ก ์ฒ๋ฆฌ๋๋ ๋ฐฉ์์ ์ด์ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
์ด๋ฅผ ์ํด์๋ MyBatis์ Mapper๋ผ๋ ์กด์ฌ๋ฅผ ์์ฑํด ์ค์ผ ํฉ๋๋ค.
Mapper๋ ์ฝ๊ฒ ๋งํด์ SQL๊ณผ ๊ทธ์ ๋ํ ์ฒ๋ฆฌ๋ฅผ ์ง์ ํ๋ ์ญํ์ ํฉ๋๋ค.
MyBatis-Spring์ ์ด์ฉํ๋ ๊ฒฝ์ฐ์๋ Mapper๋ฅผ XML๊ณผ ์ธํฐํ์ด์ค + ์ด๋
ธํ
์ด์
์ ํํ๋ก ์์ฑํ ์ ์์ต๋๋ค.
Mapper๋ฅผ ์์ฑํ๋ ์์ ์ XML์ ์ด์ฉํ ์๋ ์์ง๋ง, ์ต์ํ์ ์ฝ๋๋ฅผ ์์ฑํ๋ Mapper ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํด๋ณด๊ฒ ์
com.crow.mapper๋ผ๋ package๋ฅผ ๋ง๋ค๊ณ , TimeMapper๋ผ๋ ์ธํฐํ์ด์ค๋ฅผ ์ถ๊ฐํจ(src/main/java)
TimeMapper ์ธํฐํ์ด์ค์๋ MyBatis์ ์ด๋
ธํ
์ด์
์ ์ด์ฉํด์ SQL์ ๋ฉ์๋์ ์ถ๊ฐํฉ๋๋ค.
Mapper๋ฅผ ์์ฑํด ์ฃผ์๋ค๋ฉด MyBatis๊ฐ ๋์ํ ๋ Mapper๋ฅผ ์ธ์ํ ์ ์๋๋ก root-context.xml์ ์ถ๊ฐ์ ์ธ ์ค์ ์ด ํ์ํจ
๊ฐ์ฅ ๊ฐ๋จํ ๋ฐฉ์์ mybatis:scanํ๊ทธ๋ฅผ ์ด์ฉํ๋๊ฒ์
root-context.xml ํ์ผ์ ์ด๊ณ , ์๋์ชฝ์ 'Namespaces'ํญ๋ชฉ์์ 'mybatis-spring'ํญ์ ์ ํํฉ๋๋ค.
mybatis-spring:scan ํ๊ทธ์ base-package ์์ฑ์ ์ง์ ๋ ํจํค์ง์ ๋ชจ๋ MyBatis ๊ด๋ จ ์ด๋
ธํ
์ด์
์ ์ฐพ์์ ์ฒ๋ฆฌํฉ๋๋ค.
Mapper๋ฅผ ์ค์ ํ๋ ์์
์ ๊ฐ๊ฐ์ XML์ด๋ Mapper ์ธํฐํ์ด์ค๋ฅผ ์ค์ ํ ์๋ ์์ง๋ง,
๋งค๋ฒ ๋๋ฌด ๋ฒ์กํ๊ธฐ ๋๋ฌธ์ ์๋์ผ๋ก com.crow.mapper ํจํค์ง๋ฅผ ์ธ์ํ๋ ๋ฐฉ์์ผ๋ก ์์ฑํ๋ ๊ฒ์ด ๊ฐ์ฅ ํธ๋ฆฌํจ.
MyBatis-Spring์ Mapper ์ธํฐํ์ด์ค๋ฅผ ์ด์ฉํด์ ์ค์ SQL ์ฒ๋ฆฌ๊ฐ ๋๋ ํด๋์ค๋ฅผ ์๋์ผ๋ก ์์ฑํจ.
๋ฐ๋ผ์ ๊ฐ๋ฐ์๋ค์ ์ธํฐํ์ด์ค์ SQL๋ง์ ์์ฑํ๋ ๋ฐฉ์์ผ๋ก ๋ชจ๋ JDBC์ฒ๋ฆฌ๋ฅผ ๋๋ผ ์ ์์.
์์ฑํ TimeMapper๋ฅผ ํ
์คํธํ๋ ์ฝ๋๋ src/test/java ๋ฐ์ com.crow.persistence.TimeMapperTests๋ผ๋ ํด๋์ค๋ฅผ ์์ฑํด์ ์ฒ๋ฆฌ.
ํ
์คํธ์ค
WARNING: An illegal reflective access operation has occurred
WARNING: Illegal reflective access by org.apache.ibatis.reflection.Reflector (file:/C:/Users/oneso/.m2/repository/org/mybatis/mybatis/3.4.6/mybatis-3.4.6.jar) to method java.lang.String.value()
WARNING: Please consider reporting this to the maintainers of org.apache.ibatis.reflection.Reflector
WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations
WARNING: All illegal access operations will be denied in a future release
๋ผ๋ ์ค๋ฅ๊ฐ ์ผ๊ธฐ๋๊ฑฐ ๊ฐ์๋ pom.xml์์ mybatis ๋ฒ์ ์ ์ ์ 3.4.6์์ 3.5.4๋ก ๋ณ๊ฒฝํ๊ณ
๋ค์ JUnit์ผ๋ก ํ
์คํธ ์ฑ๊ณตํ 3.4.6์ผ๋ก ๋๋ ค์ ํ
์คํธ ํด๋ณด๋ ํด๊ฒฐ๋จ notebook์์ ๋ธ๋ฐ์น๋ฅผ ์ด๊ฒจ์ ๋ค์ ํ
์คํธ ํด๋ด์ผ๊ฒ ์
๋ง์ง๋ง์ผ๋ก ํ
์คํธํด๋ณด๋ ๋ค์ ์๊ฒจ์ ๊ทธ๋ฅ ๋ฒ์ ์ 3.5.4๋ก ๋ณ๊ฒฝํ๊ฒ ์
๊ทธ๋ฆฌ๊ณ INFO : com.crow.persistence.TimeMapperTests - 2022-01-06 15:54:48.0
ec2์์ ์ฌ๋ผ๊ฐ์๋ oracle ์๋ฒ ์๊ฐ์ด ์๋ง์ ..
์ด๊ฑด ํ์ธ๊ฒฐ๊ณผ ubuntu ์๋ฒ์ ์๊ฐ์ด UTC ๊ธฐ์ค์ผ๋ก ๋์ด์์ด์ ๊ทธ๋ผ
Thu Jan 6 15:59:07 UTC 2022
https://blog.buffashe.com/2020/02/changing-ubuntu-timezone/ ์ฌ๊ธธ ์ฐธ๊ณ ํด์ ๋ด์ผ ๋ฐ๊พธ๊ฒ ์.
์์ ์ฝ๋๋ TimeMapper๊ฐ ์ ์์ ์ฌ์ฉ์ด ๊ฐ๋ฅํ์ง ์์๋ณด๊ธฐ ์ํด ๋ง๋ค์ด์ง
์ ๋๋ก ๋์ํ๋ค๋ฉด ์คํ๋ง ๋ด๋ถ์๋ TimeMapperํ์
์ผ๋ก ๋ง๋ค์ด์ง ์คํ๋ง ๊ฐ์ฒด(๋น)์ด ์กด์ฌํ๋ค๋๋ป์
์์ ์ฝ๋์์ timeMapper.getClass().getName()์ ์ค์ ๋์ํ๋ ํด๋์ค์ ์ด๋ฆ์ ํ์ธํด ์ฃผ๋๋ฐ ์คํ๊ฒฐ๊ณผ๋ฅผ ๋ณด๋ฉด
๊ฐ๋ฐ ์ ์ธํฐํ์ด์ค๋ง ๋ง๋ค์ด ์ฃผ์๋๋ฐ ๋ด๋ถ์ ์ผ๋ก ์ ๋นํ ํด๋์ค๊ฐ ๋ง๋ค์ด์ง ๊ฒ์ ํ์ธํ ์ ์์(๋ ์์ธํ ๋ด์ฉ์ ์คํ๋ง AOP์ฐธ๊ณ )
ํ์์กด ์ค์ ์๋ฃํจ sudo timedatectl set-timezone Asia/Seoul
๊ทธ๋ฌ๋ ubuntu์๋ง ์ค์ ํจ
์์ ์ฝ๋๋ก ํ
์คํธ ํด๋ณธ๊ฒฐ๊ณผ db ํ์ ์คํฌํ๋ ์ ํํ ๋์ค์ง๋ง ๋ ์๊ฐ์ด ๋ค๋ฅด๊ฒ ๋์ฌ์ oracle์ชฝ๋ ์ค์ ํด์ค์ผ๊ฒ ์
๋ํ ํ๋๊น์ useradd๋ก ์ถ๊ฐํ crow ๊ณ์ ๊ณผ (usermod -G dba ๊ณ์ ์ด๋ฆ
๋ก sysdba๊ถํ ๋ถ์ฌํจ)
oracle ๊ณ์ ์๋ ์ค๋ผํด ํ๊ฒฝ๋ณ์๋ฅผ ์ถ๊ฐํด์ค 05์ผ ๋ฆฌํฌํธ ์ฐธ๊ณ
export ORACLE_HOME=/u01/app/oracle/product/11.2.0/xe
export ORACLE_SID=XE
export NLS_LANG=`$ORACLE_HOME/bin/nls_lang.sh`
export ORACLE_BASE=/u01/app/oracle
export LD_LIBRARY_PATH=$ORACLE_HOME/lib:$LD_LIBRARY_PATH
export PATH=$ORACLE_HOME/bin:$PATH
๊ทธ๋ฌ๋ ์ด๊ฒ ๋ฑ๋กํ sqlplus ๋ช
๋ น์ด๊ฐ ์๋จนํ์ ์์๋ณด๋ ํ๊ฒฝ ๋ณ์ ๋ฑ๋กํ
source ~/.bash_profile ๋ก ๋ฐ์์ ์ํด์ค
MyBatis๋ฅผ ์ด์ฉํด์ SQL์ ์ฒ๋ฆฌํ ๋ ์ด๋
ธํ
์ด์
์ ์ด์ฉํ๋ ๋ฐฉ์์ด ์๋์ ์ผ๋ก ํธ๋ฆฌํจ
ํ์ง๋ง, SQL์ด ๋ณต์กํ๊ฑฐ๋ ๊ธธ์ด์ง๋ ๊ฒฝ์ฐ์๋ ์ด๋
ธํ
์ด์
๋ณด๋ค๋ XML์ ์ด์ฉํ๋ ๋ฐฉ์์ ๋ ์ ํธํ๊ฒ ๋จ
MYBatis-Spring์ ๊ฒฝ์ฐ Mapper์ XML์ ๋์์ ์ด์ฉํ ์์์ ^์ค^b
XML์ ์์ฑํ ๋ ํ์ผ์ ์์น์ namespace์์ฑ์ด ์ค์ํจ
Mapper ์ธํฐํ์ด์ค๊ฐ ์๋๊ณณ์ ๊ฐ์ด ์์ฑํ๋๊ฐ src/main/resources
๊ฒฝ๋ก์
com/crow/mapper/TimeMapper.xml
ํ์ผ ์์ฑ(๋ฐ๋์ ํ๋ฒ์ ํ๋์ฉ ํด๋๋ฅผ ์์ฑํด์ค์ผํจ ํ๋ฒ์ ํด๋๋ฅผ ๋ง๋ค๋ฉด ์ ๋๋ก ์ธ์ ์๋ ์์์)
๋ํ XMLํ์ผ์ ๋ง๋ค๋ ์ด๋ฆ์ ๋ํ ๊ท์น์ ์์ง๋ง ๊ฐ๊ธ์ Mapper ์ธํฐํ์ด์ค๊ฐ์ ์ด๋ฆ์ ์ฌ์ฉํด์ ๊ฐ๋
์ฑ์ ๋์ฌ์ผํจ
XML ํ์ผ์๋ MyBatis์ XML ๋งคํผ์์ ์ด์ฉํ๋ ํ๊ทธ์ ๋ํ ์ค์ ์ด ํ์ํจ.
์ด์ ๋ํ ์์ธํ ์ ๋ณด๋ http://www.mybatis.org/mybatis-3/ko/sqlmap-xml.html
์ ์ถ๊ฐ ์ฐธ๊ณ
Mapper์ธํฐํ์ด์ค์ XML์ ๊ฐ์ด ์ด์ฉํด๋ณด๊ธฐ ์ํด์ ๊ธฐ์กด์ TimeMapper ์ธํฐํ์ด์ค์ ์ถ๊ฐ์ ์ธ ๋ฉ์๋๋ฅผ ์ ์ธํจ.
TimeMapper ์ธํฐํ์ด์ค๋ฅผ์ getTime2()๋ฅผ ์ถ๊ฐํ์ง๋ง ํน์ดํ๊ฒ๋ @Select์ ๊ฐ์ด MyBatis ์ด๋
ธํ
์ด์
์ด ์กด์ฌํ์ง ์๊ณ ,
SQL ์ญ์ ์กด์ฌํ์ง ์๋๋ค.
MyBatis๋ Mapper ์ธํฐํ์ด์ค์ XML์ ์ธํฐํ์ด์ค ์ด๋ฆ๊ณผ namespace ์์ฑ๊ฐ์ ๊ฐ์ง๊ณ ํ๋จํจ
์์๊ฐ์ด com.crow.mapper.TimeMapper ์ธํฐํ์ด์ค์ XML์ <mapper namespace="com.crow.TimeMapper">
์ ๊ฐ์ด ๋์ผํ
์ด๋ฆ์ด ์กด์ฌํ๋ฉด ์ด๋ฅผ ๋ณํฉํด์ ์ฒ๋ฆฌํจ.
๋ฐ๋ผ์ ์ด ์ด ๋ฐฉ์์ ๋ฉ์๋ ์ ์ธ์ ์ธํฐํ์ด์ค์ ์กด์ฌํ๊ณ SQL์ ๋ํ ์ฒ๋ฆฌ๋ XML์ ์ด์ฉํ๋ ๋ฐฉ์์
ํ๊ทธ์ id์์ฑ๊ฐ์ ๋ฉ์๋์ ์ด๋ฆ๊ณผ ๋์ผํ๊ฒ ๋ง์ถฐ์ผํจ. ๋ํ ํ๊ทธ์ ๊ฒฝ์ฐ resultType ์์ฑ์ ๊ฐ์ง๋๋ฐ ์ด ๊ฐ์ ์ธํฐํ์ด์ค์ ์ ์ธ๋ ๋ฉ์๋์ ๋ฆฌํด ํ์ ๊ณผ ๋์ผํ๊ฒ ์์ฑํจ ์ต์ข ์ ์ผ๋ก testGetTime2()๋ฉ์๋์ ๊ฒฐ๊ณผ๊ฐ์ getTime()๊ณผ ๋์ผํจ.