2022 01 07 - oneso123456789/2022 GitHub Wiki

์Šคํ”„๋ง๊ณผ์˜ ์—ฐ๋™์ฒ˜๋ฆฌ

SQLSessionFactory๋ฅผ ์ด์šฉํ•ด์„œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด๋„ ์ง์ ‘ Connection์„ ์–ป์–ด์„œ JDBC์ฝ”๋”ฉ์ด ๊ฐ€๋Šฅํ•˜์ง€๋งŒ,
๋” ํŽธํ•œํ•œ ์ž‘์—…์„ ํ•˜๊ธฐ ์œ„ํ•ด์„œ SQL์„ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ•  ๊ฒƒ์ธ์ง€๋ฅผ ๋ณ„๋„์˜ ์„ค์ •์„ ๋ถ„๋ฆฌํ•ด ์ฃผ๊ณ ,
์ž๋™์œผ๋กœ ์ฒ˜๋ฆฌ๋˜๋Š” ๋ฐฉ์‹์„ ์ด์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.
์ด๋ฅผ ์œ„ํ•ด์„œ๋Š” MyBatis์˜ Mapper๋ผ๋Š” ์กด์žฌ๋ฅผ ์ž‘์„ฑํ•ด ์ค˜์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Mapper๋Š” ์‰ฝ๊ฒŒ ๋งํ•ด์„œ SQL๊ณผ ๊ทธ์— ๋Œ€ํ•œ ์ฒ˜๋ฆฌ๋ฅผ ์ง€์ •ํ•˜๋Š” ์—ญํ™œ์„ ํ•ฉ๋‹ˆ๋‹ค.
MyBatis-Spring์„ ์ด์šฉํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” Mapper๋ฅผ XML๊ณผ ์ธํ„ฐํŽ˜์ด์Šค + ์–ด๋…ธํ…Œ์ด์…˜์˜ ํ˜•ํƒœ๋กœ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Mapper์ธํ„ฐํŽ˜์ด์Šค

Mapper๋ฅผ ์ž‘์„ฑํ•˜๋Š” ์ž‘์—…์€ XML์„ ์ด์šฉํ•  ์ˆ˜๋„ ์žˆ์ง€๋งŒ, ์ตœ์†Œํ•œ์˜ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” Mapper ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•ด๋ณด๊ฒ ์Œ

com.crow.mapper๋ผ๋Š” package๋ฅผ ๋งŒ๋“ค๊ณ , TimeMapper๋ผ๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ถ”๊ฐ€ํ•จ(src/main/java)
TimeMapper ์ธํ„ฐํŽ˜์ด์Šค์—๋Š” MyBatis์˜ ์–ด๋…ธํ…Œ์ด์…˜์„ ์ด์šฉํ•ด์„œ SQL์„ ๋ฉ”์„œ๋“œ์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

Mapper ์„ค์ •

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 ํŒจํ‚ค์ง€๋ฅผ ์ธ์‹ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ํŽธ๋ฆฌํ•จ.

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์ฐธ๊ณ )

01 07 ์ €๋… 9์‹œ

ํƒ€์ž„์กด ์„ค์ • ์™„๋ฃŒํ•จ 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 ๋กœ ๋ฐ˜์˜์„ ์•ˆํ•ด์คŒ

XML ๋งคํผ์™€ ๊ฐ™์ด ์“ฐ๊ธฐ

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()๊ณผ ๋™์ผํ•จ.

โš ๏ธ **GitHub.com Fallback** โš ๏ธ