SlideShare a Scribd company logo
1 of 49
Download to read offline
Data Mapper
                         (a.k.a SQL Maps)


                        Version 2.0




                      ๊ฐœ๋ฐœ์ž ๊ฐ€์ด๋“œ


                         2006๋…„ 3์›” 11์ผ




๋ฒˆ์—ญ : ์ด๋™๊ตญ(fromm0@gmail.com)
์˜คํƒ€ ๋ฐ ์˜ค์—ญ์€ ์œ„ ๋ฉ”์ผ์ฃผ์†Œ๋กœ ๋ณด๋‚ด์ฃผ์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค.

                                1
์†Œ๊ฐœ
 iBATIS Data Mapper ํ”„๋ ˆ์ž„์›Œํฌ๋Š” ๋‹น์‹ ์ด ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ ‘๊ทผํ•  ๋•Œ ํ•„์š”ํ•œ ์ž๋ฐ”์ฝ”๋“œ๋ฅผ ํ˜„์ €ํ•˜๊ฒŒ ์ค„์ผ์ˆ˜ ์žˆ๋„๋ก
๋„์™€์ค„๊ฒƒ์ด๋‹ค. iBATIS๋Š” ๊ฐ„๋‹จํ•œ XML์„œ์ˆ ์ž๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๊ฐ„๋‹จํ•˜๊ฒŒ ์ž๋ฐ”๋นˆ์ฆˆ๋ฅผ SQL statement์— ๋งตํ•‘์‹œํ‚จ๋‹ค. ๊ฐ„๋‹จํ•จ
(Simplicity)์ด๋ž€ ๋‹ค๋ฅธ ํ”„๋ ˆ์ž„์›Œํฌ์™€ ๊ฐ์ฒด๊ด€๊ณ„๋งตํ•‘ํˆด์— ๋น„ํ•ด iBATIS์˜ ๊ฐ€์žฅ ํฐ ์žฅ์ ์ด๋‹ค. iBATIS Data Mapper๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ
์œ„ํ•ด์„œ ๋‹น์‹ ์€ ์ž๋ฐ”๋นˆ์ฆˆ์™€ XML ๊ทธ๋ฆฌ๊ณ  SQL์— ์นœ์ˆ™ํ•  ํ•„์š”๊ฐ€ ์žˆ๋‹ค. ์—ฌ๊ธฐ์—” ๋ฐฐ์›Œ์•ผ ํ• ๊ฒƒ๋„ ๊ฑฐ์˜ ์—†๊ณ  ํ…Œ์ด๋ธ”์„ ์กฐ์ธํ•˜๊ฑฐ๋‚˜ ๋ณต
์žกํ•œ ์ฟผ๋ฆฌ๋ฌธ์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•œ ๋ณต์žกํ•œ ์Šคํ‚ค๋งˆ๋„ ์—†๋‹ค. Data Mapper๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋‹น์‹ ์€ ์‹ค์ œ SQL๋ฌธ์˜ ๋ชจ๋“  ๊ธฐ๋Šฅ์„ ๊ฐ€
์งˆ์ˆ˜ ์žˆ๋‹ค.


Data Mapper (com.ibatis.sqlmap.*)
๊ฐœ๋…

iBATIS Data Mapper API๋Š” ํ”„๋กœ๊ทธ๋ž˜๋จธ์—๊ฒŒ ์ž๋ฐ”๋นˆ์ฆˆ ๊ฐ์ฒด๋ฅผ PreparedStatementํŒŒ๋ผ๋ฏธํ„ฐ์™€ ResultSets์œผ๋กœ ์‰ฝ๊ฒŒ ๋งตํ•‘ํ• ์ˆ˜
์žˆ๋„๋ก ํ•œ๋‹ค. Data Mapper์˜ ๊ธฐ๋ณธ์ ์ธ ์ƒ๊ฐ์€ ๊ฐ„๋‹จํ•จ(simple)์ด๋‹ค. ์ด๋Š” ์ž๋ฐ”์ฝ”๋“œ์˜ 20%๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ JDBC๊ธฐ๋Šฅ์˜ 80%๋ฅผ
์ œ๊ณตํ•˜๋Š” ๊ฐ„๋‹จํ•œ ํ”„๋ ˆ์ž„์›Œํฌ๋ผ๋Š” ๋œป์ด๋‹ค.

์ด๊ฒƒ์€ ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋Š”๊ฐ€.?

Data Mapper๋Š” ์ž๋ฐ”๋นˆ์ฆˆ, Map๊ตฌํ˜„, ์›์‹œ๋ž˜ํผํƒ€์ž…(String, Integerโ€ฆ) ๊ทธ๋ฆฌ๊ณ  SQL๋ฌธ์„ ์œ„ํ•œ XML๋ฌธ์„œ๋ฅผ ๋งตํ•‘ํ•˜๊ธฐ ์œ„
ํ•œ XML์„œ์ˆ ์ž๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋งค์šฐ ๊ฐ„๋‹จํ•œ ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์ œ๊ณตํ•œ๋‹ค. ๋‹ค์Œ์€ ์ƒ๋ช…์ฃผ๊ธฐ์— ๋Œ€ํ•œ ๋†’์€ ๋ ˆ๋ฒจ์˜ ์„œ์ˆ ์ด๋‹ค.

      1) ํŒŒ๋ผ๋ฏธํ„ฐ(์ž๋ฐ”๋นˆ์ฆˆ, Map ๋˜๋Š” ์›์‹œ๋ž˜ํผ)๋กœ์จ ๊ฐ์ฒด๋ฅผ ์ œ๊ณตํ•œ๋‹ค. ํŒŒ๋ผ๋ฏธํ„ฐ ๊ฐ์ฒด๋Š” update๋ฌธ๋‚ด์— ์ž…๋ ฅ๊ฐ’์„ ์…‹ํŒ…ํ•˜
      ๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๊ฑฐ๋‚˜ ์ฟผ๋ฆฌ๋ฌธ์˜ where์ ˆ์„ ์…‹ํŒ…ํ•˜๊ธฐ ์œ„ํ•ด์„œ ์‚ฌ์šฉ๋œ๋‹ค.

      2) ๋งตํ•‘๋œ statement์„ ์‹คํ–‰ํ•œ๋‹ค. ์ด ๋‹จ๊ณ„๋Š” ๋งˆ๋ฒ•์ด ์ผ์–ด๋‚˜๋Š”๊ณณ์ด๋‹ค. Data Mapperํ”„๋ ˆ์ž„์›Œํฌ๋Š”
      PreparedStatement ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ• ๊ฒƒ์ด๊ณ  ์ œ๊ณต๋œ ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•ด์„œ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์…‹ํŒ…ํ•œ๋‹ค. ๊ทธ๋ฆฌ
      ๊ณ  statement๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ResultSet์œผ๋กœ๋ถ€ํ„ฐ ๊ฒฐ๊ณผ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.

      3) update์˜ ๊ฒฝ์šฐ์— ์˜ํ–ฅ์„ ๋ฏธ์นœ rows์˜ ์ˆซ์ž๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ์กฐํšŒ๋ฌธ์ผ๊ฒฝ์šฐ์— ํ•œ ๊ฐœ(single)์˜ ๊ฐ์ฒด ๋˜๋Š” ์ปฌ๋ ‰์…˜
      ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ํŒŒ๋ผ๋ฏธํ„ฐ์ฒ˜๋Ÿผ ๊ฒฐ๊ณผ ๊ฐ์ฒด๋Š” ์ž๋ฐ”๋นˆ์ฆˆ, Map ์›์‹œํƒ€์ž…๋ž˜ํผ๋˜๋Š” XML์ด ๋ ์ˆ˜ ์žˆ๋‹ค.

๋ฐ‘์˜ ๋‹ค์ด์–ด๊ทธ๋žจ์€ ์„œ์ˆ ๋œ ๊ฒƒ์„ ์„ค๋ช…ํ•œ๋‹ค.




                                          2
์„ค์น˜

iBATIS Data Mapper ํ”„๋ ˆ์ž„์›Œํฌ ์„ค์น˜๋Š” ๊ฐ„๋‹จํ•˜๊ฒŒ ํด๋ž˜์ŠคํŒจ์Šค์— ํ•„์š”ํ•œ JARํŒŒ์ผ์„ ๋‘๋ฉด ๋œ๋‹ค. ์ด๊ฒƒ์€ JVM์‹œ์ž‘์‹œ ์ •์˜๋œ ํด
๋ž˜์ŠคํŒจ์Šค์— ๋‘๊ฑฐ๋‚˜ ์›น์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ /WEB-INF/lib์— ๋‘˜์ˆ˜๋„ ์žˆ๋‹ค. ์ž๋ฐ” ํด๋ž˜์ŠคํŒจ์Šค์— ๋Œ€ํ•ด์„œ๋Š” ๋‹ค์Œ์˜ ์ž์›์„ ์ฐธ์กฐํ•˜๋ผ.

        http://java.sun.com/j2se/1.4/docs/tooldocs/win32/classpath.html
        http://java.sun.com/j2se/1.4.2/docs/api/java/lang/ClassLoader.html
        http://java.sun.com/j2se/1.4.2/docs/


iBATIS๋Š” ๋‹ค์Œ์˜ JARํŒŒ์ผ์„ ๊ฐ€์ง„๋‹ค.

ํŒŒ์ผ๋ช…                                ์ƒ์„ธ์„ค๋ช…                                  ํ•„์ˆ˜์—ฌ๋ถ€
ibatis-common.jar                  iBATIS Common Utilities               YES

ibatis-sqlmap.jar                  iBATIS Data Mapper Framework          YES

ibatis-dao.jar                     iBATIS Data Access Objects            NO
                                   Framework.



JAR ํŒŒ์ผ๊ณผ ์˜์กด์„ฑ

ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ๋„ˆ๋ฌด ๋งŽ์€ ์˜์กด์„ฑ์„ ๊ฐ€์ง„๋‹ค๋ฉด ์ด๊ฒƒ์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด๋‚˜ ๋‹ค๋ฅธ ํ”„๋ ˆ์ž„์›Œํฌ์— ํ†ตํ•ฉ๋˜๊ธฐ ํž˜๋“ค๊ฒŒ ๋งŒ๋“ ๋‹ค. 2.0์˜ ์ค‘
์š”ํ•œ ํ•ต์‹ฌ์‚ฌํ•ญ์€ ์˜์กด์„ฑ๊ด€๋ฆฌ์™€ ์ œ๊ฑฐ์˜ ์ค‘์ ์„ ๋‘์—ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ ๋งŒ์•ฝ ๋‹น์‹ ์ด jdk1.4๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ์‹ค์ œ ์˜์กด์ ์ธ ๊ฒƒ์€
Jakarta Commons Logging ํ”„๋ ˆ์ž„์›Œํฌ๋ฟ์ด๋‹ค. ์ด ์ถ”๊ฐ€์ ์ธ JARํŒŒ์ผ์€ ๋ฐฐํฌํŒ์˜ /lib/optional๋””๋ ‰ํ† ๋ฆฌ์—์„œ ์ฐพ์„์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋“ค
์€ ๊ธฐ๋Šฅ์— ์˜ํ•ด ๋ถ„๋ฅ˜๋œ๋‹ค. ๋‹ค์Œ์€ ์ถ”๊ฐ€์ ์ธ ํŒจํ‚ค์ง€๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ํ•„์š”ํ•œ ๊ฒƒ๋“ค์˜ ๋ชฉ๋ก์ด๋‹ค.

Description         When to Use                                  Directories
                                                                 JDBC 2.0 Extensions
                                                                 http://java.sun.com/products/jdbc/download.html
                    ๋งŒ์•ฝ์— ๋‹น์‹ ์ด JDK1.4๋ณด๋‹ค ํ•˜์œ„ ๋ฒ„์ „์„ ์‚ฌ
Legacy JDK          ์šฉํ•˜๊ณ  ๋‹น์‹ ์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„œ๋ฒ„๊ฐ€ ์ด๋Ÿฐ                        JTA 1.0.1a
                                                                 http://java.sun.com/products/jta/
Support             JARํŒŒ์ผ์„ ์ œ๊ณตํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด ๋‹น์‹ ์€ ์ด๋Ÿฐ
                                                                 Xerces 2.4.0
                    ์˜ต์…˜ ํŒจํ‚ค์ง€๊ฐ€ ํ•„์š”ํ• ๊ฒƒ์ด๋‹ค.                              http://xml.apache.org/xerces2-j/

                    ๋‹น์‹ ์ด iBATIS์˜ ์˜ˆ์ „๋ฒ„์ „ DAO(1.x)ํ”„๋ ˆ                  iBATIS DAO 1.3.1
                    ์ž„์›Œํฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๊ฑฐ๋‚˜ SQL Maps(1.x)                  http://sourceforge.net/projects/ibatisdb/
iBATIS Backward
                    ์˜ ์˜ˆ์ „๋ฒ„์ „์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค๋ฉด ์ด ๋””๋ ‰ํ† 
Compatibility
                    ๋ฆฌ์˜ JARํŒŒ์ผ์„ ๊ฐ„๋‹จํ•˜ ํฌํ•จ์‹œํ‚ด์œผ๋กœ์จ ๊ณ„
                    ์† ์ž‘์—…์„ ํ• ์ˆ˜ ์žˆ๋‹ค.
Runtime             ๋งŒ์•ฝ ๋‹น์‹ ์ด ๋Šฆ์€(lazy) ๋กœ๋”ฉ๊ณผ ์„ฑ๋Šฅ์— ๋Œ€                    CGLIB 2.0
Bytecode            ํ•ด ๊ณ ๋ คํ•˜๊ธฐ ์œ„ํ•œ CGLIB2.0 bytecode ๊ฐœ์„                http://cglib.sf.net
Enhancement         ์„ ์‚ฌ์šฉํ•˜๊ธธ ์›ํ•œ๋‹ค๋ฉด
DataSource          ๋‹น์‹ ์ด Jakarta DBCP Connection pool์„            DBCP 1.1
Implementation      ์‚ฌ์šฉํ•˜๊ธธ ์›ํ•œ๋‹ค๋ฉด                                    http://jakarta.apache.org/commons/dbcp/
Distributed         ์ค‘์•™์ง‘์ค‘์ ์ด๊ฑฐ๋‚˜ ๋ถ„์‚ฐ ์บ์Š ์ง€์›์„ ์œ„ํ•œ                        OSCache 2.0.1
Caching             OSCache๋ฅผ ์‚ฌ์šฉํ•˜๊ธธ ์›ํ•œ๋‹ค๋ฉด                           http://www.opensymphony.com/oscache/
Logging Solution    Log4J ๋กœ๊น…์„ ์‚ฌ์šฉํ•˜๊ธธ ์›ํ•œ๋‹ค๋ฉด                          Log4J 1.2.8
                                                                 http://logging.apache.org/log4j/docs/



1.x ์—์„œ ์—…๊ทธ๋ ˆ์ด๋“œํ•˜๊ธฐ
๋‹น์‹ ์€ ์—…๊ทธ๋ ˆ์ด๋“œ ํ• ๊ฒƒ์ธ๊ฐ€.?

๋งŒ์•ฝ ๋‹น์‹ ์ด ์—…๊ทธ๋ ˆ์ด๋“œ๋ฅผ ์‹œ๋„ํ•œ๋‹ค๋ฉด ๊ฒฐ์ •ํ• ์ˆ˜ ์žˆ๋Š” ๊ฐ€์žฅ ์ข‹์€ ๋ฐฉ๋ฒ•์ด๋‹ค. ์—ฌ๊ธฐ์— ๋ช‡๊ฐ€์ง€ ์—…๊ทธ๋ ˆ์ด๋“œ ์ ˆ์ฐจ๊ฐ€ ์žˆ๋‹ค.



                                                             3
1.   ๋ฒ„์ „ 2.0์€ 1.x๋ฆด๋ฆฌ์ฆˆ์™€ ๊ฑฐ์˜ ์™„๋ฒฝํ•œ ํ˜ธ์™„์„ฑ์„ ๊ฐ€์ง€๋„๋ก ์œ ์ง€๋˜์—ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋ช‡๋ช‡ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ๋Š” ๋‹จ์ˆœํžˆ JARํŒŒ์ผ๋งŒ
       ๊ต์ฒดํ•˜๋Š”๊ฒƒ์œผ๋กœ ์ถฉ๋ถ„ํ•  ๊ฒƒ์ด๋‹ค. ์ด๊ฒƒ์€ ์ตœ์†Œํ•œ์˜ ์ด๋“์„ ๋ฐœ์ƒ์‹œํ‚ค์ง€๋งŒ ๊ฐ€์žฅ ๊ฐ„๋‹จํ•˜๋‹ค. ๋‹น์‹ ์€ ๋‹น์‹ ์˜ XMLํŒŒ์ผ์ด๋‚˜
       ์ž๋ฐ”์ฝ”๋“œ๋ฅผ ๋ณ€๊ฒฝํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค. ๋ช‡๋ช‡ ๋ชจ์ˆœ๋˜๋Š”๊ฒƒ๋“ค์ด ๋ฐœ๊ฒฌ๋ ์ง€๋„ ๋ชจ๋ฅธ๋‹ค.

  2.   ๋‘๋ฒˆ์งธ๋Š” ๋‹น์‹ ์˜ XMLํŒŒ์ผ์„ 2.0์ŠคํŽ™์— ์ ํ•ฉํ•˜๋„๋ก ๋ณ€๊ฒฝํ•˜๋Š”๊ฒƒ์ด๋‹ค. ํ•˜์ง€๋งŒ ์ด๋Š” 1.x ์ž๋ฐ” API๋ฅผ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•œ๋‹ค.
       ์ ์€ ํ˜ธํ™˜์„ฑ์ด์Šˆ๋‚ด ์•ˆ์ „ํ•œ ํ•ด๊ฒฐ๋ฒ•์€ ๋งตํ•‘ํŒŒ์ผ ์‚ฌ์ด์— ๋ฐœ์ƒํ•œ๋‹ค. Ant์ž‘์—…์€ ๋‹น์‹ ์„ ์œ„ํ•ด XMLํŒŒ์ผ์„ ๋ณ€ํ™˜ํ•˜๊ธฐ ์œ„ํ•ด์„œ
       ํ”„๋ ˆ์ž„์›Œํฌ์— ํฌํ•จ๋œ๋‹ค.

  3.   ์„ธ๋ฒˆ์งธ ์˜ต์…˜์€ ๋‹น์‹ ์˜ XMLํŒŒ์ผ๊ณผ ์ž๋ฐ”์ฝ”๋“œ๋ฅผ ๋ณ€ํ™˜ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ์ž๋ฐ”์ฝ”๋“œ๋ฅผ ๋ณ€ํ™˜ํ•˜๊ธฐ ์œ„ํ•œ ํˆด์€ ์—†๋‹ค. ๊ทธ๋ž˜์„œ ์ด๊ฒƒ
       ์€ ์†์œผ๋กœ ์ง์ ‘ํ•ด์•ผ ํ•œ๋‹ค.

  4.   ๋งˆ์ง€๋ง‰ ์˜ต์…˜์€ ์ „์ฒด๋ฅผ ์—…๊ทธ๋ ˆ์ด๋“œ ํ•˜์ง€ ์•Š๋Š”๊ฒƒ์ด๋‹ค. ๋งŒ์•ฝ์— ๋‹น์‹ ์ด ์–ด๋ ต๋‹ค๊ณ  ๋Š๋‚€๋‹ค๋ฉด 1.x๋ฆด๋ฆฌ์ฆˆ์—์„œ ์‹œ์Šคํ…œ์ด ์ž‘
       ๋™ํ•˜๋Š” ๊ฒƒ์„ ๋‘๋ ค์›Œํ•˜์ง€ ๋งˆ๋ผ. ๋‹น์‹ ์˜ ์˜ค๋ž˜๋œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ทธ๋Œ€๋กœ ๋†”๋‘๋Š” ๊ฒƒ์€ ๋‚˜์œ ์ƒ๊ฐ์ด ์•„๋‹ˆ๋‹ค. ๋งŒ์•ฝ์— ์˜ค๋ž˜
       ๋œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์ธ์‹์ ์ธ ๋ฉด์—์„œ ์ œ๋Œ€๋กœ ๋ฆฌํŒฉํ† ๋ง๋˜์–ด ์žˆ๋‹ค๋ฉด ๋‹น์‹ ์€ SQL Maps๋ฅผ ์—…๊ทธ๋ ˆ์ด๋“œ ์ž˜ ํ• ์ˆ˜ ์žˆ์„๊ฒƒ์ด
       ๋‹ค.

1.x์—์„œ 2.x์œผ๋กœ XML์„ค์ •ํŒŒ์ผ ๋ณ€ํ™˜ํ•˜๊ธฐ

2.0ํ”„๋ ˆ์ž„์›Œํฌ๋Š” Ant๋นŒ๋“œ์‹œ์Šคํ…œ์„ ํ†ตํ•ด ์ˆ˜ํ–‰๋˜๋Š” XML๋ฌธ์„œ ๋ณ€ํ™˜๊ธฐ๋ฅผ ํฌํ•จํ•œ๋‹ค. ๋‹น์‹ ์˜ XML๋ฌธ์„œ๋ฅผ ๋ณ€ํ™˜ํ•˜๋Š” ๊ฒƒ์€ 1.x์ฝ”๋“œ๊ฐ€
์ž‘๋™์ค‘์— ์ž๋™์œผ๋กœ ์˜ค๋ž˜๋œ XMLํŒŒ์ผ์„ ๋ณ€ํ™˜ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ์˜ต์…˜์ ์ด๋‹ค. ์—ฌ์ „ํžˆ ๋‹น์‹ ์ด ์—…๊ทธ๋ ˆ์ด๋“œ๋ฅผ ํ•จ์œผ๋กœ์จ ํŽธ์•ˆํ•˜๊ฒŒ ๋‹น์‹ ์˜
ํŒŒ์ผ์„ ๋ณ€ํ™˜ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์€ ์ƒ๊ฐ์ด๋‹ค. ๋‹น์‹ ์€ ๋‹ค์†Œ ์ ์€ ํ˜ธํ™˜์ ์ธ ์ด์Šˆ๋ฅผ ๊ฒฝํ—˜ํ• ๊ฒƒ์ด๊ณ  ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์ค‘ ๋ช‡ ๊ฐœ์˜ ์žฅ์ ์„ ์–ป์„์ˆ˜
์žˆ์„๊ฒƒ์ด๋‹ค(๋น„๋ก ๋‹น์‹ ์ด 1.x์ž๋ฐ” API์„ ์‚ฌ์šฉํ•˜๋”๋ผ๋„.).

Ant์ž‘์—…์€ ๋‹น์‹ ์˜ build.xmlํŒŒ์ผ๋‚ด์— ๋‹ค์Œ๊ณผ ๋น„์Šทํ•˜๊ฒŒ ๋ณด์ผ๊ฒƒ์ด๋‹ค.

 <taskdef name="convertSqlMaps"
     classname="com.ibatis.db.sqlmap.upgrade.ConvertTask"
     classpathref="classpath"/>


  <target name="convert">
    <convertSqlMaps todir="D:/targetDirectory/" overwrite="true">
      <fileset dir="D/sourceDirectory/">
        <include name="**/maps/*.xml"/>
      </fileset>
    </convertSqlMaps>

  </target>


๋‹น์‹ ์ด ๋ณด๋Š”๊ฒƒ์ฒ˜๋Ÿผ ์ด๊ฒƒ์€ Ant ๋ณต์‚ฌ ์ž‘์—…๊ณผ ๊ฑฐ์˜ ๊ฐ™๊ณ  ์‚ฌ์‹ค ์ด๊ฒƒ์€ Ant๋ณต์‚ฌ ์ž‘์—…์„ ํ™•์žฅํ•œ๊ฒƒ์ด๋‹ค. ๊ทธ๋ž˜์„œ ๋‹น์‹ ์€ ๋ณต์‚ฌํ•˜๋Š”
์ž‘์—…์„ ํ•˜๋Š” ์–ด๋–ค๊ฒƒ๋„ ํ•  ์ˆ˜ ์žˆ๋‹ค.

JAR ํŒŒ์ผ๋“ค: ์˜ˆ์ „๊ฒƒ์„ ๋นผ๋‚ด๊ณ  ์ƒˆ๊ฒƒ์„ ๋„ฃ์ž.
์—…๊ทธ๋ ˆ์ด๋“œ๋ฅผ ํ•  ๋•Œ ์กด์žฌํ•˜๋Š”(์˜ˆ์ „์˜) iBATISํŒŒ์ผ๊ณผ ์˜์กด์ ์ธ ๊ฒƒ๋“ค์„ ๋ชจ๋‘ ์ง€์šฐ๊ณ  ์ƒˆ ํŒŒ์ผ์„ ๋Œ€์ฒดํ•˜๋Š”๊ฒƒ์ด ์ข‹์€ ์ƒ๊ฐ์ด๋‹ค.
์—ฌ์ „ํžˆ ํ•„์š”ํ•œ ๋‹น์‹ ์˜ ๋‹ค๋ฅธ ์ปดํฌ๋„ŒํŠธ๋˜๋Š” ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ๋ชจ๋‘ ์ง€์šฐ์ง€ ์•Š๋„๋ก ์ฃผ์˜ํ•ด๋ผ. JARํŒŒ์ผ์˜ ๋Œ€๋ถ€๋ถ„์€ ๋‹น์‹  ํ™˜๊ฒฝ์—
์˜์กด์ ์ด๋‹ค. JARํŒŒ์ผ๊ณผ ์˜์กด์ ์ธ๊ฒƒ์— ๋Œ€ํ•ด์„œ๋Š” ์œ„์—์„œ ์„œ์ˆ ๋œ ๊ฒƒ์„ ๋ณด์•„๋ผ.

๋‹ค์Œ์˜ ํ…Œ์ด๋ธ”์€ ์˜ˆ์ „ ํŒŒ์ผ๊ณผ ์ƒˆ ํŒŒ์ผ์„ ๋ชฉ๋กํ™” ํ•œ๋‹ค.




Old Files                                    New Files




                                                 4
ibatis-common.jar (ํ•„์ˆ˜)
 ibatis-db.jar                                ibatis-sqlmap.jar (ํ•„์ˆ˜)
 1.2.9b ๋ฒ„์ „์—์„œ๋ถ€ํ„ฐ ์ด ํŒŒ์ผ์€ ๋‹ค์Œ์˜ 3๊ฐœ์˜ ํŒŒ์ผ๋กœ              ibatis-dao.jar (DAOํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๊ฒƒ์— ๋”ฐ
 ๋ถ„๋ฆฌ๋˜์—ˆ๋‹ค.                                       ๋ผ ์˜ต์…˜)
 ibatis-common.jar
 ibatis-dao.jar
 ibatis-sqlmap.jar

                                              commons-logging-1-0-3.jar (ํ•„์ˆ˜)
 commons-logging.jar                          commons-collections-2-1.jar (์˜ต์…˜)
 commons-logging-api.jar                      commons-dbcp-1-1.jar (์˜ต์…˜)
 commons-collections.jar                      commons-pool-1-1.jar (์˜ต์…˜)
 commons-dbcp.jar                             oscache-2-0-1.jar (์˜ต์…˜)
 commons-pool.jar                             jta-1-0-1a.jar (์˜ต์…˜)
 oscache.jar                                  jdbc2_0-stdext.jar (์˜ต์…˜)
 jta.jar                                      xercesImpl-2-4-0.jar (์˜ต์…˜)
 jdbc2_0-stdext.jar                           xmlParserAPIs-2-4-0.jar (์˜ต์…˜)
 xercesImpl.jar                               xalan-2-5-2.jar (์˜ต์…˜)
 xmlParserAPIs.jar                            log4j-1.2.8.jar (์˜ต์…˜)
 jdom.jar                                     cglib-full-2-0-rc2.jar (์˜ต์…˜)


                     ์ด ๊ฐ€์ด๋“œ์˜ ๋‚˜๋จธ์ง€๋Š” ๋‹น์‹ ์ด SQL Maps๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๊ฒƒ์— ๋Œ€ํ•ด ์†Œ๊ฐœํ• ๊ฒƒ์ด๋‹ค.



SQL Map XML์„ค์ •ํŒŒ์ผ

(http://ibatis.apache.org/dtd/sql-map-config-2.dtd)

SQL Maps๋Š” ๋ฐ์ดํ„ฐ์†Œ์Šค, ๋ฐ์ดํ„ฐ ๋งตํผ์— ๋Œ€ํ•œ ์„ค์ •, ์“ฐ๋ ˆ๋“œ ๊ด€๋ฆฌ์™€ ๊ฐ™์€ SQL Maps์™€ ๋‹ค๋ฅธ ์˜ต์…˜์— ๋Œ€ํ•œ ์„ค์ •์„ ์ œ๊ณตํ•˜๋Š” ์ค‘
์•™์ง‘์ค‘์ ์ธ XML์„ค์ • ํŒŒ์ผ์„ ์‚ฌ์šฉํ•ด์„œ ์„ค์ •๋œ๋‹ค. ๋‹ค์Œ์€ SQL Maps์„ค์ •ํŒŒ์ผ์˜ ์˜ˆ์ด๋‹ค.

SqlMapConfig.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE sqlMapConfig
  PUBLIC "-//ibatis.apache.org//DTD SQL Map Config 2.0//EN"
  "http://ibatis.apache.org/dtd/sql-map-config-2.dtd">

<!--๋‹ค์Œ์€ ์ •ํ™•ํ•œ XMLํ—ค๋”๋ฅผ ์œ„ํ•œ ํ•„์ˆ˜๊ฐ’์ด๋‹ค. -->
<sqlMapConfig>

 <!--์—ฌ๊ธฐ์„œ ๋ช…์‹œ๋œ ํŒŒ์ผ๋‚ด ํ”„๋ผํผํ‹ฐ(name=value)๋Š” ์ด ์„ค์ •ํŒŒ์ผ๋‚ด ๊ณ ์ •์ž(placeholder)์— ์˜ํ•ด ์‚ฌ์šฉ๋ ์ˆ˜ ์žˆ๋‹ค. (์ด๋ฅผํ…Œ
     ๋ฉด. โ€œ${driver}โ€. ์ด ํŒŒ์ผ์€ ํด๋ž˜์ŠคํŒจ์Šค์— ์ƒ๋Œ€์ ์ด๊ณ  ์„ ํƒ์ ์ธ ์‚ฌํ•ญ์ด๋‹ค. -->
 <properties resource=" examples/sqlmap/maps/SqlMapConfigExample.properties " />

 <!--์ด ์…‹ํŒ…์€ ๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์œผ๋กœ๋Š” ํŠธ๋žœ์žญ์…˜ ๊ด€๋ฆฌ๋ฅผ ํ•˜๋ฉฐ SqlMapClient์„ค์ • ์ƒ์„ธ๋ฅผ ์ œ์–ดํ•œ๋‹ค. ์ด๊ฒƒ๋“ค์€ ๋ชจ๋‘ ์„ ํƒ์ ์ด๋‹ค. -->


 <settings
  cacheModelsEnabled="true"
  enhancementEnabled="true"
  lazyLoadingEnabled="true"
  maxRequests="128"
  maxSessions="10"
  maxTransactions="5"
  useStatementNamespaces="false"

 />




                                                  5
<!--๊ธด ์ „์ฒด ๊ฒฝ๋กœ๋ฅผ ํฌํ•จํ•œ ํด๋ž˜์Šค๋ช…์„ ์œ„ํ•œ ์ข€๋” ์งง์€ ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ ๋ณ„์นญ์„ ํƒ€์ดํ•‘ํ•œ๋‹ค. -->
<typeAlias alias="order" type="testdomain.Order"/>

<!--SimpleDataSource ๋ฅผ ์ด์šฉํ•œ SQL Map๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ ๋ฐ์ดํ„ฐ์†Œ์Šค ์„ค์ •.
์œ„ ์ž์›์œผ๋กœ ๋ถ€ํ„ฐ ํ”„๋ผํผํ‹ฐ ์‚ฌ์šฉ์— ์ฃผ์˜ํ• . -->

<transactionManager type="JDBC" >
 <dataSource type="SIMPLE">
  <property name="JDBC.Driver" value="${driver}"/>
  <property name="JDBC.ConnectionURL" value="${url}"/>
  <property name="JDBC.Username" value="${username}"/>
  <property name="JDBC.Password" value="${password}"/>
  <property name="JDBC.DefaultAutoCommit" value="true" />
  <property name="Pool.MaximumActiveConnections" value="10"/>
  <property name="Pool.MaximumIdleConnections" value="5"/>
  <property name="Pool.MaximumCheckoutTime" value="120000"/>
  <property name="Pool.TimeToWait" value="500"/>
  <property name="Pool.PingQuery" value="select 1 from ACCOUNT"/>
  <property name="Pool.PingEnabled" value="false"/>
  <property name="Pool.PingConnectionsOlderThan" value="1"/>
  <property name="Pool.PingConnectionsNotUsedFor" value="1"/>

 </dataSource>
</transactionManager>


<!--์ด SQL map์— ์˜ํ•ด ๋กœ๋“œ๋˜๋Š” ๋ชจ๋“  SQL MapํŒŒ์ผ์„ ์ธ์‹ํ•œ๋‹ค. ๊ฒฝ๋กœ๋Š” ํด๋ž˜์ŠคํŒจ์Šค์— ์ƒ๋Œ€์ ์ด๋‹ค. -->

<sqlMap resource="examples/sqlmap/maps/Person.xml" />

</sqlMapConfig>

์ด ๋ฌธ์„œ์˜ ๋‹ค์Œ ๋ถ€๋ถ„์€ SQL Maps์„ค์ •ํŒŒ์ผ์˜ ๋‹ค์–‘ํ•œ ๋ถ€๋ถ„์„ ๋…ผ์˜ํ•œ๋‹ค.

<properties> ์š”์†Œ

SQL Maps์€ SQL Maps XML์„ค์ •ํŒŒ์ผ๊ณผ ํ•จ๊ป˜ ์†ํ•˜๋Š” ํ‘œ์ค€์ ์ธ ์ž๋ฐ” ์†์„ฑํŒŒ์ผ(name=value)์„ ์ง€์ •ํ•˜๋Š” ํ•˜๋‚˜์˜ <properties>
์š”์†Œ๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋ ‡๊ฒŒ ํ•จ์œผ๋กœ์จ ์†์„ฑํŒŒ์ผ๋‚ด์— ๊ฐ๊ฐ์˜ ์ด๋ฆ„์ง€์–ด์ง„ ๊ฐ’๋“ค์€ SQL Maps์„ค์ •ํŒŒ์ผ๋‚ด์— ์ฐธ์กฐ๋ ์ˆ˜ ์žˆ๋Š” ๋ณ€์ˆ˜
๊ฐ€ ๋ ์ˆ˜ ์žˆ๊ณ  ๋ชจ๋“  SQL Maps๋Š” ๋‚ด๋ถ€์—์„œ ์ฐธ์กฐ๋œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด ์†์„ฑํŒŒ์ผ์ด ๋‹ค์Œ์„ ํฌํ•จํ•œ๋‹ค๋ฉด

      driver=org.hsqldb.jdbcDriver

๊ทธ๋Ÿฌ๋ฉด SQL Maps์„ค์ •ํŒŒ์ผ๋˜๋Š” ์„ค์ •๋ฌธ์„œ์— ์˜ํ•ด ์ฐธ์กฐ๋˜๋Š” ๊ฐ๊ฐ์˜ SQL Maps๋Š” ${driver} ํ˜•ํƒœ๋กœ ์‚ฌ์šฉ๊ฐ€๋Šฅํ•˜๊ณ 
org.hsqldb.jdbcDriver๋ผ๋Š” ๊ฐ’์ด ์ฐธ์กฐ๋œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด

      <property name="JDBC.Driver" value="${driver}"/>

์ด๊ฒƒ์€ ๋นŒ๋“œ๋˜๊ฑฐ๋‚˜ ํ…Œ์ŠคํŠธ ๊ทธ๋ฆฌ๊ณ  ๋ฐฐ์น˜๋˜๋Š” ๋™์•ˆ ํŽธ๋ฆฌํ•˜๊ฒŒ ๋œ๋‹ค. ์ด๊ฒƒ์€ ๋‹ค์ค‘ ํ™˜๊ฒฝ์ด๋‚˜ ์„ค์ •ํŒŒ์ผ์„ ์œ„ํ•œ ์ž๋™ํ™”ํˆด์„ ์‚ฌ์šฉํ•˜
๋Š” ๋‹น์‹ ์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‰ฝ๊ฒŒ ์ธ์‹ํ•˜๋„๋ก ํ•œ๋‹ค. ํ”„๋ผํผํ‹ฐ๋Š” ํด๋ž˜์ŠคํŒจ์Šค๋‚˜ ์–ด๋–ค ์œ ํšจํ•œ URL๋กœ๋ถ€ํ„ฐ ๋กœ๋“œ๋ ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค
๋ฉด ๊ณ ์ •๋œ ํŒŒ์ผ๊ฒฝ๋กœ๋ฅผ ์œ„ํ•ด ๋‹ค์Œ์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•œ๋‹ค.

      <properties url=โ€file:///c:/config/my.propertiesโ€ />


<settings> ์š”์†Œ

<settings> ์š”์†Œ๋Š” XMLํŒŒ์ผ์„ ๋นŒ๋“œํ•˜๋Š” SqlMapClient ์ธ์Šคํ„ด์Šค๋ฅผ ์œ„ํ•ด ๋‹ค์–‘ํ•œ ์˜ต์…˜๊ณผ ์ตœ์ ํ™”๋ฅผ ์„ค์ •ํ•˜๋„๋ก ํ•œ๋‹ค. setting์š”
์†Œ์™€ ๊ทธ๊ฒƒ์˜ ๋ชจ๋“  ์†์„ฑ๊ฐ’์€ ๋ชจ๋‘ ์˜ต์…˜์ ์ด๋‹ค. ์ œ๊ณต๋˜๋Š” ์†์„ฑ๊ฐ’๊ณผ ๊ทธ๊ฒƒ๋“ค์˜ ๋‹ค์–‘ํ•œ ํ–‰์œ„๋Š” ๋‹ค์Œ์˜ ํ…Œ์ด๋ธ”์—์„œ ์„œ์ˆ ๋œ๋‹ค.

maxRequests                      ์ด๊ฒƒ์€ ํ•œ๊บผ๋ฒˆ์— SQL๋ฌธ์„ ์ˆ˜ํ–‰ํ• ์ˆ˜ ์žˆ๋Š” ์“ฐ๋ ˆ๋“œ์˜ ์ˆ˜์ด๋‹ค. ์…‹ํŒ…๊ฐ’๋ณด๋‹ค ๋งŽ



                                                             6
์€ ์“ฐ๋ ˆ๋“œ๋Š” ๋‹ค๋ฅธ ์“ฐ๋ ˆ๋“œ๊ฐ€ ์ˆ˜ํ–‰์„ ์™„๋ฃŒํ• ๋•Œ๊นŒ์ง€ ๋ธ”๋ก๋œ๋‹ค. ๋‹ค๋ฅธ DBMS๋Š”
                         ๋‹ค๋ฅธ ์ œํ•œ์„ ๊ฐ€์ง„๋‹ค. ์ด๊ฒƒ์€ ์ตœ์†Œํ•œ 10๊ฐœ์˜ maxTransactions์ด๊ณ  ์–ธ์ œ๋‚˜
                         maxSessions๊ณผ maxTransactions๋ณด๋‹ค ํฌ๋‹ค. ์ข…์ข… ๋™์‹œ์š”์ฒญ๊ฐ’์˜ ์ตœ๋Œ€์น˜๋ฅผ
                         ์ค„์ด๋ฉด ์„ฑ๋Šฅํ–ฅ์ƒ์„ ๋ณด์—ฌ์ค€๋‹ค.

                         ์˜ˆ:
                         maxRequests=โ€256โ€
                         Default: 512
maxSessions              ์ด๊ฒƒ์€ ์ฃผ์–ด์ง„ ์‹œ๊ฐ„๋™์•ˆ ํ™œ์„ฑ๋ ์ˆ˜ ์žˆ๋Š” ์„ธ์…˜์˜ ์ˆ˜์ด๋‹ค. ์„ธ์…˜์€ ๋ช…์‹œ์ ์œผ๋กœ
                         ์ฃผ์–ด์งˆ์ˆ˜๋„ ์žˆ๊ณ  ํ”„๋กœ๊ทธ๋žจ์ ์œผ๋กœ ์š”์ฒญ๋ ์ˆ˜๋„ ์žˆ๊ณ  ์“ฐ๋ ˆ๋“œ๊ฐ€ SqlMapClient
                         ์ธ์Šคํ„ด์Šค๋ฅผ ์‚ฌ์šฉํ• ๋•Œ๋งˆ๋‹ค ์ž๋™์ ์œผ๋กœ ์ƒ์„ฑ๋ ์ˆ˜๋„ ์žˆ๋‹ค. ์ด๊ฒƒ์€ ์–ธ์ œ๋‚˜
                         maxTransaction๋ณด๋‹ค ๊ฐ™๊ฑฐ๋‚˜ ์ปค์•ผ ํ•˜๊ณ  maxRequests๋ณด๋‹ค ์ž‘์•„์•ผ ํ•œ๋‹ค. ๋™
                         ์‹œ์„ธ์…˜๊ฐ’์˜ ์ตœ๋Œ€์น˜๋ฅผ ์ค„์ด๋ฉด ์ „์ฒด์ ์ธ ๋ฉ”๋ชจ๋ฆฌ์‚ฌ์šฉ๋Ÿ‰์„ ์ค„์ผ์ˆ˜ ์žˆ๋‹ค.

                         ์˜ˆ:
                         maxSessions=โ€64โ€
                         Default: 128

maxTransactions          ์ด๊ฒƒ์€ ํ•œ๊บผ๋ฒˆ์— SqlMapClient.startTransaction()์— ๋“ค์–ด๊ฐˆ์ˆ˜ ์žˆ๋Š” ์“ฐ๋ ˆ๋“œ
                         ์˜ ์ตœ๋Œ€๊ฐฏ์ˆ˜์ด๋‹ค. ์…‹ํŒ…๊ฐ’๋ณด๋‹ค ๋งŽ์€ ์“ฐ๋ ˆ๋“œ๋Š” ๋‹ค๋ฅธ ์“ฐ๋ ˆ๋“œ๊ฐ€ ๋‚˜์˜ฌ๋•Œ๊นŒ์ง€ ๋ธ”
                         ๋ก๋œ๋‹ค. ๋‹ค๋ฅธ DBMS๋Š” ๋‹ค๋ฅธ ์ œํ•œ์„ ๊ฐ€์ง„๋‹ค. ์ด ๊ฐ’์€ ์–ธ์ œ๋‚˜ maxSessions๋ณด
                         ๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์•„์•ผ ํ•˜๊ณ  maxRequests๋ณด๋‹ค ์ž‘์•„์•ผ ํ•œ๋‹ค. ์ข…์ข… ๋™์‹œํŠธ๋žœ์žญ์…˜
                         ์˜ ์ตœ๋Œ€์น˜๋ฅผ ์ค„์ด๋ฉด ์„ฑ๋Šฅํ–ฅ์ƒ์„ ๋ณด์—ฌ์ค€๋‹ค.

                         ์˜ˆ:
                         maxTransactions=โ€16โ€
                         Default: 32

cacheModelsEnabled       ์ด ์…‹ํŒ…์€ SqlMapClient ๋ฅผ ์œ„ํ•œ ๋ชจ๋“  ์บ์‰ฌ๋ชจ๋ธ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๊ฑฐ๋‚˜ ๊ฐ€๋Šฅํ•˜
                         ์ง€ ์•Š๊ฒŒ ํ•œ๋‹ค. ์ด๊ฒƒ์€ ๋””๋ฒ„๊น…์‹œ ๋„์›€์ด ๋œ๋‹ค.

                         ์˜ˆ:
                         cacheModelsEnabled=โ€trueโ€
                         Default: true (enabled)

lazyLoadingEnabled       ์ด ์…‹ํŒ…์€ SqlMapClient ๋ฅผ ์œ„ํ•œ ๋ชจ๋“  ๋Šฆ์€(lazy)๋กœ๋”ฉ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๊ฑฐ๋‚˜ ๊ฐ€
                         ๋Šฅํ•˜์ง€ ์•Š๊ฒŒ ํ•œ๋‹ค. ์ด๊ฒƒ์€ ๋””๋ฒ„๊น…์‹œ ๋„์›€์ด ๋œ๋‹ค.

                         ์˜ˆ:
                         lazyLoadingEnabled=โ€trueโ€
                         Default: true (enabled)

enhancementEnabled       ์ด ์…‹ํŒ…์€ ํ–ฅ์ƒ๋œ ๋Šฆ์€(lazy)๋กœ๋”ฉ์ฒ˜๋Ÿผ ์ตœ์ ํ™”๋œ ์ž๋ฐ”๋นˆ์ฆˆ ์†์„ฑ ์ ‘๊ทผ์„ ์œ„
                         ํ•ด ๋Ÿฐํƒ€์ž„์‹œ ๋ฐ”์ดํŠธ์ฝ”๋“œ ํ–ฅ์ƒ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•œ๋‹ค.

                         ์˜ˆ:
                         enhancementEnabled=โ€trueโ€
                         Default: false (disabled)

useStatementNamespaces   ์ด ์…‹ํŒ…์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๋ฉด ๋‹น์‹ ์€ sqlmap์ด๋ฆ„๊ณผ statement์ด๋ฆ„์œผ๋กœ ๊ตฌ์„ฑ๋œ
                         ์ „์ฒด์ ์ธ ์ด๋ฆ„(fully qualified name)์œผ๋กœ ๋งตํ•‘๋œ statement๋ฅผ ์ฐธ์กฐํ•ด์•ผ ํ•œ
                         ๋‹ค.
                         ์˜ˆ๋ฅผ ๋“ค๋ฉด: queryForObject(โ€œsqlMapName.statementNameโ€);

                         ์˜ˆ:
                         useStatementNamespaces=โ€falseโ€
                         Default: false (disabled)


<typeAlias> ์š”์†Œ


                                                7
typeAlias ์š”์†Œ๋Š” ๊ธด ์ „์ฒด ๊ฒฝ๋กœ๋ฅผ ํฌํ•จํ•œ ํด๋ž˜์Šค๋ช…์„ ์ฐธ์กฐํ•˜๊ธฐ ์œ„ํ•œ ์งง์€ ์ด๋ฆ„์„ ๋ช…์‹œํ•˜๋„๋ก ํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด

   <typeAlias alias="shortname" type="com.long.class.path.Class"/>

SQL Maps์„ค์ • ํŒŒ์ผ์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๋ฏธ๋ฆฌ ์ •์˜๋œ ๋ช‡๋ช‡ alias๊ฐ€ ์žˆ๋‹ค. ๊ทธ๊ฒƒ๋“ค์€

Transaction Manager Aliases
JDBC          com.ibatis.sqlmap.engine.transaction.jdbc.JdbcTransactionConfig
JTA           com.ibatis.sqlmap.engine.transaction.jta.JtaTransactionConfig
EXTERNAL      com.ibatis.sqlmap.engine.transaction.external.ExternalTransactionConfig
Data Source Factory Aliases
SIMPLE        com.ibatis.sqlmap.engine.datasource.SimpleDataSourceFactory
DBCP          com.ibatis.sqlmap.engine.datasource.DbcpDataSourceFactory
JNDI          com.ibatis.sqlmap.engine.datasource.JndiDataSourceFactory

<transactionManager> ์š”์†Œ

1.0 ๋ณ€ํ™˜๋…ธํŠธ: SQL Maps 1.0์€ ๋‹ค์ค‘์˜ ๋ฐ์ดํ„ฐ์†Œ์Šค ์„ค์ •์„ ํ—ˆ๋ฝํ–ˆ๋‹ค. ์ด๊ฒƒ์€ ๋‹ค๋ฃจ๊ธฐ ์–ด๋ ต๊ณ  ๋ช‡๊ฐ€์ง€ ๋‚˜์œ ์˜ˆ์ œ๋ฅผ ์†Œ๊ฐœํ–ˆ๋‹ค. ๊ทธ
๋Ÿฌ๋ฏ€๋กœ 2.0์—์„œ๋Š” ์˜ค์ง ํ•˜๋‚˜์˜ ๋ฐ์ดํ„ฐ์†Œ์Šค๋งŒ์„ ํ—ˆ๋ฝํ•œ๋‹ค. ๋‹ค์ค‘์˜ ๋ฐฐ์น˜/์„ค์ •์„ ์œ„ํ•ด์„œ๋Š” ์‹œ์Šคํ…œ์— ์˜ํ•ด ๋‹ค๋ฅด๊ฒŒ ์„ค์ •๋˜๊ฑฐ๋‚˜
SQL Maps๋ฅผ ๋นŒ๋“œํ•  ๋•Œ ํŒŒ๋ผ๋ฏธํ„ฐ์ฒ˜๋Ÿผ ์ „๋‹ฌ๋˜๋Š” ๋‹ค์ค‘์†์„ฑํŒŒ์ผ์ด ์ถ”์ฒœ๋œ๋‹ค.

<transactionManager> ์š”์†Œ๋Š” ๋‹น์‹ ์ด SQL Maps๋ฅผ ์œ„ํ•œ ํŠธ๋žœ์žญ์…˜ ๊ด€๋ฆฌ๋ฅผ ์„ค์ •ํ•˜๋„๋ก ํ•œ๋‹ค. type ์†์„ฑ๊ฐ’์€ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ
ํŠธ๋žœ์žญ์…˜ ๊ด€๋ฆฌ์ž๋ฅผ ํ‘œ์‹œํ•œ๋‹ค. ๊ทธ ๊ฐ’์€ ํด๋ž˜์Šค๋ช…์ด๊ฑฐ๋‚˜ ํƒ€์ž… alias์ผ์ˆ˜ ์žˆ๋‹ค. 3๊ฐœ์˜ ํŠธ๋žœ์žญ์…˜ ๊ด€๋ฆฌ์ž๋Š” JDBC, JTA ๊ทธ๋ฆฌ๊ณ 
EXTERNAL ์ค‘์— ํ•˜๋‚˜๋กœ ํ‘œ์‹œํ• ์ˆ˜ ์žˆ๋‹ค.

       JDBC โ€“ Connection commit()๊ณผ rollback()๋ฉ”์†Œ๋“œ๋ฅผ ํ†ตํ•ด ํŠธ๋žœ์žญ์…˜๋ฅผ ์ œ์–ดํ•˜๊ธฐ ์œ„ํ•œ JDBC๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋œ๋‹ค.

       JTA โ€“ ์ด ํŠธ๋žœ์žญ์…˜๊ด€๋ฆฌ์ž๋Š” SQL Maps๊ฐ€ ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋‚˜ ํŠธ๋žœ์žญ์…˜ ์ž์›์„ ํฌํ•จํ•˜๋Š” ๋”์šฑ๋” ๋„“์€ ๋ฒ”์œ„์˜ ํŠธ๋žœ
       ์žญ์…˜์„ ํฌํ•จํ•˜๋„๋ก ํ•˜๋Š” JTA์ „์—ญํŠธ๋žœ์žญ์…˜๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ์ด ์„ค์ •์€ JNDI์ž์›์œผ๋กœ๋ถ€ํ„ฐ ์‚ฌ์šฉ์ž ํŠธ๋žœ์žญ์…˜์„ ์œ„์น˜์‹œํ‚ค๊ธฐ
       ์œ„ํ•œ UserTransaction ์†์„ฑ๊ฐ’์„ ์š”๊ตฌํ•œ๋‹ค. JNDI๋ฐ์ดํ„ฐ์†Œ์Šค์˜ˆ์ œ๋Š” ๋‹ค์Œ์˜ ์„ค์ •์˜ˆ์ œ์—์„œ ๋ณด๋ผ.

       EXTERNAL โ€“ ์ด๊ฒƒ์€ ๋‹น์‹  ์ž์‹ ์ด ํŠธ๋žœ์žญ์…˜์„ ๊ด€๋ฆฌํ•˜๋„๋ก ํ•œ๋‹ค. ๋‹น์‹ ์€ ์—ฌ์ „ํžˆ ๋ฐ์ดํ„ฐ์†Œ์Šค๋ฅผ ์„ค์ •ํ• ์ˆ˜ ์žˆ์ง€๋งŒ ํ”„
       ๋ ˆ์ž„์›Œํฌ ์ƒ๋ช…์ฃผ๊ธฐ์˜ ๋ถ€๋ถ„์ฒ˜๋Ÿผ ํŠธ๋žœ์žญ์…˜์ด ์ปค๋ฐ‹๋˜๊ฑฐ๋‚˜ ๋กค๋ฐฑ๋˜์ง€ ์•Š๋Š”๋‹ค. ์ด๊ฒƒ์€ ๋‹น์‹  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ถ€๋ถ„์ด ์™ธ
       ๋ถ€์ ์œผ๋กœ SQL Maps ํŠธ๋žœ์žญ์…˜์„ ๊ด€๋ฆฌํ•ด์•ผ ํ•œ๋‹ค๋Š”๊ฒƒ์ด๋‹ค. ์ด ์…‹ํŒ…์€ ๋น„-ํŠธ๋žœ์žญ์…˜(์˜ˆ๋ฅผ ๋“ค๋ฉด ์ฝ๊ธฐ์ „์šฉ) ๋ฐ์ดํ„ฐ๋ฒ ์ด
       ์Šค์— ์œ ์šฉํ•˜๋‹ค.


<dataSource> ์š”์†Œ

ํŠธ๋žœ์žญ์…˜๊ด€๋ฆฌ์ž ์„ค์ •์˜ ํฌํ•จ๋œ ๋ถ€๋ถ„์€ dataSource ์š”์†Œ์ด๊ณ  SQL Maps๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ ๋ฐ์ดํ„ฐ์†Œ์Šค๋ฅผ ์„ค์ •ํ•˜๊ธฐ ์œ„ํ•œ ์†์„ฑ
๊ฐ’์˜ ์ง‘ํ•ฉ์ด๋‹ค. ์—ฌ๊ธฐ์—” ํ”„๋ ˆ์ž„์›Œํฌ์—์„œ ์ œ๊ณต๋˜๋Š” 3๊ฐ€์ง€ ๋ฐ์ดํ„ฐ์†Œ์Šคํƒ€์ž…์ด ์žˆ์ง€๋งŒ ๋‹น์‹ ์€ ๋‹น์‹ ๋งŒ์˜ ๋ฐ์ดํ„ฐ์†Œ์Šค๋ฅผ ์‚ฌ์šฉํ• ์ˆ˜
๋„ ์žˆ๋‹ค. ํฌํ•จ๋œ DataSourceFactory๊ตฌํ˜„์€ ๋‹ค์Œ์— ์ƒ์„ธํ•˜๊ฒŒ ๋…ผ์˜๊ฐ€ ๋ ๊ฒƒ์ด๊ณ  ๊ฐ๊ฐ์„ ์œ„ํ•ด ์ œ๊ณต๋˜๋Š” ์„ค์ •์€ ์•„๋ž˜ ์˜ˆ์ œ๋ฅผ ๋ณด
๋ผ.


       SimpleDataSourceFactory

       SimpleDataSource ๋Š” ๋ฐ์ดํ„ฐ์†Œ์Šค๋ฅผ ์ œ๊ณตํ•˜๋Š” ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ์— connection์„ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•ด ๊ธฐ๋ณธ์ ์œผ๋กœ
       ํ’€๋ง(pooling) ๋ฐ์ดํ„ฐ์†Œ์Šค ๊ตฌํ˜„์„ ์ œ๊ณตํ•œ๋‹ค. ์ด๊ฒƒ์€ iBATIS SimpleDataSource connectionํ’€๋ง์„ ๊ธฐ์ดˆ๋กœ ํ•œ๋‹ค.

       <transactionManager type="JDBC">
        <dataSource type="SIMPLE">
           <property name="JDBC.Driver" value="org.postgresql.Driver"/>
           <property name="JDBC.ConnectionURL"
                         value="jdbc:postgresql://server:5432/dbname"/>
           <property name="JDBC.Username" value="user"/>
           <property name="JDBC.Password" value="password"/>
           <!--OPTIONAL PROPERTIES BELOW -->
           <property name="Pool.MaximumActiveConnections" value="10"/>


                                                         8
<property name="Pool.MaximumIdleConnections" value="5"/>
    <property name="Pool.MaximumCheckoutTime" value="120000"/>
    <property name="Pool.TimeToWait" value="10000"/>
    <property name="Pool.PingQuery" value="select * from dual"/>
    <property name="Pool.PingEnabled" value="false"/>
    <property name="Pool.PingConnectionsOlderThan" value="0"/>
    <property name="Pool.PingConnectionsNotUsedFor" value="0"/>
 </dataSource>
</transactionManager>



DbcpDataSourceFactory

์ด ๊ตฌํ˜„๋ฌผ์€ DataSource API๋ฅผ ํ†ตํ•ด connectionํ’€๋ง์„œ๋น„์Šค๋ฅผ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•ด Jakarta DBCP (Database
Connection Pool)์„ ์‚ฌ์šฉํ•œ๋‹ค. ์ด DataSource๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜/์›น ์ปจํ…Œ์ด๋„ˆ๊ฐ€ DataSource๊ตฌํ˜„๋ฌผ์„ ์ œ๊ณตํ•˜์ง€ ๋ชป
ํ•˜๊ฑฐ๋‚˜ ๋‹น์‹ ์ด standalone์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ตฌ๋™ํ•  ๋•Œ ์ด์ƒ์ ์ด๋‹ค. DbcpDataSourceFactory ๋ฅผ ์œ„ํ•ด ๋ช…์‹œํ•ด์•ผ ํ•˜
๋Š” ์„ค์ • ํŒŒ๋ผ๋ฏธํ„ฐ์˜ ์˜ˆ์ œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

<transactionManager type="JDBC">
 <dataSource type="DBCP">
  <property name="JDBC.Driver" value="${driver}"/>
  <property name="JDBC.ConnectionURL" value="${url}"/>
  <property name="JDBC.Username" value="${username}"/>
  <property name="JDBC.Password" value="${password}"/>
  <!--OPTIONAL PROPERTIES BELOW -->
  <property name="Pool.MaximumActiveConnections" value="10"/>
  <property name="Pool.MaximumIdleConnections" value="5"/>
  <property name="Pool.MaximumWait" value="60000"/>
  <!--Use of the validation query can be problematic. If you have difficulty, try without it. -->
  <property name="Pool.ValidationQuery" value="select * from ACCOUNT"/>
  <property name="Pool.LogAbandoned" value="false"/>
  <property name="Pool.RemoveAbandoned" value="false"/>
  <property name="Pool.RemoveAbandonedTimeout" value="50000"/>
  <property name="Driver.DriverSpecificProperty" value="SomeValue"/>
 </datasource>
</transactionManager>




JndiDataSourceFactory

์ด ๊ตฌํ˜„๋ฌผ์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ปจํ…Œ์ด๋„ˆ๋‚ด JNDI์ปจํ…์ŠคํŠธ๋กœ๋ถ€ํ„ฐ DataSource๊ตฌํ˜„๋ฌผ์„ ๊ฐ€์ ธ์™€์•ผ ํ• ๊ฒƒ์ด๋‹ค. ์ด๊ฒƒ์€ ์ „ํ˜•์ 
์œผ๋กœ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„œ๋ฒ„๋ฅผ ์‚ฌ์šฉ์ค‘์ด๊ณ  ์ปจํ…Œ์ด๋„ˆ๊ด€๋ฆฌ connection pool ๊ทธ๋ฆฌ๊ณ  ์ œ๊ณต๋˜๋Š” DataSource๊ตฌํ˜„๋ฌผ์ด ์žˆ์„ ๋•Œ
์‚ฌ์šฉํ•œ๋‹ค. JDBC DataSource๊ตฌํ˜„๋ฌผ์— ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•œ ํ‘œ์ค€์ ์ธ ๋ฐฉ๋ฒ•์€ JNDI์ปจํ…์ŠคํŠธ๋ฅผ ํ†ตํ•˜๋Š”๊ฒƒ์ด๋‹ค.
JndiDataSourceFactory ๋Š” JNDI๋ฅผ ํ†ตํ•ด DataSource์— ์ ‘๊ทผํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค. ๋ฐ์ดํ„ฐ์†Œ์Šค๋‚ด์— ๋ช…์‹œ๋˜์–ด์•ผ ํ•˜๋Š”
์„ค์ • ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

<transactionManager type="JDBC" >
 <dataSource type="JNDI">
 <property name="DBJndiContext"
 value="java:comp/env/jdbc/jpetstore"/>
 </dataSource>
</transactionManager>

์œ„ ์„ค์ •์€ ์ผ๋ฐ˜์ ์ธ JDBCํŠธ๋žœ์žญ์…˜ ๊ด€๋ฆฌ์ง€๋งŒ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ž์›์„ ๊ด€๋ฆฌํ•œ๋‹ค. ๋‹น์‹ ์€ ๋‹ค์Œ์ฒ˜๋Ÿผ ์ „์—ญ(global)ํŠธ๋žœ์žญ
์…˜์„ ์„ค์ •ํ•˜๊ธธ ์›ํ• ์ˆ˜๋„ ์žˆ๋‹ค.

<transactionManager type="JTA" >
 <property name="UserTransaction" value="java:/ctx/con/UserTransaction"/>
 <dataSource type="JNDI">


                                                9
<property name="DBJndiContext"
           value="java:comp/env/jdbc/jpetstore"/>
        </dataSource>
      </transactionManager>

      UserTransaction ์ธ์Šคํ„ด์Šค๊ฐ€ ๋ฐœ๊ฒฌ๋ ์ˆ˜ ์žˆ๋Š” JNDI์œ„์น˜๋ฅผ ๊ฐ€์ง€ํ‚ค๋Š” UserTransaction ๊ฐ’์— ์ฃผ์˜ํ•˜๋ผ. ์ข€๋” ๋„“์€ ๋ฒ”์œ„
      ์˜ ํŠธ๋žœ์žญ์…˜์„ ๊ฐ€์ง€๋Š” SQL Maps๊ฐ€ ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ํŠธ๋žœ์žญ์…˜ ์ž์›์„ ํฌํ•จํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” JTAํŠธ๋žœ์žญ์…˜ ๊ด€๋ฆฌ๊ฐ€
      ์š”๊ตฌ๋œ๋‹ค.

<sqlMap> ์š”์†Œ

sqlMap ์š”์†Œ๋Š” ๋ช…์‹œ์ ์œผ๋กœ SQL Map์ด๋‚˜ ๋‹ค๋ฅธ SQL Map์„ค์ •ํŒŒ์ผ์„ ํฌํ•จํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค. SqlMapClient์ธ์Šคํ„ด์Šค์— ์˜ํ•ด ์‚ฌ
์šฉ๋˜๋Š” ๊ฐ๊ฐ์˜ SQL Map XMLํŒŒ์ผ์€ ๋ฐ˜๋“œ์‹œ ์„ ์–ธ๋˜์–ด์•ผ ํ•œ๋‹ค. SQL Map XMLํŒŒ์ผ์€ ํด๋ž˜์ŠคํŒจ์Šค๋‚˜ URL๋กœ๋ถ€ํ„ฐ ์ŠคํŠธ๋ฆผ
(stream)์ž์›์ฒ˜๋Ÿผ ๋กœ๋“œ ๋ ๊ฒƒ์ด๋‹ค. ๋‹น์‹ ์€ SQL Maps๋ฅผ ๋ช…์‹œํ•ด์•ผ ํ•œ๋‹ค. ๋‹ค์Œ์€ ๊ทธ์— ๋Œ€ํ•œ ์˜ˆ์ด๋‹ค.

       <!--CLASSPATH RESOURCES -->
       <sqlMap resource="com/ibatis/examples/sql/Customer.xml" />
       <sqlMap resource="com/ibatis/examples/sql/Account.xml" />
       <sqlMap resource="com/ibatis/examples/sql/Product.xml" />


       <!--URL RESOURCES -->
       <sqlMap url="file:///c:/config/Customer.xml " />
       <sqlMap url="file:///c:/config/Account.xml " />
       <sqlMap url="file:///c:/config/Product.xml" />


๋‹ค์Œ์˜ ๋‹ค์–‘ํ•œ ์„น๊ฒฌ์€ SQL Map XMLํŒŒ์ผ๋“ค์˜ ๊ตฌ์กฐ์— ๋Œ€ํ•ด์„œ ์„œ์ˆ ํ•œ๋‹ค.



SQL Map XML ํŒŒ์ผ ( http://ibatis.apache.org/dtd/sql-
map-config-2.dtd)

์œ„ ์˜ˆ์ œ์—์„œ ์šฐ๋ฆฌ๋Š” SQL Maps์˜ ๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ํ˜•ํƒœ๋ฅผ ๋ณด์•˜๋‹ค. SQL Map๋ฌธ์„œ ๊ตฌ์กฐ๋‚ด์— ์‚ฌ์šฉ๊ฐ€๋Šฅํ•œ ๋‹ค๋ฅธ ์˜ต์…˜์ด ์žˆ๋‹ค. ์ข€
๋” ๋งŽ์€ ๊ธฐ๋Šฅ์„ ๊ฐ€์ง€๋Š” mapped statement์˜ ์˜ˆ์ œ์ด๋‹ค.

<sqlMap id=โ€Productโ€>

      <cacheModel id=โ€productCacheโ€ type=โ€LRUโ€>
             <flushInterval hours=โ€24โ€/>
             <property name=โ€sizeโ€ value=โ€1000โ€ />
      </cacheModel>
      <typeAlias alias=โ€productโ€ type=โ€com.ibatis.example.Productโ€ />

      <parameterMap id=โ€productParamโ€ class=โ€productโ€>
         <parameter property=โ€idโ€/>
      </parameterMap>

      <resultMap id=โ€productResultโ€ class=โ€productโ€>
             <result property=โ€idโ€ column=โ€PRD_IDโ€/>
             <result property=โ€descriptionโ€ column=โ€PRD_DESCRIPTIONโ€/>
      </resultMap>

      <select id=โ€getProductโ€ parameterMap=โ€productParamโ€
          resultMap=โ€productResultโ€ cacheModel=โ€product-cacheโ€>
          select * from PRODUCT where PRD_ID = ?
      </select>

</sqlMap>


                                                 10
๋„ˆ๋ฌด ๋งŽ์€๊ฐ€.? ๋น„๋ก ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ๋‹น์‹ ์„ ์œ„ํ•ด ๋งŽ์€ ๊ฒƒ์„ ํ•˜๋”๋ผ๋„ ๊ฐ„๋‹จํ•œ select statement๋ฅผ ์œ„ํ•ด ๋„ˆ๋ฌด ๋งŽ์€ ์ถ”๊ฐ€์ ์ธ
์ž‘์—…์„ ํ•˜๋Š”๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ธ๋‹ค. ๊ฑฑ์ •ํ•˜์ง€ ๋งˆ๋ผ ๋‹ค์Œ์€ ์œ„์˜ ๊ฒƒ์˜ ์ถ•์†Œ๋ฒ„์ „์ด๋‹ค.

<sqlMap id=โ€Productโ€>

   <select id=โ€getProductโ€        parameterClass=โ€ com.ibatis.example.Productโ€
                          resultClass=โ€com.ibatis.example.Productโ€>

       select
         PRD_ID as id,
         PRD_DESCRIPTION as description

      from PRODUCT
      where PRD_ID = #id#
   </select>
</sqlMap>

์ง€๊ธˆ SQL Map์„ ํ–‰์œ„์ ์ธ ์ธก๋ฉด์—์„œ ๋ณด๋ฉด ์ด statement๋Š” ์ •ํ™•ํ•˜๊ฒŒ ๊ฐ™์ง€๋Š” ์•Š๋‹ค. ์ฆ‰ ๋ช‡๊ฐ€์ง€ ๋‹ค๋ฅธ์ ์„ ๊ฐ€์ง„๋‹ค. ๋จผ์ € ํ›„์ž์˜
statement๋Š” ์บ์‰ฌ๋ฅผ ๋ช…์‹œํ•˜์ง€ ์•Š์•„์„œ ๋งค๋ฒˆ์˜ ์š”์ฒญ์‹œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ง์ ‘ ์š”์ฒญํ•œ๋‹ค. ๋‘๋ฒˆ์งธ ํ›„์ž์˜ statement๋Š” ์•ฝ๊ฐ„์˜ ๋ถ€ํ•˜
๋ฅผ ์•ผ๊ธฐํ• ์ˆ˜ ์žˆ๋Š” ํ”„๋ ˆ์ž„์›Œํฌ์˜ ์ž๋™๋งตํ•‘๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•œ๋‹ค. ์–ด์จŒ๋“  ๋‘๊ฐ€์ง€ statement ๋ชจ๋‘ ์ž๋ฐ”์ฝ”๋“œ๋กœ๋ถ€ํ„ฐ ์ •ํ™•ํ•˜๊ฒŒ ๊ฐ™์€ ๋ฐฉ
๋ฒ•์œผ๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š์„๊ฒƒ์ด๋‹ค ๊ทธ๋ฆฌ๊ณ  ๋‹น์‹ ์€ ์ฒซ๋ฒˆ์งธ ์ข€๋” ๊ฐ„๋‹จํ•œ ์†”๋ฃจ์…˜์œผ๋กœ ์‹œ์ž‘ํ• ๊ฒƒ์ด๊ณ  ๋‚˜์ค‘์—๋Š” ํ•„์š”ํ•˜๋ฉด ์ข€๋” ํ–ฅ์ƒ๋œ ๋งต
ํ•‘์œผ๋กœ ์˜ฎ๊ฒจ๊ฐˆ๊ฒƒ์ด๋‹ค. ๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ์†”๋ฃจ์…˜์ด ๋งŽ์€ ๊ฒฝ์šฐ์— ๊ฐ€์žฅ ์ข‹์€ ์—ฐ์Šต์ด๋‹ค.

ํ•˜๋‚˜์˜ SQL Map XML ํŒŒ์ผ์€ ๋งŽ์€ ์บ์‰ฌ ๋ชจ๋ธ, ํŒŒ๋ผ๋ฏธํ„ฐ ๋งตํ•‘, result๋งตํ•‘ ๊ทธ๋ฆฌ๊ณ  statement๋ฅผ ํฌํ•จํ• ์ˆ˜ ์—†๋‹ค. ๋‹น์‹ ์˜
์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์œ„ํ•ด statement์™€ maps๋ฅผ ์‹ ์ค‘ํ•˜๊ฒŒ ๊ตฌ์„ฑํ•˜๋ผ.


๋งตํ•‘๋œ(Mapped) Statements

SQL Maps ๊ฐœ๋…์€ ๋งตํ•‘๋œ statement์— ์ง‘์ค‘ํ•œ๋‹ค. ๋งตํ•‘๋œ statement๋Š” ์–ด๋– ํ•œ SQL๋ฌธ์„ ์‚ฌ์šฉํ• ์ˆ˜๋„ ์žˆ๊ณ  ํŒŒ๋ผ๋ฏธํ„ฐ maps(input)
๊ณผ result maps(output)๋ฅผ ๊ฐ€์งˆ์ˆ˜ ์žˆ๋‹ค. ๋งŒ์•ฝ ๊ฐ„๋‹จํ•œ ๊ฒฝ์šฐ๋ผ๋ฉด ๋งตํ•‘๋œ statement๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ์™€ result๋ฅผ ์œ„ํ•œ ํด๋ž˜์Šค๋กœ ์ง์ ‘ ์„ค
์ •ํ• ์ˆ˜ ์žˆ๋‹ค. ๋งตํ•‘๋œ statement๋Š” ๋ฉ”๋ชจ๋ฆฌ๋‚ด์— ์ƒ์‚ฐ๋œ results๋ฅผ ์บ์Šํ•˜๊ธฐ ์œ„ํ•ด ์บ์‰ฌ ๋ชจ๋ธ์„ ์‚ฌ์šฉํ•˜๋„๋ก ์„ค์ •ํ• ์ˆ˜๋„ ์žˆ๋‹ค.

<statement id=โ€statementNameโ€
                [parameterClass=โ€some.class.Nameโ€]
                [resultClass=โ€some.class.Nameโ€]
                [parameterMap=โ€nameOfParameterMapโ€]
                [resultMap=โ€nameOfResultMapโ€]
                [cacheModel=โ€nameOfCacheโ€]
                >
  select * from PRODUCT where PRD_ID = [?|#propertyName#]
  order by [$simpleDynamic$]

</statement>

์œ„ statement์—์„œ [๊ด„ํ˜ธ] ๋ถ€๋ถ„์€ ์˜ต์…˜์ด๊ณ  ๋ช‡๋ช‡์˜ ๊ฒฝ์šฐ์—๋งŒ ํ˜ผํ•ฉํ•  ํ•„์š”๊ฐ€ ์žˆ๋‹ค.

<statement id=โ€insertTestProductโ€ >
   insert into PRODUCT (PRD_ID, PRD_DESCRIPTION) values (1, โ€œShih Tzuโ€)
</statement>

์œ„ ์˜ˆ์ œ๋Š” ๋ช…๋ฐฑํ•˜๊ฒŒ ๋ฐœ์ƒํ• ๊บผ ๊ฐ™์ง€๋Š” ์•Š๋‹ค. ์–ด์จŒ๋“  ์ด๊ฒƒ์€ ๋‹น์‹ ์ด ์ž„์˜์˜ SQL ๋ฌธ์„ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•ด SQL Mapํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์‚ฌ
์šฉํ•œ๋‹ค๋ฉด ์œ ์šฉํ• ์ˆ˜ ์žˆ๋‹ค. ์–ด์จŒ๋“  ์ด๊ฒƒ์€ ํŒŒ๋ผ๋ฏธํ„ฐ Maps ์™€ Result Maps์„ ์‚ฌ์šฉํ•˜๋Š” ์ž๋ฐ”๋นˆ์ฆˆ ๋งตํ•‘๊ธฐ๋Šฅ์„ ๊ณตํ†ต์ ์œผ๋กœ ์‚ฌ์šฉ
ํ• ๊ฒƒ์ด๋‹ค. ๋‹ค์Œ์˜ ๋‹ค์–‘ํ•œ ์„น์…˜์€ ๊ตฌ์กฐ์™€ ์†์„ฑ, ๊ทธ๋“ค์ด ์–ด๋–ป๊ฒŒ ๋งตํ•‘๋œ statement์— ์˜ํ–ฅ์„ ๋ผ์น˜๋Š”์ง€ ์„œ์ˆ ํ•œ๋‹ค.

Statement ํƒ€์ž…

<statement> ์š”์†Œ๋Š” ์–ด๋–ค ํƒ€์ž…์˜ SQL ๋ฌธ์„ ์‚ฌ์šฉํ• ์ˆ˜ ์žˆ๋Š” ์ผ๋ฐ˜์ ์ธ โ€œcatch allโ€ statement์ด๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ์ด๊ฒƒ์€ ์ข€๋” ๋‹ค
์–‘ํ•œ ํŠน์„ฑ์˜ statement์š”์†Œ์ค‘ ํ•˜๋‚˜๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ ์ข‹์€ ์ƒ๊ฐ์ด๋‹ค. ์ข€๋” ๋‹ค์–‘ํ•œ ํŠน์„ฑ์˜ ์š”์†Œ๋Š” ์ข€๋” ์ง๊ด€์ ์ธ XML DTD๋ฅผ
์ œ๊ณตํ•˜๊ณ  ๋•Œ๋•Œ๋กœ ์ผ๋ฐ˜์ ์ธ <statement>์š”์†Œ๊ฐ€ ์ œ๊ณตํ•˜์ง€ ์•Š๋Š” ์ถ”๊ฐ€์ ์ธ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค. ๋‹ค์Œ์˜ ํ…Œ์ด๋ธ”์€ statement์š”์†Œ



                                                  11
์™€ ๊ทธ๋“ค์ด ์ง€์›ํ•˜๋Š” ์†์„ฑ๊ณผ ๊ธฐ๋Šฅ์„ ๋ชฉ๋กํ™” ํ•œ๋‹ค.



 Statement ์š”์†Œ          ์†์„ฑ                    ํ•˜์œ„ ์š”์†Œ                 ๋ฉ”์†Œ๋“œ
 <statement>           id                    ๋ชจ๋“  ๋™์  ์š”์†Œ              insert
                       parameterClass                              update
                       resultClass                                 delete
                       parameterMap                                ๋ชจ๋“  ์ฟผ๋ฆฌ ๋ฉ”์†Œ๋“œ
                       resultMap
                       cacheModel
                       resultSetType
                       fetchSize
                       xmlResultName
                       remapResults
 <insert>              id                    ๋ชจ๋“  ๋™์  ์š”์†Œ              insert
                       parameterClass        <selectKey>           update
                       parameterMap                                delete
 <update>              id                    ๋ชจ๋“  ๋™์  ์š”์†Œ              insert
                       parameterClass                              update
                       parameterMap                                delete
 <delete>              id                    ๋ชจ๋“  ๋™์  ์š”์†Œ              insert
                       parameterClass                              update
                       parameterMap                                delete
 <select>              id                    ๋ชจ๋“  ๋™์  ์š”์†Œ              ๋ชจ๋“  ์ฟผ๋ฆฌ ๋ฉ”์†Œ๋“œ
                       parameterClass
                       resultClass
                       parameterMap
                       resultMap
                       cacheModel
                       resultSetType
                       fetchSize
                       xmlResultName
                       remapResults
 <procedure>           id                    ๋ชจ๋“  ๋™์  ์š”์†Œ              insert
                       parameterClass                              update
                       resultClass                                 delete
                       parameterMap                                ๋ชจ๋“  ์ฟผ๋ฆฌ ๋ฉ”์†Œ๋“œ
                       resultMap
                       cacheModel
                       xmlResultName
                       remapResults

The SQL

SQL ์€ map์˜ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๋ถ€๋ถ„์„ ์ฐจ์ง€ํ•œ๋‹ค. ์ด๊ฒƒ์€ ๋‹น์‹ ์˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ JDBC๋“œ๋ผ์ด๋ฒ„์— ์ ํ•ฉํ•œ ์–ด๋–ค SQL์ด ๋ ์ˆ˜ ์žˆ๋‹ค.
๋‹น์‹ ์€ ๊ฐ€๋Šฅํ•œ ์–ด๋–ค ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ• ์ˆ˜ ์žˆ๊ณ  ๋‹น์‹ ์˜ ๋“œ๋ผ์ด๋ฒ„๊ฐ€ ์ง€์›ํ•˜๋Š” ํ•œ ๋‹ค์ค‘ statement์— ์ „๋‹ฌํ• ์ˆ˜๋„ ์žˆ๋‹ค. ๋‹น์‹ ์ด ํ•˜๋‚˜
์˜ ๋ฌธ์„œ์—์„œ SQL๊ณผ XML์„ ํ˜ผํ•ฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํŠน์ˆ˜๋ฌธ์ž์˜ ์ถฉ๋Œ์ด ์ž ์žฌ์ ์œผ๋กœ ์กด์žฌํ•œ๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ ๊ณตํ†ต์ ์ธ ๊ฒƒ์€ greater-than
๊ณผ less-than ๋ฌธ์ž๋“ค์ด๋‹ค.(<>). ์ด๊ฒƒ๋“ค์€ SQL๋ฌธ์—์„œ ๊ณตํ†ต์ ์œผ๋กœ ์š”๊ตฌ๋˜๊ณ  XML์—์„œ๋Š” ์˜ˆ์•ฝ์–ด์ด๋‹ค. ๋‹น์‹ ์˜ SQL๋ฌธ์— ๋“ค์–ด๊ฐˆ ํ•„
์š”๊ฐ€ ์žˆ๋Š” ํŠน์ˆ˜ XML๋ฌธ์ž๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ๊ฐ„๋‹จํ•œ ํ•ด๊ฒฐ๋ฒ•์ด ์žˆ๋‹ค. ํ‘œ์ค€์ ์ธ XML CDATA ์„น์…˜์„ ์‚ฌ์šฉํ•จ์œผ๋กœ์จ ํŠน์ˆ˜๋ฌธ์ž์˜ ์–ด
๋–ค๊ฒƒ๋„ ํŒŒ์‹ฑ๋˜์ง€ ์•Š๊ณ  ๋ฌธ์ œ๋Š” ํ•ด๊ฒฐ๋œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด

<statement id="getPersonsByAge" parameterClass=โ€intโ€ resultClass="examples.domain.Person">
    <![CDATA[
       SELECT *
       FROM PERSON
       WHERE AGE > #value#

    ]]>
</statement>


                                                12
์ž๋™ ์ƒ์„ฑ ํ‚ค

๋งŽ์€ ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์‹œ์Šคํ…œ์€ ๊ธฐ๋ณธํ‚ค(primay key)ํ•„๋“œ์˜ ์ž๋™์ƒ์„ฑ์„ ์ง€์›ํ•œ๋‹ค. ์ด RDBMS์˜ ๊ธฐ๋Šฅ์€ ์ข…์ข… ํŠน์ •์—…์ฒด์—
์ข…์†๋œ๋‹ค. SQL Map์€ <insert>์š”์†Œ์˜ <selectKey>๋ฅผ ํ†ตํ•ด ์ž๋™์ƒ์„ฑํ‚ค๋ฅผ ์ง€์›ํ•œ๋‹ค. ์„ ์ƒ์„ฑํ‚ค(pre-generated - ์ด๋ฅผ ํ…Œ๋ฉด ์˜ค
๋ผํด)๊ณผ ํ›„์ƒ์„ฑํ‚ค(post-generated - ์ด๋ฅผ ํ…Œ๋ฉด MS-SQL ์„œ๋ฒ„) ๋ชจ๋‘ ์ง€์›ํ•œ๋‹ค. ์—ฌ๊ธฐ์— ๊ทธ ์˜ˆ์ œ๊ฐ€ ์žˆ๋‹ค.

<!โ€”Oracle SEQUENCE Example -->
<insert id="insertProduct-ORACLE" parameterClass="com.domain.Product">
  <selectKey resultClass="int">
        SELECT STOCKIDSEQUENCE.NEXTVAL AS ID FROM DUAL
  </selectKey>
  insert into PRODUCT (PRD_ID,PRD_DESCRIPTION)
  values (#id#,#description#)

</insert>

<!โ€” Microsoft SQL Server IDENTITY Column Example -->
<insert id="insertProduct-MS-SQL" parameterClass="com.domain.Product">
  insert into PRODUCT (PRD_DESCRIPTION) values (#description#)
  <selectKey resultClass="int">
    SELECT @@IDENTITY AS ID
  </selectKey>
</insert>

์ €์žฅ ํ”„๋กœ์‹œ์ €

์ €์žฅ ํ”„๋กœ์‹œ์ €๋Š” <procedure> statement์š”์†Œ๋ฅผ ํ†ตํ•ด ์ง€์›๋œ๋‹ค. ์ €์žฅ ํ”„๋กœ์‹œ์ €๋ฅผ ์ถœ๋ ฅ๋ฌผ ํŒŒ๋ผ๋ฏธํ„ฐ์™€ ํ•จ๊ป˜ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•˜
๋Š”์ง€ ๋‹ค์Œ ์˜ˆ์ œ์—์„œ ๋ณด์—ฌ์ค€๋‹ค.

<parameterMap id="swapParameters" class="map" >
 <parameter property="email1" jdbcType="VARCHAR" javaType="java.lang.String" mode="INOUT"/>
 <parameter property="email2" jdbcType="VARCHAR" javaType="java.lang.String"
mode="INOUT"/>

</parameterMap>



<procedure id="swapEmailAddresses" parameterMap="swapParameters" >
 {call swap_email_address (?, ?)}

</procedure>

์œ„์ฒ˜๋Ÿผ ํ”„๋กœ์‹œ์ €๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ์€ ํŒŒ๋ผ๋ฏธํ„ฐ ๊ฐ์ฒด(map)๋‚ด์—์„œ ๋‘๊ฐœ์˜ ์นผ๋Ÿผ์‚ฌ์ด์— ๋‘๊ฐœ์˜ ์ด๋ฉ”์ผ์ฃผ์†Œ๋ฅผ ๊ต์ฒดํ•˜๋Š”๊ฒƒ์ด๋‹ค. ํŒŒ
๋ผ๋ฏธํ„ฐ ๊ฐ์ฒด๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ ๋งตํ•‘์˜ mode์†์„ฑ๊ฐ’์ด โ€œINOUTโ€๋˜๋Š” โ€œOUTโ€์ผ ๊ฒฝ์šฐ์—๋งŒ ๋ณ€๊ฒฝ๋œ๋‹ค. ๋‹ค๋ฅธ ๊ฒฝ์šฐ๋ผ๋ฉด ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๊ณ  ๋‚จ๋Š”
๋‹ค. ๋ช…๋ฐฑํ•œ ๋ถˆ๋ณ€์˜ ํŒŒ๋ผ๋ฏธํ„ฐ ๊ฐ์ฒด(์ด๋ฅผ ํ…Œ๋ฉด String)๋Š” ๋ณ€๊ฒฝํ• ์ˆ˜ ์—†๋‹ค.

์ฃผ์˜! ์–ธ์ œ๋‚˜ ํ‘œ์ค€์ ์ธ JDBC์ €์žฅ ํ”„๋กœ์‹œ์ €๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ํ•˜๋ผ. ์ข€๋” ๋‹ค์–‘ํ•œ ์ •๋ณด๋ฅผ ๋ณด๊ธฐ ์œ„ํ•ด์„œ๋Š” JDBC CallableStatement๋ฌธ
์„œ๋ฅผ ๋ณด๋ผ.



parameterClass

parameterClass ์†์„ฑ๊ฐ’์€ ์ž๋ฐ”ํด๋ž˜์Šค์˜ ์ „์ฒด๊ฒฝ๋กœ๋ฅผ ํฌํ•จ(์˜ˆ๋ฅผ ๋“ค๋ฉด ํŒจํ‚ค์ง€๋ฅผ ํฌํ•จํ•œ)ํ•œ ์ด๋ฆ„์ด๋‹ค. parameterClass ์†์„ฑ์€ ์˜ต
์…˜์ด์ง€๋งŒ ์‚ฌ์šฉ์ด ๊ต‰์žฅํžˆ ์ถ”์ฒœ๋˜๋Š” ๊ฒƒ์ด๋‹ค. ์ด๊ฒƒ์€ ํ”„๋ ˆ์ž„์›Œํฌ ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚ค๋Š” ๋งŒํผ statement์— ์ „๋‹ฌํ•˜๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์ œ
ํ•œํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋œ๋‹ค. ๋งŒ์•ฝ ๋‹น์‹ ์ด parameterMap์„ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด parameterClass์†์„ฑ์„ ์‚ฌ์šฉํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹น์‹ ์ด
ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ „๋‹ฌํ•˜๊ธฐ ์œ„ํ•œ โ€œexamples.domain.Productโ€ ํƒ€์ž…์˜ ๊ฐ์ฒด๋ฅผ ํ—ˆ๋ฝํ•˜๊ธธ ์›ํ•œ๋‹ค๋ฉด ๋‹น์‹ ์€ ๋‹ค์Œ์ฒ˜๋Ÿผ ํ• ์ˆ˜ ์žˆ์„๊ฒƒ์ด๋‹ค.

<statement id=โ€statementNameโ€ parameterClass=โ€ examples.domain.Productโ€>


                                                13
insert into PRODUCT values (#id#, #description#, #price#)
</statement>

์ค‘์š”: ๋น„๋ก ์ด์ „๋ฒ„์ „๊ณผ์˜ ํ˜ธํ™˜์„ฑ์„ ์œ„ํ•œ ์˜ต์…˜์ด์ง€๋งŒ ์ด๊ฒƒ์€ ์–ธ์ œ๋‚˜ ํŒŒ๋ผ๋ฏธํ„ฐ ํด๋ž˜์Šค๋ฅผ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์€ ๋งค์šฐ ์ถ”์ฒœ๋˜๋Š” ์‚ฌํ•ญ
์ด๋‹ค(๋ฌผ๋ก  ์š”๊ตฌ๋˜๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ์—†๋”๋ผ๋„). ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ๋จผ์ € ํƒ€์ž…์„ ์•ˆ๋‹ค๋ฉด ์Šค์Šค๋กœ ์ตœ์ ํ™”๋Šฅ๋ ฅ์„ ๊ฐ€์ง€๊ธฐ ๋•Œ๋ฌธ์— ๋‹น์‹ ์€
ํด๋ž˜์Šค๋ฅผ ์ œ๊ณตํ•จ์œผ๋กœ์จ ์ข€๋” ๋‚˜์€ ์„ฑ๋Šฅ์„ ๋‹ฌ์„ฑํ• ์ˆ˜ ์žˆ๋‹ค.

๋ช…์‹œ๋œ parameterClass ์—†์ด ์„ ํ˜ธํ•˜๋Š” ์†์„ฑ(get/set๋ฉ”์†Œ๋“œ)์„ ๊ฐ€์ง€๋Š” ์ž๋ฐ”๋นˆ์ฆˆ๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๋ฐ›์„๊ฒƒ์ด๊ณ  ์–ด๋Š ์œ„์น˜์—์„œ
๋งค์šฐ ์œ ์šฉํ•˜๋‹ค.



parameterMap

parameterMap ์†์„ฑ๊ฐ’์€ ๋ช…์‹œ๋œ(๋ฐ‘์˜ ๊ฒฝ์šฐ์ฒ˜๋Ÿผ) parameterMap์š”์†Œ์˜ ์ด๋ฆ„์ด๋‹ค. parameterMap์†์„ฑ์€ parameterClass ์†์„ฑ
๊ณผ ์ธ๋ผ์ธ ํŒŒ๋ผ๋ฏธํ„ฐ์˜ ์ด์ต์ด ๋˜๋„๋ก ์‚ฌ์šฉ๋œ๋‹ค. XML์˜ ๊น”๋”ํ•จ๊ณผ ์ผ๊ด€์„ฑ์ด ๋‹น์‹ ์˜ ๊ฑฑ์ •์ด๊ฑฐ๋‚˜ ๋‹น์‹ ์ด ์ข€๋” ์ƒ์„ธํ•œ
parameterMap(์ด๋ฅผ ํ…Œ๋ฉด ์ €์žฅํ”„๋กœ์‹œ์ €)์ด ํ•„์š”ํ•˜๋‹ค๋ฉด ์ด๊ฒƒ์€ ์ข‹์€ ์ ‘๊ทผ๋ฒ•์ด๋‹ค.

์ฃผ์˜! ๋™์ ์œผ๋กœ ๋งตํ•‘๋œ statement๋Š” ๋‹จ์ง€ ์ธ๋ผ์ธ ํŒŒ๋ผ๋ฏธํ„ฐ๋งŒ ์ง€์›ํ•˜๊ณ  ํŒŒ๋ผ๋ฏธํ„ฐ map๊ณผ๋Š” ์ž‘๋™ํ•˜์ง€ ์•Š๋Š”๋‹ค.

parameterMap์˜ ์ƒ๊ฐ์€ JDBC PreparedStatement์˜ ๊ฐ’ ํ† ํฐ๊ณผ ๋งค์น˜๋˜๋Š” ์ •๋ ฌ๋œ ํŒŒ๋ผ๋ฏธํ„ฐ ๋ชฉ๋ก์„ ๋ช…์‹œํ•œ๋‹ค.
์˜ˆ๋ฅผ๋“ค๋ฉด:

<parameterMap id=โ€insert-product-paramโ€ class=โ€com.domain.Productโ€>
      <parameter property=โ€idโ€/>
      <parameter property=โ€descriptionโ€/>
</parameterMap>

<statement id=โ€insertProductโ€ parameterMap=โ€insert-product-paramโ€>
       insert into PRODUCT (PRD_ID, PRD_DESCRIPTION) values (?,?);
</statement>

์œ„์˜ ์˜ˆ์ œ์—์„œ, ํŒŒ๋ผ๋ฏธํ„ฐ map์€ SQL๋ฌธ์—์„œ ๊ฐ’ํ† ํฐ(โ€œ?โ€)์— ๋งค์น˜๋˜๊ณ  ์ •๋ ฌ๋˜๋Š” ๋‘๊ฐœ์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์„œ์ˆ ํ•œ๋‹ค. ๊ทธ๋ž˜์„œ ์ฒซ๋ฒˆ์งธ
โ€œ?โ€๋Š” โ€œidโ€ ์†์„ฑ๊ฐ’์— ๋Œ€์ฒด๋˜๊ณ  ๋‘๋ฒˆ์งธ๋Š” โ€œdescriptionโ€ ์†์„ฑ๊ฐ’์— ๋Œ€์ฒด๋œ๋‹ค. ํŒŒ๋ผ๋ฏธํ„ฐ map๊ณผ ๊ทธ๋“ค์˜ ์˜ต์…˜์€ ์ด ๋ฌธ์„œ ๋‚˜์ค‘์— ์ข€
๋” ๋‹ค์–‘ํ•˜๊ฒŒ ์„œ์ˆ ๋ ๊ฒƒ์ด๋‹ค.



์ธ๋ผ์ธ ํŒŒ๋ผ๋ฏธํ„ฐ์˜ ๋น ๋ฅธ ์–ธ๊ธ‰

์ด ๋ฌธ์„œ์— ๋‚˜์ค‘์— ์ œ๊ณต๋˜๋Š” ์ข€๋” ์ƒ์„ธํ™”๋œ ์„ค๋ช…์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ์ธ๋ผ์ธ ํŒŒ๋ผ๋ฏธํ„ฐ์— ๋Œ€ํ•œ ๋น ๋ฅธ ์–ธ๊ธ‰์„ ํ•œ๋‹ค. ์ธ๋ผ์ธ ํŒŒ๋ผ๋ฏธํ„ฐ๋Š”
๋งตํ•‘๋œ statement๋‚ด๋ถ€์—์„œ ์‚ฌ์šฉ๋ ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด :

<statement id=โ€insertProductโ€ >
       insert into PRODUCT (PRD_ID, PRD_DESCRIPTION)
       values (#id#, #description#);
</statement>

์œ„ ์˜ˆ์ œ์—์„œ ์ธ๋ผ์ธ ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” #id# ์™€ #description# ์ด๋‹ค. ๊ฐ๊ฐ์€ statementํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๋Œ€์ฒดํ•˜๋Š” ์ž๋ฐ”๋นˆ์ฆˆ ์†์„ฑ์„ ํ‘œํ˜„ํ•œ
๋‹ค. Productํด๋ž˜์Šค๋Š” ํฌํ•จ๋œ ํ”„๋ผํผํ‹ฐ ํ† ํฐ์ด ์œ„์น˜ํ•ด ์žˆ๋Š” statement๋‚ด์— ์œ„์น˜ํ•˜๋Š” ๊ฐ’์„ ์œ„ํ•ด ์ฝ๊ฒŒ ๋˜๋Š” id ์™€ description ํ”„
๋ผํผํ‹ฐ์„ ๊ฐ€์ง„๋‹ค. id=5 ์™€ description=โ€dogโ€ ๋ฅผ ๊ฐ€์ง€๋Š” Product๋ฅผ ๋„˜๊ฒจ๋ฐ›์€ statement๋Š” ๋‹ค์Œ์ฒ˜๋Ÿผ ์ˆ˜ํ–‰๋œ๋‹ค.

   insert into PRODUCT (PRD_ID, PRD_DESCRIPTION)
   values (5, โ€˜dogโ€™);



resultClass

resultClass์†์„ฑ๊ฐ’์€ ์ž๋ฐ”ํด๋ž˜์Šค์˜ ์ „์ฒด๊ฒฝ๋กœ๋ฅผ ํฌํ•จ(์˜ˆ๋ฅผ ๋“ค๋ฉด ํŒจํ‚ค์ง€๋ฅผ ํฌํ•จํ•œ)ํ•œ ์ด๋ฆ„์ด๋‹ค. resultClass์†์„ฑ์€ ์šฐ๋ฆฌ์—๊ฒŒ
ResultSetMetaData์— ๊ธฐ๋ฐ˜ํ•œ JDBC ResultSet์— ์ž๋™๋งตํ•‘๋˜๋Š” ํด๋ž˜์Šค๋ฅผ ๋ช…์‹œํ•˜๋„๋ก ํ•œ๋‹ค. ์ž๋ฐ”๋นˆ์ฆˆ์˜ ํ”„๋ผํผํ‹ฐ์™€ ResultSet์˜
์นผ๋Ÿผ์ด ๋งค์น˜๋ ๋•Œ๋งˆ๋‹ค ํ”„๋ผํผํ‹ฐ๋Š” ์นผ๋Ÿผ๊ฐ’๊ณผ ํ•จ๊ป˜ ์ƒ์„ฑ๋œ๋‹ค. ์ด๊ฒƒ์€ ๋งค์šฐ ์งง๊ณ  ๋‹ฌ์ฝคํ•˜๊ฒŒ ๋งตํ•‘๋œ statement๋ฅผ ์ฟผ๋ฆฌํ•œ๋‹ค. ์˜ˆ๋ฅผ


                                                  14
๋“ค๋ฉด :

<statement id="getPerson" parameterClass=โ€intโ€ resultClass="examples.domain.Person">
       SELECT
              PER_ID as id,
              PER_FIRST_NAME as firstName,
              PER_LAST_NAME as lastName,
              PER_BIRTH_DATE as birthDate,
              PER_WEIGHT_KG as weightInKilograms,
              PER_HEIGHT_M as heightInMeters
       FROM PERSON
       WHERE PER_ID = #value#
</statement>

์œ„์˜ ์˜ˆ์ œ์—์„œ Personํด๋ž˜์Šค๋Š” id, firstName, lastName, birthDate, weightInKilograms, heightInMeters๋ฅผ ํฌํ•จํ•˜๋Š” ํ”„๋ผํผํ‹ฐ
๋ฅผ ๊ฐ€์ง„๋‹ค. ์นผ๋Ÿผ๋ณ„์นญ๊ณผ ํ•จ๊ป˜ ๋Œ€์‘๋˜๋Š” ๊ฐ๊ฐ์€ SQL select๋ฌธ์— ์˜ํ•ด ์„œ์ˆ ๋œ๋‹ค. ์นผ๋Ÿผ๋ณ„์นญ์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์นผ๋Ÿผ์ด๋ฆ„์ด ๋งค์น˜๋˜์ง€
์•Š์„๋•Œ๋งŒ ์š”๊ตฌ๋œ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ๋Š” ์š”๊ตฌ๋˜์ง€ ์•Š๋Š”๋‹ค. ์‹คํ–‰๋˜์—ˆ์„๋•Œ Person๊ฐ์ฒด๋Š” ํ”„๋ผํผํ‹ฐ์ด๋ฆ„๊ณผ ์นผ๋Ÿผ๋ช…์— ๊ธฐ๋ฐ˜ํ•ด์„œ ์ดˆ๊ธฐํ™”
๋˜๊ธฐ ์œ„ํ•ด ๋งตํ•‘๋˜๋Š” result set์œผ๋กœ๋ถ€ํ„ฐ ์ดˆ๊ธฐํ™”๋˜๊ณ  ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

resultClass์œผ๋กœ ์ž๋™๋งตํ•‘ํ•˜๋Š”๋ฐ๋Š” ๋ช‡ ๊ฐ€์ง€ ์ œํ•œ์ ์ด ์žˆ๋‹ค. ์ถœ๋ ฅ์นผ๋Ÿผ์˜ ํƒ€์ž…์„ ๋ช…์‹œํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์—†๋‹ค. ๊ด€๋ จ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์ž๋™์ 
์œผ๋กœ ๋กœ๋“œํ•˜๋Š”๋ฐฉ๋ฒ•์ด ์—†๊ณ  ResultSetMetaData์— ์ ‘๊ทผํ•˜๋Š”๋ฐ ํ•„์š”ํ•œ ์ ‘๊ทผ๋ฒ•๋‚ด์—์„œ ํ•˜์ฐฎ์€ ์„ฑ๋Šฅ๊ฒฐ๊ณผ๊ฐ€ ์žˆ๋‹ค. ์ด ์ œํ•œ์  ๋ชจ๋“œ
๋Š” ๋ช…์‹œ์ ์ธ resultMap๋ฅผ ์‚ฌ์šฉํ•จ์œผ๋กœ์จ ๊ทน๋ณตํ• ์ˆ˜ ์žˆ๋‹ค. Result maps๋Š” ์ด ๋ฌธ์„œ ๋‚˜์ค‘์— ์ข€๋” ์ƒ์„ธํ•˜๊ฒŒ ๋‹ค๋ฃจ์–ด์งˆ๊ฒƒ์ด๋‹ค.



resultMap

resultMapํ”„๋ผํผํ‹ฐ๋Š” ์ข€๋” ๊ณตํ†ต์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๊ณ  ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด ๊ฐ€์žฅ ์ค‘์š”ํ•œ ์†์„ฑ์ค‘์— ํ•˜๋‚˜์ด๋‹ค. ์ด resultMap์†์„ฑ๊ฐ’์€
๋ช…์‹œ๋œ resultMap์š”์†Œ์˜ ์ด๋ฆ„์ด๋‹ค. resultMap์†์„ฑ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ๋‹น์‹ ์—๊ฒŒ result set์œผ๋กœ๋ถ€ํ„ฐ ๋ฐ์ดํ„ฐ์™€ ์นผ๋Ÿผ์— ๋งตํ•‘๋˜
๋Š” ํ”„๋ผํผํ‹ฐ๋ฅผ ์–ด๋–ป๊ฒŒ ๊บผ๋‚ด๋Š”์ง€ ์ œ์–ดํ•˜๋„๋ก ํ•œ๋‹ค. resultClass์†์„ฑ์„ ์‚ฌ์šฉํ•˜๋Š” ์ž๋™๋งตํ•‘์ ‘๊ทผ๋ฒ•๊ณผ๋Š” ๋‹ฌ๋ฆฌ resultMap๋Š” ๋‹น
์‹ ์—๊ฒŒ ์นผ๋Ÿผํƒ€์ž…์„ ๋ช…์‹œํ•˜๊ณ  null๊ฐ’์„ ๋Œ€์ฒด ๊ทธ๋ฆฌ๊ณ  ๋ณตํ•ฉ ํ”„๋ผํผํ‹ฐ๋งตํ•‘(๋‹ค๋ฅธ ์ž๋ฐ”๋นˆ์ฆˆ, Collections ๊ทธ๋ฆฌ๊ณ  ์›์‹œํƒ€์ž…๋ž˜ํผ)
์„ ํ—ˆ๋ฝํ•œ๋‹ค.

resultMap ๊ตฌ์กฐ์˜ ๋ชจ๋“  ์ƒ์„ธ์ •๋ณด๋Š” ์ด ๋ฌธ์„œ ๋‚˜์ค‘์— ์„ค๋ช…๋œ๋‹ค. ํ•˜์ง€๋งŒ ๋‹ค์Œ์˜ ์˜ˆ์ œ๋Š” resultMap๊ฐ€ ์–ด๋–ป๊ฒŒ statement์— ๊ด€๋ จ
๋˜์—ˆ๋Š”์ง€ ๋ณด์—ฌ์ค€๋‹ค.

<resultMap id=โ€get-product-resultโ€ class=โ€com.ibatis.example.Productโ€>
       <result property=โ€idโ€ column=โ€PRD_IDโ€/>
       <result property=โ€descriptionโ€ column=โ€PRD_DESCRIPTIONโ€/>
</resultMap>

<statement id=โ€getProductโ€ resultMap=โ€get-product-resultโ€>
       select * from PRODUCT
</statement>
์œ„ ์˜ˆ์ œ์—์„œ SQL์ฟผ๋ฆฌ๋กœ๋ถ€ํ„ฐ ResultSet์€ resultMap์ •์˜๋ฅผ ์‚ฌ์šฉํ•ด์„œ Product์ธ์Šคํ„ด์Šค์— ๋งตํ•‘ํ• ๊ฒƒ์ด๋‹ค. resultMap์€ โ€œidโ€ํ”„
๋ผํผํ‹ฐ๊ฐ€ โ€œPRD_IDโ€์นผ๋Ÿผ๊ณผ โ€œPRD_DESCRIPTIONโ€์นผ๋Ÿผ์— ์˜ํ•ด ์ƒ์„ฑ๋˜๋Š” โ€œdescriptionโ€ํ”„๋ผํผํ‹ฐ์— ์˜ํ•ด ์ƒ์„ฑ๋ ๊ฒƒ์ด๋‹ค. โ€œselect
*โ€๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ์ง€์›๋œ๋‹ค๋Š” ๊ฒƒ์— ์ฃผ์˜ํ•˜๋ผ. ResultSet๋‚ด ๋ฐ˜ํ™˜์นผ๋Ÿผ ๋ชจ๋‘์— ๋งตํ•‘ํ•  ํ•„์š”๋Š” ์—†๋‹ค.



cacheModel

cacheModel์†์„ฑ๊ฐ’์€ ์ •์˜๋œ cacheModel์š”์†Œ์˜ ์ด๋ฆ„์ด๋‹ค. cacheModel์€ ์ฟผ๋ฆฌ๊ฐ€ ๋งตํ•‘๋œ statement๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ ์บ์‰ฌ๋ฅผ
์„œ์ˆ ํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋œ๋‹ค. ๊ฐ๊ฐ์˜ ์ฟผ๋ฆฌ๋งตํ•‘ statement๋Š” ๋‹ค๋ฅธ cacheModel์ด๋‚˜ ๊ฐ™์€๊ฒƒ์„ ์‚ฌ์šฉํ• ์ˆ˜ ์žˆ๋‹ค. cacheModel์š”์†Œ์™€ ๊ทธ๊ฒƒ
์˜ ์†์„ฑ์— ๋Œ€ํ•œ ๋ชจ๋“  ์ƒ์„ธ์„ค๋ช…์€ ๋‚˜์ค‘์— ์–ธ๊ธ‰๋œ๋‹ค. ๋‹ค์Œ ์˜ˆ์ œ๋Š” ์–ด๋–ป๊ฒŒ statement์™€ ๊ด€๋ จ๋˜๋Š”์ง€ ๋ณด์—ฌ์ค€๋‹ค.

<cacheModel id="product-cache" imlementation="LRU">
 <flushInterval hours="24"/>
 <flushOnExecute statement="insertProduct"/>
 <flushOnExecute statement="updateProduct"/>
 <flushOnExecute statement="deleteProduct"/>



                                                  15
<property name=โ€sizeโ€ value=โ€1000โ€ />
</cacheModel>

<statement id=โ€getProductListโ€ parameterClass=โ€intโ€ cacheModel=โ€product-cacheโ€>

select * from PRODUCT where PRD_CAT_ID = #value#

</statement>

์œ„ ์˜ˆ์ œ์—์„œ ์บ์‰ฌ๋Š” WEAK์ฐธ์กฐํƒ€์ž…์„ ์‚ฌ์šฉํ•˜๋Š” products๋ฅผ ์œ„ํ•ด ์ •์˜๋˜๊ณ  24์‹œ๊ฐ„๋งˆ๋‹ค ๋˜๋Š” ๊ด€๋ จ๋œ update๋ฌธ์ด ์ˆ˜ํ–‰๋ ๋•Œ
๋งˆ๋‹ค ์ง€์›Œ์ง„๋‹ค(flush) .

xmlResultName

mapping result๋ฅผ XML๋ฌธ์„œ๋กœ ์ง์ ‘์ ์œผ๋กœ ๋งŒ๋“ค ๋•Œ xmlResultName์˜ ๊ฐ’์€ XML๋ฌธ์„œ์˜ ๊ฐ€์žฅ ์ƒ์œ„ ์š”์†Œ์˜ ์ด๋ฆ„์ด ๋ ๊ฒƒ์ด๋‹ค. ์˜ˆ
๋ฅผ ๋“ค๋ฉด :

<select id="getPerson" parameterClass=โ€intโ€ resultClass="xml" xmlResultName=โ€personโ€>
        SELECT
               PER_ID as id,
               PER_FIRST_NAME as firstName,
               PER_LAST_NAME as lastName,
               PER_BIRTH_DATE as birthDate,
               PER_WEIGHT_KG as weightInKilograms,
               PER_HEIGHT_M as heightInMeters

   FROM PERSON WHERE PER_ID = #value#
</select>
์œ„ select statement๋Š” ๋‹ค์Œ ๊ตฌ์กฐ์˜ XML๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•  ๊ฒƒ์ด๋‹ค.

<person>
 <id>1</id>
 <firstName>Clinton</firstName>
 <lastName>Begin</lastName>
 <birthDate>1900-01-01</birthDate>
 <weightInKilograms>89</weightInKilograms>
 <heightInMeters>1.77</heightInMeters>
</person>


remapResults

remapResults ์†์„ฑ์€ <statement>, <select>, ๊ทธ๋ฆฌ๊ณ  <procedure> ์—์„œ ์‚ฌ์šฉ๊ฐ€๋Šฅํ•˜๋‹ค. ์ด๊ฒƒ์€ ์„ ํƒ์ ์ธ ์†์„ฑ์ด๊ณ  ๋””ํดํŠธ๋Š”
false์ด๋‹ค.

remapResults์†์„ฑ์€ ์ฟผ๋ฆฌ๊ฐ€ ๋ฐ˜ํ™˜ ์นผ๋Ÿผ์˜ ๋‹ค์–‘ํ•œ ์„ธํŠธ๋ฅผ ๊ฐ€์งˆ๋•Œ true์…‹ํŒ…๋˜์–ด์•ผ๋งŒ ํ•œ๋‹ค. ๋‹ค์Œ ์ฟผ๋ฆฌ๋ฅผ ๋ณด์ž.

       SELECT $fieldList$
       FROM    table

์ด์ „ ์˜ˆ์ œ์—์„œ ์นผ๋Ÿผ์˜ ๋ชฉ๋ก์€ ํ…Œ์ด๋ธ”์ด ์–ธ์ œ๋‚˜ ๊ฐ™๋”๋ผ๋„ ๋™์ ์ด๋‹ค.

       SELECT *
       FROM    $sometable$

์ด์ „ ์˜ˆ์ œ์—์„œ ํ…Œ์ด๋ธ”์€ ๋‹ค๋ฅผ์ˆ˜ ์žˆ๋‹ค. Select์ ˆ์˜ * ์‚ฌ์šฉ๋•Œ๋ฌธ์—, ๊ฒฐ๊ณผ์ ์ธ ์นผ๋Ÿผ์ด๋ฆ„์€ ๋‹ค๋ฅผ์ˆ˜ ์žˆ๋‹ค. ๋™์  ์š”์†Œ๋Š” ํ•˜๋‚˜์˜ ์ฟผ๋ฆฌ
์ˆ˜ํ–‰์—์„œ ๋‹ค์Œ ์ˆ˜ํ–‰๊นŒ์ง€ ๋ณ€๊ฒฝํ•˜๊ธฐ ์œ„ํ•œ ๋ชฉ๋ก์„ ์•ผ๊ธฐํ• ์ˆ˜์žˆ๋‹ค.

resultset๋ฉ”ํƒ€๋ฐ์ดํƒ€๋ฅผ ์•Œ๊ณ /ํŒ๋‹จํ•˜๊ธฐ ์œ„ํ•œ ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ๋ช…๋ฐฑํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์—, iBATIS๋Š” ๋งˆ์ง€๋ง‰ ์ฟผ๋ฆฌ ์ˆ˜ํ–‰์— ๋ฐ˜ํ™˜๋œ ๊ฒƒ๋งŒ์„ ๊ธฐ
์–ตํ• ๊ฒƒ์ด๋‹ค. ์ด๊ฒƒ์€ ์œ„ ์˜ˆ์ œ์™€ ๋น„์Šทํ•œ ์ƒํ™ฉ์—์„œ ๋ฌธ์ œ๋ฅผ ๋ฐœ์ƒ์‹œํ‚จ๋‹ค.


                                                16
๋งŒ์•ฝ ๋ฐ˜ํ™˜ ์นผ๋Ÿผ์ด ๋ณ€๊ฒฝ๋œ๋‹ค๋ฉด, remapResults๋ฅผ true๋กœ ์…‹ํŒ…ํ•˜๋ผ. ๊ทธ๋ ‡์ง€ ์•Š๋‹ค๋ฉด ๋ฉ”ํƒ€๋ฐ์ดํƒ€ ๊ฒ€์ƒ‰์˜ ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ์ œ๊ฑฐํ•˜๊ธฐ ์œ„ํ•ด
remapResults๋ฅผ false๋กœ ์…‹ํŒ…ํ•˜๋ผ.

resultSetType

SQL๊ตฌ๋ฌธ์˜ resultSetType์„ ๋ช…์‹œํ•˜๊ธฐ ์œ„ํ•ด, ๋‹ค์Œ์„ ์‚ฌ์šฉํ• ์ˆ˜ ์žˆ๋‹ค.

โ€ข   FORWARD_ONLY: ์ปค์„œ๋Š” ์•ž์ชฝ์œผ๋กœ๋งŒ ์ด๋™ํ•œ๋‹ค.
โ€ข   SCROLL_INSENSITIVE: ์ปค์„œ๋Š” ์Šคํฌ๋กค๊ฐ€๋Šฅํ•˜์ง€๋งŒ ๋‹ค๋ฅธ๊ฒƒ์— ์˜ํ•œ ๋ณ€๊ฒฝ์—๋Š” ๋Œ€๊ฐœ ๋ฏผ๊ฐํ•˜์ง€ ์•Š๋‹ค.
โ€ข   SCROLL_SENSITIVE: ์ปค์„œ๋Š” ์Šคํฌ๋กค๊ฐ€๋Šฅํ•˜๊ณ  ๋‹ค๋ฅธ๊ฒƒ์— ์˜ํ•œ ๋ณ€๊ฒฝ์— ๋Œ€๊ฐœ ๋ฏผ๊ฐํ•˜๋‹ค.

resultSetType์€ ๋Œ€๊ฐœ ์š”๊ตฌ๋˜์ง€ ์•Š๋Š”๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์„œ๋กœ ๋‹ค๋ฅธ JDBC๋“œ๋ผ์ด๋ฒ„๋Š” ๊ฐ™์€ resultSetType์…‹ํŒ…์„ ์‚ฌ์šฉํ•˜๋”๋ผ๋„ ๋‹ค๋ฅด๊ฒŒ ํ–‰
๋™ํ• ๊ฒƒ์ด๋‹ค. (์ด๋ฅผํ…Œ๋ฉด. Oracle์€ SCROLL_SENSITIVE๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š๋Š”๋‹ค.).

fetchSize

SQL๊ตฌ๋ฌธ์˜ fetchSize๋ฅผ ์…‹ํŒ…ํ•˜๋Š” ๊ฒƒ์€ ์ˆ˜ํ–‰๋ ๊ฒƒ์ด๋‹ค. ์ด๊ฒƒ์€ JDBC๋“œ๋ผ์ด๋ฒ„์— ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์„œ๋ฒ„๋กœ์˜ ์™•๋ณต์„ ์ค„์ด๊ธฐ ์œ„ํ•ด
prefetching ํžŒํŠธ๋ฅผ ์ œ๊ณตํ•œ๋‹ค.


ํŒŒ๋ผ๋ฏธํ„ฐ Maps ์™€ ์ธ๋ผ์ธ ํŒŒ๋ผ๋ฏธํ„ฐ

๋‹น์‹ ์ด ์œ„์—์„œ ๋ณธ๊ฒƒ์ฒ˜๋Ÿผ parameterMap๋Š” ์ž๋ฐ”๋นˆ์ฆˆ ํ”„๋ผํผํ‹ฐ๋ฅผ statement์˜ ํ”„๋ผํผํ‹ฐ์— ๋งตํ•‘์‹œํ‚ค๋Š” ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•œ๋‹ค. ๋น„
๋ก parameterMaps๊ฐ€ ์™ธ๋ถ€ํ˜•ํƒœ๋‚ด์— ๋“œ๋ฌผ๊ฒŒ ๋ฐœ์ƒํ•˜๋”๋ผ๋„ ๊ทธ๊ฒƒ๋“ค์ด ๋‹น์‹ ์—๊ฒŒ ์ธ๋ผ์ธ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์ดํ•ดํ•˜๋„๋ก ๋„์™€์ค€๋‹ค๋Š”
๊ฒƒ์„ ์ดํ•ดํ•˜๋ผ.

<parameterMap id=โ€parameterMapNameโ€ [class=โ€com.domain.Productโ€]>
 <parameter property =โ€propertyNameโ€ [jdbcType=โ€VARCHARโ€] [javaType=โ€stringโ€]
 [nullValue=โ€NUMERICโ€] [null=โ€-9999999โ€] [typeName=โ€{REF or user-defined type}โ€/>
 <parameter โ€ฆโ€ฆ />
 <parameter โ€ฆโ€ฆ />
</parameterMap>

[๊ด„ํ˜ธ]๋‚ด์˜ ๋ถ€๋ถ„์€ ์˜ต์…˜์ด๋‹ค. parameterMap๋Š” ์Šค์Šค๋กœ๋Š” statement๊ฐ€ ๊ทธ๊ฒƒ์„ ์ฐธ์กฐํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๊ตฌ๋ถ„์ž๋กœ์จ ๋‹จ์ง€ id์†์„ฑ
๋งŒ ํ•„์š”ํ•˜๋‹ค. Class์†์„ฑ์€ ์˜ต์…˜์ด์ง€๋งŒ ํฌ๊ฒŒ ์‚ฌ์šฉ์ด ์ถ”์ฒœ๋˜๋Š” ๊ฒƒ์ด๋‹ค. Statement์˜ parameterClass์†์„ฑ๊ณผ ์œ ์‚ฌํ•˜๊ฒŒ class์†
์„ฑ์€ ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ์„ฑ๋Šฅ์„ ์œ„ํ•ด ์—”์ง„์„ ์ตœ์ ํ™”ํ•˜๋Š” ๊ฒƒ๋งŒํผ ๋“ค์–ด์˜ค๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์ฒดํฌํ•˜๋„๋ก ํ•œ๋‹ค.

<parameter> ์š”์†Œ

parameterMap์€ statement์˜ ํŒŒ๋ผ๋ฏธํ„ฐ์— ์ง์ ‘ ๋งตํ•‘ํ•˜๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ๋งตํ•‘์˜ ์–ด๋–ค ์ˆซ์ž๋ฅผ ํฌํ•จํ•œ๋‹ค. ๋‹ค์Œ์˜ ์ผ๋ถ€ ์„น์…˜์€
property ์š”์†Œ์˜ ์†์„ฑ์„ ์„œ์ˆ ํ•œ๋‹ค.



property

ํŒŒ๋ผ๋ฏธํ„ฐ map์˜ property์†์„ฑ์€ ๋งตํ•‘๋œ statement์— ์ „๋‹ฌ๋˜๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ์ฒด์˜ ์ž๋ฐ”๋นˆ์ฆˆ ํ”„๋ผํผํ‹ฐ(get๋ฉ”์†Œ๋“œ)์˜ ์ด๋ฆ„์ด๋‹ค.
๊ทธ ์ด๋ฆ„์€ statement๋‚ด์— ํ•„์š”ํ•œ ํšŸ์ˆ˜์— ์˜์กดํ•˜๋Š”๊ฒƒ๋ณด๋‹ค ์ข€๋” ์‚ฌ์šฉ๋ ์ˆ˜ ์žˆ๋‹ค.

jdbcType

jdbcType์†์„ฑ์€ ์ด ํ”„๋ผํผํ‹ฐ์— ์˜ํ•ด ์…‹ํŒ…๋˜๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ์˜ ์นผ๋Ÿผํƒ€์ž…์„ ๋ช…์‹œ์ ์œผ๋กœ ์ •์˜ํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋œ๋‹ค. ๋ช‡๋ช‡ JDBC๋“œ๋ผ์ด
๋ฒ„๋Š” ๋ช…์‹œ์ ์ธ ๋“œ๋ผ์ด๋ฒ„ ์นผ๋Ÿผํƒ€์ž…์„ ๋ถ€๋ฅด๋Š” ๊ฒƒ ์—†์ด ์–ด๋–ค ์ž‘๋™์„ ์œ„ํ•ด ์นผ๋Ÿผ์˜ ํƒ€์ž…์„ ํ™•์ธํ• ์ˆ˜ ์—†๋‹ค. ์ด๊ฒƒ์˜ ์™„๋ฒฝํ•œ ์˜ˆ์ œ๋Š”
PreparedStatement.setNull(int parameterIndex, int sqlType) ๋ฉ”์†Œ๋“œ์ด๋‹ค. ์ด ๋ฉ”์†Œ๋“œ๋Š” ์ •์˜ํ•˜๊ธฐ ์œ„ํ•œ ํƒ€์ž…์„ ์š”๊ตฌํ•œ๋‹ค. ๋ช‡
๋ช‡ ๋“œ๋ผ์ด๋ฒ„๋Š” ๊ฐ„๋‹จํ•˜๊ฒŒ Types.OTHER ๋˜๋Š” Types.NULL์„ ๋ณด๋ƒ„์œผ๋กœ์จ ํ•จ์ถ•๋˜๋Š” ํƒ€์ž…์„ ํ—ˆ๋ฝํ•œ๋‹ค. ์–ด์จŒ๋“  ํ–‰์œ„๋Š” ๋น„์ผ๊ด€์ 
์ด๊ณ  ๋ช‡๋ช‡ ๋“œ๋ผ์ด๋ฒ„๋Š” ์ •์˜๋˜๊ธฐ ์œ„ํ•œ ์ •ํ™•ํ•œ ํƒ€์ž…์„ ํ•„์š”๋กœํ•œ๋‹ค. ๊ทธ๋Ÿฐ ๊ฒฝ์šฐ๋ฅผ ์œ„ํ•ด์„œ SQL Maps API๋Š” parameterMapํ”„๋ผ
ํผํ‹ฐ ์š”์†Œ์˜ jdbcType ์†์„ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ •์˜๋˜๊ธฐ ์œ„ํ•œ ํƒ€์ž…์„ ํ—ˆ๋ฝํ•œ๋‹ค.

์ด ์†์„ฑ์€ ์นผ๋Ÿผ์ด null์ด ๊ฐ€๋Šฅํ•  ๋•Œ(nullable)๋งŒ ์š”๊ตฌ๋œ๋‹ค. Type์†์„ฑ์„ ์‚ฌ์šฉํ•˜๋Š” ๋‹ค๋ฅธ ์ด์œ ๋Š” ๋ช…์‹œ์ ์œผ๋กœ dateํƒ€์ž…์„ ์ •์˜ํ•˜


                                               17
๋Š” ๊ฒƒ์ด๋‹ค. ์ž๋ฐ”๋Š” ๋‹จ์ง€ ํ•˜๋‚˜์˜ Date๊ฐ’ํƒ€์ž…(java.util.Date)์„ ๊ฐ€์ง€๋Š”๋ฐ ๋ฐ˜ํ•ด ๋Œ€๊ฐœ์˜ SQL๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” ๋งŽ์€, ๋Œ€๊ฐœ ์ตœ์†Œ 3๊ฐ€
์ง€ ์ด์ƒ์˜ ํƒ€์ž…์„ ๊ฐ€์ง„๋‹ค. ๋‹น์‹ ์˜ ์นผ๋Ÿผ ํƒ€์ž…์ด DATE๋‚˜ DATETIME์ค‘์— ํ•˜๋‚˜๋กœ ๋ช…์‹œ์ ์œผ๋กœ ์ •์˜ํ•˜๊ธธ ๋ฐ”๋ž„์ง€๋„ ๋ชจ๋ฅด๊ธฐ ๋•Œ๋ฌธ์ด
๋‹ค.

jdbcType ์†์„ฑ์€ JDBCํƒ€์ž… ํด๋ž˜์Šค๋‚ด ๋ณ€์ˆ˜์™€ ๋งค์น˜๋˜๋Š” ์–ด๋–ค ๋ฌธ์ž์—ด๊ฐ’์— ์…‹ํŒ…๋ ์ˆ˜ ์žˆ๋‹ค. ๋น„๋ก ์ด๊ฒƒ์€ ๊ทธ๊ฒƒ๋“ค์ค‘์— ์–ด๋–ค๊ฒƒ
์— ์…‹ํŒ…๋ ์ˆ˜ ์žˆ์ง€๋งŒ ๋ช‡๋ช‡ ํƒ€์ž…์€ ์ง€์›๋˜์ง€ ์•Š๋Š”๋‹ค(์ด๋ฅผ ํ…Œ๋ฉด blobs). ์ด ๋ฌธ์„œ์˜ ๋‚˜์ค‘ ์„น์…˜์—์„œ ํ”„๋ ˆ์ž„์›Œํฌ์— ์˜ํ•ด ์ง€์›๋˜
๋Š” ํƒ€์ž…์— ๋Œ€ํ•ด์„œ ์„œ์ˆ ํ•œ๋‹ค.

์ฃผ์˜! ๋Œ€๋ถ€๋ถ„์˜ ๋“œ๋ผ์ด๋ฒ„๋Š” ๋‹จ์ง€ null์ด ๊ฐ€๋Šฅํ•œ ์นผ๋Ÿผ์„ ์œ„ํ•ด ์ •์˜๋˜๋Š” ํƒ€์ž…์„ ํ•„์š”๋กœ ํ•œ๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ ๊ทธ๋Ÿฐ ๋“œ๋ผ์ด๋ฒ„๋ฅผ ์œ„ํ•ด
๋‹น์‹ ์€ null์ด ๊ฐ€๋Šฅํ•œ ์นผ๋Ÿผ์„ ์œ„ํ•ด ํƒ€์ž…์„ ์ •์˜ํ•  ํ•„์š”๊ฐ€ ์žˆ๋‹ค.

์ฃผ์˜! ์˜ค๋ผํด ๋“œ๋ผ์ด๋ฒ„๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ๋‹น์‹ ์€ ์ด๊ฒƒ์˜ ํƒ€์ž…์„ ์ •์˜ํ•˜์ง€ ์•Š๊ณ ์„œ๋Š” ์นผ๋Ÿผ์— null๊ฐ’์„ ๋„ฃ์„ ๋•Œ โ€œInvalid column typeโ€
์—๋Ÿฌ๋ฅผ ๋ณด๊ฒŒ๋ ๊ฒƒ์ด๋‹ค.



javaType

javaType ์†์„ฑ์€ ์…‹ํŒ…๋˜๊ธฐ ์œ„ํ•œ ํŒŒ๋ผ๋ฏธํ„ฐ์˜ ์ž๋ฐ” ํ”„๋ผํผํ‹ฐ๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ์ •์˜ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋œ๋‹ค. ๋Œ€๊ฒŒ ์ด๊ฒƒ์€ ๋ฆฌํ”Œ๋ ‰์…˜
(reflection)์„ ํ†ตํ•ด ์ž๋ฐ”๋นˆ์ฆˆ ํ”„๋ผํผํ‹ฐ๋กœ๋ถ€ํ„ฐ ํŒŒ์ƒ๋œ๋‹ค. ํ•˜์ง€๋งŒ Map๊ณผ XML๋งตํ•‘ ๊ฐ™์€ ํŠน์ • ๋งตํ•‘์€ ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์œ„ํ•œ ํƒ€์ž…
์„ ์ œ๊ณตํ•˜์ง€ ์•Š๋Š”๋‹ค. ๋งŒ์•ฝ javaType๊ฐ€ ์…‹ํŒ…๋˜์ง€ ์•Š๊ณ  ํ”„๋ ˆ์ž„์›Œํฌ๋„ ์–ด๋–คํƒ€์ž…์ธ์ง€ ๊ตฌ๋ณ„ํ• ์ˆ˜ ์—†๋‹ค๋ฉด ํƒ€์ž…์€ ๊ฐ์ฒด๋กœ ๊ฐ„์ฃผ๋ 
๊ฒƒ์ด๋‹ค.


typeName

typeName ์†์„ฑ์€ REFํƒ€์ž…์ด๋‚˜ ์‚ฌ์šฉ์ž ์ •์˜ ํƒ€์ž…์„ ๋ช…์‹œํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋œ๋‹ค.

javadoc์— ๋ณด๋ฉด..

typeName ์†์„ฑ์€ ์‚ฌ์šฉ์ž-์ •์˜๋‚˜ REF์ถœ๋ ฅ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์œ„ํ•ด ์‚ฌ์šฉ๋œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด, ์‚ฌ์šฉ์ž-์ •์˜ ํƒ€์ž…์€ STRUCT, DISTINCT,
JAVA_OBJECT, ๊ทธ๋ฆฌ๊ณ  ๋ช…๋ช…๋œ ๋ฐฐ์—ด ํƒ€์ž…์„ ํฌํ•จํ•œ๋‹ค. ์‚ฌ์šฉ์ž-์ •์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์œ„ํ•ด, ํŒŒ๋ผ๋ฏธํ„ฐ์˜ ์ „์ฒด ๊ฒฝ๋กœ๊ฐ€ ํฌํ•จ๋œ SQLํƒ€์ž…
๋ช…์ด ์ฃผ์–ด์ง„๋‹ค. ๋ฐ˜๋ฉด์— REFํŒŒ๋ผ๋ฏธํ„ฐ๋Š” ์ฃผ์–ด์ง„ ์ฐธ์กฐํƒ€์ž…์˜ ์ „์ฒด ๊ฒฝ๋กœ๊ฐ€ ํฌํ•จ๋œ ํƒ€์ž…๋ช…์„ ์š”๊ตฌํ•œ๋‹ค. JDBC๋“œ๋ผ์ด๋ฒ„๋Š” ํƒ€์ž…์ฝ”๋“œ
๋ฅผ ํ•„์š”๋กœ ํ•˜์ง€ ์•Š์œผ๋ฉฐ ํƒ€์ž…๋ช… ์ •๋ณด๋Š” ์ด๊ฒƒ์„ ๋ฌด์‹œํ•œ๋‹ค. ์ด์‹๊ฐ€๋Šฅํ•˜๊ธฐ ์œ„ํ•ด, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ์ด๋Ÿฌํ•œ ์‚ฌ์šฉ์ž์ •์˜์™€ REFํŒŒ๋ผ๋ฏธ
ํ„ฐ๋ฅผ ์œ„ํ•œ ๊ฐ’์„ ์ œ๊ณตํ•ด์•ผ๋งŒ ํ•œ๋‹ค. ๋น„๋ก ์ด๊ฒƒ์ด ์‚ฌ์šฉ์ž-์ •์˜์™€ REFํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ๋˜๋”๋ผ๋„, ์ด ์†์„ฑ์€ JDBCํƒ€์ž…์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๋“ฑ
๋กํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋œ๋‹ค. ๋งŒ์•ฝ ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ์‚ฌ์šฉ์ž-์ •์˜๋‚˜ REFํƒ€์ž…์„ ๊ฐ€์ง€์ง€ ์•Š๋Š”๋‹ค๋ฉด, typeNameํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๋ฌด์‹œ๋œ๋‹ค.



nullValue

nullValue ์†์„ฑ์€ ์–ด๋–ค ์œ ํšจํ•œ ๊ฐ’(ํ”„๋ผํผํ‹ฐ ํƒ€์ž…์— ๊ธฐ์ดˆ๋กœ ํ•ด์„œ)์— ์…‹ํŒ…ํ• ์ˆ˜ ์žˆ๋‹ค. null ์†์„ฑ์€ null๊ฐ’ ๋Œ€์ฒด๋ฅผ ์ •์˜ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ
์šฉ๋œ๋‹ค. ์ด๊ฒƒ์ด ์˜๋ฏธํ•˜๋Š” ๊ฒƒ์€ ์ž๋ฐ”๋นˆ์ฆˆ ํ”„๋ผํผํ‹ฐ๋‚ด์—์„œ ๊ฒ€์ƒ‰๋˜๋Š” ๊ฐ’์ธ NULL์ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์“ฐ์—ฌ์งˆ๊ฒƒ์ด๋ผ๋Š”๊ฒƒ์ด๋‹ค(๋“ค์–ด
์˜ค๋Š” null๊ฐ’ ๋Œ€์ฒด์˜ ์ƒ๋ฐ˜๋œ ํ–‰์œ„). ์ด๊ฒƒ์€ ๋‹น์‹ ์—๊ฒŒ null๊ฐ’์„ ์ง€์›ํ•˜์ง€ ์•Š๋Š” ํƒ€์ž…(์ด๋ฅผ ํ…Œ๋ฉด int, double, float๋“ฑ๋“ฑ)์„ ์œ„ํ•ด ๋‹น์‹ 
์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๋‚ด์— โ€œmagicโ€ null ์ˆซ์ž๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ํ—ˆ๋ฝํ•œ๋‹ค. ํ”„๋ผํผํ‹ฐ์˜ ๊ทธ๋Ÿฐ ํƒ€์ž…์€ ์ ํ•ฉํ•œ null๊ฐ’์„ ํฌํ•จํ•  ๋•Œ NULL์€
๊ฐ’ ๋Œ€์‹ ์— ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์“ฐ์—ฌ์งˆ๊ฒƒ์ด๋‹ค.

<parameterMap> ์˜ˆ์ œ

๋ชจ๋“  ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” parameterMap์˜ ์˜ˆ์ œ๊ฐ€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

<parameterMap id=โ€insert-product-paramโ€ class=โ€com.domain.Productโ€>
      <parameter property=โ€idโ€ jdbcType=โ€NUMERICโ€ javaType=โ€intโ€ nullValue=โ€-9999999โ€/>
      <parameter property=โ€descriptionโ€ jdbcType=โ€VARCHARโ€ nullValue=โ€NO_ENTRYโ€/>
</parameterMap>

<statement id=โ€insertProductโ€ parameterMap=โ€insert-product-paramโ€>
       insert into PRODUCT (PRD_ID, PRD_DESCRIPTION) values (?,?);
</statement>
์œ„ ์˜ˆ์ œ์—์„œ ์ž๋ฐ”๋นˆ์ฆˆ ํ”„๋ผํผํ‹ฐ์ธ id ์™€ description๋Š” ๋ชฉ๋กํ™”๋˜๋Š” ์ˆœ์„œ๋Œ€๋กœ ๋งตํ•‘๋œ Statement ์ธ insertProduct ์˜ ํŒŒ๋ผ๋ฏธํ„ฐ
์— ์ ์šฉ๋ ๊ฒƒ์ด๋‹ค. ๊ทธ๋ž˜์„œ id๋Š” ์ฒซ๋ฒˆ์งธ ํŒŒ๋ผ๋ฏธํ„ฐ(?)์— ์ ์šฉ๋˜๊ณ  description ๋Š” ๋‘๋ฒˆ์งธ ํŒŒ๋ผ๋ฏธํ„ฐ์— ์ ์šฉ๋œ๋‹ค. ๋งŒ์•ฝ์— ์ˆœ์„œ๊ฐ€ ๋ฐ˜


                                               18
๋Œ€๋ผ๋ฉด XML์€ ๋‹ค์Œ์ฒ˜๋Ÿผ ๋ณด์ผ๊ฒƒ์ด๋‹ค.

<parameterMap id=โ€insert-product-paramโ€ class=โ€com.domain.Productโ€>
      <parameter property=โ€descriptionโ€ />
      <parameter property=โ€idโ€/>
</parameterMap>

<statement id=โ€insertProductโ€ parameterMap=โ€insert-product-paramโ€>
       insert into PRODUCT (PRD_DESCRIPTION, PRD_ID) values (?,?);
</statement>

์ฃผ์˜! Parameter Map ์ด๋ฆ„์€ ์ •์˜๋œ SQL Map XMLํŒŒ์ผ์— ์œ„์น˜ํ•œ๋‹ค. ๋‹น์‹ ์€ SQL Map(<sqlMap> rootํƒœ๊ทธ์— ์…‹ํŒ…๋œ)์˜ id์™€
ํ•จ๊ป˜ ํŒŒ๋ผ๋ฏธํ„ฐ Map์˜ id๋ฅผ ์•ž์— ๋ถ™์ž„์œผ๋กœ์จ ๋‹ค๋ฅธ SQL Map XMLํŒŒ์ผ๋‚ด์— ํŒŒ๋ผ๋ฏธํ„ฐ Map์„ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค๋ฅธ ํŒŒ
์ผ๋กœ๋ถ€ํ„ฐ ์œ„์˜ ํŒŒ๋ผ๋ฏธํ„ฐ map๋ฅผ ์ฐธ์กฐํ•˜๊ธฐ ์œ„ํ•ด ์ฐธ์กฐํ•˜๊ธฐ ์œ„ํ•œ ์ „์ฒด์ด๋ฆ„์€ โ€œProduct.insert-product-paramโ€์ด ๋ ๊ฒƒ์ด๋‹ค.




์ธ๋ผ์ธ ํŒŒ๋ผ๋ฏธํ„ฐ Maps

๋งค์šฐ ์ƒ์„ธํ•œ ์„ค๋ช…์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  parameterMaps์„ ์„ ์–ธํ•˜๊ธฐ ์œ„ํ•œ ์œ„์˜ ๋ฌธ๋ฒ•์€ ๋งค์šฐ ์žฅํ™ฉํ•˜๋‹ค. ํŒŒ๋ผ๋ฏธํ„ฐ Maps์„ ์œ„ํ•œ ์ •์˜
(definition)์„ ๊ฐ„๋‹จํ•˜๊ฒŒ ํ•˜๊ณ  ์ฝ”๋“œ๋ฅผ ์ค„์ผ์ˆ˜ ์žˆ๋Š” ์ข€๋” ๋‹ค์–‘ํ•œ ๋ฌธ๋ฒ•์ด ์žˆ๋‹ค. ๊ทธ ๋Œ€์•ˆ์ ์ธ ๋ฌธ๋ฒ•์€ ์ž๋ฐ”๋นˆ์ฆˆ ํ”„๋ผํผํ‹ฐ์ด๋ฆ„์„ ๋งต
ํ•‘๋œ statement์— ์ธ๋ผ์ธ์‹œํ‚ค๋Š” ๊ฒƒ์ด๋‹ค. ์ดˆ๊ธฐ์„ค์ •์— ์˜ํ•ด ๋ช…์‹œ์ ์œผ๋กœ ์ •์˜๋œ parameterMap ์ด ์—†๋Š” ์–ด๋–ค ๋งตํ•‘๋œ statement
๋Š” ์ธ๋ผ์ธ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์œ„ํ•ด ํŒŒ์‹ฑ๋ ๊ฒƒ์ด๋‹ค. ์ด์ „์˜ ์ธ๋ผ์ธ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๊ตฌํ˜„ํ•œ ์˜ˆ์ œ(์ด๋ฅผ ํ…Œ๋ฉด Product)๋Š” ๋‹ค์Œ์ฒ˜๋Ÿผ ๋ณด์ผ๊ฒƒ์ด
๋‹ค.

<statement id=โ€insertProductโ€ parameterClass=โ€com.domain.Productโ€>
        insert into PRODUCT (PRD_ID, PRD_DESCRIPTION)
        values (#id#, #description#);
</statement>

ํƒ€์ž…์„ ์„ ์–ธํ•˜๋Š” ๊ฒƒ์€ ๋‹ค์Œ์˜ ๋ฌธ๋ฒ•์„ ์‚ฌ์šฉํ•จ์œผ๋กœ์จ ์ธ๋ผ์ธ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ํ• ์ˆ˜ ์žˆ๋‹ค.

<statement id=โ€insertProductโ€ parameterClass=โ€com.domain.Productโ€>
        insert into PRODUCT (PRD_ID, PRD_DESCRIPTION)
        values (#id:NUMERIC#, #description:VARCHAR#);
</statement>

ํƒ€์ž…์„ ์„ ์–ธํ•˜๋Š” ๊ฒƒ๊ณผ null๊ฐ’ ๋Œ€์ฒด๋Š” ๋‹ค์Œ ๋ฌธ๋ฒ•์„ ์‚ฌ์šฉํ•จ์œผ๋กœ์จ ์ธ๋ผ์ธ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ํ• ์ˆ˜ ์žˆ๋‹ค.

<statement id=โ€insertProductโ€ parameterClass=โ€com.domain.Productโ€>
        insert into PRODUCT (PRD_ID, PRD_DESCRIPTION)
        values (#id:NUMERIC:-999999#, #description:VARCHAR:NO_ENTRY#);
</statement>

์ฃผ์˜! ์ธ๋ผ์ธ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ๋‹น์‹ ์€ ํƒ€์ž…์ •์˜์—†์ด null๊ฐ’ ๋Œ€์ฒด๋ฅผ ๋ช…์‹œํ• ์ˆ˜ ์—†๋‹ค. ๋‹น์‹ ์€ ์ˆœ์„œ๋Œ€๋กœ ํŒŒ์‹ฑํ•˜๊ธฐ ์œ„ํ•ด ๋‘˜๋‹ค
๋ช…์‹œํ•ด์•ผ ํ•œ๋‹ค.

์ฃผ์˜! Null๊ฐ’์˜ ์™„์ „ํ•œ ํˆฌ๋ช…์„ฑ์„ ์›ํ•œ๋‹ค๋ฉด ๋‹น์‹ ์€ ์ด ๋ฌธ์„œ์˜ ๋‚˜์ค‘์— ์„ค๋ช…๋˜๋Š”๊ฒƒ์ฒ˜๋Ÿผ ๋‹น์‹ ์˜ result maps๋‚ด์— null๊ฐ’ ๋Œ€์ฒด๋ฅผ
๋ฐ˜๋“œ์‹œ ๋ช…์‹œํ•ด์•ผ ํ•œ๋‹ค.

์ฃผ์˜! ๋‹น์‹ ์ด ๋งŽ์€ ์ˆ˜์˜ ํƒ€์ž… ์„œ์ˆ ์ž์™€ null๊ฐ’ ๋Œ€์ฒด๊ฐ€ ํ•„์š”ํ•˜๋‹ค๋ฉด ๋‹น์‹ ์€ ์™ธ๋ถ€์ ์ธ ๊ฒƒ์„ ์‚ฌ์šฉํ•ด์„œ ์ฝ”๋“œ๋ฅผ ์ •๋ฆฌํ• ์ˆ˜ ์žˆ์–ด
์•ผ ํ• ๊ฒƒ์ด๋‹ค.


์›์‹œํƒ€์ž… ํŒŒ๋ผ๋ฏธํ„ฐ

ํŒŒ๋ผ๋ฏธํ„ฐ์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ์ž๋ฐ”๋นˆ์„ ์“ฐ๋Š” ๊ฒƒ์€ ์–ธ์ œ๋‚˜ ํ•„์š”ํ•˜๊ณ  ํŽธ๋ฆฌํ•œ ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค. ์ด๋Ÿฐ ๊ฒฝ์šฐ์— ๋‹น์‹ ์€ ์ง์ ‘์ ์œผ๋กœ ํŒŒ
๋ผ๋ฏธํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๊ฒƒ์ฒ˜๋Ÿผ ์›์‹œํƒ€์ž… ๋ž˜ํผ๊ฐ์ฒด(String, Integer, Date๋“ฑ๋“ฑ)๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ํ™˜์˜ํ• ๊ฒƒ์ด๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด :




                                                19
<statement id=โ€insertProductโ€ parameter=โ€java.lang.Integerโ€>
       select * from PRODUCT where PRD_ID = #value#
</statement>

PRD_ID๊ฐ€ ์ˆซ์ž ํƒ€์ž…์ด๋ผ๊ณ  ๊ฐ€์ •ํ•˜์ž. ํ˜ธ์ถœ์ด ๋˜์—ˆ์„ ๋•Œ java.lang.Integer๊ฐ์ฒด๋ฅผ ์ „๋‹ฌํ• ์ˆ˜ ์žˆ๋Š” ๋งตํ•‘๋œ statement๋ฅผ ๋งŒ๋“ค๊ฒƒ
์ด๋‹ค. #value# ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” Integer์ธ์Šคํ„ด์Šค์˜ ๊ฐ’์œผ๋กœ ๋Œ€์ฒด๋ ๊ฒƒ์ด๋‹ค. โ€œvalueโ€๋ผ๋Š” ์ด๋ฆ„์€ ๊ฐ„๋‹จํ•œ ๋ฌธ๋ฒ•(์ด๋ฅผ ํ…Œ๋ฉด ๊ด„ํ˜ธ)์•ˆ
์˜ ์š”์†Œ์ด๊ณ  ๋ณ„๋ช…์ด ๋ ์ˆ˜ ์žˆ๋‹ค. Result Map๋Š” result์ฒ˜๋Ÿผ ์›์‹œํƒ€์ž…์„ ์ž˜ ์ง€์›ํ•œ๋‹ค. ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์›์‹œํƒ€์ž…์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์—
๋Œ€ํ•ด์„œ ์ข€๋” ๋‹ค์–‘ํ•œ ์ •๋ณด๋ฅผ ์œ„ํ•ด์„œ๋Š” Result Map์„น์…˜๊ณผ ํ”„๋กœ๊ทธ๋ž˜๋ฐ SQL Maps(API)๋ฅผ ๋ณด๋ผ.

์›์‹œ ํƒ€์ž…์€ ์ข€๋” ๊ฐ„๊ฒฐํ•œ ์ฝ”๋“œ๋ฅผ ์œ„ํ•ด์„œ ๋ณ„์นญ๋œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด โ€œintโ€๋Š” โ€œjava.lang.Integerโ€๋Œ€์‹ ์— ์‚ฌ์šฉ๋ ์ˆ˜ ์žˆ๋‹ค. ๋ณ„์นญ์€ ์•„
๋ž˜์˜ โ€œํŒŒ๋ผ๋ฏธํ„ฐ Map๊ณผ result Map์„ ์œ„ํ•ด ์ง€์›๋˜๋Š” ํƒ€์ž…โ€ ์ด๋ผ๋Š” ์ œ๋ชฉ์˜ ํ…Œ์ด๋ธ”์—์„œ ์ด์•ผ๊ธฐ ๋œ๋‹ค.



Map ํƒ€์ž… ํŒŒ๋ผ๋ฏธํ„ฐ

๋‹น์‹ ์ด ์ž๋ฐ”๋นˆ์ฆˆ ํด๋ž˜์Šค๋ฅผ ์“ฐ๋Š” ๊ฒƒ์ด ํ•„์š”ํ•˜์ง€ ์•Š๊ฑฐ๋‚˜ ํŽธ๋ฆฌํ•˜์ง€ ์•Š์€ ์œ„์น˜์— ์žˆ๊ณ  ํ•˜๋‚˜์˜ ์›์‹œํƒ€์ž… ํŒŒ๋ผ๋ฏธํ„ฐ์„ ์“ฐ์ง€๋Š” ์•Š
๋Š”๋‹ค๋ฉด ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ์ฒด๋กœ Map(์ด๋ฅผ ํ…Œ๋ฉด HashMap, TreeMap)์„ ์‚ฌ์šฉํ• ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด :

<statement id=โ€insertProductโ€ parameterClass=โ€java.util.Mapโ€>
       select * from PRODUCT
       where PRD_CAT_ID = #catId#
       and PRD_CODE = #code#
</statement>

๋งตํ•‘๋œ statement๊ตฌํ˜„๋‚ด์—์„œ๋Š” ์ฐจ์ด์ ์ด ์—†๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๋ผ. ์œ„์˜ ์˜ˆ์ œ์—์„œ ๋งŒ์•ฝ Map์ธ์Šคํ„ด์Šค๊ฐ€ statement๋ฅผ ์œ„ํ•œ ํ˜ธ์ถœ๋กœ ์ „
๋‹ฌ๋˜์—ˆ๋‹ค๋ฉด Map์€ โ€œcatIdโ€ ๊ณผ โ€œcodeโ€ ๋ผ๋Š” ์ด๋ฆ„์˜ ํ‚ค๋ฅผ ํฌํ•จํ•ด์•ผ๋งŒ ํ•œ๋‹ค. ์ด ๊ฐ’์€ Integer๊ณผ String๊ณผ ๊ฐ™์€ ์„ ํ˜ธ๋˜๋Š” ํƒ€์ž…์ด ๋˜
๋Š” ๊ทธ๋Ÿฐ ํ‚ค์— ์˜ํ•ด ์ฐธ์กฐ๋œ๋‹ค. Result Map์€ result์ฒ˜๋Ÿผ Mapํƒ€์ž…์„ ์•„์ฃผ ์ž˜ ์ง€์›ํ•œ๋‹ค. ํŒŒ๋ผ๋ฏธํ„ฐ์ฒ˜๋Ÿผ Mapํƒ€์ž…์„ ์‚ฌ์šฉํ•˜๋Š”๊ฒƒ์—
๋Œ€ํ•œ ์ข€๋” ์ƒ์„ธํ•œ ์ •๋ณด๋ฅผ ์œ„ํ•ด์„œ๋Š” result Map์„น์…˜๊ณผ ํ”„๋กœ๊ทธ๋ž˜๋ฐ SQL Map(API)๋ฅผ ๋ณด๋ผ.

Map ํƒ€์ž… ์—ญ์‹œ ์ข€๋” ๊ฐ„๊ฒฐํ•œ ์ฝ”๋“œ๋ฅผ ์œ„ํ•ด ๋ณ„์นญ๋œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด โ€œmapโ€๋Š” โ€œjava.util.Mapโ€์„ ๋Œ€์‹ ํ• ์ˆ˜ ์žˆ๋‹ค. ๋ณ„์นญ์€ ์•„๋ž˜์˜ โ€œํŒŒ
๋ผ๋ฏธํ„ฐ Map๊ณผ result Map์„ ์œ„ํ•ด ์ง€์›๋˜๋Š” ํƒ€์ž…โ€ ์ด๋ผ๋Š” ์ œ๋ชฉ์˜ ํ…Œ์ด๋ธ”์—์„œ ์ด์•ผ๊ธฐ ๋œ๋‹ค.


Result Maps

Result maps๋Š” SQL Maps์˜ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ์ปดํฌ๋„ŒํŠธ์ด๋‹ค. resultMap๋Š” ์ž๋ฐ”๋นˆ์ฆˆ ํ”„๋ผํผํ‹ฐ๋ฅผ ๋งตํ•‘๋œ ์ฟผ๋ฆฌ statement๋ฅผ
์‹คํ–‰ํ•จ์œผ๋กœ์จ ์ƒ์‚ฐ๋œ ResultSet์˜ ์นผ๋Ÿผ์— ๋งตํ•‘์‹œํ‚ค๋Š” ์ฑ…์ž„์„ ์ง„๋‹ค. resultMap์˜ ๊ตฌ์กฐ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ณด์ธ๋‹ค.

<resultMap id=โ€resultMapNameโ€ class=โ€some.domain.Classโ€ [extends=โ€parent-resultMapโ€]>
       <result property=โ€propertyNameโ€ column=โ€COLUMN_NAMEโ€
                 [columnIndex=โ€1โ€] [javaType=โ€intโ€] [jdbcType=โ€NUMERICโ€]
                 [nullValue=โ€-999999โ€] [select=โ€someOtherStatementโ€]
                 />
       <result โ€ฆโ€ฆ/>
       <result โ€ฆโ€ฆ/>
       <result โ€ฆโ€ฆ/>

</resultMap>

[๊ด„ํ˜ธ] ๋ถ€๋ถ„์€ ์˜ต์…˜์ด๋‹ค. resultMap๋Š” ์Šค์Šค๋กœ statement๊ฐ€ ๊ทธ๊ฒƒ์„ ์ฐธ์กฐํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•  id์†์„ฑ์„ ๊ฐ€์ง„๋‹ค. resultMap๋Š” ํด๋ž˜
์Šค๋‚˜ ํƒ€์ž…๋ณ„์นญ์˜ ์ „์ฒด๊ฒฝ๋กœ๋ฅผ ํฌํ•จํ•œ ์ด๋ฆ„์ธ class์†์„ฑ์„ ๊ฐ€์ง„๋‹ค. ์ด ํด๋ž˜์Šค๋Š” ์ด๊ฒƒ์„ ํฌํ•จํ•˜๋Š” result๋งตํ•‘์— ๊ธฐ๋ฐ˜ํ•˜์—ฌ ์ดˆ๊ธฐ
ํ™”๋˜๊ณ  ์ƒ์„ฑ๋ ๊ฒƒ์ด๋‹ค. Extends์†์„ฑ์€ resultMap์— ๊ธฐ์ดˆํ•œ ๋‹ค๋ฅธ resultMap์˜ ์ด๋ฆ„์„ ์˜ต์…˜์ ์œผ๋กœ ์…‹ํŒ…ํ• ์ˆ˜ ์žˆ๋‹ค. ์ด๊ฒƒ์€ ์ƒ
์œ„ resultMap์˜ ๋ชจ๋“  ํ”„๋ผํผํ‹ฐ๊ฐ€ ํ•˜์œ„ resultMap์˜ ๋ถ€๋ถ„์„ ํฌํ•จํ•˜๋Š”๊ฒƒ์ฒ˜๋Ÿผ ์ž๋ฐ”๋‚ด์—์„œ ํด๋ž˜์Šค๋ฅผ ํ™•์žฅํ•˜๋Š”๊ฒƒ๊ณผ ์œ ์‚ฌํ•˜๋‹ค. ์ƒ
์œ„ resultMap์˜ ํ”„๋ผํผํ‹ฐ๋Š” ํ•˜์œ„ resultMapํ”„๋ผํผํ‹ฐ์™€ ๋ถ€๋ชจ resultMap๊ฐ€ ์ž์‹ ์•ž์—์„œ ์ •์˜๋˜๊ธฐ ์ „์— ์–ธ์ œ๋‚˜ ์ถ”๊ฐ€๋œ๋‹ค. ์ƒ์œ„/
ํ•˜์œ„ resultMap๋ฅผ ์œ„ํ•œ ํด๋ž˜์Šค๋Š” ๊ฐ™์€ ๊ฒƒ์„ ํ•„์š”๋กœ ํ•˜์ง€ ์•Š์„๋ฟ ์•„๋‹ˆ๋ผ ๋ชจ๋“  ๊ฒƒ์ด ๊ด€๋ จ๋  ํ•„์š”๋„ ์—†๋‹ค.

resultMap ์€ ์ž๋ฐ”๋นˆ์ฆˆ๋ฅผ ResultSet์˜ ์นผ๋Ÿผ์— ๋งตํ•‘์‹œํ‚ค๋Š” ์–ด๋Š์ •๋„์˜ ํ”„๋ผํผํ‹ฐ ๋งตํ•‘์„ ํฌํ•จํ• ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋Ÿฐ ํ”„๋ผํผํ‹ฐ ๋งตํ•‘
์€ ๋ฌธ์„œ๋‚ด์—์„œ ์ •์˜ํ•˜๊ธฐ ์œ„ํ•ด ์ ์šฉ๋ ๊ฒƒ์ด๋‹ค. ๊ด€๋ จ ํด๋ž˜์Šค๋Š” ๊ฐ๊ฐ์˜ ํ”„๋ผํผํ‹ฐ, Map๋˜๋Š” XML์„ ์œ„ํ•œ get/set๋ฉ”์†Œ๋“œ๋ฅผ ๊ฐ€์ง„
์ž๋ฐ”๋นˆ์ฆˆ์™€ ํ˜ธํ™˜๋˜๋Š” ํด๋ž˜์Šค์—ฌ์•ผ๋งŒ ํ•œ๋‹ค.


                                                 20
์ฃผ์˜! ์นผ๋Ÿผ์€ Result Map๋‚ด์—์„œ ์ •์˜๋˜๊ธฐ ์œ„ํ•ด์„œ ๋ช…์‹œ์ ์œผ๋กœ ์ฝ์„๊ฒƒ์ด๋‹ค.

๋‹ค์Œ์˜ ์„น์…˜์€ property์š”์†Œ์˜ ์†์„ฑ๋“ค์„ ์„œ์ˆ ํ•œ๋‹ค.

property

result map์˜ property ์†์„ฑ์€ ๋งตํ•‘ statement์— ์˜ํ•ด ๋ฐ˜ํ™˜๋˜๋Š” result๊ฐ์ฒด์˜ ์ž๋ฐ”๋นˆ์ฆˆ ํ”„๋ผํผํ‹ฐ(get๋ฉ”์†Œ๋“œ) ์ด๋ฆ„์ด๋‹ค. ์ด๋ฆ„
์€ results๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ํ•„์š”ํ•œ ํšŸ์ˆ˜์— ์˜์กด์ ์ธ ๊ฐ’๋ณด๋‹ค ๋” ํฌ๊ฒŒ ์‚ฌ์šฉ๋ ์ˆ˜ ์žˆ๋‹ค.



column

column ์†์„ฑ๊ฐ’์€ ํ”„๋ผํผํ‹ฐ๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋  ๊ฐ’๋“ค๋กœ๋ถ€ํ„ฐ์˜ ResultSet๋‚ด์˜ ์นผ๋Ÿผ์˜ ์ด๋ฆ„์ด๋‹ค.



columnIndex

์˜ต์…˜์ ์ธ(์ตœ์†Œํ•œ์˜) ์„ฑ๋Šฅํ–ฅ์ƒ์„ ์œ„ํ•ด์„œ columnIndex ์†์„ฑ๊ฐ’์€ ์ž๋ฐ”๋นˆ์ฆˆ ํ”„๋ผํผํ‹ฐ๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋  ๊ฐ’์œผ๋กœ๋ถ€ํ„ฐ์˜
ResultSet๋‚ด์˜ ์นผ๋Ÿผ์˜ ์ธ๋ฑ์Šค์ด๋‹ค. ์ด๊ฒƒ์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ 99%์ •๋„์—” ํ•„์š”ํ•˜์ง€ ์•Š์„๊ฒƒ์ด๊ณ  ์œ ์ง€๋ฅผ ์œ„ํ•œ ๋…ธ๋ ฅ๊ณผ ์†๋„๋ฅผ ์œ„
ํ•ด ๊ฐ€๋…์„ฑ์„ ํฌ์ƒํ•œ๋‹ค. ๋ช‡๋ช‡ JDBC๋“œ๋ผ์ด๋ฒ„๋Š” ๋‹ค๋ฅธ๊ฒƒ๋“ค์ด ๋™์ ์œผ๋กœ ์†๋„๋ฅผ ์˜ฌ๋ ค์ฃผ๋Š” ๋™์•ˆ ์–ด๋–ค ์„ฑ๋Šฅ์ด๋“๋„ ๊ตฌ์ฒดํ™”ํ•˜์ง€ ์•Š์„
๊ฒƒ์ด๋‹ค.

jdbcType

jdbcType ์†์„ฑ์€ ์ž๋ฐ”๋นˆ์ฆˆ ํ”„๋ผํผํ‹ฐ๋ฅผ ์ƒ์„ฑํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋˜๋Š” ResultSet ์นผ๋Ÿผ์˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์นผ๋Ÿผ ํƒ€์ž…์„ ๋ช…์‹œ์ ์œผ๋กœ ์ •์˜
ํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋œ๋‹ค. ๋น„๋ก result maps์ด null๊ฐ’๊ณผ ํ•จ๊ป˜ ๊ฐ™์€ ์–ด๋ ค์›€์„ ๊ฐ€์ง€์ง€ ์•Š๋Š”๋‹ค๊ณ  ํ•˜๋”๋ผ๋„ Dateํ”„๋ผํผํ‹ฐ์ฒ˜๋Ÿผ ์–ด๋–ค ๋งตํ•‘
ํƒ€์ž…์„ ์œ„ํ•ด ์œ ์šฉํ• ์ˆ˜ ์žˆ๋Š” ํƒ€์ž…์„ ์ •์˜ํ•œ๋‹ค. ์ž๋ฐ”๋Š” ์˜ค์ง ํ•˜๋‚˜์˜ Date๊ฐ’ ํƒ€์ž…์„ ๊ฐ€์ง€๊ณ  SQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” ์—ฌ๋Ÿฌ๊ฐ€์ง€๋ฅผ
๊ฐ€์ง€๊ธฐ ๋•Œ๋ฌธ์— dates(๋˜๋Š” ๋‹ค๋ฅธํƒ€์ž…)ํƒ€์ž…์„ ์ •ํ™•ํ•˜๊ฒŒ ์…‹ํŒ…ํ•˜๋Š” ๊ฒƒ์„ ํ™•์‹ ํ•˜๋Š” ๋ช‡๋ช‡๊ฒฝ์šฐ์— ํ•„์š”ํ•˜๊ฒŒ ๋ ๊ฒƒ์ด๋‹ค. ์œ ์‚ฌํ•˜๊ฒŒ๋„
Stringํƒ€์ž…์€ VARCHAR, CHAR ๋˜๋Š” CLOB์— ์˜ํ•ด ์ƒ์„ฑ๋ ๊ฒƒ์ด๋‹ค. ๊ทธ๋ž˜์„œ ๊ทธ๋Ÿฐ ๊ฒฝ์šฐ์— ํ•„์š”ํ•œ ํƒ€์ž…์„ ์ •์˜ํ•˜๋ผ.



javaType

javaType ์†์„ฑ์€ ์…‹ํŒ…๋˜๋Š” ํ”„๋ผํผํ‹ฐ์˜ ์ž๋ฐ”ํ”„๋ผํผํ‹ฐํƒ€์ž…์„ ๋ช…์‹œ์ ์œผ๋กœ ์ •์˜ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋œ๋‹ค. ๋Œ€๊ฐœ ์ด๊ฒƒ์€ ๋ฆฌํ”Œ๋ ‰์…˜
(reflection)์„ ํ†ตํ•ด ์ž๋ฐ”๋นˆ์ฆˆ ํ”„๋ผํผํ‹ฐ๋กœ๋ถ€ํ„ฐ ๋Œ์–ด๋‚ผ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ Map์™€ XML๋งตํ•‘๊ณผ ๊ฐ™์€ ๋งตํ•‘์€ ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์œ„ํ•œ ํƒ€
์ž…์„ ์ œ๊ณตํ• ์ˆ˜ ์—†๋‹ค. ๋งŒ์•ฝ javaType๊ฐ€ ์…‹ํŒ…๋˜์ง€ ์•Š๊ณ  ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ๊ทธ ํƒ€์ž…์„ ๊ตฌ๋ถ„ํ• ์ˆ˜ ์—†๋‹ค๋ฉด ํƒ€์ž…์€ ๊ฐ์ฒด๋กœ ๊ฐ€์ •๋˜์–ด ์ฒ˜
๋ฆฌ๋ ๊ฒƒ์ด๋‹ค.



nullValue

nullValue ์†์„ฑ์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋‚ด์—์„œ NULL๊ฐ’์„ ๋Œ€์‹ ํ•ด์„œ ์‚ฌ์šฉ๋˜๊ธฐ ์œ„ํ•œ ๊ฐ’์„ ์ •์˜ํ•œ๋‹ค. ๊ทธ๋ž˜์„œ ๋งŒ์•ฝ ResultSet์œผ๋กœ๋ถ€ํ„ฐ
NULL์ด ์ฝ์—ˆ๋‹ค๋ฉด ์ž๋ฐ”๋นˆ ํ”„๋ผํผํ‹ฐ๋Š” NULL๋Œ€์‹ ์— nullValue์†์„ฑ์— ์˜ํ•ด ์ •์˜๋œ ๊ฐ’์„ ์…‹ํŒ…ํ• ๊ฒƒ์ด๋‹ค. null ์†์„ฑ๊ฐ’์€ ์–ด๋– ํ•œ ๊ฐ’
์„ ๋ ์ˆ˜ ์žˆ์ง€๋งŒ ํ”„๋ผํผํ‹ฐํƒ€์ž…์„ ์œ„ํ•ด์„œ๋Š” ์ ์ ˆํ•ด์•ผ๋งŒ ํ•œ๋‹ค.

๋งŒ์•ฝ ๋‹น์‹ ์˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ NULL์ด ๊ฐ€๋Šฅํ•œ ์นผ๋Ÿผ์„ ๊ฐ€์ง„๋‹ค๋ฉด ๋‹น์‹ ์€ ๋‹น์‹ ์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๋‹ค์Œ์ฒ˜๋Ÿผ result map๋‚ด์—
์„œ ๊ทธ๊ฒƒ์„ ์ •์˜ํ• ์ˆ˜ ์žˆ๋Š” ๋ณ€์ˆ˜๊ฐ’๊ณผ ํ•จ๊ป˜ NULL์„ ํ‘œ์‹œํ•˜๊ธฐ๋ฅผ ์›ํ•œ๋‹ค.

      <resultMap id=โ€get-product-resultโ€ class=โ€com.ibatis.example.Productโ€>
             <result property=โ€idโ€ column=โ€PRD_IDโ€/>
             <result property=โ€descriptionโ€ column=โ€PRD_DESCRIPTIONโ€/>
             <result property=โ€subCodeโ€ column=โ€PRD_SUB_CODEโ€ nullValue=โ€-999โ€/>
      </resultMap>

์œ„ ์˜ˆ์ œ์—์„œ ๋งŒ์•ฝ PRD_SUB_CODE์ด NULL๋กœ ์ฝํ˜€์ง„๋‹ค๋ฉด subCode ํ”„๋ผํผํ‹ฐ๋Š” -999๋ผ๋Š” ๊ฐ’์œผ๋กœ ์…‹ํŒ…๋ ๊ฒƒ์ด๋‹ค. ์ด๊ฒƒ์€ ๋‹น์‹ 
์—๊ฒŒ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋‚ด์—์„œ NULL์ด ๊ฐ€๋Šฅํ•œ ์นผ๋Ÿผ์„ ํ‘œํ˜„ํ•˜๊ธฐ ์œ„ํ•ด ๋‹น์‹ ์˜ ์ž๋ฐ”ํด๋ž˜์Šค๋‚ด์— ์›์‹œํƒ€์ž…์„ ์‚ฌ์šฉํ•˜๋„๋ก ํ—ˆ๋ฝํ• ๊ฒƒ์ด
๋‹ค. ๋งŒ์•ฝ ๋‹น์‹ ์ด updates/inserts๊ฐ™์€ ์ฟผ๋ฆฌ๋ฅผ ์œ„ํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ๋ฅผ ์›ํ•  ๋•Œ ๋‹น์‹ ์€ ํŒŒ๋ผ๋ฏธํ„ฐ map๋‚ด์— nullValue๋ฅผ ์ •์˜ํ•ด


                                             21
์•ผ๋งŒ ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ๊ธฐ์–ตํ•ด๋ผ.



select

select ์†์„ฑ์€ ๊ฐ์ฒด์‚ฌ์ด์˜ ๊ด€๊ณ„๋ฅผ ์„œ์ˆ ํ•˜๊ณ  ์ž๋™์ ์œผ๋กœ ๋ณตํ•ฉ ํ”„๋ผํผํ‹ฐ ํƒ€์ž…์„ ๋กœ๋“œํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋œ๋‹ค. statementํ”„๋ผํผํ‹ฐ๊ฐ’
์€ ๋‹ค๋ฅธ ๋งตํ•‘๋œ statement์˜ ์ด๋ฆ„์ด ๋˜์–ด์•ผ๋งŒ ํ•œ๋‹ค. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์นผ๋Ÿผ๊ฐ’์€ statement์†์„ฑ์ด ํŒŒ๋ผ๋ฏธํ„ฐ์ฒ˜๋Ÿผ ๊ด€๊ณ„๋œ ๋งตํ•‘
statement๋กœ ์ „๋‹ฌํ•˜๋Š”๊ฒƒ์ฒ˜๋Ÿผ ๊ฐ™์€ property์š”์†Œ๋‚ด์— ์ •์˜๋œ๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ ์นผ๋Ÿผ์€ ์›์‹œํƒ€์ž…์œผ๋กœ ์ง€์›์ด ๋˜์–ด์•ผ ํ•œ๋‹ค. ์ง€์›๋˜
๋Š” ์›์‹œํƒ€์ž…๊ณผ ๋ณตํ•ฉ ํ”„๋ผํผํ‹ฐ ๋งตํ•‘/๊ด€๊ณ„์— ๋Œ€ํ•œ ์ƒ์„ธ์ •๋ณด๋Š” ์ด ๋ฌธ์„œ ๋‚˜์ค‘์— ์ด์•ผ๊ธฐ ๋œ๋‹ค.




๋‚ดํฌํ•˜๋Š” Result Maps

๋งŒ์•ฝ ๋‹น์‹ ์ด ๋ช…์‹œ์ ์œผ๋กœ ์ •์˜๋œ resultMap์˜ ์žฌ์‚ฌ์šฉ์„ ์š”๊ตฌํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๋งค์šฐ ๊ฐ„๋‹จํ•œ ์š”๊ตฌ์‚ฌํ•ญ์„ ๊ฐ€์ง„๋‹ค๋ฉด ๋งตํ•‘๋œ
statement์˜ resultClass์†์„ฑ์„ ์…‹ํŒ…ํ•จ์œผ๋กœ์จ result map์„ ํ•จ์ถ•์ ์œผ๋กœ ์ •์˜ํ•˜๋Š” ๋น ๋ฅธ ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค. ์ด ๋ฌ˜๊ธฐ๋Š” ๋‹น์‹ ์ด ๋ฐ˜ํ™˜๋˜
๋Š” result set์ด ๋‹น์‹ ์˜ ์ž๋ฐ”๋นˆ์˜ ์“ฐ๊ธฐ ๊ฐ€๋Šฅํ•œ ํ”„๋ผํผํ‹ฐ ์ด๋ฆ„์— ๋งค์น˜๋˜๋Š” ์นผ๋Ÿผ์ด๋ฆ„(๋˜๋Š” ๋ผ๋ฒจ/๋ณ„์นญ)์„ ๊ฐ€์ง€๋Š” ๊ฒƒ์„ ํ™•์‹คํ•ด์•ผ๋งŒ
ํ•œ๋‹ค๋Š”๊ฒƒ์ด๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋งŒ์•ฝ ์šฐ๋ฆฌ๊ฐ€ ์œ„์—์„œ ์„œ์ˆ ๋œ Productํด๋ž˜์Šค๋ฅผ ์ƒ๊ฐํ•  ๋•Œ ์šฐ๋ฆฌ๋Š” ๋‹ค์Œ์ฒ˜๋Ÿผ ๋‚ดํฌํ•˜๋Š” result map์œผ๋กœ
๋งตํ•‘๋œ statement๋ฅผ ์ƒ์„ฑํ• ์ˆ˜ ์žˆ๋‹ค.
<statement id=โ€getProductโ€ resultClass=โ€com.ibatis.example.Productโ€>
         select
            PRD_ID as id,
            PRD_DESCRIPTION as description
         from PRODUCT
        where PRD_ID = #value#
</statement>

์œ„์˜ ๋งตํ•‘๋œ statement๋Š” resultClass๋ฅผ ํ‘œ๊ธฐํ•˜๊ณ  Productํด๋ž˜์Šค์˜ ์ž๋ฐ”๋นˆ์ฆˆ ํ”„๋ผํผํ‹ฐ์— ๋งค์น˜๋˜๋Š” ๊ฐ๊ฐ์˜ ์นผ๋Ÿผ๋ฅผ ์œ„ํ•œ ๋ณ„์นญ
์„ ๋ช…์‹œํ•œ๋‹ค. ์ด๊ฒƒ์€ ๋ชจ๋‘ ํ•„์ˆ˜(required) ์ด๋‹ค. Result map์€ ํ•„์š”ํ•˜์ง€ ์•Š๋‹ค. ์—ฌ๊ธฐ์„œ ๊ตํ™˜(tradeoff)์€ ๋‹น์‹ ์ด ์นผ๋Ÿผํƒ€์ž…(๋Œ€๊ฐœ
ํ•„์ˆ˜๊ฐ€ ์•„๋‹Œ)๊ณผ null๊ฐ’(๋˜๋Š” ๋‹ค๋ฅธ ์–ด๋–ค ํ”„๋ผํผํ‹ฐ ์†์„ฑ)์„ ์ •์˜ํ•˜๋Š” ๊ธฐํšŒ๋ฅผ ๊ฐ€์ง€์ง€ ์•Š๋Š”๊ฒƒ์ด๋‹ค. ๋งŽ์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ๋Œ€์†Œ๋ฌธ
์ž๋ฅผ ๊ฐ€๋ฆฌ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋‚ดํฌ๋œ result map๋Š” ๋˜ํ•œ ๊ฐ€๋ฆฌ์ง€ ์•Š๋Š”๋‹ค. ๋งŒ์•ฝ ๋‹น์‹ ์˜ ์ž๋ฐ”๋นˆ์ด ๋‘๊ฐœ์˜ ํ”„๋ผํผํ‹ฐ๋ฅผ ๊ฐ€์ง„๋‹ค๋ฉด ํ•˜๋‚˜
์˜ ์ด๋ฆ„์€ firstName์ด๊ณ  ๋‹ค๋ฅธ ๊ฒƒ์€ firstname์ด๋‹ค(๋‘๊ฐœ์˜ ๊ฐ’์€ ๋Œ€์†Œ๋ฌธ์ž์˜ ์ฐจ์ด์ด๋‹ค). ๊ทธ๊ฒƒ๋“ค์€ ๋™์ผํ•˜๊ณ  ๋‹น์‹ ์€ ๋‚ดํฌ๋œ
result map๋ฅผ ์‚ฌ์šฉํ• ์ˆ˜์—†์„๊ฒƒ์ด๋‹ค(์ด๊ฒƒ์€ ์ž๋ฐ”๋นˆ ํด๋ž˜์Šค์˜ ๋””์ž์ธ์—์„œ ์ž ์žฌ์ ์ธ ๋ฌธ์ œ์ ์„ ํŒŒ์•…ํ•˜๊ฒŒ ๋ ๊ฒƒ์ด๋‹ค.). ๊ฒŒ๋‹ค๊ฐ€
resultClass๋ฅผ ํ†ตํ•ด ์ž๋™๋งตํ•‘์„ ํ•˜๋ฉด ๋ช‡๋ช‡ ์„ฑ๋Šฅ์— ๊ด€๋ จ๋œ ๋ถ€ํ•˜๊ฐ€ ๋ฐœ์ƒํ• ๊ฒƒ์ด๋‹ค. ResultSetMetaData์— ์ ‘๊ทผํ•˜๋Š” ๊ฒƒ์€ ๋ช‡๋ช‡ ์“ฐ
์—ฌ์ง„ JDBC๋“œ๋ผ์ด๋ฒ„๋กœ๋Š” ๋Š๋ฆฌ๊ฒŒ ๋งŒ๋“ค์ˆ˜ ์žˆ๋‹ค.



์›์‹œํƒ€์ž…์˜ Results (์ด๋ฅผ ํ…Œ๋ฉด String, Integer, Boolean)

์ž๋ฐ”๋นˆ ํ˜ธํ™˜ ํด๋ž˜์Šค๋ฅผ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•ด ์ถ”๊ฐ€์ ์œผ๋กœ result Map์€ String, Integer, Boolean ๋“ฑ๋“ฑ๊ณผ ๊ฐ™์€ ๊ฐ„๋‹จํ•œ ์ž๋ฐ”ํƒ€์ž… ๋ž˜ํผ๋ฅผ
ํŽธ๋ฆฌํ•˜๊ฒŒ ์ƒ์„ฑํ• ์ˆ˜ ์žˆ๋‹ค. ์›์‹œํƒ€์ž…๊ฐ์ฒด์˜ collection์€ ๋ฐ‘์—์„œ ์ด์•ผ๊ธฐ ๋˜๋Š” API(executeQueryForList()๋ฅผ ๋ณด๋ผ)๋“ค์„ ์‚ฌ์šฉํ•ด์„œ
๊ฐ€์ ธ์˜ฌ์ˆ˜ ์žˆ๋‹ค. ์›์‹œํƒ€์ž…์€ ์ž๋ฐ”๋นˆ์ฒ˜๋Ÿผ ๊ฐ™์€ ๋ฐฉ๋ฒ•์œผ๋กœ ์ •ํ™•ํ•˜๊ฒŒ ๋งตํ•‘๋œ๋‹ค. ์›์‹œํƒ€์ž…์€ ๋‹น์‹ ์ด ์„ ํ˜ธํ•˜๋Š”(๋Œ€๊ฐœ โ€œvalueโ€ ๋˜๋Š”
โ€œvalโ€) ์ด๋ฆ„ํ˜•์‹์˜ ์–ด๋–ค๊ฒƒ์ฒ˜๋Ÿผ ๋ ์ˆ˜ ์žˆ๋Š” ํ•˜๋‚˜์˜ ํ”„๋ผํผํ‹ฐ๋งŒ์„ ๊ฐ€์งˆ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด ์šฐ๋ฆฌ๊ฐ€ ์ „์ฒด Productํด๋ž˜์Šค ๋Œ€์‹ ์— ๋ชจ
๋“  product์„œ์ˆ ์ž(description)์˜ ๋ชฉ๋ก๋งŒ์„ ๋กœ๋“œํ•˜๊ธธ ์›ํ•œ๋‹ค๋ฉด map์€ ๋‹ค์Œ์ฒ˜๋Ÿผ ๋ณด์—ฌ์งˆ๊ฒƒ์ด๋‹ค.

<resultMap id=โ€get-product-resultโ€ class=โ€java.lang.Stringโ€>
       <result property=โ€valueโ€ column=โ€PRD_DESCRIPTIONโ€/>
</resultMap>

์ข€๋” ๊ฐ„๋‹จํ•œ ์ ‘๊ทผ๋ฒ•์€ ๋งตํ•‘๋œ statement์•ˆ์—์„œ ๊ฐ„๋‹จํ•˜๊ฒŒ result class๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๊ฒƒ์ด๋‹ค.(โ€œasโ€ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์„œ โ€œvalueโ€
๋ผ๋Š” ์นผ๋Ÿผ๋ณ„์นญ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ์ฃผ์˜๊นŠ๊ฒŒ ๋ณด๋ผ.)

<statement id=โ€getProductCountโ€ resultClass=โ€java.lang.Integerโ€>
   select count(1) as value
   from PRODUCT
</statement>




                                                 22
Map Results

Result Maps์€ HashMap๋˜๋Š” TreeMap์ฒ˜๋Ÿผ Map์ธ์Šคํ„ด์Šค๋ฅผ ํŽธ๋ฆฌํ•˜๊ฒŒ ์ƒ์„ฑํ• ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋Ÿฐ ๊ฐ์ฒด(Map์˜ List)์˜ collection์€
์•„๋ž˜์—์„œ ์ด์•ผ๊ธฐ๋˜๋Š” API(executeQueryForList()๋ฅผ ๋ณด๋ผ)๋“ค์„ ์‚ฌ์šฉํ•ด์„œ ๊ฐ€์ ธ์˜ฌ์ˆ˜ ์žˆ๋‹ค. Mapํƒ€์ž…์€ ์ž๋ฐ”๋นˆ๊ณผ ๊ฐ™์€ ๋ฐฉ๋ฒ•์œผ๋กœ
์ •ํ™•ํ•˜๊ฒŒ ๋งตํ•‘๋œ๋‹ค. ํ•˜์ง€๋งŒ ์ž๋ฐ”๋นˆ ํ”„๋ผํผํ‹ฐ์…‹ํŒ… ๋Œ€์‹ ์— Map์˜ key๋“ค์€ ๋Œ€์‘๋˜๋Š” ๋งตํ•‘์นผ๋Ÿผ์„ ์œ„ํ•œ ๊ฐ’์„ ์ฐธ์กฐํ•˜๋„๋ก ์…‹ํŒ…ํ•œ
๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋งŒ์•ฝ ์šฐ๋ฆฌ๊ฐ€ product์˜ ๊ฐ’์„ Map์œผ๋กœ ๋นจ๋ฆฌ ๋กœ๋“œ์‹œํ‚ค๊ธธ ์›ํ•œ๋‹ค๋ฉด ์šฐ๋ฆฌ๋Š” ๋‹ค์Œ์ฒ˜๋Ÿผ ํ• ๊ฒƒ์ด๋‹ค.

<resultMap id=โ€get-product-resultโ€ class=โ€java.util.HashMapโ€>
       <result property=โ€idโ€ column=โ€PRD_IDโ€/>
       <result property=โ€codeโ€ column=โ€PRD_CODEโ€/>
       <result property=โ€descriptionโ€ column=โ€PRD_DESCRIPTIONโ€/>
       <result property=โ€suggestedPriceโ€ column=โ€PRD_SUGGESTED_PRICEโ€/>
</resultMap>
์œ„ ์˜ˆ์ œ์—์„œ HashMap์ธ์Šคํ„ด์Šค๋Š” Product๋ฐ์ดํ„ฐ๋ฅผ ์ƒ์„ฑํ• ๊ฒƒ์ด๋‹ค. ํ”„๋ผํผํ‹ฐ ์ด๋ฆ„ ์†์„ฑ(์ด๋ฅผ ํ…Œ๋ฉด โ€œidโ€)์€ HashMap์˜ ํ‚ค๊ฐ€ ๋ 
๊ฒƒ์ด๋‹ค. ๋งตํ•‘์นผ๋Ÿผ์˜ ๊ฐ’์€ HashMap์˜ ๊ฐ’์ด ๋ ๊ฒƒ์ด๋‹ค. ๋ฌผ๋ก  ๋‹น์‹ ์€ Mapํƒ€์ž…์„ ๊ฐ€์ง€๊ณ  ๋‚ดํฌ๋œ result map์„ ์‚ฌ์šฉํ• ์ˆ˜๋„ ์žˆ๋‹ค.
์˜ˆ๋ฅผ ๋“ค๋ฉด :

 <statement id=โ€getProductCountโ€ resultClass=โ€java.util.HashMapโ€>
   select * from PRODUCT
 </statement>
์œ„์˜ ๊ฒƒ์€ ๋ฐ˜ํ™˜๋œ ResultSet์˜ Mapํ‘œํ˜„์„ ๋‹น์‹ ์—๊ฒŒ ์ค„๊ฒƒ์ด๋‹ค.



๋ณตํ•ฉ(Complex) Properties (์ด๋ฅผ ํ…Œ๋ฉด ์‚ฌ์šฉ์ž์— ์˜ํ•ด ์ •์˜๋œ ํด๋ž˜์Šค์˜ ํ”„๋ผํผํ‹ฐ)

์ด๊ฒƒ์€ ์„ ํ˜ธํ•˜๋Š” ๋ฐ์ดํ„ฐ์™€ ํด๋ž˜์Šค๋ฅผ ๋กœ๋“œํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ๊ณ ์žˆ๋Š” ๋งตํ•‘๋œ statement์™€ ํ•จ๊ป˜ ๊ด€๋ จ๋œ resultMapํ”„๋ผํผํ‹ฐ์— ์˜ํ•ด
๋ณตํ•ฉํƒ€์ž…์˜ ํ”„๋ผํผํ‹ฐ(์‚ฌ์šฉ์ž์— ์˜ํ•ด ์ƒ์„ฑ๋œ ํด๋ž˜์Šค)๋ฅผ ์ž๋™์ ์œผ๋กœ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์€ ๊ฐ€๋Šฅํ•˜๋‹ค. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋‚ด ๋ฐ์ดํ„ฐ๋Š” ์–ธ์ œ
๋‚˜ ๋ณตํ•ฉํ”„๋ผํผํ‹ฐ๋Š” ๊ด€๊ณ„์˜ โ€œmany sideโ€๋กœ๋ถ€ํ„ฐ์ด๊ณ  ํ”„๋ผํผํ‹ฐ ์ž์‹ ์€ ๊ด€๊ณ„์˜ โ€œone sideโ€๋กœ ๋ถ€ํ„ฐ์ด๋‹ค๋ผ๋Š” ๊ฒƒ์„ ๊ณ ์ •ํ•˜๋Š” ํด๋ž˜
์Šค์—์„œ 1:1๊ด€๊ณ„ ๋˜๋Š” 1:M๊ด€๊ณ„๋ฅผ ํ†ตํ•ด ํ‘œํ˜„๋œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด :

<resultMap id=โ€get-product-resultโ€ class=โ€com.ibatis.example.Productโ€>
 <result property=โ€idโ€ column=โ€PRD_IDโ€/>
 <result property=โ€descriptionโ€ column=โ€PRD_DESCRIPTIONโ€/>
 <result property=โ€categoryโ€ column=โ€PRD_CAT_IDโ€ select=โ€getCategoryโ€/>
</resultMap>

<resultMap id=โ€get-category-resultโ€ class=โ€com.ibatis.example.Categoryโ€>
 <result property=โ€idโ€ column=โ€CAT_IDโ€/>
 <result property=โ€descriptionโ€ column=โ€CAT_DESCRIPTIONโ€/>
</resultMap>

<statement id=โ€getProductโ€ parameterClass=โ€intโ€ resultMap=โ€get-product-resultโ€>
 select * from PRODUCT where PRD_ID = #value#
</statement>

<statement id=โ€getCategoryโ€ parameterClass=โ€intโ€ resultMap=โ€get-category-resultโ€>
       select * from CATEGORY where CAT_ID = #value#
</statement>

์œ„ ์˜ˆ์ œ์—์„œ Product์˜ ์ธ์Šคํ„ด์Šค๋Š” Categoryํƒ€์ž…์˜ category๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ํ”„๋ผํผํ‹ฐ๋ฅผ ๊ฐ€์ง„๋‹ค. Category๋Š” ๋ณตํ•ฉ์‚ฌ์šฉ์žํƒ€์ž…์ด
๊ธฐ ๋•Œ๋ฌธ์— JDBC๋Š” ๊ทธ๊ฒƒ์„ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๊ฐ€์ง€์ง€ ์•Š๋Š”๋‹ค. ํ”„๋ผํผํ‹ฐ๋งตํ•‘๊ณผ ํ•จ๊ป˜ ๋‹ค๋ฅธ ๋งตํ•‘๋œ statement๋ฅผ ๊ด€๋ จ์‹œํ‚ด์œผ๋กœ์จ ์šฐ
๋ฆฌ๋Š” ๊ทธ๊ฒƒ์„ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•œ SQL Map์—”์ง„์„ ์œ„ํ•ด ์ถฉ๋ถ„ํ•œ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•œ๋‹ค. getProduct๋ฅผ ์ˆ˜ํ–‰ํ•˜๋ฉด get-product-result result
map์ด PRD_CAT_ID์นผ๋Ÿผ๋‚ด ๋ฐ˜ํ™˜๋˜๋Š” ๊ฐ’์„ ์‚ฌ์šฉํ•ด์„œ getCategory์„ ํ˜ธ์ถœํ• ๊ฒƒ์ด๋‹ค. get-category-result result map์€ Category
๋ฅผ ์ดˆ๊ธฐํ™”ํ• ๊ฒƒ์ด๊ณ  ๊ทธ๊ฒƒ์„ ์ƒ์„ฑํ•œ๋‹ค. ์ „์ฒด Category์ธ์Šคํ„ด์Šค๋Š” Product์˜ categoryํ”„๋ผํผํ‹ฐ๋กœ ์…‹ํŒ…ํ•œ๋‹ค.



N+1 Selects (1:1) ํ”ผํ•˜๊ธฐ



                                                  23
์œ„ ์†”๋ฃจ์…˜์„ ์‚ฌ์šฉํ•  ๋•Œ ๋ฌธ์ œ์ ์€ ๋‹น์‹ ์ด Product๋ฅผ ๋กœ๋“œํ• ๋•Œ๋งˆ๋‹ค ๋‘๊ฐœ(Product๋ฅผ ์œ„ํ•ด ํ•˜๋‚˜ ๊ทธ๋ฆฌ๊ณ  Category๋ฅผ ์œ„ํ•ด์„œ ํ•˜๋‚˜.
์ด 2๊ฐœ)์˜ SQL๋ฌธ์ด ์‹ค์ œ์ ์œผ๋กœ ๊ตฌ๋™๋œ๋‹ค๋Š”๊ฒƒ์ด๋‹ค. ์ด ๋ฌธ์ œ๋Š” ํ•˜๋‚˜์˜ Product๋ฅผ ๋กœ๋“œํ• ๋•Œ๋Š” ํฐ๋ฌธ์ œ๊ฐ€ ์•„๋‹Œ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋งŒ
๋งŒ์•ฝ 10๊ฐœ์˜ Product๋ฅผ ๋กœ๋“œํ•˜๋Š” ์ฟผ๋ฆฌ๋ฅผ ํ•œ๋‹ค๋ฉด ๊ฐ๊ฐ์˜ ์ฟผ๋ฆฌ๋Š” ๊ด€๋ จ๋œ category๋ฅผ ๋กœ๋“œํ•˜๊ธฐ ์œ„ํ•œ Product๋ฅผ ์œ„ํ•ด์„œ๋„ ์‹คํ–‰๋ 
๊ฒƒ์ด๋‹ค. ๊ฒฐ๊ณผ์ ์œผ๋กœ 11๋ฒˆ์˜ ์ฟผ๋ฆฌ๋ฅผ ํ•˜๊ฒŒ ๋œ๋‹ค. Product์˜ ๋ชฉ๋ก์„ ์œ„ํ•ด ํ•˜๋‚˜, ๊ด€๋ จ๋œ Category๋ฅผ ๋กœ๋“œํ•˜๊ธฐ ์œ„ํ•ด ๋ฐ˜ํ™˜๋˜๋Š”
Product๋ฅผ ์œ„ํ•ด ํ•˜๋‚˜์”ฉ(N+1 ๋˜๋Š” ์ด ๊ฒฝ์šฐ์—” 10+1=11)

ํ•ด๊ฒฐ๋ฒ•์€ ๋ถ„๋ฆฌ๋œ select ๋ฌธ ๋Œ€์‹ ์— ์กฐ์ธ๊ณผ ๋‚ดํฌ๋œ(nested)ํ”„๋ผํผํ‹ฐ ๋งตํ•‘์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ์—ฌ๊ธฐ์— ๊ทธ์™€ ๊ฐ™์€ ์ƒํ™ฉ์„ ์‚ฌ์šฉ
ํ•œ ์˜ˆ์ œ๊ฐ€ ์žˆ๋‹ค.
<resultMap id=โ€get-product-resultโ€ class=โ€com.ibatis.example.Productโ€>
 <result property=โ€idโ€ column=โ€PRD_IDโ€/>
 <result property=โ€descriptionโ€ column=โ€PRD_DESCRIPTIONโ€/>
 <result property=โ€category.idโ€ column=โ€CAT_IDโ€ />
 <result property=โ€category.descriptionโ€ column=โ€CAT_DESCRIPTIONโ€ />
</resultMap>

<statement id=โ€getProductโ€ parameterClass=โ€intโ€ resultMap=โ€get-product-resultโ€>
 select * from PRODUCT, CATEGORY where PRD_CAT_ID=CAT_ID and PRD_ID = #value#
</statement>

๋Šฆ์€(Lazy) ๋กœ๋”ฉ ๋Œ€ ์กฐ์ธ(1:1)

์กฐ์ธ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์–ธ์ œ๋‚˜ ๋” ์ข‹์€ ๊ฒฐ๊ณผ๋ฅผ ๋‚ด์ง€๋Š” ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์— ์ฃผ์˜ํ•˜๋Š” ๊ฒƒ์€ ์ค‘์š”ํ•˜๋‹ค. ๋งŒ์•ฝ ๋‹น์‹ ์ด ๊ด€๊ณ„๊ฐ์ฒด์— ์ ‘๊ทผ
ํ•˜๋Š” ๊ฒƒ์ด ๊ฑฐ์˜ ์—†๋Š” ์ƒํ™ฉ์ด๋ผ๋ฉด ์กฐ์ธ์„ ํ”ผํ•˜๋Š” ๊ฒƒ์ด ๋” ๋น ๋ฅด๊ณ  ๋ชจ๋“  categoryํ”„๋ผํผํ‹ฐ์˜ ๋กœ๋”ฉ์ด ๋ถˆํ•„์š”ํ•˜๋‹ค. ์ด๊ฒƒ์€ outer
์กฐ์ธ์„ ํฌํ•จํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋””์ž์ธ์ด๋‚˜ null๊ฐ’์ด ๊ฐ€๋Šฅํ•˜๊ฑฐ๋‚˜ ์ธ๋ฑ์Šค๊ฐ€ ์—†๋Š” ์นผ๋Ÿผ์—๋Š” ์‚ฌ์‹ค์ด๋‹ค. ์ด๋Ÿฐ ์ƒํ™ฉ์—์„œ ๋Šฆ์€ ๋กœ
๋”ฉ๊ณผ bytecodeํ–ฅ์ƒ ์˜ต์…˜์œผ๋กœ sub-select์†”๋ฅ˜์„ ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ์ข€๋” ํ–ฅ์ƒ๋œ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์—ฌ์ค€๋‹ค. ์ผ๋ฐ˜์ ์ธ ๊ทœ์น™์€ ์—ฐ๊ด€๋œ ํ”„๋ผ
ํผํ‹ฐ์— ์ ‘๊ทผํ•˜๋Š” ๊ฒƒ์„ ์ข€๋” ํ•˜๊ณ ์ž ํ• ๋•Œ๋งŒ ์กฐ์ธ์„ ์‚ฌ์šฉํ•˜๋ผ. ๋ฐ˜๋ฉด์— ๋Šฆ์€ ๋กœ๋”ฉ์ด ์˜ต์…˜์ด ์•„๋‹๋•Œ์—๋งŒ ๊ทธ๊ฒƒ์„ ์‚ฌ์šฉํ•˜๋ผ.

๋งŒ์•ฝ ๋‹น์‹ ์ด ์‚ฌ์šฉํ•  ๋ฐฉ๋ฒ•์„ ๊ฒฐ์ •ํ•˜๋Š”๋ฐ ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค๋ฉด ๊ฑฑ์ •ํ•˜์ง€ ๋งˆ๋ผ. ๊ทธ๊ฒƒ์€ ๋ฌธ์ œ๋„ ์•„๋‹ˆ๋‹ค. ๋‹น์‹ ์€ ์ž๋ฐ”์ฝ”๋“œ ์ถฉ๋Œ์—†์ด
์ด๊ฒƒ์„ ํ•ญ์ƒ ๋ณ€๊ฒฝํ• ์ˆ˜์žˆ๋‹ค. ์œ„์˜ ๋‘ ์˜ˆ์ œ๋Š” ๊ฐ™์€ ๊ฐ์ฒดํ˜•ํƒœ์˜ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์ด๊ณ  ์ •ํ™•ํ•˜๊ฒŒ ๊ฐ™์€ ๋ฉ”์†Œ๋“œ ํ˜ธ์ถœ์„ ์‚ฌ์šฉํ•ด์„œ ๋กœ๋“œ๋œ
๋‹ค. ๋งŒ์•ฝ ๋‹น์‹ ์ด ์บ์‰ฌ๋ฅผ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๋ฉด ๋‹จ์ง€ ํ•˜๋‚˜์˜ ๊ณ ๋ ค์‚ฌํ•ญ์€ separate select(์กฐ์ธ์ด ์•„๋‹Œ) ์†”๋ฃจ์…˜์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋ฐ˜ํ™˜
๋˜๋Š” ์บ์‰ฌ๋œ ์ธ์Šคํ„ด์Šค๋‚ด์— ๊ฒฐ๊ณผ๋ฅผ ๋ณด์ด๊ฒŒ ๋œ๋‹ค.



๋ณตํ•ฉ Collection ํ”„๋ผํผํ‹ฐ

๋ณตํ•ฉ ๊ฐ์ฒด์˜ ๋ชฉ๋ก์„ ํ‘œํ˜„ํ•˜๋Š” ํ”„๋ผํผํ‹ฐ๋ฅผ ๋กœ๋“œํ•˜๋Š” ๊ฒƒ์€ ๊ฐ€๋Šฅํ•˜๋‹ค. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋‚ด์˜ ๋ฐ์ดํ„ฐ๋Š” M:M๊ด€๊ณ„๋‚˜ 1:M๊ด€๊ณ„์— ์˜
ํ•ด ํ‘œํ˜„๋ ๊ฒƒ์ด๋‹ค. ๊ฐ์ฒด๋ชฉ๋ก์„ ๋กœ๋“œํ•˜๋Š” ๊ฒƒ์€ statement์— ์–ด๋–ค ๋ณ€๊ฒฝ์‚ฌํ•ญ๋„ ์ฃผ์ง€ ์•Š๋Š”๋‹ค. SQL Mapํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ๋น„์ฆˆ๋‹ˆ์Šค๊ฐ
์ฒด๋‚ด์—์„œ ๋ฆฌ์ŠคํŠธ์ฒ˜๋Ÿผ ํ”„๋ผํผํ‹ฐ๋ฅผ ๋กœ๋“œํ•˜๊ธฐ์œ„ํ•ด ์š”๊ตฌ๋˜๋Š” ๋‹จ ํ•˜๋‚˜์˜ ์ฐจ์ด์ ์€ java.util.List ๋˜๋Š” java.util.Collection ํƒ€์ž…์ด
๋˜์–ด์•ผ ํ•œ๋‹ค๋Š”๊ฒƒ์ด๋‹ค. ์˜ˆ๋ฅผ๋“ค๋ฉด Category๊ฐ€ Product ์ธ์Šคํ„ด์Šค ๋ชฉ๋ก์„ ๊ฐ€์ง„๋‹ค๋ฉด ๋งตํ•‘์€ ๋‹ค์Œ์ฒ˜๋Ÿผ ๋ณด์ผ๊ฒƒ์ด๋‹ค.(Category๊ฐ€
java.util.Listํƒ€์ž…์˜ โ€œproductListโ€๋ผ๊ณ  ๋ถˆ๋ฆฌ๋Š” ํ”„๋ผํผํ‹ฐ๋ฅผ ๊ฐ€์ง„๋‹ค๊ณ  ๊ฐ€์ •ํ•˜์ž.)

<resultMap id=โ€get-category-resultโ€ class=โ€com.ibatis.example.Categoryโ€>
 <result property=โ€idโ€ column=โ€CAT_IDโ€/>
 <result property=โ€descriptionโ€ column=โ€CAT_DESCRIPTIONโ€/>
 <result property=โ€productListโ€ column=โ€CAT_IDโ€ select=โ€ getProductsByCatIdโ€/>
</resultMap>

<resultMap id=โ€get-product-resultโ€ class=โ€com.ibatis.example.Productโ€>
 <result property=โ€idโ€ column=โ€PRD_IDโ€/>
 <result property=โ€descriptionโ€ column=โ€PRD_DESCRIPTIONโ€/>
</resultMap>

<statement id=โ€getCategoryโ€ parameterClass=โ€intโ€ resultMap=โ€get-category-resultโ€>
 select * from CATEGORY where CAT_ID = #value#
</statement>

<statement id=โ€getProductsByCatIdโ€ parameterClass=โ€intโ€ resultMap=โ€get-product-resultโ€>
       select * from PRODUCT where PRD_CAT_ID = #value#
</statement>


                                                  24
N+1 Selects (1:M ๊ณผ M:N) ํ”ผํ•˜๊ธฐ

์ด๊ฒƒ์€ ์œ„์˜ 1:1 ์ƒํ™ฉ๊ณผ ์œ ์‚ฌํ•˜๋‹ค. ํ•˜์ง€๋งŒ ๊ต‰์žฅํžˆ ๋งŽ์€ ๋ฐ์ดํ„ฐ๋ฅผ ํฌํ•จํ•  ๋•Œ ์ข€๋” ํฐ ๊ฑฑ์ •๊ฑฐ๋ฆฌ๊ฐ€ ๋ ๊ฒƒ์ด๋‹ค. ์œ„ ํ•ด๊ฒฐ๋ฒ•๊ณผ ํ•จ๊ป˜
๋ฌธ์ œ๋Š” ๋‹น์‹ ์ด Category๋ฅผ ๋กœ๋“œํ• ๋•Œ๋งˆ๋‹ค ๋‘๊ฐœ์˜ SQL๋ฌธ(ํ•˜๋‚˜๋Š” Category๋ฅผ ์œ„ํ•œ ํ•˜๋‚˜์ด๊ณ  ํ•˜๋‚˜๋Š” Products์— ๋Œ€ํ•œ ๋ชฉ๋ก์„ ์œ„
ํ•œ ๊ฒƒ)์€ ์‹ค์งˆ์ ์œผ๋กœ ์ˆ˜ํ–‰๋œ๋‹ค. ์ด ๋ฌธ์ œ๋Š” ํ•˜๋‚˜์˜ Category๋ฅผ ๋กœ๋“œํ•  ๋•Œ ํ‰๋ฒ”ํ•œ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋งŒ 10๊ฐœ์˜ Category๋ฅผ ๋กœ๋“œํ•˜
๋Š” ์ฟผ๋ฆฌ๋ฌธ์„ ์‹คํ–‰ํ• ๋•Œ๋Š” ๊ฐ๊ฐ์˜ ์ฟผ๋ฆฌ๊ฐ€ Product์˜ ๋ชฉ๋ก์„ ๋กœ๋“œํ•˜๊ธฐ ์œ„ํ•œ ๊ฐ๊ฐ์˜ Category๋ฅผ ์œ„ํ•ด์„œ ์ˆ˜ํ–‰๋ ๊ฒƒ์ด๋‹ค. ๊ฒฐ๊ณผ์ ์œผ
๋กœ 11๊ฐœ์˜ ์ฟผ๋ฆฌ๊ฐ€ ์ˆ˜ํ–‰๋œ๋‹ค. ํ•˜๋‚˜๋Š” Category ๋ชฉ๋ก์„ ์œ„ํ•œ๊ฒƒ์ด๊ณ  ๊ฐ๊ฐ์˜ Product ๊ด€๋ จ ๋ชฉ๋ก์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฐ๊ฐ์˜ Category๋ฅผ
์œ„ํ•œ ๊ฒƒ์ด๋‹ค(N+1 ๋˜๋Š” ์ด ๊ฒฝ์šฐ์—” 10+1=11). ์ด ์ƒํ™˜์„ ๋”์šฑ ๋‚˜์˜๊ฒŒ ๋งŒ๋“ค๋ ค๋ฉด ์šฐ๋ฆฌ๋Š” ๊ต‰์žฅํžˆ ๋งŽ์€ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฃจ๋ฉด ๋œ๋‹ค.

1:N ๊ณผ M:N ํ•ด๊ฒฐ๋ฒ•

iBATIS๋Š” ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•œ๋‹ค. ๋‹ค์Œ์€ ๊ทธ ์˜ˆ์ œ์ด๋‹ค.

<sqlMap namespace="ProductCategory">
<resultMap id=โ€categoryResultโ€ class=โ€com.ibatis.example.Categoryโ€ groupBy=โ€idโ€>
       <result property=โ€idโ€ column=โ€CAT_IDโ€/>
       <result property=โ€descriptionโ€ column=โ€CAT_DESCRIPTIONโ€/>
       <result property=โ€productListโ€ resultMap=โ€ProductCategory.productResultโ€/>
</resultMap>

<resultMap id=โ€productResultโ€ class=โ€com.ibatis.example.Productโ€>
       <result property=โ€idโ€ column=โ€PRD_IDโ€/>
       <result property=โ€descriptionโ€ column=โ€PRD_DESCRIPTIONโ€/>
</resultMap>

<select id=โ€getCategoryโ€ parameterClass=โ€intโ€ resultMap=โ€categoryResultโ€>
        select C.CAT_ID, C.CAT_DESCRIPTION, P.PRD_ID, P.PRD_DESCRIPTION
        from CATEGORY C
        left outer join PRODUCT P
        on C.CAT_ID = P.PRD_CAT_ID
        where CAT_ID = #value#
</select>
</sqlMap>


๋‹น์‹ ์ด ํ˜ธ์ถœํ• ๋•Œ,
List myList = executeQueryForList("ProductCategory.getCategory", new Integer(1002));

...๋ฉ”์ธ ์ฟผ๋ฆฌ๋Š” ์ˆ˜ํ–‰๋˜๊ณ  ๊ฒฐ๊ณผ๋Š” โ€œ com.ibatis.example.Category โ€œํƒ€์ž…์˜ bean์ธ myList๋ณ€์ˆ˜์— ์ €์žฅ๋œ๋‹ค. List๋‚ด ๊ฐ๊ฐ์˜ ๊ฐ์ฒด๋Š”
๊ฐ™์€ ์ฟผ๋ฆฌ๋กœ๋ถ€ํ„ฐ ์ƒ์„ฑ๋˜๋Š” List์ธ โ€œ productList โ€œํ”„๋ผํผํ‹ฐ๋ฅผ ๊ฐ€์งˆ๊ฒƒ์ด๋‹ค. ํ•˜์ง€๋งŒ ํ•˜์œ„ ๋ชฉ๋ก๋‚ด bean์„ ์ƒ์„ฑํ•˜๋Š” โ€œ
productResult โ€œ ๊ฒฐ๊ณผ ๋งต์„ ์‚ฌ์šฉํ•œ๋‹ค. ๊ทธ๋ž˜์„œ ๋‹น์‹ ์€ ํ•˜์œ„๋ชฉ๋ก์„ ํฌํ•จํ•˜๋Š” ๋ชฉ๋ก์œผ๋กœ ์ข…๋ฃŒํ•˜๊ณ  ์˜ค์ง ํ•˜๋‚˜์˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ฟผ๋ฆฌ
๋งŒ์ด ์ˆ˜ํ–‰๋œ๋‹ค.


๊ฐ€์žฅ ์ค‘์š”ํ•œ ํ•ญ๋ชฉ์€ "categoryResult" ๊ฒฐ๊ณผ ๋งต๋‚ด


groupBy="id"

...์†์„ฑ์ด๊ณ  ...
<result property="productList" resultMap="ProductCategory.productResult"/>

...ํ”„๋ผํผํ‹ฐ ๋งตํ•‘์ด๋‹ค. ๋‹ค๋ฅธ ์ค‘์š”ํ•œ ์‚ฌํ•ญ์€ productListํ”„๋ผํผํ‹ฐ๋ฅผ ์œ„ํ•œ ๊ฒฐ๊ณผ๋งตํ•‘์ด ๋ช…๋ช…๊ณต๊ฐ„์„ ์ธ์‹(์ด๊ฒƒ์€ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š”
โ€œproductResult โ€œ์ด ๋ ๊ฒƒ์ด๋‹ค.)ํ•˜๋Š”๊ฒƒ์ด๋‹ค.
์ด ์ ‘๊ทผ๋ฒ•์„ ์‚ฌ์šฉํ•˜์—ฌ, ๋‹น์‹ ์€ N+1 ๋ฌธ์ œ๋ฅผ ํ’€์ˆ˜ ์žˆ๋‹ค.




                                                  25
๋Šฆ์€(Lazy) ๋กœ๋”ฉ ๋Œ€ ์กฐ์ธ(1:M and M:N)

๋จผ์ € ์ด์•ผ๊ธฐ๋œ 1:1์ƒํ™ฉ์ฒ˜๋Ÿผ ์กฐ์ธ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์–ธ์ œ๋‚˜ ๋” ์ข‹๋‹ค๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ๋Š” ๊ฒƒ์„ ์•„๋Š” ๊ฒƒ์€ ์ค‘์š”ํ•˜๋‹ค. ์ด๊ฒƒ์€ ๋Œ€๋Ÿ‰์˜
๋ฐ์ดํ„ฐ๋กœ ์ธํ•˜์—ฌ ๊ฐœ๋ณ„์ ์ธ ๊ฐ’ ํ”„๋ผํผํ‹ฐ๋ฅผ ์œ„ํ•œ ๊ฒƒ๋ณด๋‹ค collectionํ”„๋ผํผํ‹ฐ์—์„œ ์ข€๋” ์‚ฌ์‹ค์ ์ด๋‹ค. ๋งŒ์•ฝ ๋‹น์‹ ์ด ๊ด€๋ จ๋œ ๊ฐ์ฒด์—
์ ‘๊ทผํ•˜๋Š” ๊ฒƒ์ด ๋“œ๋ฌธ ์ƒํ™ฉ(์ด๋ฅผ ํ…Œ๋ฉด Categoryํด๋ž˜์Šค์˜ productList ํ”„๋ผํผํ‹ฐ)์ด๋ผ๋ฉด ์ด๊ฒƒ์€ ์กฐ์ธ๊ณผ product๋ชฉ๋ก์˜ ํ•„์š”์—†๋Š”
๋กœ๋”ฉ์„ ํ”ผํ•œ๋‹ค๋ฉด ์ •๋ง ๋น ๋ฅด๊ฒŒ ๋ ๊ฒƒ์ด๋‹ค. ์ด๊ฒƒ์€ outer์กฐ์ธ๊ณผ null์ด ๊ฐ€๋Šฅํ•˜๊ณ  ์•„๋‹ˆ๋ฉด ๋˜๋Š” ์ธ๋ฑ์Šค๊ฐ€ ์—†๋Š” ์นผ๋Ÿผ์„ ํฌํ•จํ•œ ๋ฐ์ด
ํ„ฐ๋ฒ ์ด์Šค ๋””์ž์ธ์—๋Š” ํŠน๋ณ„ํžˆ ์‚ฌ์‹ค์ด๋‹ค. ์ด๋Ÿฐ ์ƒํ™ฉ์—์„œ ๋Šฆ์€(lazy)๋กœ๋”ฉ๊ณผ bytecodeํ–ฅ์ƒ์˜ต์…˜์œผ๋กœ sub-select์†”๋ฃจ์…˜์„ ์‚ฌ์šฉํ•˜๋Š”
๊ฒƒ์€ ์ข€๋” ํ–ฅ์ƒ์‹œ์ผœ์ค€๋‹ค. ์ผ๋ฐ˜์ ์ธ ๊ทœ์น™์€ ์—ฐ๊ด€๋œ ํ”„๋ผํผํ‹ฐ์— ์ ‘๊ทผํ•˜๋Š” ๊ฒƒ์„ ์ข€๋” ํ•˜๊ณ ์ž ํ• ๋•Œ๋งŒ ์กฐ์ธ์„ ์‚ฌ์šฉํ•˜๋ผ. ๋ฐ˜๋ฉด์— ๋Šฆ
์€ ๋กœ๋”ฉ์ด ์˜ต์…˜์ด ์•„๋‹๋•Œ์—๋งŒ ๊ทธ๊ฒƒ์„ ์‚ฌ์šฉํ•˜๋ผ.

๋จผ์ € ์–ธ๊ธ‰ํ–ˆ๋˜ ๊ฒƒ ์ฒ˜๋Ÿผ ๋งŒ์•ฝ ๋‹น์‹ ์ด ์–ด๋–ค ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š”์ง€ ๊ฒฐ์ •ํ•˜๋Š”๋ฐ ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค๋ฉด ๊ฑฑ์ •ํ•˜์ง€ ๋งˆ๋ผ. ์–ด๋–ค ๋ฐฉ๋ฒ•์„ ์‚ฌ
์šฉํ• ์ง€์— ๋Œ€ํ•ด์„œ ๊ฑฑ์ •ํ•˜๋Š” ๊ฒƒ์€ ํ•„์š”์—†๋Š” ์ผ์ด๋‹ค. ๋‹น์‹ ์€ ๋‹น์‹ ์˜ ์ž๋ฐ”์ฝ”๋“œ์— ์ถฉ๋Œ์—†์ด ๊ทธ๊ฒƒ์„ ๋ณ€ํ™”์‹œํ‚ฌ์ˆ˜ ์žˆ๋‹ค. ์œ„์˜ ๋‘ ์˜ˆ์ œ
๋Š” ๊ฐ™์€ ๊ฐ์ฒดํ˜•ํƒœ์˜ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์ด๊ณ  ์ •ํ™•ํ•˜๊ฒŒ ๊ฐ™์€ ๋ฉ”์†Œ๋“œ ํ˜ธ์ถœ์„ ์‚ฌ์šฉํ•ด์„œ ๋กœ๋“œ๋œ๋‹ค. ๋งŒ์•ฝ ๋‹น์‹ ์ด ์บ์‰ฌ๋ฅผ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๋ฉด ๋‹จ์ง€
ํ•˜๋‚˜์˜ ๊ณ ๋ ค์‚ฌํ•ญ์€ separate select(์กฐ์ธ์ด ์•„๋‹Œ) ์†”๋ฃจ์…˜์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋ฐ˜ํ™˜๋˜๋Š” ์บ์‰ฌ๋œ ์ธ์Šคํ„ด์Šค๋‚ด์— ๊ฒฐ๊ณผ๋ฅผ ๋ณด์ด๊ฒŒ ๋œ
๋‹ค.



๋ณตํ•ฉ ํ‚ค๋˜๋Š” ๋‹ค์ค‘ ๋ณตํ•ฉ ํŒŒ๋ผ๋ฏธํ„ฐ ํ”„๋ผํผํ‹ฐ

๋‹น์‹ ์€ ์œ„ ์˜ˆ์ œ์—์„œ column ์†์„ฑ์— ์˜ํ•ด resultMap๋‚ด์— ์ •์˜๋œ ๊ฒƒ์ฒ˜๋Ÿผ ์‚ฌ์šฉ๋˜์–ด์ง€๋Š” ๊ฒƒ์€ ํ•˜๋‚˜์˜ ํ‚ค๋ผ๋Š” ๊ฒƒ์ด ์–ธ๊ธ‰๋˜์—ˆ๋‹ค.
์ด๊ฒƒ์€ ๋‹จ์ง€ ํ•˜๋‚˜์˜ ํ‚ค๋งŒ์ด ๊ด€๊ณ„๋œ ๋งตํ•‘ statement์— ๊ด€๋ จ ๋  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์ œ์•ˆํ–ˆ๋‹ค. ์–ด์จŒ๋“  ๊ด€๊ณ„๋œ ๋งตํ•‘ statement์— ์ „
๋‹ฌํ•  ๋‹ค์ค‘ ์นผ๋Ÿผ์„ ํ—ˆ๋ฝํ•˜๋Š” ๋Œ€์•ˆ์ ์ธ ๋ฌธ๋ฒ•์ด ์žˆ๋‹ค. ์ด๊ฒƒ์€ ๋ณตํ•ฉํ‚ค ๊ด€๊ณ„๊ฐ€ ์กด์žฌํ•˜๋Š” ์ƒํ™ฉ์ด๋‚˜ ๋‹น์‹ ์ด ๊ฐ„๋‹จํ•˜๊ฒŒ #value#์™€ ๋‹ค
๋ฅธ ์ด๋ฆ„์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ ์ž ํ•  ๋•Œ ํŽธ๋ฆฌํ•˜๋‹ค. Column ์†์„ฑ์ด ๊ฐ„๋‹จ{param1=column1, param2=column2, โ€ฆ,
paramN=columnN}ํ•  ๋•Œ ๋Œ€์•ˆ์ ์ธ ๋ฌธ๋ฒ•์ด๋‹ค. PAYMENTํ…Œ์ด๋ธ”์ด Customer ID์™€ Order ID๋ฅผ ๋‘˜๋‹ค ํ‚ค๋กœ ํ•  ๋•Œ ๋‹ค์Œ์˜ ์˜ˆ์ œ๋ฅผ
๋ณด๊ณ  ์ƒ๊ฐํ•ด๋ณด๋ผ.

<resultMap id=โ€get-order-resultโ€ class=โ€com.ibatis.example.Orderโ€>
  <result property=โ€idโ€ column=โ€ORD_IDโ€/>
  <result property=โ€customerIdโ€ column=โ€ORD_CST_IDโ€/>
  โ€ฆ
  <result property=โ€paymentsโ€ column=โ€{itemId=ORD_ID, custId=ORD_CST_ID}โ€
            select=โ€ getOrderPaymentsโ€/>
</resultMap>

<statement id=โ€getOrderPaymentsโ€
                       resultMap=โ€get-payment-resultโ€>
       select * from PAYMENT
       where PAY_ORD_ID = #itemId#
       and PAY_CST_ID = #custId#
</statement>
์˜ต์…˜์ ์œผ๋กœ ๋‹น์‹ ์€ ๊ทธ๊ฒƒ๋“ค์ด ํŒŒ๋ผ๋ฏธํ„ฐ์ฒ˜๋Ÿผ ๊ฐ™์€ ์ˆœ์„œ๋กœ ์ •๋ ฌ๋˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ์นผ๋Ÿผ์ด๋ฆ„์„ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด

      {ORD_ID, ORD_CST_ID}

์–ธ์ œ๋‚˜ ์ฒ˜๋Ÿผ ์ด๊ฒƒ์€ ์ฝ๊ธฐ์™€ ์œ ์ง€๋ผ๋Š” ๊ฒƒ์˜ ์˜ํ–ฅ๊ณผ ํ•จ๊ป˜ ๋ฏธ์„ธํ•œ ์„ฑ๋Šฅ ํš๋“์ด ์žˆ๋‹ค.

์ค‘์š”! ํ˜„์žฌ์˜ SQL Mapํ”„๋ ˆ์ž„์›Œํฌ๋Š” ์ˆœํ™˜ํ•˜๋Š” ๊ด€๊ณ„๋ฅผ ์ž๋™์œผ๋กœ ํ•ด์„ํ•˜์ง€ ์•Š๋Š”๋‹ค. ๋ถ€๋ชจ/์ž์‹ ๊ด€๊ณ„(ํŠธ๋ฆฌ)๋ฅผ ๊ตฌํ˜„ํ•  ๋•Œ ์ด๊ฒƒ์„
์•Œ๊ณ  ์žˆ์–ด๋ผ. ์‰ฌ์šด ๋Œ€์•ˆ์€ ๊ฐ„๋‹จํ•˜๊ฒŒ ๋ถ€๋ชจ๊ฐ์ฒด๋ฅผ ๋กœ๋“œํ•˜๊ธฐ ์•Š๋Š” ๊ฒฝ์šฐ๋ฅผ ์œ„ํ•œ ํ•˜๋‚˜ ๋˜๋Š” โ€œN+1 avoidanceโ€ ํ•ด๊ฒฐ๋ฒ•์—์„œ ์„œ์ˆ ๋œ
์กฐ์ธ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๋ฅผ ์œ„ํ•œ ๋‘๋ฒˆ์งธ result map๋ฅผ ์ •์˜ํ•˜๋Š”๊ฒƒ์ด๋‹ค.

์ฃผ์˜! ๋ช‡๋ช‡ JDBC๋“œ๋ผ์ด๋ฒ„(์ด๋ฅผ ํ…Œ๋ฉด ๋‚ด์žฅ๋œ PointBase)๋Š” ๋™์‹œ์— ๋‹ค์ค‘ ResultSet(connection๋งˆ๋‹ค)์„ ์ง€์›ํ•˜์ง€ ์•Š๋Š”๋‹ค. ๊ทธ๋Ÿฐ
๋“œ๋ผ์ด๋ฒ„๋Š” SQL Map์—”์ง„์ด ๋‹ค์ค‘ ResultSet connection์„ ์š”๊ตฌํ•˜๊ธฐ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋ณต์žกํ•œ ๊ฐ์ฒด ๋งตํ•‘๊ณผ๋Š” ์ž‘๋™ํ•˜์ง€ ์•Š์„๊ฒƒ์ด๋‹ค.
๋‹ค์‹œ ๋งํ•ด ์กฐ์ธ์„ ์‚ฌ์šฉํ•˜๋Š”๊ฑฐ ๋Œ€์‹ ์— ์ด๊ฒƒ์„ ํ•ด์„ํ• ์ˆ˜ ์žˆ๋‹ค.

์ฃผ์˜! Result Map ์ด๋ฆ„์€ ์–ธ์ œ๋‚˜ ๊ทธ๊ฒƒ๋“ค์ด ์ •์˜๋œ SQL Map XMLํŒŒ์ผ์— ์œ„์น˜ํ•œ๋‹ค. ๋‹น์‹ ์€ SQL Map์˜ ์ด๋ฆ„์„ Result map
์˜ ์ด๋ฆ„์•ž์— ์œ„์น˜์‹œํ‚ด์œผ๋กœ์จ ๋‹ค๋ฅธ SQL Map XMLํŒŒ์ผ๋‚ด์˜ Result Map๋ฅผ ์ฐธ์กฐํ• ์ˆ˜ ์žˆ๋‹ค.




                                             26
๋งŒ์•ฝ ๋‹น์‹ ์ด JDBC๋ฅผ ์œ„ํ•ด MS์˜ SQL Server2000 ๋“œ๋ผ์ด๋ฒ„๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ๋‹น์‹ ์€ ์ˆ˜๋™ ํŠธ๋žœ์žญ์…˜ ๋ชจ๋“œ์ธ ๋™์•ˆ ๋‹ค์ค‘ statement
๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด connection url์— SelectMethod=Cursor์„ ์ถ”๊ฐ€ํ•  ํ•„์š”๊ฐ€ ์žˆ์„์ง€๋„ ๋ชจ๋ฅธ๋‹ค.(MS์˜ ์ง€์‹ ๊ธฐ๋ฐ˜ ๊ธฐ์‚ฌ 313181์„
๋ณด๋ผ. http://support.microsoft.com/default.aspx?scid=kb%3Ben-us%3B313181).




ํŒŒ๋ผ๋ฏธํ„ฐ Maps์™€ Result Maps๋ฅผ ์œ„ํ•ด ์ง€์›๋˜๋Š” ํƒ€์ž…๋“ค

ํŒŒ๋ผ๋ฏธํ„ฐ์™€ result๋ฅผ ์œ„ํ•ด iBATIS ํ”„๋ ˆ์ž„์›Œํฌ์— ์˜ํ•ด ์ง€์›๋˜๋Š” ์ž๋ฐ”ํƒ€์ž…์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

 Java Type                JavaBean/Map           Result Class /        Type Alias**
                          Property Mapping       Parameter Class***
 boolean                           YES                    NO              boolean
 java.lang.Boolean                 YES                    YES             boolean
 byte                              YES                    NO                byte
 java.lang.Byte                    YES                    YES               byte
 short                             YES                    NO               short
 java.lang.Short                   YES                    YES              short
 int                               YES                    NO            int/integer
 java.lang.Integer                 YES                    YES           int/integer
 long                              YES                    NO                long
 java.lang.Long                    YES                    YES               long
 float                             YES                    NO                float
 java.lang.Float                   YES                    YES               float
 double                            YES                    NO              double
 java.lang.Double                  YES                    YES             double
 java.lang.String                  YES                    YES              string
 java.util.Date                    YES                    YES               date
 java.math.BigDecimal              YES                    YES             decimal
 * java.sql.Date                   YES                    YES               N/A
 * java.sql.Time                   YES                    YES               N/A
 * java.sql.Timestamp              YES                    YES               N/A

* java.sql. date ํƒ€์ž… ์‚ฌ์šฉ์€ ์ข‹์ง€์•Š๋‹ค(discouraged). ๋Œ€์‹ ์— java.util.Date ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ œ์ผ์ข‹๋‹ค.

** .ํŒŒ๋ผ๋ฏธํ„ฐ๋‚˜ resultํด๋ž˜์Šค๋ฅผ ์ •์˜ํ•  ๋•Œ ํƒ€์ž…๋ณ„์นญ์€ ์ „์ฒด๊ฒฝ๋กœ์˜ ํด๋ž˜์Šค๋ช…์— ๋‘๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

*** int, boolean and float ์™€ ๊ฐ™์€ ์›์‹œํƒ€์ž…์€ iBATIS ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ ˆ์ด์–ด๊ฐ€ ์™„์ „ํ•œ ๊ฐ์ฒด์ง€ํ–ฅ์ ‘๊ทผ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋Š”๊ฒƒ์ฒ˜๋Ÿผ ์ง
์ ‘์ ์œผ๋กœ ์›์‹œํƒ€์ž…์„ ์ง€์›ํ•˜์ง€๋Š” ์•Š๋Š”๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ ๋ชจ๋“  ํŒŒ๋ผ๋ฏธํ„ฐ์™€ result๋Š” ๊ทธ๋“ค์˜ ์ƒ์œ„๋ ˆ๋ฒจ์—์„œ ๊ฐ์ฒด๊ฐ€ ๋˜์–ด์•ผ ํ•œ๋‹ค. ๋ถ€์ˆ˜
์ ์œผ๋กœ JDK1.5์˜ autoboxing๊ธฐ๋Šฅ์€ ์ž˜ ์‚ฌ์šฉ๋˜๊ธฐ ์œ„ํ•ด ์›์‹œํƒ€์ž…์„ ํ—ˆ๋ฝํ•œ๋‹ค.

์‚ฌ์šฉ์ž ์ •์˜ ํƒ€์ž… ํ•ธ๋“ค๋Ÿฌ ์ƒ์„ฑํ•˜๊ธฐ

ํƒ€์ž…์€ TypeHandlerCallback์ธํ„ฐํŽ˜์ด์Šค์˜ ์‚ฌ์šฉ์„ ํ†ตํ•ด iBATIS๋‚ด์—์„œ ํ™•์žฅ๋ ์ˆ˜ ์žˆ๋‹ค. ๋‹น์‹  ์ž์‹ ์˜ ํƒ€์ž… ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„
ํ•ด, TypeHandlerCallback์„ ๊ตฌํ˜„ํ•œ ํด๋ž˜์Šค๋ฅผ ์ƒ์„ฑํ•  ํ•„์š”๊ฐ€ ์žˆ๋‹ค. ์‚ฌ์šฉ์ž์ •์˜ ํƒ€์ž… ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‹น์‹ ์€ ์ง€์›๋˜์ง€ ์•Š๋Š”
ํƒ€์ž…์„ ๋‹ค๋ฃจ๊ฑฐ๋‚˜ ์ง€์›๋˜๋Š” ํƒ€์ž…์„ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์œผ๋กœ ๋‹ค๋ค„์„œ ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ํ™•์žฅํ• ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ๋ฅป๋“ค๋ฉด, ๋‹น์‹ ์€ ์ ์ ˆํ•œ BLOB์ง€์›์„
๊ตฌํ˜„ํ•˜๋Š” ์‚ฌ์šฉ์ž ์ •์˜ ํƒ€์ž… ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ๋Œ€๊ฐœ 0/1๋Œ€์‹ ์— โ€œYโ€์™€ โ€œNโ€์„ ์‚ฌ์šฉํ•˜๋Š” boolean์„ ๋‹ค๋ฃจ๊ธฐ ์œ„ํ•ด ์ด๊ฒƒ์„ ์‚ฌ์šฉ
ํ• ์ˆ˜ ์žˆ๋‹ค.

๋‹ค์Œ์€ โ€œYesโ€์™€ โ€œNoโ€๋ฅผ ์‚ฌ์šฉํ•˜๋Š” booleanํ•ธ๋“ค๋Ÿฌ์˜ ๊ฐ„๋‹จํ•œ ์˜ˆ์ œ์ด๋‹ค.

 public class YesNoBoolTypeHandlerCallback implements TypeHandlerCallback {

  private static final String YES = "Y";
  private static final String NO = "N";

  public Object getResult(ResultGetter getter)


                                                     27
throws SQLException {
   String s = getter.getString();
   if (YES.equalsIgnoreCase(s)) {
     return new Boolean (true);
   } else if (NO.equalsIgnoreCase(s)) {
     return new Boolean (false);
   } else {
     throw new SQLException (
      "Unexpected value " + s + " found where " + YES + " or " + NO + " was expected.");
   }
  }

  public void setParameter(ParameterSetter setter, Object parameter)
   throws SQLException {
   boolean b = ((Boolean)parameter).booleanValue();
   if (b) {
     setter.setString(YES);
   } else {
     setter.setString(NO);
   }
  }

  public Object valueOf(String s) {
   if (YES.equalsIgnoreCase(s)) {
     return new Boolean (true);
   } else if (NO.equalsIgnoreCase(s)) {
     return new Boolean (false);
   } else {
     throw new SQLException (
       "Unexpected value " + s + " found where " + YES + " or " + NO + " was expected.");
   }
  }

iBATIS๋‚ด ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ ์ด๋Ÿฌํ•œ ํƒ€์ž…์„ ์„ ์–ธํ•˜๊ธฐ ์œ„ํ•ด, ๋‹น์‹ ์€ sqlMapConfig.xml๋‚ด ๋‹ค์Œ์˜ ๋ฌธ๋ฒ•์„ ์‚ฌ์šฉํ•œ๋‹ค.

<typeHandler
 javaType="boolean"
 jdbcType=โ€VARCHARโ€
 callback="org.apache.ibatis.sqlmap.extensions.YesNoBoolTypeHandlerCallback"/>

iBATIS ๊ฐ€ javaํƒ€์ž…๊ณผ jdbcํƒ€์ž…๊ฐ„์˜ ์ด์ „์„ ๋‹ค๋ฃจ๋Š”๊ฒƒ์„ ์•Œ๊ณ  ๋‚œ๋’ค์—, ํŠน์ • ํƒ€์ž… ํ•ธ๋“ค๋Ÿฌ ์ฝœ๋ฐฑ์€ ์ž‘์„ฑ๋œ๋‹ค.

์บ์‰ฌ์ƒํƒœ์˜ ๋งตํ•‘๋œ Statement Results

๋งตํ•‘๋œ statement ์ฟผ๋ฆฌ๋กœ๋ถ€ํ„ฐ์˜ result๋Š” statementํƒœํฌ๋‚ด์— cacheModelํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์ •์˜ํ•จ์œผ๋กœ์จ ๊ฐ„๋‹จํ•˜๊ฒŒ ์บ์‰ฌ๋ ์ˆ˜ ์žˆ๋‹ค.
์บ์‰ฌ ๋ชจ๋ธ์€ ๋‹น์‹ ์˜ SQL Map๋‚ด์—์„œ ์ •์˜๋œ ์„ค์ •๋œ ์บ์‰ฌ๋‹ค. ์บ์‰ฌ ๋ชจ๋ธ์€ ๋‹ค์Œ์ฒ˜๋Ÿผ cacheModel์š”์†Œ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์„ค์ •๋œ๋‹ค.

<cacheModel id="product-cache" type ="LRU" readOnly=โ€trueโ€ serialize=โ€falseโ€>
  <flushInterval hours="24"/>
  <flushOnExecute statement="insertProduct"/>
  <flushOnExecute statement="updateProduct"/>
  <flushOnExecute statement="deleteProduct"/>
  <property name=โ€cache-sizeโ€ value=โ€1000โ€ />
</cacheModel>




                                                    28
Ibatis
Ibatis
Ibatis
Ibatis
Ibatis
Ibatis
Ibatis
Ibatis
Ibatis
Ibatis
Ibatis
Ibatis
Ibatis
Ibatis
Ibatis
Ibatis
Ibatis
Ibatis
Ibatis
Ibatis
Ibatis

More Related Content

What's hot

03.์‹คํ–‰ํ™˜๊ฒฝ ๊ต์œก๊ต์žฌ(๋ฐฐ์น˜์ฒ˜๋ฆฌ)
03.์‹คํ–‰ํ™˜๊ฒฝ ๊ต์œก๊ต์žฌ(๋ฐฐ์น˜์ฒ˜๋ฆฌ)03.์‹คํ–‰ํ™˜๊ฒฝ ๊ต์œก๊ต์žฌ(๋ฐฐ์น˜์ฒ˜๋ฆฌ)
03.์‹คํ–‰ํ™˜๊ฒฝ ๊ต์œก๊ต์žฌ(๋ฐฐ์น˜์ฒ˜๋ฆฌ)Hankyo
ย 
[์˜คํ”ˆ์†Œ์Šค์ปจ์„คํŒ…]MyBatis Basic
[์˜คํ”ˆ์†Œ์Šค์ปจ์„คํŒ…]MyBatis Basic[์˜คํ”ˆ์†Œ์Šค์ปจ์„คํŒ…]MyBatis Basic
[์˜คํ”ˆ์†Œ์Šค์ปจ์„คํŒ…]MyBatis BasicJi-Woong Choi
ย 
H3 2011 ๋Œ€ํ˜•์‚ฌ์ดํŠธ ๊ตฌ์ถ•์„ ์œ„ํ•œ MySQL ํŠœ๋‹์ „๋žต
H3 2011 ๋Œ€ํ˜•์‚ฌ์ดํŠธ ๊ตฌ์ถ•์„ ์œ„ํ•œ MySQL ํŠœ๋‹์ „๋žตH3 2011 ๋Œ€ํ˜•์‚ฌ์ดํŠธ ๊ตฌ์ถ•์„ ์œ„ํ•œ MySQL ํŠœ๋‹์ „๋žต
H3 2011 ๋Œ€ํ˜•์‚ฌ์ดํŠธ ๊ตฌ์ถ•์„ ์œ„ํ•œ MySQL ํŠœ๋‹์ „๋žตKTH
ย 
KEEP BUFFER ํ™œ์šฉ ๋ฐฉ์•ˆ_Wh oracle
KEEP BUFFER ํ™œ์šฉ ๋ฐฉ์•ˆ_Wh oracleKEEP BUFFER ํ™œ์šฉ ๋ฐฉ์•ˆ_Wh oracle
KEEP BUFFER ํ™œ์šฉ ๋ฐฉ์•ˆ_Wh oracle์—‘์…ˆ
ย 
NLJ BATCH์™€ ๋ถ€๋ถ„๋ฒ”์œ„ ์ฒ˜๋ฆฌ_Wh oracle
NLJ BATCH์™€ ๋ถ€๋ถ„๋ฒ”์œ„ ์ฒ˜๋ฆฌ_Wh oracleNLJ BATCH์™€ ๋ถ€๋ถ„๋ฒ”์œ„ ์ฒ˜๋ฆฌ_Wh oracle
NLJ BATCH์™€ ๋ถ€๋ถ„๋ฒ”์œ„ ์ฒ˜๋ฆฌ_Wh oracle์—‘์…ˆ
ย 
[162] jpaแ„‹แ…ช แ„†แ…ฉแ„ƒแ…ฅแ†ซ แ„Œแ…กแ„‡แ…ก แ„ƒแ…ฆแ„‹แ…ตแ„แ…ฅ แ„Œแ…ฅแ„Œแ…กแ†ผ แ„€แ…ตแ„‰แ…ฎแ†ฏ
[162] jpaแ„‹แ…ช แ„†แ…ฉแ„ƒแ…ฅแ†ซ แ„Œแ…กแ„‡แ…ก แ„ƒแ…ฆแ„‹แ…ตแ„แ…ฅ แ„Œแ…ฅแ„Œแ…กแ†ผ แ„€แ…ตแ„‰แ…ฎแ†ฏ[162] jpaแ„‹แ…ช แ„†แ…ฉแ„ƒแ…ฅแ†ซ แ„Œแ…กแ„‡แ…ก แ„ƒแ…ฆแ„‹แ…ตแ„แ…ฅ แ„Œแ…ฅแ„Œแ…กแ†ผ แ„€แ…ตแ„‰แ…ฎแ†ฏ
[162] jpaแ„‹แ…ช แ„†แ…ฉแ„ƒแ…ฅแ†ซ แ„Œแ…กแ„‡แ…ก แ„ƒแ…ฆแ„‹แ…ตแ„แ…ฅ แ„Œแ…ฅแ„Œแ…กแ†ผ แ„€แ…ตแ„‰แ…ฎแ†ฏNAVER D2
ย 
04.์‹คํ–‰ํ™˜๊ฒฝ ๊ต์œก๊ต์žฌ(ํ™”๋ฉด์ฒ˜๋ฆฌ)
04.์‹คํ–‰ํ™˜๊ฒฝ ๊ต์œก๊ต์žฌ(ํ™”๋ฉด์ฒ˜๋ฆฌ)04.์‹คํ–‰ํ™˜๊ฒฝ ๊ต์œก๊ต์žฌ(ํ™”๋ฉด์ฒ˜๋ฆฌ)
04.์‹คํ–‰ํ™˜๊ฒฝ ๊ต์œก๊ต์žฌ(ํ™”๋ฉด์ฒ˜๋ฆฌ)Hankyo
ย 
redis ์†Œ๊ฐœ์ž๋ฃŒ - ๋„ค์˜คํด๋กœ๋ฐ”
redis ์†Œ๊ฐœ์ž๋ฃŒ - ๋„ค์˜คํด๋กœ๋ฐ”redis ์†Œ๊ฐœ์ž๋ฃŒ - ๋„ค์˜คํด๋กœ๋ฐ”
redis ์†Œ๊ฐœ์ž๋ฃŒ - ๋„ค์˜คํด๋กœ๋ฐ”NeoClova
ย 
[2015 07-06-์œค์„์ค€] Oracle ์„ฑ๋Šฅ ์ตœ์ ํ™” ๋ฐ ํ’ˆ์งˆ ๊ณ ๋„ํ™” 4
[2015 07-06-์œค์„์ค€] Oracle ์„ฑ๋Šฅ ์ตœ์ ํ™” ๋ฐ ํ’ˆ์งˆ ๊ณ ๋„ํ™” 4[2015 07-06-์œค์„์ค€] Oracle ์„ฑ๋Šฅ ์ตœ์ ํ™” ๋ฐ ํ’ˆ์งˆ ๊ณ ๋„ํ™” 4
[2015 07-06-์œค์„์ค€] Oracle ์„ฑ๋Šฅ ์ตœ์ ํ™” ๋ฐ ํ’ˆ์งˆ ๊ณ ๋„ํ™” 4Seok-joon Yun
ย 
#21.์Šคํ”„๋งํ”„๋ ˆ์ž„์›Œํฌ & ๋งˆ์ด๋ฐ”ํ‹ฐ์Šค (Spring Framework, MyBatis)_๊ตญ๋น„์ง€์›ITํ•™์›/์‹ค์—…์ž/์žฌ์ง์žํ™˜๊ธ‰๊ต์œก/์ž๋ฐ”/์Šคํ”„๋ง/...
#21.์Šคํ”„๋งํ”„๋ ˆ์ž„์›Œํฌ & ๋งˆ์ด๋ฐ”ํ‹ฐ์Šค (Spring Framework, MyBatis)_๊ตญ๋น„์ง€์›ITํ•™์›/์‹ค์—…์ž/์žฌ์ง์žํ™˜๊ธ‰๊ต์œก/์ž๋ฐ”/์Šคํ”„๋ง/...#21.์Šคํ”„๋งํ”„๋ ˆ์ž„์›Œํฌ & ๋งˆ์ด๋ฐ”ํ‹ฐ์Šค (Spring Framework, MyBatis)_๊ตญ๋น„์ง€์›ITํ•™์›/์‹ค์—…์ž/์žฌ์ง์žํ™˜๊ธ‰๊ต์œก/์ž๋ฐ”/์Šคํ”„๋ง/...
#21.์Šคํ”„๋งํ”„๋ ˆ์ž„์›Œํฌ & ๋งˆ์ด๋ฐ”ํ‹ฐ์Šค (Spring Framework, MyBatis)_๊ตญ๋น„์ง€์›ITํ•™์›/์‹ค์—…์ž/์žฌ์ง์žํ™˜๊ธ‰๊ต์œก/์ž๋ฐ”/์Šคํ”„๋ง/...ํƒ‘ํฌ๋ฆฌ์—๋“€(๊ตฌ๋กœ๋””์ง€ํ„ธ๋‹จ์ง€์—ญ3๋ฒˆ์ถœ๊ตฌ 2๋ถ„๊ฑฐ๋ฆฌ)
ย 
Federated Engine ์‹ค๋ฌด์ ์šฉ์‚ฌ๋ก€
Federated Engine ์‹ค๋ฌด์ ์šฉ์‚ฌ๋ก€Federated Engine ์‹ค๋ฌด์ ์šฉ์‚ฌ๋ก€
Federated Engine ์‹ค๋ฌด์ ์šฉ์‚ฌ๋ก€I Goo Lee
ย 
[์˜คํ”ˆ์†Œ์Šค์ปจ์„คํŒ…]Day #1 MySQL ์—”์ง„์†Œ๊ฐœ, ํŠœ๋‹, ๋ฐฑ์—… ๋ฐ ๋ณต๊ตฌ, ์—…๊ทธ๋ ˆ์ด๋“œ๋ฐฉ๋ฒ•
[์˜คํ”ˆ์†Œ์Šค์ปจ์„คํŒ…]Day #1 MySQL ์—”์ง„์†Œ๊ฐœ, ํŠœ๋‹, ๋ฐฑ์—… ๋ฐ ๋ณต๊ตฌ, ์—…๊ทธ๋ ˆ์ด๋“œ๋ฐฉ๋ฒ•[์˜คํ”ˆ์†Œ์Šค์ปจ์„คํŒ…]Day #1 MySQL ์—”์ง„์†Œ๊ฐœ, ํŠœ๋‹, ๋ฐฑ์—… ๋ฐ ๋ณต๊ตฌ, ์—…๊ทธ๋ ˆ์ด๋“œ๋ฐฉ๋ฒ•
[์˜คํ”ˆ์†Œ์Šค์ปจ์„คํŒ…]Day #1 MySQL ์—”์ง„์†Œ๊ฐœ, ํŠœ๋‹, ๋ฐฑ์—… ๋ฐ ๋ณต๊ตฌ, ์—…๊ทธ๋ ˆ์ด๋“œ๋ฐฉ๋ฒ•Ji-Woong Choi
ย 
01.๊ฐœ๋ฐœํ™˜๊ฒฝ ๊ต์œก๊ต์žฌ
01.๊ฐœ๋ฐœํ™˜๊ฒฝ ๊ต์œก๊ต์žฌ01.๊ฐœ๋ฐœํ™˜๊ฒฝ ๊ต์œก๊ต์žฌ
01.๊ฐœ๋ฐœํ™˜๊ฒฝ ๊ต์œก๊ต์žฌHankyo
ย 
Using AdoRepository
Using AdoRepositoryUsing AdoRepository
Using AdoRepositorySunghyouk Bae
ย 
#17.์Šคํ”„๋งํ”„๋ ˆ์ž„์›Œํฌ & ๋งˆ์ด๋ฐ”ํ‹ฐ์Šค (Spring Framework, MyBatis)_๊ตญ๋น„์ง€์›ITํ•™์›/์‹ค์—…์ž/์žฌ์ง์žํ™˜๊ธ‰๊ต์œก/์ž๋ฐ”/์Šคํ”„๋ง/...
#17.์Šคํ”„๋งํ”„๋ ˆ์ž„์›Œํฌ & ๋งˆ์ด๋ฐ”ํ‹ฐ์Šค (Spring Framework, MyBatis)_๊ตญ๋น„์ง€์›ITํ•™์›/์‹ค์—…์ž/์žฌ์ง์žํ™˜๊ธ‰๊ต์œก/์ž๋ฐ”/์Šคํ”„๋ง/...#17.์Šคํ”„๋งํ”„๋ ˆ์ž„์›Œํฌ & ๋งˆ์ด๋ฐ”ํ‹ฐ์Šค (Spring Framework, MyBatis)_๊ตญ๋น„์ง€์›ITํ•™์›/์‹ค์—…์ž/์žฌ์ง์žํ™˜๊ธ‰๊ต์œก/์ž๋ฐ”/์Šคํ”„๋ง/...
#17.์Šคํ”„๋งํ”„๋ ˆ์ž„์›Œํฌ & ๋งˆ์ด๋ฐ”ํ‹ฐ์Šค (Spring Framework, MyBatis)_๊ตญ๋น„์ง€์›ITํ•™์›/์‹ค์—…์ž/์žฌ์ง์žํ™˜๊ธ‰๊ต์œก/์ž๋ฐ”/์Šคํ”„๋ง/...ํƒ‘ํฌ๋ฆฌ์—๋“€(๊ตฌ๋กœ๋””์ง€ํ„ธ๋‹จ์ง€์—ญ3๋ฒˆ์ถœ๊ตฌ 2๋ถ„๊ฑฐ๋ฆฌ)
ย 
#2.SQL์ดˆ๋ณด์—์„œ Schema Objects๊นŒ์ง€_์žฌ์ง์ž/๊ทผ๋กœ์žํ™˜๊ธ‰/๊ตญ๋น„์ง€์›๊ต์œก/IT์‹ค๋ฌด๊ต์œก/SQL๊ธฐ์ดˆ๊ต์œก/๊ตฌ๋กœITํ•™์›์ถ”์ฒœ
#2.SQL์ดˆ๋ณด์—์„œ Schema Objects๊นŒ์ง€_์žฌ์ง์ž/๊ทผ๋กœ์žํ™˜๊ธ‰/๊ตญ๋น„์ง€์›๊ต์œก/IT์‹ค๋ฌด๊ต์œก/SQL๊ธฐ์ดˆ๊ต์œก/๊ตฌ๋กœITํ•™์›์ถ”์ฒœ#2.SQL์ดˆ๋ณด์—์„œ Schema Objects๊นŒ์ง€_์žฌ์ง์ž/๊ทผ๋กœ์žํ™˜๊ธ‰/๊ตญ๋น„์ง€์›๊ต์œก/IT์‹ค๋ฌด๊ต์œก/SQL๊ธฐ์ดˆ๊ต์œก/๊ตฌ๋กœITํ•™์›์ถ”์ฒœ
#2.SQL์ดˆ๋ณด์—์„œ Schema Objects๊นŒ์ง€_์žฌ์ง์ž/๊ทผ๋กœ์žํ™˜๊ธ‰/๊ตญ๋น„์ง€์›๊ต์œก/IT์‹ค๋ฌด๊ต์œก/SQL๊ธฐ์ดˆ๊ต์œก/๊ตฌ๋กœITํ•™์›์ถ”์ฒœํƒ‘ํฌ๋ฆฌ์—๋“€(๊ตฌ๋กœ๋””์ง€ํ„ธ๋‹จ์ง€์—ญ3๋ฒˆ์ถœ๊ตฌ 2๋ถ„๊ฑฐ๋ฆฌ)
ย 
Scala, Spring-Boot, JPA์˜ ๋ถˆํŽธํ•˜๋ฉด์„œ๋„ ์ฆ๊ฑฐ์šด ๋™๊ฑฐ
Scala, Spring-Boot, JPA์˜ ๋ถˆํŽธํ•˜๋ฉด์„œ๋„ ์ฆ๊ฑฐ์šด ๋™๊ฑฐScala, Spring-Boot, JPA์˜ ๋ถˆํŽธํ•˜๋ฉด์„œ๋„ ์ฆ๊ฑฐ์šด ๋™๊ฑฐ
Scala, Spring-Boot, JPA์˜ ๋ถˆํŽธํ•˜๋ฉด์„œ๋„ ์ฆ๊ฑฐ์šด ๋™๊ฑฐJavajigi Jaesung
ย 

What's hot (20)

03.์‹คํ–‰ํ™˜๊ฒฝ ๊ต์œก๊ต์žฌ(๋ฐฐ์น˜์ฒ˜๋ฆฌ)
03.์‹คํ–‰ํ™˜๊ฒฝ ๊ต์œก๊ต์žฌ(๋ฐฐ์น˜์ฒ˜๋ฆฌ)03.์‹คํ–‰ํ™˜๊ฒฝ ๊ต์œก๊ต์žฌ(๋ฐฐ์น˜์ฒ˜๋ฆฌ)
03.์‹คํ–‰ํ™˜๊ฒฝ ๊ต์œก๊ต์žฌ(๋ฐฐ์น˜์ฒ˜๋ฆฌ)
ย 
[์˜คํ”ˆ์†Œ์Šค์ปจ์„คํŒ…]MyBatis Basic
[์˜คํ”ˆ์†Œ์Šค์ปจ์„คํŒ…]MyBatis Basic[์˜คํ”ˆ์†Œ์Šค์ปจ์„คํŒ…]MyBatis Basic
[์˜คํ”ˆ์†Œ์Šค์ปจ์„คํŒ…]MyBatis Basic
ย 
H3 2011 ๋Œ€ํ˜•์‚ฌ์ดํŠธ ๊ตฌ์ถ•์„ ์œ„ํ•œ MySQL ํŠœ๋‹์ „๋žต
H3 2011 ๋Œ€ํ˜•์‚ฌ์ดํŠธ ๊ตฌ์ถ•์„ ์œ„ํ•œ MySQL ํŠœ๋‹์ „๋žตH3 2011 ๋Œ€ํ˜•์‚ฌ์ดํŠธ ๊ตฌ์ถ•์„ ์œ„ํ•œ MySQL ํŠœ๋‹์ „๋žต
H3 2011 ๋Œ€ํ˜•์‚ฌ์ดํŠธ ๊ตฌ์ถ•์„ ์œ„ํ•œ MySQL ํŠœ๋‹์ „๋žต
ย 
KEEP BUFFER ํ™œ์šฉ ๋ฐฉ์•ˆ_Wh oracle
KEEP BUFFER ํ™œ์šฉ ๋ฐฉ์•ˆ_Wh oracleKEEP BUFFER ํ™œ์šฉ ๋ฐฉ์•ˆ_Wh oracle
KEEP BUFFER ํ™œ์šฉ ๋ฐฉ์•ˆ_Wh oracle
ย 
NLJ BATCH์™€ ๋ถ€๋ถ„๋ฒ”์œ„ ์ฒ˜๋ฆฌ_Wh oracle
NLJ BATCH์™€ ๋ถ€๋ถ„๋ฒ”์œ„ ์ฒ˜๋ฆฌ_Wh oracleNLJ BATCH์™€ ๋ถ€๋ถ„๋ฒ”์œ„ ์ฒ˜๋ฆฌ_Wh oracle
NLJ BATCH์™€ ๋ถ€๋ถ„๋ฒ”์œ„ ์ฒ˜๋ฆฌ_Wh oracle
ย 
[162] jpaแ„‹แ…ช แ„†แ…ฉแ„ƒแ…ฅแ†ซ แ„Œแ…กแ„‡แ…ก แ„ƒแ…ฆแ„‹แ…ตแ„แ…ฅ แ„Œแ…ฅแ„Œแ…กแ†ผ แ„€แ…ตแ„‰แ…ฎแ†ฏ
[162] jpaแ„‹แ…ช แ„†แ…ฉแ„ƒแ…ฅแ†ซ แ„Œแ…กแ„‡แ…ก แ„ƒแ…ฆแ„‹แ…ตแ„แ…ฅ แ„Œแ…ฅแ„Œแ…กแ†ผ แ„€แ…ตแ„‰แ…ฎแ†ฏ[162] jpaแ„‹แ…ช แ„†แ…ฉแ„ƒแ…ฅแ†ซ แ„Œแ…กแ„‡แ…ก แ„ƒแ…ฆแ„‹แ…ตแ„แ…ฅ แ„Œแ…ฅแ„Œแ…กแ†ผ แ„€แ…ตแ„‰แ…ฎแ†ฏ
[162] jpaแ„‹แ…ช แ„†แ…ฉแ„ƒแ…ฅแ†ซ แ„Œแ…กแ„‡แ…ก แ„ƒแ…ฆแ„‹แ…ตแ„แ…ฅ แ„Œแ…ฅแ„Œแ…กแ†ผ แ„€แ…ตแ„‰แ…ฎแ†ฏ
ย 
04.์‹คํ–‰ํ™˜๊ฒฝ ๊ต์œก๊ต์žฌ(ํ™”๋ฉด์ฒ˜๋ฆฌ)
04.์‹คํ–‰ํ™˜๊ฒฝ ๊ต์œก๊ต์žฌ(ํ™”๋ฉด์ฒ˜๋ฆฌ)04.์‹คํ–‰ํ™˜๊ฒฝ ๊ต์œก๊ต์žฌ(ํ™”๋ฉด์ฒ˜๋ฆฌ)
04.์‹คํ–‰ํ™˜๊ฒฝ ๊ต์œก๊ต์žฌ(ํ™”๋ฉด์ฒ˜๋ฆฌ)
ย 
redis ์†Œ๊ฐœ์ž๋ฃŒ - ๋„ค์˜คํด๋กœ๋ฐ”
redis ์†Œ๊ฐœ์ž๋ฃŒ - ๋„ค์˜คํด๋กœ๋ฐ”redis ์†Œ๊ฐœ์ž๋ฃŒ - ๋„ค์˜คํด๋กœ๋ฐ”
redis ์†Œ๊ฐœ์ž๋ฃŒ - ๋„ค์˜คํด๋กœ๋ฐ”
ย 
[2015 07-06-์œค์„์ค€] Oracle ์„ฑ๋Šฅ ์ตœ์ ํ™” ๋ฐ ํ’ˆ์งˆ ๊ณ ๋„ํ™” 4
[2015 07-06-์œค์„์ค€] Oracle ์„ฑ๋Šฅ ์ตœ์ ํ™” ๋ฐ ํ’ˆ์งˆ ๊ณ ๋„ํ™” 4[2015 07-06-์œค์„์ค€] Oracle ์„ฑ๋Šฅ ์ตœ์ ํ™” ๋ฐ ํ’ˆ์งˆ ๊ณ ๋„ํ™” 4
[2015 07-06-์œค์„์ค€] Oracle ์„ฑ๋Šฅ ์ตœ์ ํ™” ๋ฐ ํ’ˆ์งˆ ๊ณ ๋„ํ™” 4
ย 
#21.์Šคํ”„๋งํ”„๋ ˆ์ž„์›Œํฌ & ๋งˆ์ด๋ฐ”ํ‹ฐ์Šค (Spring Framework, MyBatis)_๊ตญ๋น„์ง€์›ITํ•™์›/์‹ค์—…์ž/์žฌ์ง์žํ™˜๊ธ‰๊ต์œก/์ž๋ฐ”/์Šคํ”„๋ง/...
#21.์Šคํ”„๋งํ”„๋ ˆ์ž„์›Œํฌ & ๋งˆ์ด๋ฐ”ํ‹ฐ์Šค (Spring Framework, MyBatis)_๊ตญ๋น„์ง€์›ITํ•™์›/์‹ค์—…์ž/์žฌ์ง์žํ™˜๊ธ‰๊ต์œก/์ž๋ฐ”/์Šคํ”„๋ง/...#21.์Šคํ”„๋งํ”„๋ ˆ์ž„์›Œํฌ & ๋งˆ์ด๋ฐ”ํ‹ฐ์Šค (Spring Framework, MyBatis)_๊ตญ๋น„์ง€์›ITํ•™์›/์‹ค์—…์ž/์žฌ์ง์žํ™˜๊ธ‰๊ต์œก/์ž๋ฐ”/์Šคํ”„๋ง/...
#21.์Šคํ”„๋งํ”„๋ ˆ์ž„์›Œํฌ & ๋งˆ์ด๋ฐ”ํ‹ฐ์Šค (Spring Framework, MyBatis)_๊ตญ๋น„์ง€์›ITํ•™์›/์‹ค์—…์ž/์žฌ์ง์žํ™˜๊ธ‰๊ต์œก/์ž๋ฐ”/์Šคํ”„๋ง/...
ย 
(์Šคํ”„๋งJDBC์™€ Spring Data JPA๋น„๊ต)Spring JDBC์™€ JPA๋ฅผ ๊ฐ„๋‹จํ•œ CRUD ์˜ˆ์ œ๋กœ ๋งŒ๋“ค๋ฉด์„œ ๋น„๊ตํ•ด๋ณด์ž.
(์Šคํ”„๋งJDBC์™€ Spring Data JPA๋น„๊ต)Spring JDBC์™€ JPA๋ฅผ ๊ฐ„๋‹จํ•œ CRUD ์˜ˆ์ œ๋กœ  ๋งŒ๋“ค๋ฉด์„œ ๋น„๊ตํ•ด๋ณด์ž.(์Šคํ”„๋งJDBC์™€ Spring Data JPA๋น„๊ต)Spring JDBC์™€ JPA๋ฅผ ๊ฐ„๋‹จํ•œ CRUD ์˜ˆ์ œ๋กœ  ๋งŒ๋“ค๋ฉด์„œ ๋น„๊ตํ•ด๋ณด์ž.
(์Šคํ”„๋งJDBC์™€ Spring Data JPA๋น„๊ต)Spring JDBC์™€ JPA๋ฅผ ๊ฐ„๋‹จํ•œ CRUD ์˜ˆ์ œ๋กœ ๋งŒ๋“ค๋ฉด์„œ ๋น„๊ตํ•ด๋ณด์ž.
ย 
(IT์‹ค๋ฌด๊ต์œก/๊ตญ๋น„์ง€์›๊ต์œก/์ž๋ฐ”/์Šคํ”„๋ง๊ต์œก์ถ”์ฒœ)#15.์Šคํ”„๋งํ”„๋ ˆ์ž„์›Œํฌ & ๋งˆ์ด๋ฐ”ํ‹ฐ์Šค (Spring Framework, MyBatis)
(IT์‹ค๋ฌด๊ต์œก/๊ตญ๋น„์ง€์›๊ต์œก/์ž๋ฐ”/์Šคํ”„๋ง๊ต์œก์ถ”์ฒœ)#15.์Šคํ”„๋งํ”„๋ ˆ์ž„์›Œํฌ & ๋งˆ์ด๋ฐ”ํ‹ฐ์Šค (Spring Framework, MyBatis)(IT์‹ค๋ฌด๊ต์œก/๊ตญ๋น„์ง€์›๊ต์œก/์ž๋ฐ”/์Šคํ”„๋ง๊ต์œก์ถ”์ฒœ)#15.์Šคํ”„๋งํ”„๋ ˆ์ž„์›Œํฌ & ๋งˆ์ด๋ฐ”ํ‹ฐ์Šค (Spring Framework, MyBatis)
(IT์‹ค๋ฌด๊ต์œก/๊ตญ๋น„์ง€์›๊ต์œก/์ž๋ฐ”/์Šคํ”„๋ง๊ต์œก์ถ”์ฒœ)#15.์Šคํ”„๋งํ”„๋ ˆ์ž„์›Œํฌ & ๋งˆ์ด๋ฐ”ํ‹ฐ์Šค (Spring Framework, MyBatis)
ย 
Federated Engine ์‹ค๋ฌด์ ์šฉ์‚ฌ๋ก€
Federated Engine ์‹ค๋ฌด์ ์šฉ์‚ฌ๋ก€Federated Engine ์‹ค๋ฌด์ ์šฉ์‚ฌ๋ก€
Federated Engine ์‹ค๋ฌด์ ์šฉ์‚ฌ๋ก€
ย 
[์˜คํ”ˆ์†Œ์Šค์ปจ์„คํŒ…]Day #1 MySQL ์—”์ง„์†Œ๊ฐœ, ํŠœ๋‹, ๋ฐฑ์—… ๋ฐ ๋ณต๊ตฌ, ์—…๊ทธ๋ ˆ์ด๋“œ๋ฐฉ๋ฒ•
[์˜คํ”ˆ์†Œ์Šค์ปจ์„คํŒ…]Day #1 MySQL ์—”์ง„์†Œ๊ฐœ, ํŠœ๋‹, ๋ฐฑ์—… ๋ฐ ๋ณต๊ตฌ, ์—…๊ทธ๋ ˆ์ด๋“œ๋ฐฉ๋ฒ•[์˜คํ”ˆ์†Œ์Šค์ปจ์„คํŒ…]Day #1 MySQL ์—”์ง„์†Œ๊ฐœ, ํŠœ๋‹, ๋ฐฑ์—… ๋ฐ ๋ณต๊ตฌ, ์—…๊ทธ๋ ˆ์ด๋“œ๋ฐฉ๋ฒ•
[์˜คํ”ˆ์†Œ์Šค์ปจ์„คํŒ…]Day #1 MySQL ์—”์ง„์†Œ๊ฐœ, ํŠœ๋‹, ๋ฐฑ์—… ๋ฐ ๋ณต๊ตฌ, ์—…๊ทธ๋ ˆ์ด๋“œ๋ฐฉ๋ฒ•
ย 
์Šคํ”„๋งํ”„๋ ˆ์ž„์›Œํฌ & ๋งˆ์ด๋ฐ”ํ‹ฐ์Šค โ˜† ๋ฌด.๋ฃŒ ๊ฐ•์˜์ž๋ฃŒ ์ œ๊ณต ไธญ
์Šคํ”„๋งํ”„๋ ˆ์ž„์›Œํฌ & ๋งˆ์ด๋ฐ”ํ‹ฐ์Šค โ˜† ๋ฌด.๋ฃŒ ๊ฐ•์˜์ž๋ฃŒ ์ œ๊ณต ไธญ์Šคํ”„๋งํ”„๋ ˆ์ž„์›Œํฌ & ๋งˆ์ด๋ฐ”ํ‹ฐ์Šค โ˜† ๋ฌด.๋ฃŒ ๊ฐ•์˜์ž๋ฃŒ ์ œ๊ณต ไธญ
์Šคํ”„๋งํ”„๋ ˆ์ž„์›Œํฌ & ๋งˆ์ด๋ฐ”ํ‹ฐ์Šค โ˜† ๋ฌด.๋ฃŒ ๊ฐ•์˜์ž๋ฃŒ ์ œ๊ณต ไธญ
ย 
01.๊ฐœ๋ฐœํ™˜๊ฒฝ ๊ต์œก๊ต์žฌ
01.๊ฐœ๋ฐœํ™˜๊ฒฝ ๊ต์œก๊ต์žฌ01.๊ฐœ๋ฐœํ™˜๊ฒฝ ๊ต์œก๊ต์žฌ
01.๊ฐœ๋ฐœํ™˜๊ฒฝ ๊ต์œก๊ต์žฌ
ย 
Using AdoRepository
Using AdoRepositoryUsing AdoRepository
Using AdoRepository
ย 
#17.์Šคํ”„๋งํ”„๋ ˆ์ž„์›Œํฌ & ๋งˆ์ด๋ฐ”ํ‹ฐ์Šค (Spring Framework, MyBatis)_๊ตญ๋น„์ง€์›ITํ•™์›/์‹ค์—…์ž/์žฌ์ง์žํ™˜๊ธ‰๊ต์œก/์ž๋ฐ”/์Šคํ”„๋ง/...
#17.์Šคํ”„๋งํ”„๋ ˆ์ž„์›Œํฌ & ๋งˆ์ด๋ฐ”ํ‹ฐ์Šค (Spring Framework, MyBatis)_๊ตญ๋น„์ง€์›ITํ•™์›/์‹ค์—…์ž/์žฌ์ง์žํ™˜๊ธ‰๊ต์œก/์ž๋ฐ”/์Šคํ”„๋ง/...#17.์Šคํ”„๋งํ”„๋ ˆ์ž„์›Œํฌ & ๋งˆ์ด๋ฐ”ํ‹ฐ์Šค (Spring Framework, MyBatis)_๊ตญ๋น„์ง€์›ITํ•™์›/์‹ค์—…์ž/์žฌ์ง์žํ™˜๊ธ‰๊ต์œก/์ž๋ฐ”/์Šคํ”„๋ง/...
#17.์Šคํ”„๋งํ”„๋ ˆ์ž„์›Œํฌ & ๋งˆ์ด๋ฐ”ํ‹ฐ์Šค (Spring Framework, MyBatis)_๊ตญ๋น„์ง€์›ITํ•™์›/์‹ค์—…์ž/์žฌ์ง์žํ™˜๊ธ‰๊ต์œก/์ž๋ฐ”/์Šคํ”„๋ง/...
ย 
#2.SQL์ดˆ๋ณด์—์„œ Schema Objects๊นŒ์ง€_์žฌ์ง์ž/๊ทผ๋กœ์žํ™˜๊ธ‰/๊ตญ๋น„์ง€์›๊ต์œก/IT์‹ค๋ฌด๊ต์œก/SQL๊ธฐ์ดˆ๊ต์œก/๊ตฌ๋กœITํ•™์›์ถ”์ฒœ
#2.SQL์ดˆ๋ณด์—์„œ Schema Objects๊นŒ์ง€_์žฌ์ง์ž/๊ทผ๋กœ์žํ™˜๊ธ‰/๊ตญ๋น„์ง€์›๊ต์œก/IT์‹ค๋ฌด๊ต์œก/SQL๊ธฐ์ดˆ๊ต์œก/๊ตฌ๋กœITํ•™์›์ถ”์ฒœ#2.SQL์ดˆ๋ณด์—์„œ Schema Objects๊นŒ์ง€_์žฌ์ง์ž/๊ทผ๋กœ์žํ™˜๊ธ‰/๊ตญ๋น„์ง€์›๊ต์œก/IT์‹ค๋ฌด๊ต์œก/SQL๊ธฐ์ดˆ๊ต์œก/๊ตฌ๋กœITํ•™์›์ถ”์ฒœ
#2.SQL์ดˆ๋ณด์—์„œ Schema Objects๊นŒ์ง€_์žฌ์ง์ž/๊ทผ๋กœ์žํ™˜๊ธ‰/๊ตญ๋น„์ง€์›๊ต์œก/IT์‹ค๋ฌด๊ต์œก/SQL๊ธฐ์ดˆ๊ต์œก/๊ตฌ๋กœITํ•™์›์ถ”์ฒœ
ย 
Scala, Spring-Boot, JPA์˜ ๋ถˆํŽธํ•˜๋ฉด์„œ๋„ ์ฆ๊ฑฐ์šด ๋™๊ฑฐ
Scala, Spring-Boot, JPA์˜ ๋ถˆํŽธํ•˜๋ฉด์„œ๋„ ์ฆ๊ฑฐ์šด ๋™๊ฑฐScala, Spring-Boot, JPA์˜ ๋ถˆํŽธํ•˜๋ฉด์„œ๋„ ์ฆ๊ฑฐ์šด ๋™๊ฑฐ
Scala, Spring-Boot, JPA์˜ ๋ถˆํŽธํ•˜๋ฉด์„œ๋„ ์ฆ๊ฑฐ์šด ๋™๊ฑฐ
ย 

Viewers also liked

ใ‚จใƒผใ‚ธใ‚งใƒณใƒˆใ‚ทใ‚นใƒ†ใƒ ็‰น่ซ–็™บ่กจใ‚นใƒฉใ‚คใƒ‰
ใ‚จใƒผใ‚ธใ‚งใƒณใƒˆใ‚ทใ‚นใƒ†ใƒ ็‰น่ซ–็™บ่กจใ‚นใƒฉใ‚คใƒ‰ใ‚จใƒผใ‚ธใ‚งใƒณใƒˆใ‚ทใ‚นใƒ†ใƒ ็‰น่ซ–็™บ่กจใ‚นใƒฉใ‚คใƒ‰
ใ‚จใƒผใ‚ธใ‚งใƒณใƒˆใ‚ทใ‚นใƒ†ใƒ ็‰น่ซ–็™บ่กจใ‚นใƒฉใ‚คใƒ‰Genki Furumi
ย 
Nfp seminar---audit-update
Nfp seminar---audit-updateNfp seminar---audit-update
Nfp seminar---audit-updatenone
ย 
Tinati - the HTP Model understanding the development of social machines
Tinati  - the HTP Model understanding the development of social machinesTinati  - the HTP Model understanding the development of social machines
Tinati - the HTP Model understanding the development of social machinesRamine Tinati
ย 
Dma awards unplugged slides 24 july
Dma awards unplugged slides 24 julyDma awards unplugged slides 24 july
Dma awards unplugged slides 24 julyRachel Aldighieri
ย 
What does data sharing mean to consumers? - 27 February 2013
What does data sharing mean to consumers? - 27 February 2013What does data sharing mean to consumers? - 27 February 2013
What does data sharing mean to consumers? - 27 February 2013Rachel Aldighieri
ย 
The good, the bad and the ugly of lead generation
The good, the bad and the ugly of lead generationThe good, the bad and the ugly of lead generation
The good, the bad and the ugly of lead generationRachel Aldighieri
ย 
History of Development AL in Australia
History of Development AL in  AustraliaHistory of Development AL in  Australia
History of Development AL in AustraliaMatahati Mahbol
ย 
DMA Scotland: Legal update
DMA Scotland: Legal updateDMA Scotland: Legal update
DMA Scotland: Legal updateRachel Aldighieri
ย 
5 mejores grupos de rock segun la revista rolling stones
5 mejores grupos de rock segun la revista rolling stones5 mejores grupos de rock segun la revista rolling stones
5 mejores grupos de rock segun la revista rolling stonescarlosasencio93
ย 
ZEDTalk 3: Creativity & ROI
ZEDTalk 3: Creativity & ROIZEDTalk 3: Creativity & ROI
ZEDTalk 3: Creativity & ROIRachel Aldighieri
ย 
๋””์ง€ํ„ธ ํ™”๊ฐ€๋“ค์ด ์˜ค๊ณ  ์žˆ๋‹ค
๋””์ง€ํ„ธ ํ™”๊ฐ€๋“ค์ด ์˜ค๊ณ  ์žˆ๋‹ค๋””์ง€ํ„ธ ํ™”๊ฐ€๋“ค์ด ์˜ค๊ณ  ์žˆ๋‹ค
๋””์ง€ํ„ธ ํ™”๊ฐ€๋“ค์ด ์˜ค๊ณ  ์žˆ๋‹คJoonseong Ko
ย 
Soft serve discount
Soft serve discountSoft serve discount
Soft serve discountBairachnaya Olga
ย 
The importance of branding
The importance of brandingThe importance of branding
The importance of brandingHappyface Mgnt
ย 
What makes-an-influencer
What makes-an-influencerWhat makes-an-influencer
What makes-an-influencerFred Phebs
ย 
New zealand
New zealandNew zealand
New zealandfujii57
ย 
Presentacion final c video. ppt
Presentacion final c video. pptPresentacion final c video. ppt
Presentacion final c video. pptpscaroliese
ย 
Inserts nuts & bolts, 31st january 2013
Inserts nuts & bolts, 31st january 2013Inserts nuts & bolts, 31st january 2013
Inserts nuts & bolts, 31st january 2013Rachel Aldighieri
ย 
Legal update Leeds - 7 October 2014
Legal update Leeds -  7 October 2014Legal update Leeds -  7 October 2014
Legal update Leeds - 7 October 2014Rachel Aldighieri
ย 
Data privacy: what the consumer really thinks - 30.06.2015
Data privacy: what the consumer really thinks - 30.06.2015Data privacy: what the consumer really thinks - 30.06.2015
Data privacy: what the consumer really thinks - 30.06.2015Rachel Aldighieri
ย 

Viewers also liked (20)

ใ‚จใƒผใ‚ธใ‚งใƒณใƒˆใ‚ทใ‚นใƒ†ใƒ ็‰น่ซ–็™บ่กจใ‚นใƒฉใ‚คใƒ‰
ใ‚จใƒผใ‚ธใ‚งใƒณใƒˆใ‚ทใ‚นใƒ†ใƒ ็‰น่ซ–็™บ่กจใ‚นใƒฉใ‚คใƒ‰ใ‚จใƒผใ‚ธใ‚งใƒณใƒˆใ‚ทใ‚นใƒ†ใƒ ็‰น่ซ–็™บ่กจใ‚นใƒฉใ‚คใƒ‰
ใ‚จใƒผใ‚ธใ‚งใƒณใƒˆใ‚ทใ‚นใƒ†ใƒ ็‰น่ซ–็™บ่กจใ‚นใƒฉใ‚คใƒ‰
ย 
Nfp seminar---audit-update
Nfp seminar---audit-updateNfp seminar---audit-update
Nfp seminar---audit-update
ย 
Tinati - the HTP Model understanding the development of social machines
Tinati  - the HTP Model understanding the development of social machinesTinati  - the HTP Model understanding the development of social machines
Tinati - the HTP Model understanding the development of social machines
ย 
Dma awards unplugged slides 24 july
Dma awards unplugged slides 24 julyDma awards unplugged slides 24 july
Dma awards unplugged slides 24 july
ย 
What does data sharing mean to consumers? - 27 February 2013
What does data sharing mean to consumers? - 27 February 2013What does data sharing mean to consumers? - 27 February 2013
What does data sharing mean to consumers? - 27 February 2013
ย 
Phonegap research for bada kyubongcho
Phonegap research for bada kyubongchoPhonegap research for bada kyubongcho
Phonegap research for bada kyubongcho
ย 
The good, the bad and the ugly of lead generation
The good, the bad and the ugly of lead generationThe good, the bad and the ugly of lead generation
The good, the bad and the ugly of lead generation
ย 
History of Development AL in Australia
History of Development AL in  AustraliaHistory of Development AL in  Australia
History of Development AL in Australia
ย 
DMA Scotland: Legal update
DMA Scotland: Legal updateDMA Scotland: Legal update
DMA Scotland: Legal update
ย 
5 mejores grupos de rock segun la revista rolling stones
5 mejores grupos de rock segun la revista rolling stones5 mejores grupos de rock segun la revista rolling stones
5 mejores grupos de rock segun la revista rolling stones
ย 
ZEDTalk 3: Creativity & ROI
ZEDTalk 3: Creativity & ROIZEDTalk 3: Creativity & ROI
ZEDTalk 3: Creativity & ROI
ย 
๋””์ง€ํ„ธ ํ™”๊ฐ€๋“ค์ด ์˜ค๊ณ  ์žˆ๋‹ค
๋””์ง€ํ„ธ ํ™”๊ฐ€๋“ค์ด ์˜ค๊ณ  ์žˆ๋‹ค๋””์ง€ํ„ธ ํ™”๊ฐ€๋“ค์ด ์˜ค๊ณ  ์žˆ๋‹ค
๋””์ง€ํ„ธ ํ™”๊ฐ€๋“ค์ด ์˜ค๊ณ  ์žˆ๋‹ค
ย 
Soft serve discount
Soft serve discountSoft serve discount
Soft serve discount
ย 
The importance of branding
The importance of brandingThe importance of branding
The importance of branding
ย 
What makes-an-influencer
What makes-an-influencerWhat makes-an-influencer
What makes-an-influencer
ย 
New zealand
New zealandNew zealand
New zealand
ย 
Presentacion final c video. ppt
Presentacion final c video. pptPresentacion final c video. ppt
Presentacion final c video. ppt
ย 
Inserts nuts & bolts, 31st january 2013
Inserts nuts & bolts, 31st january 2013Inserts nuts & bolts, 31st january 2013
Inserts nuts & bolts, 31st january 2013
ย 
Legal update Leeds - 7 October 2014
Legal update Leeds -  7 October 2014Legal update Leeds -  7 October 2014
Legal update Leeds - 7 October 2014
ย 
Data privacy: what the consumer really thinks - 30.06.2015
Data privacy: what the consumer really thinks - 30.06.2015Data privacy: what the consumer really thinks - 30.06.2015
Data privacy: what the consumer really thinks - 30.06.2015
ย 

Similar to Ibatis

#33.์Šคํ”„๋งํ”„๋ ˆ์ž„์›Œํฌ & ๋งˆ์ด๋ฐ”ํ‹ฐ์Šค (Spring Framework, MyBatis)_์Šคํ”„๋งํ”„๋ ˆ์ž„์›Œํฌ ๊ฐ•์ขŒ, ์žฌ์ง์žํ™˜๊ธ‰๊ต์œก,์‹ค์—…์ž๊ตญ๋น„์ง€์›...
#33.์Šคํ”„๋งํ”„๋ ˆ์ž„์›Œํฌ & ๋งˆ์ด๋ฐ”ํ‹ฐ์Šค (Spring Framework, MyBatis)_์Šคํ”„๋งํ”„๋ ˆ์ž„์›Œํฌ ๊ฐ•์ขŒ, ์žฌ์ง์žํ™˜๊ธ‰๊ต์œก,์‹ค์—…์ž๊ตญ๋น„์ง€์›...#33.์Šคํ”„๋งํ”„๋ ˆ์ž„์›Œํฌ & ๋งˆ์ด๋ฐ”ํ‹ฐ์Šค (Spring Framework, MyBatis)_์Šคํ”„๋งํ”„๋ ˆ์ž„์›Œํฌ ๊ฐ•์ขŒ, ์žฌ์ง์žํ™˜๊ธ‰๊ต์œก,์‹ค์—…์ž๊ตญ๋น„์ง€์›...
#33.์Šคํ”„๋งํ”„๋ ˆ์ž„์›Œํฌ & ๋งˆ์ด๋ฐ”ํ‹ฐ์Šค (Spring Framework, MyBatis)_์Šคํ”„๋งํ”„๋ ˆ์ž„์›Œํฌ ๊ฐ•์ขŒ, ์žฌ์ง์žํ™˜๊ธ‰๊ต์œก,์‹ค์—…์ž๊ตญ๋น„์ง€์›...ํƒ‘ํฌ๋ฆฌ์—๋“€(๊ตฌ๋กœ๋””์ง€ํ„ธ๋‹จ์ง€์—ญ3๋ฒˆ์ถœ๊ตฌ 2๋ถ„๊ฑฐ๋ฆฌ)
ย 
Json view ์˜ˆ์ œ ์„ค๋ช…
Json view ์˜ˆ์ œ ์„ค๋ช…Json view ์˜ˆ์ œ ์„ค๋ช…
Json view ์˜ˆ์ œ ์„ค๋ช…Hyung Eun Jin
ย 
Xml standard library selection v1.0 2013
Xml standard library selection v1.0 2013Xml standard library selection v1.0 2013
Xml standard library selection v1.0 2013GunSik Choi
ย 
Jstl_GETCHA_HANJUNG
Jstl_GETCHA_HANJUNGJstl_GETCHA_HANJUNG
Jstl_GETCHA_HANJUNGJung Han
ย 
[์˜คํ”ˆ์†Œ์Šค์ปจ์„คํŒ…]Tomcat6&7 How To
[์˜คํ”ˆ์†Œ์Šค์ปจ์„คํŒ…]Tomcat6&7 How To[์˜คํ”ˆ์†Œ์Šค์ปจ์„คํŒ…]Tomcat6&7 How To
[์˜คํ”ˆ์†Œ์Šค์ปจ์„คํŒ…]Tomcat6&7 How ToJi-Woong Choi
ย 
[pgday.Seoul 2022] PostgreSQL๊ตฌ์กฐ - ์œค์„ฑ์žฌ
[pgday.Seoul 2022] PostgreSQL๊ตฌ์กฐ - ์œค์„ฑ์žฌ[pgday.Seoul 2022] PostgreSQL๊ตฌ์กฐ - ์œค์„ฑ์žฌ
[pgday.Seoul 2022] PostgreSQL๊ตฌ์กฐ - ์œค์„ฑ์žฌPgDay.Seoul
ย 
2.apache spark ์‹ค์Šต
2.apache spark ์‹ค์Šต2.apache spark ์‹ค์Šต
2.apache spark ์‹ค์Šต๋™ํ˜„ ๊ฐ•
ย 
์Šคํ”„๋ง๊ตฐ์‚ด์—†์ด์„ธํŒ…ํ•˜๊ธฐ(The way to setting the Spring framework for web.)
์Šคํ”„๋ง๊ตฐ์‚ด์—†์ด์„ธํŒ…ํ•˜๊ธฐ(The way to setting the Spring framework for web.)์Šคํ”„๋ง๊ตฐ์‚ด์—†์ด์„ธํŒ…ํ•˜๊ธฐ(The way to setting the Spring framework for web.)
์Šคํ”„๋ง๊ตฐ์‚ด์—†์ด์„ธํŒ…ํ•˜๊ธฐ(The way to setting the Spring framework for web.)EunChul Shin
ย 
๋ฐ์ดํ„ฐ ๋ ˆ์ดํฌ ์•Œ์•„๋ณด๊ธฐ(Learn about Data Lake)
๋ฐ์ดํ„ฐ ๋ ˆ์ดํฌ ์•Œ์•„๋ณด๊ธฐ(Learn about Data Lake)๋ฐ์ดํ„ฐ ๋ ˆ์ดํฌ ์•Œ์•„๋ณด๊ธฐ(Learn about Data Lake)
๋ฐ์ดํ„ฐ ๋ ˆ์ดํฌ ์•Œ์•„๋ณด๊ธฐ(Learn about Data Lake)SeungYong Baek
ย 
์†์‰ฌ์šด ๋ฐ์ดํ„ฐ ์—ฐ๊ฒฐ ๋ฐฉ๋ฒ•(๋ผ์ด๋ธŒ๋ฐ”์ธ๋”ฉ ํ™œ์šฉ)
์†์‰ฌ์šด ๋ฐ์ดํ„ฐ ์—ฐ๊ฒฐ ๋ฐฉ๋ฒ•(๋ผ์ด๋ธŒ๋ฐ”์ธ๋”ฉ ํ™œ์šฉ)์†์‰ฌ์šด ๋ฐ์ดํ„ฐ ์—ฐ๊ฒฐ ๋ฐฉ๋ฒ•(๋ผ์ด๋ธŒ๋ฐ”์ธ๋”ฉ ํ™œ์šฉ)
์†์‰ฌ์šด ๋ฐ์ดํ„ฐ ์—ฐ๊ฒฐ ๋ฐฉ๋ฒ•(๋ผ์ด๋ธŒ๋ฐ”์ธ๋”ฉ ํ™œ์šฉ)Devgear
ย 
Apache Spark
Apache SparkApache Spark
Apache Sparkssuser09ca0c1
ย 
N02 gae v1.1_20110220
N02 gae v1.1_20110220N02 gae v1.1_20110220
N02 gae v1.1_20110220Software in Life
ย 
Oracle History #9
Oracle History #9Oracle History #9
Oracle History #9Kyung Sang Jang
ย 
07.์‹คํ–‰ํ™˜๊ฒฝ ๊ต์œก๊ต์žฌ(ํ‘œ์ค€ํ”„๋ ˆ์ž„์›Œํฌ ์„ธ๋ถ€ ์ ์šฉ๊ธฐ์ค€)
07.์‹คํ–‰ํ™˜๊ฒฝ ๊ต์œก๊ต์žฌ(ํ‘œ์ค€ํ”„๋ ˆ์ž„์›Œํฌ ์„ธ๋ถ€ ์ ์šฉ๊ธฐ์ค€)07.์‹คํ–‰ํ™˜๊ฒฝ ๊ต์œก๊ต์žฌ(ํ‘œ์ค€ํ”„๋ ˆ์ž„์›Œํฌ ์„ธ๋ถ€ ์ ์šฉ๊ธฐ์ค€)
07.์‹คํ–‰ํ™˜๊ฒฝ ๊ต์œก๊ต์žฌ(ํ‘œ์ค€ํ”„๋ ˆ์ž„์›Œํฌ ์„ธ๋ถ€ ์ ์šฉ๊ธฐ์ค€)Hankyo
ย 
Mongodb2.2์™€ 2.4์˜ ์‹  ๊ธฐ๋Šฅ ์†Œ๊ฐœ
Mongodb2.2์™€ 2.4์˜ ์‹  ๊ธฐ๋Šฅ ์†Œ๊ฐœMongodb2.2์™€ 2.4์˜ ์‹  ๊ธฐ๋Šฅ ์†Œ๊ฐœ
Mongodb2.2์™€ 2.4์˜ ์‹  ๊ธฐ๋Šฅ ์†Œ๊ฐœํฅ๋ฐฐ ์ตœ
ย 
Osc4.x installation v1-upload
Osc4.x installation v1-uploadOsc4.x installation v1-upload
Osc4.x installation v1-uploadDong-Hwa jung
ย 

Similar to Ibatis (20)

#33.์Šคํ”„๋งํ”„๋ ˆ์ž„์›Œํฌ & ๋งˆ์ด๋ฐ”ํ‹ฐ์Šค (Spring Framework, MyBatis)_์Šคํ”„๋งํ”„๋ ˆ์ž„์›Œํฌ ๊ฐ•์ขŒ, ์žฌ์ง์žํ™˜๊ธ‰๊ต์œก,์‹ค์—…์ž๊ตญ๋น„์ง€์›...
#33.์Šคํ”„๋งํ”„๋ ˆ์ž„์›Œํฌ & ๋งˆ์ด๋ฐ”ํ‹ฐ์Šค (Spring Framework, MyBatis)_์Šคํ”„๋งํ”„๋ ˆ์ž„์›Œํฌ ๊ฐ•์ขŒ, ์žฌ์ง์žํ™˜๊ธ‰๊ต์œก,์‹ค์—…์ž๊ตญ๋น„์ง€์›...#33.์Šคํ”„๋งํ”„๋ ˆ์ž„์›Œํฌ & ๋งˆ์ด๋ฐ”ํ‹ฐ์Šค (Spring Framework, MyBatis)_์Šคํ”„๋งํ”„๋ ˆ์ž„์›Œํฌ ๊ฐ•์ขŒ, ์žฌ์ง์žํ™˜๊ธ‰๊ต์œก,์‹ค์—…์ž๊ตญ๋น„์ง€์›...
#33.์Šคํ”„๋งํ”„๋ ˆ์ž„์›Œํฌ & ๋งˆ์ด๋ฐ”ํ‹ฐ์Šค (Spring Framework, MyBatis)_์Šคํ”„๋งํ”„๋ ˆ์ž„์›Œํฌ ๊ฐ•์ขŒ, ์žฌ์ง์žํ™˜๊ธ‰๊ต์œก,์‹ค์—…์ž๊ตญ๋น„์ง€์›...
ย 
Tomcat monitoring using_javamelody
Tomcat monitoring using_javamelodyTomcat monitoring using_javamelody
Tomcat monitoring using_javamelody
ย 
(Spring Data JPA)๊ฒŒ์‹œํŒ ๋ฆฌ์ŠคํŠธ๋ณด๊ธฐ_์˜ค๋ผํด, ์Šคํ”„๋ง๋ถ€ํŠธ,ํŽ˜์ด์ง€๋‚˜๋ˆ„๊ธฐ
(Spring Data JPA)๊ฒŒ์‹œํŒ ๋ฆฌ์ŠคํŠธ๋ณด๊ธฐ_์˜ค๋ผํด, ์Šคํ”„๋ง๋ถ€ํŠธ,ํŽ˜์ด์ง€๋‚˜๋ˆ„๊ธฐ(Spring Data JPA)๊ฒŒ์‹œํŒ ๋ฆฌ์ŠคํŠธ๋ณด๊ธฐ_์˜ค๋ผํด, ์Šคํ”„๋ง๋ถ€ํŠธ,ํŽ˜์ด์ง€๋‚˜๋ˆ„๊ธฐ
(Spring Data JPA)๊ฒŒ์‹œํŒ ๋ฆฌ์ŠคํŠธ๋ณด๊ธฐ_์˜ค๋ผํด, ์Šคํ”„๋ง๋ถ€ํŠธ,ํŽ˜์ด์ง€๋‚˜๋ˆ„๊ธฐ
ย 
Json view ์˜ˆ์ œ ์„ค๋ช…
Json view ์˜ˆ์ œ ์„ค๋ช…Json view ์˜ˆ์ œ ์„ค๋ช…
Json view ์˜ˆ์ œ ์„ค๋ช…
ย 
Xml standard library selection v1.0 2013
Xml standard library selection v1.0 2013Xml standard library selection v1.0 2013
Xml standard library selection v1.0 2013
ย 
Jstl_GETCHA_HANJUNG
Jstl_GETCHA_HANJUNGJstl_GETCHA_HANJUNG
Jstl_GETCHA_HANJUNG
ย 
[์˜คํ”ˆ์†Œ์Šค์ปจ์„คํŒ…]Tomcat6&7 How To
[์˜คํ”ˆ์†Œ์Šค์ปจ์„คํŒ…]Tomcat6&7 How To[์˜คํ”ˆ์†Œ์Šค์ปจ์„คํŒ…]Tomcat6&7 How To
[์˜คํ”ˆ์†Œ์Šค์ปจ์„คํŒ…]Tomcat6&7 How To
ย 
Spark sql
Spark sqlSpark sql
Spark sql
ย 
[pgday.Seoul 2022] PostgreSQL๊ตฌ์กฐ - ์œค์„ฑ์žฌ
[pgday.Seoul 2022] PostgreSQL๊ตฌ์กฐ - ์œค์„ฑ์žฌ[pgday.Seoul 2022] PostgreSQL๊ตฌ์กฐ - ์œค์„ฑ์žฌ
[pgday.Seoul 2022] PostgreSQL๊ตฌ์กฐ - ์œค์„ฑ์žฌ
ย 
2.apache spark ์‹ค์Šต
2.apache spark ์‹ค์Šต2.apache spark ์‹ค์Šต
2.apache spark ์‹ค์Šต
ย 
์Šคํ”„๋ง๊ตฐ์‚ด์—†์ด์„ธํŒ…ํ•˜๊ธฐ(The way to setting the Spring framework for web.)
์Šคํ”„๋ง๊ตฐ์‚ด์—†์ด์„ธํŒ…ํ•˜๊ธฐ(The way to setting the Spring framework for web.)์Šคํ”„๋ง๊ตฐ์‚ด์—†์ด์„ธํŒ…ํ•˜๊ธฐ(The way to setting the Spring framework for web.)
์Šคํ”„๋ง๊ตฐ์‚ด์—†์ด์„ธํŒ…ํ•˜๊ธฐ(The way to setting the Spring framework for web.)
ย 
๋ฐ์ดํ„ฐ ๋ ˆ์ดํฌ ์•Œ์•„๋ณด๊ธฐ(Learn about Data Lake)
๋ฐ์ดํ„ฐ ๋ ˆ์ดํฌ ์•Œ์•„๋ณด๊ธฐ(Learn about Data Lake)๋ฐ์ดํ„ฐ ๋ ˆ์ดํฌ ์•Œ์•„๋ณด๊ธฐ(Learn about Data Lake)
๋ฐ์ดํ„ฐ ๋ ˆ์ดํฌ ์•Œ์•„๋ณด๊ธฐ(Learn about Data Lake)
ย 
์†์‰ฌ์šด ๋ฐ์ดํ„ฐ ์—ฐ๊ฒฐ ๋ฐฉ๋ฒ•(๋ผ์ด๋ธŒ๋ฐ”์ธ๋”ฉ ํ™œ์šฉ)
์†์‰ฌ์šด ๋ฐ์ดํ„ฐ ์—ฐ๊ฒฐ ๋ฐฉ๋ฒ•(๋ผ์ด๋ธŒ๋ฐ”์ธ๋”ฉ ํ™œ์šฉ)์†์‰ฌ์šด ๋ฐ์ดํ„ฐ ์—ฐ๊ฒฐ ๋ฐฉ๋ฒ•(๋ผ์ด๋ธŒ๋ฐ”์ธ๋”ฉ ํ™œ์šฉ)
์†์‰ฌ์šด ๋ฐ์ดํ„ฐ ์—ฐ๊ฒฐ ๋ฐฉ๋ฒ•(๋ผ์ด๋ธŒ๋ฐ”์ธ๋”ฉ ํ™œ์šฉ)
ย 
Apache Spark
Apache SparkApache Spark
Apache Spark
ย 
N02 gae v1.1_20110220
N02 gae v1.1_20110220N02 gae v1.1_20110220
N02 gae v1.1_20110220
ย 
Oracle History #9
Oracle History #9Oracle History #9
Oracle History #9
ย 
07.์‹คํ–‰ํ™˜๊ฒฝ ๊ต์œก๊ต์žฌ(ํ‘œ์ค€ํ”„๋ ˆ์ž„์›Œํฌ ์„ธ๋ถ€ ์ ์šฉ๊ธฐ์ค€)
07.์‹คํ–‰ํ™˜๊ฒฝ ๊ต์œก๊ต์žฌ(ํ‘œ์ค€ํ”„๋ ˆ์ž„์›Œํฌ ์„ธ๋ถ€ ์ ์šฉ๊ธฐ์ค€)07.์‹คํ–‰ํ™˜๊ฒฝ ๊ต์œก๊ต์žฌ(ํ‘œ์ค€ํ”„๋ ˆ์ž„์›Œํฌ ์„ธ๋ถ€ ์ ์šฉ๊ธฐ์ค€)
07.์‹คํ–‰ํ™˜๊ฒฝ ๊ต์œก๊ต์žฌ(ํ‘œ์ค€ํ”„๋ ˆ์ž„์›Œํฌ ์„ธ๋ถ€ ์ ์šฉ๊ธฐ์ค€)
ย 
How to build a web server on Linux.
How to build a web server on Linux.How to build a web server on Linux.
How to build a web server on Linux.
ย 
Mongodb2.2์™€ 2.4์˜ ์‹  ๊ธฐ๋Šฅ ์†Œ๊ฐœ
Mongodb2.2์™€ 2.4์˜ ์‹  ๊ธฐ๋Šฅ ์†Œ๊ฐœMongodb2.2์™€ 2.4์˜ ์‹  ๊ธฐ๋Šฅ ์†Œ๊ฐœ
Mongodb2.2์™€ 2.4์˜ ์‹  ๊ธฐ๋Šฅ ์†Œ๊ฐœ
ย 
Osc4.x installation v1-upload
Osc4.x installation v1-uploadOsc4.x installation v1-upload
Osc4.x installation v1-upload
ย 

Ibatis

  • 1. Data Mapper (a.k.a SQL Maps) Version 2.0 ๊ฐœ๋ฐœ์ž ๊ฐ€์ด๋“œ 2006๋…„ 3์›” 11์ผ ๋ฒˆ์—ญ : ์ด๋™๊ตญ(fromm0@gmail.com) ์˜คํƒ€ ๋ฐ ์˜ค์—ญ์€ ์œ„ ๋ฉ”์ผ์ฃผ์†Œ๋กœ ๋ณด๋‚ด์ฃผ์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค. 1
  • 2. ์†Œ๊ฐœ iBATIS Data Mapper ํ”„๋ ˆ์ž„์›Œํฌ๋Š” ๋‹น์‹ ์ด ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ ‘๊ทผํ•  ๋•Œ ํ•„์š”ํ•œ ์ž๋ฐ”์ฝ”๋“œ๋ฅผ ํ˜„์ €ํ•˜๊ฒŒ ์ค„์ผ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ค„๊ฒƒ์ด๋‹ค. iBATIS๋Š” ๊ฐ„๋‹จํ•œ XML์„œ์ˆ ์ž๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๊ฐ„๋‹จํ•˜๊ฒŒ ์ž๋ฐ”๋นˆ์ฆˆ๋ฅผ SQL statement์— ๋งตํ•‘์‹œํ‚จ๋‹ค. ๊ฐ„๋‹จํ•จ (Simplicity)์ด๋ž€ ๋‹ค๋ฅธ ํ”„๋ ˆ์ž„์›Œํฌ์™€ ๊ฐ์ฒด๊ด€๊ณ„๋งตํ•‘ํˆด์— ๋น„ํ•ด iBATIS์˜ ๊ฐ€์žฅ ํฐ ์žฅ์ ์ด๋‹ค. iBATIS Data Mapper๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ ๋‹น์‹ ์€ ์ž๋ฐ”๋นˆ์ฆˆ์™€ XML ๊ทธ๋ฆฌ๊ณ  SQL์— ์นœ์ˆ™ํ•  ํ•„์š”๊ฐ€ ์žˆ๋‹ค. ์—ฌ๊ธฐ์—” ๋ฐฐ์›Œ์•ผ ํ• ๊ฒƒ๋„ ๊ฑฐ์˜ ์—†๊ณ  ํ…Œ์ด๋ธ”์„ ์กฐ์ธํ•˜๊ฑฐ๋‚˜ ๋ณต ์žกํ•œ ์ฟผ๋ฆฌ๋ฌธ์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•œ ๋ณต์žกํ•œ ์Šคํ‚ค๋งˆ๋„ ์—†๋‹ค. Data Mapper๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋‹น์‹ ์€ ์‹ค์ œ SQL๋ฌธ์˜ ๋ชจ๋“  ๊ธฐ๋Šฅ์„ ๊ฐ€ ์งˆ์ˆ˜ ์žˆ๋‹ค. Data Mapper (com.ibatis.sqlmap.*) ๊ฐœ๋… iBATIS Data Mapper API๋Š” ํ”„๋กœ๊ทธ๋ž˜๋จธ์—๊ฒŒ ์ž๋ฐ”๋นˆ์ฆˆ ๊ฐ์ฒด๋ฅผ PreparedStatementํŒŒ๋ผ๋ฏธํ„ฐ์™€ ResultSets์œผ๋กœ ์‰ฝ๊ฒŒ ๋งตํ•‘ํ• ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค. Data Mapper์˜ ๊ธฐ๋ณธ์ ์ธ ์ƒ๊ฐ์€ ๊ฐ„๋‹จํ•จ(simple)์ด๋‹ค. ์ด๋Š” ์ž๋ฐ”์ฝ”๋“œ์˜ 20%๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ JDBC๊ธฐ๋Šฅ์˜ 80%๋ฅผ ์ œ๊ณตํ•˜๋Š” ๊ฐ„๋‹จํ•œ ํ”„๋ ˆ์ž„์›Œํฌ๋ผ๋Š” ๋œป์ด๋‹ค. ์ด๊ฒƒ์€ ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋Š”๊ฐ€.? Data Mapper๋Š” ์ž๋ฐ”๋นˆ์ฆˆ, Map๊ตฌํ˜„, ์›์‹œ๋ž˜ํผํƒ€์ž…(String, Integerโ€ฆ) ๊ทธ๋ฆฌ๊ณ  SQL๋ฌธ์„ ์œ„ํ•œ XML๋ฌธ์„œ๋ฅผ ๋งตํ•‘ํ•˜๊ธฐ ์œ„ ํ•œ XML์„œ์ˆ ์ž๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋งค์šฐ ๊ฐ„๋‹จํ•œ ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์ œ๊ณตํ•œ๋‹ค. ๋‹ค์Œ์€ ์ƒ๋ช…์ฃผ๊ธฐ์— ๋Œ€ํ•œ ๋†’์€ ๋ ˆ๋ฒจ์˜ ์„œ์ˆ ์ด๋‹ค. 1) ํŒŒ๋ผ๋ฏธํ„ฐ(์ž๋ฐ”๋นˆ์ฆˆ, Map ๋˜๋Š” ์›์‹œ๋ž˜ํผ)๋กœ์จ ๊ฐ์ฒด๋ฅผ ์ œ๊ณตํ•œ๋‹ค. ํŒŒ๋ผ๋ฏธํ„ฐ ๊ฐ์ฒด๋Š” update๋ฌธ๋‚ด์— ์ž…๋ ฅ๊ฐ’์„ ์…‹ํŒ…ํ•˜ ๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๊ฑฐ๋‚˜ ์ฟผ๋ฆฌ๋ฌธ์˜ where์ ˆ์„ ์…‹ํŒ…ํ•˜๊ธฐ ์œ„ํ•ด์„œ ์‚ฌ์šฉ๋œ๋‹ค. 2) ๋งตํ•‘๋œ statement์„ ์‹คํ–‰ํ•œ๋‹ค. ์ด ๋‹จ๊ณ„๋Š” ๋งˆ๋ฒ•์ด ์ผ์–ด๋‚˜๋Š”๊ณณ์ด๋‹ค. Data Mapperํ”„๋ ˆ์ž„์›Œํฌ๋Š” PreparedStatement ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ• ๊ฒƒ์ด๊ณ  ์ œ๊ณต๋œ ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•ด์„œ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์…‹ํŒ…ํ•œ๋‹ค. ๊ทธ๋ฆฌ ๊ณ  statement๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ResultSet์œผ๋กœ๋ถ€ํ„ฐ ๊ฒฐ๊ณผ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•œ๋‹ค. 3) update์˜ ๊ฒฝ์šฐ์— ์˜ํ–ฅ์„ ๋ฏธ์นœ rows์˜ ์ˆซ์ž๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ์กฐํšŒ๋ฌธ์ผ๊ฒฝ์šฐ์— ํ•œ ๊ฐœ(single)์˜ ๊ฐ์ฒด ๋˜๋Š” ์ปฌ๋ ‰์…˜ ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ํŒŒ๋ผ๋ฏธํ„ฐ์ฒ˜๋Ÿผ ๊ฒฐ๊ณผ ๊ฐ์ฒด๋Š” ์ž๋ฐ”๋นˆ์ฆˆ, Map ์›์‹œํƒ€์ž…๋ž˜ํผ๋˜๋Š” XML์ด ๋ ์ˆ˜ ์žˆ๋‹ค. ๋ฐ‘์˜ ๋‹ค์ด์–ด๊ทธ๋žจ์€ ์„œ์ˆ ๋œ ๊ฒƒ์„ ์„ค๋ช…ํ•œ๋‹ค. 2
  • 3. ์„ค์น˜ iBATIS Data Mapper ํ”„๋ ˆ์ž„์›Œํฌ ์„ค์น˜๋Š” ๊ฐ„๋‹จํ•˜๊ฒŒ ํด๋ž˜์ŠคํŒจ์Šค์— ํ•„์š”ํ•œ JARํŒŒ์ผ์„ ๋‘๋ฉด ๋œ๋‹ค. ์ด๊ฒƒ์€ JVM์‹œ์ž‘์‹œ ์ •์˜๋œ ํด ๋ž˜์ŠคํŒจ์Šค์— ๋‘๊ฑฐ๋‚˜ ์›น์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ /WEB-INF/lib์— ๋‘˜์ˆ˜๋„ ์žˆ๋‹ค. ์ž๋ฐ” ํด๋ž˜์ŠคํŒจ์Šค์— ๋Œ€ํ•ด์„œ๋Š” ๋‹ค์Œ์˜ ์ž์›์„ ์ฐธ์กฐํ•˜๋ผ. http://java.sun.com/j2se/1.4/docs/tooldocs/win32/classpath.html http://java.sun.com/j2se/1.4.2/docs/api/java/lang/ClassLoader.html http://java.sun.com/j2se/1.4.2/docs/ iBATIS๋Š” ๋‹ค์Œ์˜ JARํŒŒ์ผ์„ ๊ฐ€์ง„๋‹ค. ํŒŒ์ผ๋ช… ์ƒ์„ธ์„ค๋ช… ํ•„์ˆ˜์—ฌ๋ถ€ ibatis-common.jar iBATIS Common Utilities YES ibatis-sqlmap.jar iBATIS Data Mapper Framework YES ibatis-dao.jar iBATIS Data Access Objects NO Framework. JAR ํŒŒ์ผ๊ณผ ์˜์กด์„ฑ ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ๋„ˆ๋ฌด ๋งŽ์€ ์˜์กด์„ฑ์„ ๊ฐ€์ง„๋‹ค๋ฉด ์ด๊ฒƒ์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด๋‚˜ ๋‹ค๋ฅธ ํ”„๋ ˆ์ž„์›Œํฌ์— ํ†ตํ•ฉ๋˜๊ธฐ ํž˜๋“ค๊ฒŒ ๋งŒ๋“ ๋‹ค. 2.0์˜ ์ค‘ ์š”ํ•œ ํ•ต์‹ฌ์‚ฌํ•ญ์€ ์˜์กด์„ฑ๊ด€๋ฆฌ์™€ ์ œ๊ฑฐ์˜ ์ค‘์ ์„ ๋‘์—ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ ๋งŒ์•ฝ ๋‹น์‹ ์ด jdk1.4๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ์‹ค์ œ ์˜์กด์ ์ธ ๊ฒƒ์€ Jakarta Commons Logging ํ”„๋ ˆ์ž„์›Œํฌ๋ฟ์ด๋‹ค. ์ด ์ถ”๊ฐ€์ ์ธ JARํŒŒ์ผ์€ ๋ฐฐํฌํŒ์˜ /lib/optional๋””๋ ‰ํ† ๋ฆฌ์—์„œ ์ฐพ์„์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋“ค ์€ ๊ธฐ๋Šฅ์— ์˜ํ•ด ๋ถ„๋ฅ˜๋œ๋‹ค. ๋‹ค์Œ์€ ์ถ”๊ฐ€์ ์ธ ํŒจํ‚ค์ง€๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ํ•„์š”ํ•œ ๊ฒƒ๋“ค์˜ ๋ชฉ๋ก์ด๋‹ค. Description When to Use Directories JDBC 2.0 Extensions http://java.sun.com/products/jdbc/download.html ๋งŒ์•ฝ์— ๋‹น์‹ ์ด JDK1.4๋ณด๋‹ค ํ•˜์œ„ ๋ฒ„์ „์„ ์‚ฌ Legacy JDK ์šฉํ•˜๊ณ  ๋‹น์‹ ์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„œ๋ฒ„๊ฐ€ ์ด๋Ÿฐ JTA 1.0.1a http://java.sun.com/products/jta/ Support JARํŒŒ์ผ์„ ์ œ๊ณตํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด ๋‹น์‹ ์€ ์ด๋Ÿฐ Xerces 2.4.0 ์˜ต์…˜ ํŒจํ‚ค์ง€๊ฐ€ ํ•„์š”ํ• ๊ฒƒ์ด๋‹ค. http://xml.apache.org/xerces2-j/ ๋‹น์‹ ์ด iBATIS์˜ ์˜ˆ์ „๋ฒ„์ „ DAO(1.x)ํ”„๋ ˆ iBATIS DAO 1.3.1 ์ž„์›Œํฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๊ฑฐ๋‚˜ SQL Maps(1.x) http://sourceforge.net/projects/ibatisdb/ iBATIS Backward ์˜ ์˜ˆ์ „๋ฒ„์ „์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค๋ฉด ์ด ๋””๋ ‰ํ†  Compatibility ๋ฆฌ์˜ JARํŒŒ์ผ์„ ๊ฐ„๋‹จํ•˜ ํฌํ•จ์‹œํ‚ด์œผ๋กœ์จ ๊ณ„ ์† ์ž‘์—…์„ ํ• ์ˆ˜ ์žˆ๋‹ค. Runtime ๋งŒ์•ฝ ๋‹น์‹ ์ด ๋Šฆ์€(lazy) ๋กœ๋”ฉ๊ณผ ์„ฑ๋Šฅ์— ๋Œ€ CGLIB 2.0 Bytecode ํ•ด ๊ณ ๋ คํ•˜๊ธฐ ์œ„ํ•œ CGLIB2.0 bytecode ๊ฐœ์„  http://cglib.sf.net Enhancement ์„ ์‚ฌ์šฉํ•˜๊ธธ ์›ํ•œ๋‹ค๋ฉด DataSource ๋‹น์‹ ์ด Jakarta DBCP Connection pool์„ DBCP 1.1 Implementation ์‚ฌ์šฉํ•˜๊ธธ ์›ํ•œ๋‹ค๋ฉด http://jakarta.apache.org/commons/dbcp/ Distributed ์ค‘์•™์ง‘์ค‘์ ์ด๊ฑฐ๋‚˜ ๋ถ„์‚ฐ ์บ์Š ์ง€์›์„ ์œ„ํ•œ OSCache 2.0.1 Caching OSCache๋ฅผ ์‚ฌ์šฉํ•˜๊ธธ ์›ํ•œ๋‹ค๋ฉด http://www.opensymphony.com/oscache/ Logging Solution Log4J ๋กœ๊น…์„ ์‚ฌ์šฉํ•˜๊ธธ ์›ํ•œ๋‹ค๋ฉด Log4J 1.2.8 http://logging.apache.org/log4j/docs/ 1.x ์—์„œ ์—…๊ทธ๋ ˆ์ด๋“œํ•˜๊ธฐ ๋‹น์‹ ์€ ์—…๊ทธ๋ ˆ์ด๋“œ ํ• ๊ฒƒ์ธ๊ฐ€.? ๋งŒ์•ฝ ๋‹น์‹ ์ด ์—…๊ทธ๋ ˆ์ด๋“œ๋ฅผ ์‹œ๋„ํ•œ๋‹ค๋ฉด ๊ฒฐ์ •ํ• ์ˆ˜ ์žˆ๋Š” ๊ฐ€์žฅ ์ข‹์€ ๋ฐฉ๋ฒ•์ด๋‹ค. ์—ฌ๊ธฐ์— ๋ช‡๊ฐ€์ง€ ์—…๊ทธ๋ ˆ์ด๋“œ ์ ˆ์ฐจ๊ฐ€ ์žˆ๋‹ค. 3
  • 4. 1. ๋ฒ„์ „ 2.0์€ 1.x๋ฆด๋ฆฌ์ฆˆ์™€ ๊ฑฐ์˜ ์™„๋ฒฝํ•œ ํ˜ธ์™„์„ฑ์„ ๊ฐ€์ง€๋„๋ก ์œ ์ง€๋˜์—ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋ช‡๋ช‡ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ๋Š” ๋‹จ์ˆœํžˆ JARํŒŒ์ผ๋งŒ ๊ต์ฒดํ•˜๋Š”๊ฒƒ์œผ๋กœ ์ถฉ๋ถ„ํ•  ๊ฒƒ์ด๋‹ค. ์ด๊ฒƒ์€ ์ตœ์†Œํ•œ์˜ ์ด๋“์„ ๋ฐœ์ƒ์‹œํ‚ค์ง€๋งŒ ๊ฐ€์žฅ ๊ฐ„๋‹จํ•˜๋‹ค. ๋‹น์‹ ์€ ๋‹น์‹ ์˜ XMLํŒŒ์ผ์ด๋‚˜ ์ž๋ฐ”์ฝ”๋“œ๋ฅผ ๋ณ€๊ฒฝํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค. ๋ช‡๋ช‡ ๋ชจ์ˆœ๋˜๋Š”๊ฒƒ๋“ค์ด ๋ฐœ๊ฒฌ๋ ์ง€๋„ ๋ชจ๋ฅธ๋‹ค. 2. ๋‘๋ฒˆ์งธ๋Š” ๋‹น์‹ ์˜ XMLํŒŒ์ผ์„ 2.0์ŠคํŽ™์— ์ ํ•ฉํ•˜๋„๋ก ๋ณ€๊ฒฝํ•˜๋Š”๊ฒƒ์ด๋‹ค. ํ•˜์ง€๋งŒ ์ด๋Š” 1.x ์ž๋ฐ” API๋ฅผ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•œ๋‹ค. ์ ์€ ํ˜ธํ™˜์„ฑ์ด์Šˆ๋‚ด ์•ˆ์ „ํ•œ ํ•ด๊ฒฐ๋ฒ•์€ ๋งตํ•‘ํŒŒ์ผ ์‚ฌ์ด์— ๋ฐœ์ƒํ•œ๋‹ค. Ant์ž‘์—…์€ ๋‹น์‹ ์„ ์œ„ํ•ด XMLํŒŒ์ผ์„ ๋ณ€ํ™˜ํ•˜๊ธฐ ์œ„ํ•ด์„œ ํ”„๋ ˆ์ž„์›Œํฌ์— ํฌํ•จ๋œ๋‹ค. 3. ์„ธ๋ฒˆ์งธ ์˜ต์…˜์€ ๋‹น์‹ ์˜ XMLํŒŒ์ผ๊ณผ ์ž๋ฐ”์ฝ”๋“œ๋ฅผ ๋ณ€ํ™˜ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ์ž๋ฐ”์ฝ”๋“œ๋ฅผ ๋ณ€ํ™˜ํ•˜๊ธฐ ์œ„ํ•œ ํˆด์€ ์—†๋‹ค. ๊ทธ๋ž˜์„œ ์ด๊ฒƒ ์€ ์†์œผ๋กœ ์ง์ ‘ํ•ด์•ผ ํ•œ๋‹ค. 4. ๋งˆ์ง€๋ง‰ ์˜ต์…˜์€ ์ „์ฒด๋ฅผ ์—…๊ทธ๋ ˆ์ด๋“œ ํ•˜์ง€ ์•Š๋Š”๊ฒƒ์ด๋‹ค. ๋งŒ์•ฝ์— ๋‹น์‹ ์ด ์–ด๋ ต๋‹ค๊ณ  ๋Š๋‚€๋‹ค๋ฉด 1.x๋ฆด๋ฆฌ์ฆˆ์—์„œ ์‹œ์Šคํ…œ์ด ์ž‘ ๋™ํ•˜๋Š” ๊ฒƒ์„ ๋‘๋ ค์›Œํ•˜์ง€ ๋งˆ๋ผ. ๋‹น์‹ ์˜ ์˜ค๋ž˜๋œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ทธ๋Œ€๋กœ ๋†”๋‘๋Š” ๊ฒƒ์€ ๋‚˜์œ ์ƒ๊ฐ์ด ์•„๋‹ˆ๋‹ค. ๋งŒ์•ฝ์— ์˜ค๋ž˜ ๋œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์ธ์‹์ ์ธ ๋ฉด์—์„œ ์ œ๋Œ€๋กœ ๋ฆฌํŒฉํ† ๋ง๋˜์–ด ์žˆ๋‹ค๋ฉด ๋‹น์‹ ์€ SQL Maps๋ฅผ ์—…๊ทธ๋ ˆ์ด๋“œ ์ž˜ ํ• ์ˆ˜ ์žˆ์„๊ฒƒ์ด ๋‹ค. 1.x์—์„œ 2.x์œผ๋กœ XML์„ค์ •ํŒŒ์ผ ๋ณ€ํ™˜ํ•˜๊ธฐ 2.0ํ”„๋ ˆ์ž„์›Œํฌ๋Š” Ant๋นŒ๋“œ์‹œ์Šคํ…œ์„ ํ†ตํ•ด ์ˆ˜ํ–‰๋˜๋Š” XML๋ฌธ์„œ ๋ณ€ํ™˜๊ธฐ๋ฅผ ํฌํ•จํ•œ๋‹ค. ๋‹น์‹ ์˜ XML๋ฌธ์„œ๋ฅผ ๋ณ€ํ™˜ํ•˜๋Š” ๊ฒƒ์€ 1.x์ฝ”๋“œ๊ฐ€ ์ž‘๋™์ค‘์— ์ž๋™์œผ๋กœ ์˜ค๋ž˜๋œ XMLํŒŒ์ผ์„ ๋ณ€ํ™˜ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ์˜ต์…˜์ ์ด๋‹ค. ์—ฌ์ „ํžˆ ๋‹น์‹ ์ด ์—…๊ทธ๋ ˆ์ด๋“œ๋ฅผ ํ•จ์œผ๋กœ์จ ํŽธ์•ˆํ•˜๊ฒŒ ๋‹น์‹ ์˜ ํŒŒ์ผ์„ ๋ณ€ํ™˜ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์€ ์ƒ๊ฐ์ด๋‹ค. ๋‹น์‹ ์€ ๋‹ค์†Œ ์ ์€ ํ˜ธํ™˜์ ์ธ ์ด์Šˆ๋ฅผ ๊ฒฝํ—˜ํ• ๊ฒƒ์ด๊ณ  ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์ค‘ ๋ช‡ ๊ฐœ์˜ ์žฅ์ ์„ ์–ป์„์ˆ˜ ์žˆ์„๊ฒƒ์ด๋‹ค(๋น„๋ก ๋‹น์‹ ์ด 1.x์ž๋ฐ” API์„ ์‚ฌ์šฉํ•˜๋”๋ผ๋„.). Ant์ž‘์—…์€ ๋‹น์‹ ์˜ build.xmlํŒŒ์ผ๋‚ด์— ๋‹ค์Œ๊ณผ ๋น„์Šทํ•˜๊ฒŒ ๋ณด์ผ๊ฒƒ์ด๋‹ค. <taskdef name="convertSqlMaps" classname="com.ibatis.db.sqlmap.upgrade.ConvertTask" classpathref="classpath"/> <target name="convert"> <convertSqlMaps todir="D:/targetDirectory/" overwrite="true"> <fileset dir="D/sourceDirectory/"> <include name="**/maps/*.xml"/> </fileset> </convertSqlMaps> </target> ๋‹น์‹ ์ด ๋ณด๋Š”๊ฒƒ์ฒ˜๋Ÿผ ์ด๊ฒƒ์€ Ant ๋ณต์‚ฌ ์ž‘์—…๊ณผ ๊ฑฐ์˜ ๊ฐ™๊ณ  ์‚ฌ์‹ค ์ด๊ฒƒ์€ Ant๋ณต์‚ฌ ์ž‘์—…์„ ํ™•์žฅํ•œ๊ฒƒ์ด๋‹ค. ๊ทธ๋ž˜์„œ ๋‹น์‹ ์€ ๋ณต์‚ฌํ•˜๋Š” ์ž‘์—…์„ ํ•˜๋Š” ์–ด๋–ค๊ฒƒ๋„ ํ•  ์ˆ˜ ์žˆ๋‹ค. JAR ํŒŒ์ผ๋“ค: ์˜ˆ์ „๊ฒƒ์„ ๋นผ๋‚ด๊ณ  ์ƒˆ๊ฒƒ์„ ๋„ฃ์ž. ์—…๊ทธ๋ ˆ์ด๋“œ๋ฅผ ํ•  ๋•Œ ์กด์žฌํ•˜๋Š”(์˜ˆ์ „์˜) iBATISํŒŒ์ผ๊ณผ ์˜์กด์ ์ธ ๊ฒƒ๋“ค์„ ๋ชจ๋‘ ์ง€์šฐ๊ณ  ์ƒˆ ํŒŒ์ผ์„ ๋Œ€์ฒดํ•˜๋Š”๊ฒƒ์ด ์ข‹์€ ์ƒ๊ฐ์ด๋‹ค. ์—ฌ์ „ํžˆ ํ•„์š”ํ•œ ๋‹น์‹ ์˜ ๋‹ค๋ฅธ ์ปดํฌ๋„ŒํŠธ๋˜๋Š” ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ๋ชจ๋‘ ์ง€์šฐ์ง€ ์•Š๋„๋ก ์ฃผ์˜ํ•ด๋ผ. JARํŒŒ์ผ์˜ ๋Œ€๋ถ€๋ถ„์€ ๋‹น์‹  ํ™˜๊ฒฝ์— ์˜์กด์ ์ด๋‹ค. JARํŒŒ์ผ๊ณผ ์˜์กด์ ์ธ๊ฒƒ์— ๋Œ€ํ•ด์„œ๋Š” ์œ„์—์„œ ์„œ์ˆ ๋œ ๊ฒƒ์„ ๋ณด์•„๋ผ. ๋‹ค์Œ์˜ ํ…Œ์ด๋ธ”์€ ์˜ˆ์ „ ํŒŒ์ผ๊ณผ ์ƒˆ ํŒŒ์ผ์„ ๋ชฉ๋กํ™” ํ•œ๋‹ค. Old Files New Files 4
  • 5. ibatis-common.jar (ํ•„์ˆ˜) ibatis-db.jar ibatis-sqlmap.jar (ํ•„์ˆ˜) 1.2.9b ๋ฒ„์ „์—์„œ๋ถ€ํ„ฐ ์ด ํŒŒ์ผ์€ ๋‹ค์Œ์˜ 3๊ฐœ์˜ ํŒŒ์ผ๋กœ ibatis-dao.jar (DAOํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๊ฒƒ์— ๋”ฐ ๋ถ„๋ฆฌ๋˜์—ˆ๋‹ค. ๋ผ ์˜ต์…˜) ibatis-common.jar ibatis-dao.jar ibatis-sqlmap.jar commons-logging-1-0-3.jar (ํ•„์ˆ˜) commons-logging.jar commons-collections-2-1.jar (์˜ต์…˜) commons-logging-api.jar commons-dbcp-1-1.jar (์˜ต์…˜) commons-collections.jar commons-pool-1-1.jar (์˜ต์…˜) commons-dbcp.jar oscache-2-0-1.jar (์˜ต์…˜) commons-pool.jar jta-1-0-1a.jar (์˜ต์…˜) oscache.jar jdbc2_0-stdext.jar (์˜ต์…˜) jta.jar xercesImpl-2-4-0.jar (์˜ต์…˜) jdbc2_0-stdext.jar xmlParserAPIs-2-4-0.jar (์˜ต์…˜) xercesImpl.jar xalan-2-5-2.jar (์˜ต์…˜) xmlParserAPIs.jar log4j-1.2.8.jar (์˜ต์…˜) jdom.jar cglib-full-2-0-rc2.jar (์˜ต์…˜) ์ด ๊ฐ€์ด๋“œ์˜ ๋‚˜๋จธ์ง€๋Š” ๋‹น์‹ ์ด SQL Maps๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๊ฒƒ์— ๋Œ€ํ•ด ์†Œ๊ฐœํ• ๊ฒƒ์ด๋‹ค. SQL Map XML์„ค์ •ํŒŒ์ผ (http://ibatis.apache.org/dtd/sql-map-config-2.dtd) SQL Maps๋Š” ๋ฐ์ดํ„ฐ์†Œ์Šค, ๋ฐ์ดํ„ฐ ๋งตํผ์— ๋Œ€ํ•œ ์„ค์ •, ์“ฐ๋ ˆ๋“œ ๊ด€๋ฆฌ์™€ ๊ฐ™์€ SQL Maps์™€ ๋‹ค๋ฅธ ์˜ต์…˜์— ๋Œ€ํ•œ ์„ค์ •์„ ์ œ๊ณตํ•˜๋Š” ์ค‘ ์•™์ง‘์ค‘์ ์ธ XML์„ค์ • ํŒŒ์ผ์„ ์‚ฌ์šฉํ•ด์„œ ์„ค์ •๋œ๋‹ค. ๋‹ค์Œ์€ SQL Maps์„ค์ •ํŒŒ์ผ์˜ ์˜ˆ์ด๋‹ค. SqlMapConfig.xml <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE sqlMapConfig PUBLIC "-//ibatis.apache.org//DTD SQL Map Config 2.0//EN" "http://ibatis.apache.org/dtd/sql-map-config-2.dtd"> <!--๋‹ค์Œ์€ ์ •ํ™•ํ•œ XMLํ—ค๋”๋ฅผ ์œ„ํ•œ ํ•„์ˆ˜๊ฐ’์ด๋‹ค. --> <sqlMapConfig> <!--์—ฌ๊ธฐ์„œ ๋ช…์‹œ๋œ ํŒŒ์ผ๋‚ด ํ”„๋ผํผํ‹ฐ(name=value)๋Š” ์ด ์„ค์ •ํŒŒ์ผ๋‚ด ๊ณ ์ •์ž(placeholder)์— ์˜ํ•ด ์‚ฌ์šฉ๋ ์ˆ˜ ์žˆ๋‹ค. (์ด๋ฅผํ…Œ ๋ฉด. โ€œ${driver}โ€. ์ด ํŒŒ์ผ์€ ํด๋ž˜์ŠคํŒจ์Šค์— ์ƒ๋Œ€์ ์ด๊ณ  ์„ ํƒ์ ์ธ ์‚ฌํ•ญ์ด๋‹ค. --> <properties resource=" examples/sqlmap/maps/SqlMapConfigExample.properties " /> <!--์ด ์…‹ํŒ…์€ ๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์œผ๋กœ๋Š” ํŠธ๋žœ์žญ์…˜ ๊ด€๋ฆฌ๋ฅผ ํ•˜๋ฉฐ SqlMapClient์„ค์ • ์ƒ์„ธ๋ฅผ ์ œ์–ดํ•œ๋‹ค. ์ด๊ฒƒ๋“ค์€ ๋ชจ๋‘ ์„ ํƒ์ ์ด๋‹ค. --> <settings cacheModelsEnabled="true" enhancementEnabled="true" lazyLoadingEnabled="true" maxRequests="128" maxSessions="10" maxTransactions="5" useStatementNamespaces="false" /> 5
  • 6. <!--๊ธด ์ „์ฒด ๊ฒฝ๋กœ๋ฅผ ํฌํ•จํ•œ ํด๋ž˜์Šค๋ช…์„ ์œ„ํ•œ ์ข€๋” ์งง์€ ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ ๋ณ„์นญ์„ ํƒ€์ดํ•‘ํ•œ๋‹ค. --> <typeAlias alias="order" type="testdomain.Order"/> <!--SimpleDataSource ๋ฅผ ์ด์šฉํ•œ SQL Map๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ ๋ฐ์ดํ„ฐ์†Œ์Šค ์„ค์ •. ์œ„ ์ž์›์œผ๋กœ ๋ถ€ํ„ฐ ํ”„๋ผํผํ‹ฐ ์‚ฌ์šฉ์— ์ฃผ์˜ํ• . --> <transactionManager type="JDBC" > <dataSource type="SIMPLE"> <property name="JDBC.Driver" value="${driver}"/> <property name="JDBC.ConnectionURL" value="${url}"/> <property name="JDBC.Username" value="${username}"/> <property name="JDBC.Password" value="${password}"/> <property name="JDBC.DefaultAutoCommit" value="true" /> <property name="Pool.MaximumActiveConnections" value="10"/> <property name="Pool.MaximumIdleConnections" value="5"/> <property name="Pool.MaximumCheckoutTime" value="120000"/> <property name="Pool.TimeToWait" value="500"/> <property name="Pool.PingQuery" value="select 1 from ACCOUNT"/> <property name="Pool.PingEnabled" value="false"/> <property name="Pool.PingConnectionsOlderThan" value="1"/> <property name="Pool.PingConnectionsNotUsedFor" value="1"/> </dataSource> </transactionManager> <!--์ด SQL map์— ์˜ํ•ด ๋กœ๋“œ๋˜๋Š” ๋ชจ๋“  SQL MapํŒŒ์ผ์„ ์ธ์‹ํ•œ๋‹ค. ๊ฒฝ๋กœ๋Š” ํด๋ž˜์ŠคํŒจ์Šค์— ์ƒ๋Œ€์ ์ด๋‹ค. --> <sqlMap resource="examples/sqlmap/maps/Person.xml" /> </sqlMapConfig> ์ด ๋ฌธ์„œ์˜ ๋‹ค์Œ ๋ถ€๋ถ„์€ SQL Maps์„ค์ •ํŒŒ์ผ์˜ ๋‹ค์–‘ํ•œ ๋ถ€๋ถ„์„ ๋…ผ์˜ํ•œ๋‹ค. <properties> ์š”์†Œ SQL Maps์€ SQL Maps XML์„ค์ •ํŒŒ์ผ๊ณผ ํ•จ๊ป˜ ์†ํ•˜๋Š” ํ‘œ์ค€์ ์ธ ์ž๋ฐ” ์†์„ฑํŒŒ์ผ(name=value)์„ ์ง€์ •ํ•˜๋Š” ํ•˜๋‚˜์˜ <properties> ์š”์†Œ๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋ ‡๊ฒŒ ํ•จ์œผ๋กœ์จ ์†์„ฑํŒŒ์ผ๋‚ด์— ๊ฐ๊ฐ์˜ ์ด๋ฆ„์ง€์–ด์ง„ ๊ฐ’๋“ค์€ SQL Maps์„ค์ •ํŒŒ์ผ๋‚ด์— ์ฐธ์กฐ๋ ์ˆ˜ ์žˆ๋Š” ๋ณ€์ˆ˜ ๊ฐ€ ๋ ์ˆ˜ ์žˆ๊ณ  ๋ชจ๋“  SQL Maps๋Š” ๋‚ด๋ถ€์—์„œ ์ฐธ์กฐ๋œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด ์†์„ฑํŒŒ์ผ์ด ๋‹ค์Œ์„ ํฌํ•จํ•œ๋‹ค๋ฉด driver=org.hsqldb.jdbcDriver ๊ทธ๋Ÿฌ๋ฉด SQL Maps์„ค์ •ํŒŒ์ผ๋˜๋Š” ์„ค์ •๋ฌธ์„œ์— ์˜ํ•ด ์ฐธ์กฐ๋˜๋Š” ๊ฐ๊ฐ์˜ SQL Maps๋Š” ${driver} ํ˜•ํƒœ๋กœ ์‚ฌ์šฉ๊ฐ€๋Šฅํ•˜๊ณ  org.hsqldb.jdbcDriver๋ผ๋Š” ๊ฐ’์ด ์ฐธ์กฐ๋œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด <property name="JDBC.Driver" value="${driver}"/> ์ด๊ฒƒ์€ ๋นŒ๋“œ๋˜๊ฑฐ๋‚˜ ํ…Œ์ŠคํŠธ ๊ทธ๋ฆฌ๊ณ  ๋ฐฐ์น˜๋˜๋Š” ๋™์•ˆ ํŽธ๋ฆฌํ•˜๊ฒŒ ๋œ๋‹ค. ์ด๊ฒƒ์€ ๋‹ค์ค‘ ํ™˜๊ฒฝ์ด๋‚˜ ์„ค์ •ํŒŒ์ผ์„ ์œ„ํ•œ ์ž๋™ํ™”ํˆด์„ ์‚ฌ์šฉํ•˜ ๋Š” ๋‹น์‹ ์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‰ฝ๊ฒŒ ์ธ์‹ํ•˜๋„๋ก ํ•œ๋‹ค. ํ”„๋ผํผํ‹ฐ๋Š” ํด๋ž˜์ŠคํŒจ์Šค๋‚˜ ์–ด๋–ค ์œ ํšจํ•œ URL๋กœ๋ถ€ํ„ฐ ๋กœ๋“œ๋ ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค ๋ฉด ๊ณ ์ •๋œ ํŒŒ์ผ๊ฒฝ๋กœ๋ฅผ ์œ„ํ•ด ๋‹ค์Œ์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•œ๋‹ค. <properties url=โ€file:///c:/config/my.propertiesโ€ /> <settings> ์š”์†Œ <settings> ์š”์†Œ๋Š” XMLํŒŒ์ผ์„ ๋นŒ๋“œํ•˜๋Š” SqlMapClient ์ธ์Šคํ„ด์Šค๋ฅผ ์œ„ํ•ด ๋‹ค์–‘ํ•œ ์˜ต์…˜๊ณผ ์ตœ์ ํ™”๋ฅผ ์„ค์ •ํ•˜๋„๋ก ํ•œ๋‹ค. setting์š” ์†Œ์™€ ๊ทธ๊ฒƒ์˜ ๋ชจ๋“  ์†์„ฑ๊ฐ’์€ ๋ชจ๋‘ ์˜ต์…˜์ ์ด๋‹ค. ์ œ๊ณต๋˜๋Š” ์†์„ฑ๊ฐ’๊ณผ ๊ทธ๊ฒƒ๋“ค์˜ ๋‹ค์–‘ํ•œ ํ–‰์œ„๋Š” ๋‹ค์Œ์˜ ํ…Œ์ด๋ธ”์—์„œ ์„œ์ˆ ๋œ๋‹ค. maxRequests ์ด๊ฒƒ์€ ํ•œ๊บผ๋ฒˆ์— SQL๋ฌธ์„ ์ˆ˜ํ–‰ํ• ์ˆ˜ ์žˆ๋Š” ์“ฐ๋ ˆ๋“œ์˜ ์ˆ˜์ด๋‹ค. ์…‹ํŒ…๊ฐ’๋ณด๋‹ค ๋งŽ 6
  • 7. ์€ ์“ฐ๋ ˆ๋“œ๋Š” ๋‹ค๋ฅธ ์“ฐ๋ ˆ๋“œ๊ฐ€ ์ˆ˜ํ–‰์„ ์™„๋ฃŒํ• ๋•Œ๊นŒ์ง€ ๋ธ”๋ก๋œ๋‹ค. ๋‹ค๋ฅธ DBMS๋Š” ๋‹ค๋ฅธ ์ œํ•œ์„ ๊ฐ€์ง„๋‹ค. ์ด๊ฒƒ์€ ์ตœ์†Œํ•œ 10๊ฐœ์˜ maxTransactions์ด๊ณ  ์–ธ์ œ๋‚˜ maxSessions๊ณผ maxTransactions๋ณด๋‹ค ํฌ๋‹ค. ์ข…์ข… ๋™์‹œ์š”์ฒญ๊ฐ’์˜ ์ตœ๋Œ€์น˜๋ฅผ ์ค„์ด๋ฉด ์„ฑ๋Šฅํ–ฅ์ƒ์„ ๋ณด์—ฌ์ค€๋‹ค. ์˜ˆ: maxRequests=โ€256โ€ Default: 512 maxSessions ์ด๊ฒƒ์€ ์ฃผ์–ด์ง„ ์‹œ๊ฐ„๋™์•ˆ ํ™œ์„ฑ๋ ์ˆ˜ ์žˆ๋Š” ์„ธ์…˜์˜ ์ˆ˜์ด๋‹ค. ์„ธ์…˜์€ ๋ช…์‹œ์ ์œผ๋กœ ์ฃผ์–ด์งˆ์ˆ˜๋„ ์žˆ๊ณ  ํ”„๋กœ๊ทธ๋žจ์ ์œผ๋กœ ์š”์ฒญ๋ ์ˆ˜๋„ ์žˆ๊ณ  ์“ฐ๋ ˆ๋“œ๊ฐ€ SqlMapClient ์ธ์Šคํ„ด์Šค๋ฅผ ์‚ฌ์šฉํ• ๋•Œ๋งˆ๋‹ค ์ž๋™์ ์œผ๋กœ ์ƒ์„ฑ๋ ์ˆ˜๋„ ์žˆ๋‹ค. ์ด๊ฒƒ์€ ์–ธ์ œ๋‚˜ maxTransaction๋ณด๋‹ค ๊ฐ™๊ฑฐ๋‚˜ ์ปค์•ผ ํ•˜๊ณ  maxRequests๋ณด๋‹ค ์ž‘์•„์•ผ ํ•œ๋‹ค. ๋™ ์‹œ์„ธ์…˜๊ฐ’์˜ ์ตœ๋Œ€์น˜๋ฅผ ์ค„์ด๋ฉด ์ „์ฒด์ ์ธ ๋ฉ”๋ชจ๋ฆฌ์‚ฌ์šฉ๋Ÿ‰์„ ์ค„์ผ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ: maxSessions=โ€64โ€ Default: 128 maxTransactions ์ด๊ฒƒ์€ ํ•œ๊บผ๋ฒˆ์— SqlMapClient.startTransaction()์— ๋“ค์–ด๊ฐˆ์ˆ˜ ์žˆ๋Š” ์“ฐ๋ ˆ๋“œ ์˜ ์ตœ๋Œ€๊ฐฏ์ˆ˜์ด๋‹ค. ์…‹ํŒ…๊ฐ’๋ณด๋‹ค ๋งŽ์€ ์“ฐ๋ ˆ๋“œ๋Š” ๋‹ค๋ฅธ ์“ฐ๋ ˆ๋“œ๊ฐ€ ๋‚˜์˜ฌ๋•Œ๊นŒ์ง€ ๋ธ” ๋ก๋œ๋‹ค. ๋‹ค๋ฅธ DBMS๋Š” ๋‹ค๋ฅธ ์ œํ•œ์„ ๊ฐ€์ง„๋‹ค. ์ด ๊ฐ’์€ ์–ธ์ œ๋‚˜ maxSessions๋ณด ๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์•„์•ผ ํ•˜๊ณ  maxRequests๋ณด๋‹ค ์ž‘์•„์•ผ ํ•œ๋‹ค. ์ข…์ข… ๋™์‹œํŠธ๋žœ์žญ์…˜ ์˜ ์ตœ๋Œ€์น˜๋ฅผ ์ค„์ด๋ฉด ์„ฑ๋Šฅํ–ฅ์ƒ์„ ๋ณด์—ฌ์ค€๋‹ค. ์˜ˆ: maxTransactions=โ€16โ€ Default: 32 cacheModelsEnabled ์ด ์…‹ํŒ…์€ SqlMapClient ๋ฅผ ์œ„ํ•œ ๋ชจ๋“  ์บ์‰ฌ๋ชจ๋ธ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๊ฑฐ๋‚˜ ๊ฐ€๋Šฅํ•˜ ์ง€ ์•Š๊ฒŒ ํ•œ๋‹ค. ์ด๊ฒƒ์€ ๋””๋ฒ„๊น…์‹œ ๋„์›€์ด ๋œ๋‹ค. ์˜ˆ: cacheModelsEnabled=โ€trueโ€ Default: true (enabled) lazyLoadingEnabled ์ด ์…‹ํŒ…์€ SqlMapClient ๋ฅผ ์œ„ํ•œ ๋ชจ๋“  ๋Šฆ์€(lazy)๋กœ๋”ฉ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๊ฑฐ๋‚˜ ๊ฐ€ ๋Šฅํ•˜์ง€ ์•Š๊ฒŒ ํ•œ๋‹ค. ์ด๊ฒƒ์€ ๋””๋ฒ„๊น…์‹œ ๋„์›€์ด ๋œ๋‹ค. ์˜ˆ: lazyLoadingEnabled=โ€trueโ€ Default: true (enabled) enhancementEnabled ์ด ์…‹ํŒ…์€ ํ–ฅ์ƒ๋œ ๋Šฆ์€(lazy)๋กœ๋”ฉ์ฒ˜๋Ÿผ ์ตœ์ ํ™”๋œ ์ž๋ฐ”๋นˆ์ฆˆ ์†์„ฑ ์ ‘๊ทผ์„ ์œ„ ํ•ด ๋Ÿฐํƒ€์ž„์‹œ ๋ฐ”์ดํŠธ์ฝ”๋“œ ํ–ฅ์ƒ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•œ๋‹ค. ์˜ˆ: enhancementEnabled=โ€trueโ€ Default: false (disabled) useStatementNamespaces ์ด ์…‹ํŒ…์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๋ฉด ๋‹น์‹ ์€ sqlmap์ด๋ฆ„๊ณผ statement์ด๋ฆ„์œผ๋กœ ๊ตฌ์„ฑ๋œ ์ „์ฒด์ ์ธ ์ด๋ฆ„(fully qualified name)์œผ๋กœ ๋งตํ•‘๋œ statement๋ฅผ ์ฐธ์กฐํ•ด์•ผ ํ•œ ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด: queryForObject(โ€œsqlMapName.statementNameโ€); ์˜ˆ: useStatementNamespaces=โ€falseโ€ Default: false (disabled) <typeAlias> ์š”์†Œ 7
  • 8. typeAlias ์š”์†Œ๋Š” ๊ธด ์ „์ฒด ๊ฒฝ๋กœ๋ฅผ ํฌํ•จํ•œ ํด๋ž˜์Šค๋ช…์„ ์ฐธ์กฐํ•˜๊ธฐ ์œ„ํ•œ ์งง์€ ์ด๋ฆ„์„ ๋ช…์‹œํ•˜๋„๋ก ํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด <typeAlias alias="shortname" type="com.long.class.path.Class"/> SQL Maps์„ค์ • ํŒŒ์ผ์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๋ฏธ๋ฆฌ ์ •์˜๋œ ๋ช‡๋ช‡ alias๊ฐ€ ์žˆ๋‹ค. ๊ทธ๊ฒƒ๋“ค์€ Transaction Manager Aliases JDBC com.ibatis.sqlmap.engine.transaction.jdbc.JdbcTransactionConfig JTA com.ibatis.sqlmap.engine.transaction.jta.JtaTransactionConfig EXTERNAL com.ibatis.sqlmap.engine.transaction.external.ExternalTransactionConfig Data Source Factory Aliases SIMPLE com.ibatis.sqlmap.engine.datasource.SimpleDataSourceFactory DBCP com.ibatis.sqlmap.engine.datasource.DbcpDataSourceFactory JNDI com.ibatis.sqlmap.engine.datasource.JndiDataSourceFactory <transactionManager> ์š”์†Œ 1.0 ๋ณ€ํ™˜๋…ธํŠธ: SQL Maps 1.0์€ ๋‹ค์ค‘์˜ ๋ฐ์ดํ„ฐ์†Œ์Šค ์„ค์ •์„ ํ—ˆ๋ฝํ–ˆ๋‹ค. ์ด๊ฒƒ์€ ๋‹ค๋ฃจ๊ธฐ ์–ด๋ ต๊ณ  ๋ช‡๊ฐ€์ง€ ๋‚˜์œ ์˜ˆ์ œ๋ฅผ ์†Œ๊ฐœํ–ˆ๋‹ค. ๊ทธ ๋Ÿฌ๋ฏ€๋กœ 2.0์—์„œ๋Š” ์˜ค์ง ํ•˜๋‚˜์˜ ๋ฐ์ดํ„ฐ์†Œ์Šค๋งŒ์„ ํ—ˆ๋ฝํ•œ๋‹ค. ๋‹ค์ค‘์˜ ๋ฐฐ์น˜/์„ค์ •์„ ์œ„ํ•ด์„œ๋Š” ์‹œ์Šคํ…œ์— ์˜ํ•ด ๋‹ค๋ฅด๊ฒŒ ์„ค์ •๋˜๊ฑฐ๋‚˜ SQL Maps๋ฅผ ๋นŒ๋“œํ•  ๋•Œ ํŒŒ๋ผ๋ฏธํ„ฐ์ฒ˜๋Ÿผ ์ „๋‹ฌ๋˜๋Š” ๋‹ค์ค‘์†์„ฑํŒŒ์ผ์ด ์ถ”์ฒœ๋œ๋‹ค. <transactionManager> ์š”์†Œ๋Š” ๋‹น์‹ ์ด SQL Maps๋ฅผ ์œ„ํ•œ ํŠธ๋žœ์žญ์…˜ ๊ด€๋ฆฌ๋ฅผ ์„ค์ •ํ•˜๋„๋ก ํ•œ๋‹ค. type ์†์„ฑ๊ฐ’์€ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ ํŠธ๋žœ์žญ์…˜ ๊ด€๋ฆฌ์ž๋ฅผ ํ‘œ์‹œํ•œ๋‹ค. ๊ทธ ๊ฐ’์€ ํด๋ž˜์Šค๋ช…์ด๊ฑฐ๋‚˜ ํƒ€์ž… alias์ผ์ˆ˜ ์žˆ๋‹ค. 3๊ฐœ์˜ ํŠธ๋žœ์žญ์…˜ ๊ด€๋ฆฌ์ž๋Š” JDBC, JTA ๊ทธ๋ฆฌ๊ณ  EXTERNAL ์ค‘์— ํ•˜๋‚˜๋กœ ํ‘œ์‹œํ• ์ˆ˜ ์žˆ๋‹ค. JDBC โ€“ Connection commit()๊ณผ rollback()๋ฉ”์†Œ๋“œ๋ฅผ ํ†ตํ•ด ํŠธ๋žœ์žญ์…˜๋ฅผ ์ œ์–ดํ•˜๊ธฐ ์œ„ํ•œ JDBC๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋œ๋‹ค. JTA โ€“ ์ด ํŠธ๋žœ์žญ์…˜๊ด€๋ฆฌ์ž๋Š” SQL Maps๊ฐ€ ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋‚˜ ํŠธ๋žœ์žญ์…˜ ์ž์›์„ ํฌํ•จํ•˜๋Š” ๋”์šฑ๋” ๋„“์€ ๋ฒ”์œ„์˜ ํŠธ๋žœ ์žญ์…˜์„ ํฌํ•จํ•˜๋„๋ก ํ•˜๋Š” JTA์ „์—ญํŠธ๋žœ์žญ์…˜๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ์ด ์„ค์ •์€ JNDI์ž์›์œผ๋กœ๋ถ€ํ„ฐ ์‚ฌ์šฉ์ž ํŠธ๋žœ์žญ์…˜์„ ์œ„์น˜์‹œํ‚ค๊ธฐ ์œ„ํ•œ UserTransaction ์†์„ฑ๊ฐ’์„ ์š”๊ตฌํ•œ๋‹ค. JNDI๋ฐ์ดํ„ฐ์†Œ์Šค์˜ˆ์ œ๋Š” ๋‹ค์Œ์˜ ์„ค์ •์˜ˆ์ œ์—์„œ ๋ณด๋ผ. EXTERNAL โ€“ ์ด๊ฒƒ์€ ๋‹น์‹  ์ž์‹ ์ด ํŠธ๋žœ์žญ์…˜์„ ๊ด€๋ฆฌํ•˜๋„๋ก ํ•œ๋‹ค. ๋‹น์‹ ์€ ์—ฌ์ „ํžˆ ๋ฐ์ดํ„ฐ์†Œ์Šค๋ฅผ ์„ค์ •ํ• ์ˆ˜ ์žˆ์ง€๋งŒ ํ”„ ๋ ˆ์ž„์›Œํฌ ์ƒ๋ช…์ฃผ๊ธฐ์˜ ๋ถ€๋ถ„์ฒ˜๋Ÿผ ํŠธ๋žœ์žญ์…˜์ด ์ปค๋ฐ‹๋˜๊ฑฐ๋‚˜ ๋กค๋ฐฑ๋˜์ง€ ์•Š๋Š”๋‹ค. ์ด๊ฒƒ์€ ๋‹น์‹  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ถ€๋ถ„์ด ์™ธ ๋ถ€์ ์œผ๋กœ SQL Maps ํŠธ๋žœ์žญ์…˜์„ ๊ด€๋ฆฌํ•ด์•ผ ํ•œ๋‹ค๋Š”๊ฒƒ์ด๋‹ค. ์ด ์…‹ํŒ…์€ ๋น„-ํŠธ๋žœ์žญ์…˜(์˜ˆ๋ฅผ ๋“ค๋ฉด ์ฝ๊ธฐ์ „์šฉ) ๋ฐ์ดํ„ฐ๋ฒ ์ด ์Šค์— ์œ ์šฉํ•˜๋‹ค. <dataSource> ์š”์†Œ ํŠธ๋žœ์žญ์…˜๊ด€๋ฆฌ์ž ์„ค์ •์˜ ํฌํ•จ๋œ ๋ถ€๋ถ„์€ dataSource ์š”์†Œ์ด๊ณ  SQL Maps๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ ๋ฐ์ดํ„ฐ์†Œ์Šค๋ฅผ ์„ค์ •ํ•˜๊ธฐ ์œ„ํ•œ ์†์„ฑ ๊ฐ’์˜ ์ง‘ํ•ฉ์ด๋‹ค. ์—ฌ๊ธฐ์—” ํ”„๋ ˆ์ž„์›Œํฌ์—์„œ ์ œ๊ณต๋˜๋Š” 3๊ฐ€์ง€ ๋ฐ์ดํ„ฐ์†Œ์Šคํƒ€์ž…์ด ์žˆ์ง€๋งŒ ๋‹น์‹ ์€ ๋‹น์‹ ๋งŒ์˜ ๋ฐ์ดํ„ฐ์†Œ์Šค๋ฅผ ์‚ฌ์šฉํ• ์ˆ˜ ๋„ ์žˆ๋‹ค. ํฌํ•จ๋œ DataSourceFactory๊ตฌํ˜„์€ ๋‹ค์Œ์— ์ƒ์„ธํ•˜๊ฒŒ ๋…ผ์˜๊ฐ€ ๋ ๊ฒƒ์ด๊ณ  ๊ฐ๊ฐ์„ ์œ„ํ•ด ์ œ๊ณต๋˜๋Š” ์„ค์ •์€ ์•„๋ž˜ ์˜ˆ์ œ๋ฅผ ๋ณด ๋ผ. SimpleDataSourceFactory SimpleDataSource ๋Š” ๋ฐ์ดํ„ฐ์†Œ์Šค๋ฅผ ์ œ๊ณตํ•˜๋Š” ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ์— connection์„ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•ด ๊ธฐ๋ณธ์ ์œผ๋กœ ํ’€๋ง(pooling) ๋ฐ์ดํ„ฐ์†Œ์Šค ๊ตฌํ˜„์„ ์ œ๊ณตํ•œ๋‹ค. ์ด๊ฒƒ์€ iBATIS SimpleDataSource connectionํ’€๋ง์„ ๊ธฐ์ดˆ๋กœ ํ•œ๋‹ค. <transactionManager type="JDBC"> <dataSource type="SIMPLE"> <property name="JDBC.Driver" value="org.postgresql.Driver"/> <property name="JDBC.ConnectionURL" value="jdbc:postgresql://server:5432/dbname"/> <property name="JDBC.Username" value="user"/> <property name="JDBC.Password" value="password"/> <!--OPTIONAL PROPERTIES BELOW --> <property name="Pool.MaximumActiveConnections" value="10"/> 8
  • 9. <property name="Pool.MaximumIdleConnections" value="5"/> <property name="Pool.MaximumCheckoutTime" value="120000"/> <property name="Pool.TimeToWait" value="10000"/> <property name="Pool.PingQuery" value="select * from dual"/> <property name="Pool.PingEnabled" value="false"/> <property name="Pool.PingConnectionsOlderThan" value="0"/> <property name="Pool.PingConnectionsNotUsedFor" value="0"/> </dataSource> </transactionManager> DbcpDataSourceFactory ์ด ๊ตฌํ˜„๋ฌผ์€ DataSource API๋ฅผ ํ†ตํ•ด connectionํ’€๋ง์„œ๋น„์Šค๋ฅผ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•ด Jakarta DBCP (Database Connection Pool)์„ ์‚ฌ์šฉํ•œ๋‹ค. ์ด DataSource๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜/์›น ์ปจํ…Œ์ด๋„ˆ๊ฐ€ DataSource๊ตฌํ˜„๋ฌผ์„ ์ œ๊ณตํ•˜์ง€ ๋ชป ํ•˜๊ฑฐ๋‚˜ ๋‹น์‹ ์ด standalone์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ตฌ๋™ํ•  ๋•Œ ์ด์ƒ์ ์ด๋‹ค. DbcpDataSourceFactory ๋ฅผ ์œ„ํ•ด ๋ช…์‹œํ•ด์•ผ ํ•˜ ๋Š” ์„ค์ • ํŒŒ๋ผ๋ฏธํ„ฐ์˜ ์˜ˆ์ œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค. <transactionManager type="JDBC"> <dataSource type="DBCP"> <property name="JDBC.Driver" value="${driver}"/> <property name="JDBC.ConnectionURL" value="${url}"/> <property name="JDBC.Username" value="${username}"/> <property name="JDBC.Password" value="${password}"/> <!--OPTIONAL PROPERTIES BELOW --> <property name="Pool.MaximumActiveConnections" value="10"/> <property name="Pool.MaximumIdleConnections" value="5"/> <property name="Pool.MaximumWait" value="60000"/> <!--Use of the validation query can be problematic. If you have difficulty, try without it. --> <property name="Pool.ValidationQuery" value="select * from ACCOUNT"/> <property name="Pool.LogAbandoned" value="false"/> <property name="Pool.RemoveAbandoned" value="false"/> <property name="Pool.RemoveAbandonedTimeout" value="50000"/> <property name="Driver.DriverSpecificProperty" value="SomeValue"/> </datasource> </transactionManager> JndiDataSourceFactory ์ด ๊ตฌํ˜„๋ฌผ์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ปจํ…Œ์ด๋„ˆ๋‚ด JNDI์ปจํ…์ŠคํŠธ๋กœ๋ถ€ํ„ฐ DataSource๊ตฌํ˜„๋ฌผ์„ ๊ฐ€์ ธ์™€์•ผ ํ• ๊ฒƒ์ด๋‹ค. ์ด๊ฒƒ์€ ์ „ํ˜•์  ์œผ๋กœ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„œ๋ฒ„๋ฅผ ์‚ฌ์šฉ์ค‘์ด๊ณ  ์ปจํ…Œ์ด๋„ˆ๊ด€๋ฆฌ connection pool ๊ทธ๋ฆฌ๊ณ  ์ œ๊ณต๋˜๋Š” DataSource๊ตฌํ˜„๋ฌผ์ด ์žˆ์„ ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค. JDBC DataSource๊ตฌํ˜„๋ฌผ์— ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•œ ํ‘œ์ค€์ ์ธ ๋ฐฉ๋ฒ•์€ JNDI์ปจํ…์ŠคํŠธ๋ฅผ ํ†ตํ•˜๋Š”๊ฒƒ์ด๋‹ค. JndiDataSourceFactory ๋Š” JNDI๋ฅผ ํ†ตํ•ด DataSource์— ์ ‘๊ทผํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค. ๋ฐ์ดํ„ฐ์†Œ์Šค๋‚ด์— ๋ช…์‹œ๋˜์–ด์•ผ ํ•˜๋Š” ์„ค์ • ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค. <transactionManager type="JDBC" > <dataSource type="JNDI"> <property name="DBJndiContext" value="java:comp/env/jdbc/jpetstore"/> </dataSource> </transactionManager> ์œ„ ์„ค์ •์€ ์ผ๋ฐ˜์ ์ธ JDBCํŠธ๋žœ์žญ์…˜ ๊ด€๋ฆฌ์ง€๋งŒ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ž์›์„ ๊ด€๋ฆฌํ•œ๋‹ค. ๋‹น์‹ ์€ ๋‹ค์Œ์ฒ˜๋Ÿผ ์ „์—ญ(global)ํŠธ๋žœ์žญ ์…˜์„ ์„ค์ •ํ•˜๊ธธ ์›ํ• ์ˆ˜๋„ ์žˆ๋‹ค. <transactionManager type="JTA" > <property name="UserTransaction" value="java:/ctx/con/UserTransaction"/> <dataSource type="JNDI"> 9
  • 10. <property name="DBJndiContext" value="java:comp/env/jdbc/jpetstore"/> </dataSource> </transactionManager> UserTransaction ์ธ์Šคํ„ด์Šค๊ฐ€ ๋ฐœ๊ฒฌ๋ ์ˆ˜ ์žˆ๋Š” JNDI์œ„์น˜๋ฅผ ๊ฐ€์ง€ํ‚ค๋Š” UserTransaction ๊ฐ’์— ์ฃผ์˜ํ•˜๋ผ. ์ข€๋” ๋„“์€ ๋ฒ”์œ„ ์˜ ํŠธ๋žœ์žญ์…˜์„ ๊ฐ€์ง€๋Š” SQL Maps๊ฐ€ ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ํŠธ๋žœ์žญ์…˜ ์ž์›์„ ํฌํ•จํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” JTAํŠธ๋žœ์žญ์…˜ ๊ด€๋ฆฌ๊ฐ€ ์š”๊ตฌ๋œ๋‹ค. <sqlMap> ์š”์†Œ sqlMap ์š”์†Œ๋Š” ๋ช…์‹œ์ ์œผ๋กœ SQL Map์ด๋‚˜ ๋‹ค๋ฅธ SQL Map์„ค์ •ํŒŒ์ผ์„ ํฌํ•จํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค. SqlMapClient์ธ์Šคํ„ด์Šค์— ์˜ํ•ด ์‚ฌ ์šฉ๋˜๋Š” ๊ฐ๊ฐ์˜ SQL Map XMLํŒŒ์ผ์€ ๋ฐ˜๋“œ์‹œ ์„ ์–ธ๋˜์–ด์•ผ ํ•œ๋‹ค. SQL Map XMLํŒŒ์ผ์€ ํด๋ž˜์ŠคํŒจ์Šค๋‚˜ URL๋กœ๋ถ€ํ„ฐ ์ŠคํŠธ๋ฆผ (stream)์ž์›์ฒ˜๋Ÿผ ๋กœ๋“œ ๋ ๊ฒƒ์ด๋‹ค. ๋‹น์‹ ์€ SQL Maps๋ฅผ ๋ช…์‹œํ•ด์•ผ ํ•œ๋‹ค. ๋‹ค์Œ์€ ๊ทธ์— ๋Œ€ํ•œ ์˜ˆ์ด๋‹ค. <!--CLASSPATH RESOURCES --> <sqlMap resource="com/ibatis/examples/sql/Customer.xml" /> <sqlMap resource="com/ibatis/examples/sql/Account.xml" /> <sqlMap resource="com/ibatis/examples/sql/Product.xml" /> <!--URL RESOURCES --> <sqlMap url="file:///c:/config/Customer.xml " /> <sqlMap url="file:///c:/config/Account.xml " /> <sqlMap url="file:///c:/config/Product.xml" /> ๋‹ค์Œ์˜ ๋‹ค์–‘ํ•œ ์„น๊ฒฌ์€ SQL Map XMLํŒŒ์ผ๋“ค์˜ ๊ตฌ์กฐ์— ๋Œ€ํ•ด์„œ ์„œ์ˆ ํ•œ๋‹ค. SQL Map XML ํŒŒ์ผ ( http://ibatis.apache.org/dtd/sql- map-config-2.dtd) ์œ„ ์˜ˆ์ œ์—์„œ ์šฐ๋ฆฌ๋Š” SQL Maps์˜ ๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ํ˜•ํƒœ๋ฅผ ๋ณด์•˜๋‹ค. SQL Map๋ฌธ์„œ ๊ตฌ์กฐ๋‚ด์— ์‚ฌ์šฉ๊ฐ€๋Šฅํ•œ ๋‹ค๋ฅธ ์˜ต์…˜์ด ์žˆ๋‹ค. ์ข€ ๋” ๋งŽ์€ ๊ธฐ๋Šฅ์„ ๊ฐ€์ง€๋Š” mapped statement์˜ ์˜ˆ์ œ์ด๋‹ค. <sqlMap id=โ€Productโ€> <cacheModel id=โ€productCacheโ€ type=โ€LRUโ€> <flushInterval hours=โ€24โ€/> <property name=โ€sizeโ€ value=โ€1000โ€ /> </cacheModel> <typeAlias alias=โ€productโ€ type=โ€com.ibatis.example.Productโ€ /> <parameterMap id=โ€productParamโ€ class=โ€productโ€> <parameter property=โ€idโ€/> </parameterMap> <resultMap id=โ€productResultโ€ class=โ€productโ€> <result property=โ€idโ€ column=โ€PRD_IDโ€/> <result property=โ€descriptionโ€ column=โ€PRD_DESCRIPTIONโ€/> </resultMap> <select id=โ€getProductโ€ parameterMap=โ€productParamโ€ resultMap=โ€productResultโ€ cacheModel=โ€product-cacheโ€> select * from PRODUCT where PRD_ID = ? </select> </sqlMap> 10
  • 11. ๋„ˆ๋ฌด ๋งŽ์€๊ฐ€.? ๋น„๋ก ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ๋‹น์‹ ์„ ์œ„ํ•ด ๋งŽ์€ ๊ฒƒ์„ ํ•˜๋”๋ผ๋„ ๊ฐ„๋‹จํ•œ select statement๋ฅผ ์œ„ํ•ด ๋„ˆ๋ฌด ๋งŽ์€ ์ถ”๊ฐ€์ ์ธ ์ž‘์—…์„ ํ•˜๋Š”๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ธ๋‹ค. ๊ฑฑ์ •ํ•˜์ง€ ๋งˆ๋ผ ๋‹ค์Œ์€ ์œ„์˜ ๊ฒƒ์˜ ์ถ•์†Œ๋ฒ„์ „์ด๋‹ค. <sqlMap id=โ€Productโ€> <select id=โ€getProductโ€ parameterClass=โ€ com.ibatis.example.Productโ€ resultClass=โ€com.ibatis.example.Productโ€> select PRD_ID as id, PRD_DESCRIPTION as description from PRODUCT where PRD_ID = #id# </select> </sqlMap> ์ง€๊ธˆ SQL Map์„ ํ–‰์œ„์ ์ธ ์ธก๋ฉด์—์„œ ๋ณด๋ฉด ์ด statement๋Š” ์ •ํ™•ํ•˜๊ฒŒ ๊ฐ™์ง€๋Š” ์•Š๋‹ค. ์ฆ‰ ๋ช‡๊ฐ€์ง€ ๋‹ค๋ฅธ์ ์„ ๊ฐ€์ง„๋‹ค. ๋จผ์ € ํ›„์ž์˜ statement๋Š” ์บ์‰ฌ๋ฅผ ๋ช…์‹œํ•˜์ง€ ์•Š์•„์„œ ๋งค๋ฒˆ์˜ ์š”์ฒญ์‹œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ง์ ‘ ์š”์ฒญํ•œ๋‹ค. ๋‘๋ฒˆ์งธ ํ›„์ž์˜ statement๋Š” ์•ฝ๊ฐ„์˜ ๋ถ€ํ•˜ ๋ฅผ ์•ผ๊ธฐํ• ์ˆ˜ ์žˆ๋Š” ํ”„๋ ˆ์ž„์›Œํฌ์˜ ์ž๋™๋งตํ•‘๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•œ๋‹ค. ์–ด์จŒ๋“  ๋‘๊ฐ€์ง€ statement ๋ชจ๋‘ ์ž๋ฐ”์ฝ”๋“œ๋กœ๋ถ€ํ„ฐ ์ •ํ™•ํ•˜๊ฒŒ ๊ฐ™์€ ๋ฐฉ ๋ฒ•์œผ๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š์„๊ฒƒ์ด๋‹ค ๊ทธ๋ฆฌ๊ณ  ๋‹น์‹ ์€ ์ฒซ๋ฒˆ์งธ ์ข€๋” ๊ฐ„๋‹จํ•œ ์†”๋ฃจ์…˜์œผ๋กœ ์‹œ์ž‘ํ• ๊ฒƒ์ด๊ณ  ๋‚˜์ค‘์—๋Š” ํ•„์š”ํ•˜๋ฉด ์ข€๋” ํ–ฅ์ƒ๋œ ๋งต ํ•‘์œผ๋กœ ์˜ฎ๊ฒจ๊ฐˆ๊ฒƒ์ด๋‹ค. ๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ์†”๋ฃจ์…˜์ด ๋งŽ์€ ๊ฒฝ์šฐ์— ๊ฐ€์žฅ ์ข‹์€ ์—ฐ์Šต์ด๋‹ค. ํ•˜๋‚˜์˜ SQL Map XML ํŒŒ์ผ์€ ๋งŽ์€ ์บ์‰ฌ ๋ชจ๋ธ, ํŒŒ๋ผ๋ฏธํ„ฐ ๋งตํ•‘, result๋งตํ•‘ ๊ทธ๋ฆฌ๊ณ  statement๋ฅผ ํฌํ•จํ• ์ˆ˜ ์—†๋‹ค. ๋‹น์‹ ์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์œ„ํ•ด statement์™€ maps๋ฅผ ์‹ ์ค‘ํ•˜๊ฒŒ ๊ตฌ์„ฑํ•˜๋ผ. ๋งตํ•‘๋œ(Mapped) Statements SQL Maps ๊ฐœ๋…์€ ๋งตํ•‘๋œ statement์— ์ง‘์ค‘ํ•œ๋‹ค. ๋งตํ•‘๋œ statement๋Š” ์–ด๋– ํ•œ SQL๋ฌธ์„ ์‚ฌ์šฉํ• ์ˆ˜๋„ ์žˆ๊ณ  ํŒŒ๋ผ๋ฏธํ„ฐ maps(input) ๊ณผ result maps(output)๋ฅผ ๊ฐ€์งˆ์ˆ˜ ์žˆ๋‹ค. ๋งŒ์•ฝ ๊ฐ„๋‹จํ•œ ๊ฒฝ์šฐ๋ผ๋ฉด ๋งตํ•‘๋œ statement๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ์™€ result๋ฅผ ์œ„ํ•œ ํด๋ž˜์Šค๋กœ ์ง์ ‘ ์„ค ์ •ํ• ์ˆ˜ ์žˆ๋‹ค. ๋งตํ•‘๋œ statement๋Š” ๋ฉ”๋ชจ๋ฆฌ๋‚ด์— ์ƒ์‚ฐ๋œ results๋ฅผ ์บ์Šํ•˜๊ธฐ ์œ„ํ•ด ์บ์‰ฌ ๋ชจ๋ธ์„ ์‚ฌ์šฉํ•˜๋„๋ก ์„ค์ •ํ• ์ˆ˜๋„ ์žˆ๋‹ค. <statement id=โ€statementNameโ€ [parameterClass=โ€some.class.Nameโ€] [resultClass=โ€some.class.Nameโ€] [parameterMap=โ€nameOfParameterMapโ€] [resultMap=โ€nameOfResultMapโ€] [cacheModel=โ€nameOfCacheโ€] > select * from PRODUCT where PRD_ID = [?|#propertyName#] order by [$simpleDynamic$] </statement> ์œ„ statement์—์„œ [๊ด„ํ˜ธ] ๋ถ€๋ถ„์€ ์˜ต์…˜์ด๊ณ  ๋ช‡๋ช‡์˜ ๊ฒฝ์šฐ์—๋งŒ ํ˜ผํ•ฉํ•  ํ•„์š”๊ฐ€ ์žˆ๋‹ค. <statement id=โ€insertTestProductโ€ > insert into PRODUCT (PRD_ID, PRD_DESCRIPTION) values (1, โ€œShih Tzuโ€) </statement> ์œ„ ์˜ˆ์ œ๋Š” ๋ช…๋ฐฑํ•˜๊ฒŒ ๋ฐœ์ƒํ• ๊บผ ๊ฐ™์ง€๋Š” ์•Š๋‹ค. ์–ด์จŒ๋“  ์ด๊ฒƒ์€ ๋‹น์‹ ์ด ์ž„์˜์˜ SQL ๋ฌธ์„ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•ด SQL Mapํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์‚ฌ ์šฉํ•œ๋‹ค๋ฉด ์œ ์šฉํ• ์ˆ˜ ์žˆ๋‹ค. ์–ด์จŒ๋“  ์ด๊ฒƒ์€ ํŒŒ๋ผ๋ฏธํ„ฐ Maps ์™€ Result Maps์„ ์‚ฌ์šฉํ•˜๋Š” ์ž๋ฐ”๋นˆ์ฆˆ ๋งตํ•‘๊ธฐ๋Šฅ์„ ๊ณตํ†ต์ ์œผ๋กœ ์‚ฌ์šฉ ํ• ๊ฒƒ์ด๋‹ค. ๋‹ค์Œ์˜ ๋‹ค์–‘ํ•œ ์„น์…˜์€ ๊ตฌ์กฐ์™€ ์†์„ฑ, ๊ทธ๋“ค์ด ์–ด๋–ป๊ฒŒ ๋งตํ•‘๋œ statement์— ์˜ํ–ฅ์„ ๋ผ์น˜๋Š”์ง€ ์„œ์ˆ ํ•œ๋‹ค. Statement ํƒ€์ž… <statement> ์š”์†Œ๋Š” ์–ด๋–ค ํƒ€์ž…์˜ SQL ๋ฌธ์„ ์‚ฌ์šฉํ• ์ˆ˜ ์žˆ๋Š” ์ผ๋ฐ˜์ ์ธ โ€œcatch allโ€ statement์ด๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ์ด๊ฒƒ์€ ์ข€๋” ๋‹ค ์–‘ํ•œ ํŠน์„ฑ์˜ statement์š”์†Œ์ค‘ ํ•˜๋‚˜๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ ์ข‹์€ ์ƒ๊ฐ์ด๋‹ค. ์ข€๋” ๋‹ค์–‘ํ•œ ํŠน์„ฑ์˜ ์š”์†Œ๋Š” ์ข€๋” ์ง๊ด€์ ์ธ XML DTD๋ฅผ ์ œ๊ณตํ•˜๊ณ  ๋•Œ๋•Œ๋กœ ์ผ๋ฐ˜์ ์ธ <statement>์š”์†Œ๊ฐ€ ์ œ๊ณตํ•˜์ง€ ์•Š๋Š” ์ถ”๊ฐ€์ ์ธ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค. ๋‹ค์Œ์˜ ํ…Œ์ด๋ธ”์€ statement์š”์†Œ 11
  • 12. ์™€ ๊ทธ๋“ค์ด ์ง€์›ํ•˜๋Š” ์†์„ฑ๊ณผ ๊ธฐ๋Šฅ์„ ๋ชฉ๋กํ™” ํ•œ๋‹ค. Statement ์š”์†Œ ์†์„ฑ ํ•˜์œ„ ์š”์†Œ ๋ฉ”์†Œ๋“œ <statement> id ๋ชจ๋“  ๋™์  ์š”์†Œ insert parameterClass update resultClass delete parameterMap ๋ชจ๋“  ์ฟผ๋ฆฌ ๋ฉ”์†Œ๋“œ resultMap cacheModel resultSetType fetchSize xmlResultName remapResults <insert> id ๋ชจ๋“  ๋™์  ์š”์†Œ insert parameterClass <selectKey> update parameterMap delete <update> id ๋ชจ๋“  ๋™์  ์š”์†Œ insert parameterClass update parameterMap delete <delete> id ๋ชจ๋“  ๋™์  ์š”์†Œ insert parameterClass update parameterMap delete <select> id ๋ชจ๋“  ๋™์  ์š”์†Œ ๋ชจ๋“  ์ฟผ๋ฆฌ ๋ฉ”์†Œ๋“œ parameterClass resultClass parameterMap resultMap cacheModel resultSetType fetchSize xmlResultName remapResults <procedure> id ๋ชจ๋“  ๋™์  ์š”์†Œ insert parameterClass update resultClass delete parameterMap ๋ชจ๋“  ์ฟผ๋ฆฌ ๋ฉ”์†Œ๋“œ resultMap cacheModel xmlResultName remapResults The SQL SQL ์€ map์˜ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๋ถ€๋ถ„์„ ์ฐจ์ง€ํ•œ๋‹ค. ์ด๊ฒƒ์€ ๋‹น์‹ ์˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ JDBC๋“œ๋ผ์ด๋ฒ„์— ์ ํ•ฉํ•œ ์–ด๋–ค SQL์ด ๋ ์ˆ˜ ์žˆ๋‹ค. ๋‹น์‹ ์€ ๊ฐ€๋Šฅํ•œ ์–ด๋–ค ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ• ์ˆ˜ ์žˆ๊ณ  ๋‹น์‹ ์˜ ๋“œ๋ผ์ด๋ฒ„๊ฐ€ ์ง€์›ํ•˜๋Š” ํ•œ ๋‹ค์ค‘ statement์— ์ „๋‹ฌํ• ์ˆ˜๋„ ์žˆ๋‹ค. ๋‹น์‹ ์ด ํ•˜๋‚˜ ์˜ ๋ฌธ์„œ์—์„œ SQL๊ณผ XML์„ ํ˜ผํ•ฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํŠน์ˆ˜๋ฌธ์ž์˜ ์ถฉ๋Œ์ด ์ž ์žฌ์ ์œผ๋กœ ์กด์žฌํ•œ๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ ๊ณตํ†ต์ ์ธ ๊ฒƒ์€ greater-than ๊ณผ less-than ๋ฌธ์ž๋“ค์ด๋‹ค.(<>). ์ด๊ฒƒ๋“ค์€ SQL๋ฌธ์—์„œ ๊ณตํ†ต์ ์œผ๋กœ ์š”๊ตฌ๋˜๊ณ  XML์—์„œ๋Š” ์˜ˆ์•ฝ์–ด์ด๋‹ค. ๋‹น์‹ ์˜ SQL๋ฌธ์— ๋“ค์–ด๊ฐˆ ํ•„ ์š”๊ฐ€ ์žˆ๋Š” ํŠน์ˆ˜ XML๋ฌธ์ž๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ๊ฐ„๋‹จํ•œ ํ•ด๊ฒฐ๋ฒ•์ด ์žˆ๋‹ค. ํ‘œ์ค€์ ์ธ XML CDATA ์„น์…˜์„ ์‚ฌ์šฉํ•จ์œผ๋กœ์จ ํŠน์ˆ˜๋ฌธ์ž์˜ ์–ด ๋–ค๊ฒƒ๋„ ํŒŒ์‹ฑ๋˜์ง€ ์•Š๊ณ  ๋ฌธ์ œ๋Š” ํ•ด๊ฒฐ๋œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด <statement id="getPersonsByAge" parameterClass=โ€intโ€ resultClass="examples.domain.Person"> <![CDATA[ SELECT * FROM PERSON WHERE AGE > #value# ]]> </statement> 12
  • 13. ์ž๋™ ์ƒ์„ฑ ํ‚ค ๋งŽ์€ ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์‹œ์Šคํ…œ์€ ๊ธฐ๋ณธํ‚ค(primay key)ํ•„๋“œ์˜ ์ž๋™์ƒ์„ฑ์„ ์ง€์›ํ•œ๋‹ค. ์ด RDBMS์˜ ๊ธฐ๋Šฅ์€ ์ข…์ข… ํŠน์ •์—…์ฒด์— ์ข…์†๋œ๋‹ค. SQL Map์€ <insert>์š”์†Œ์˜ <selectKey>๋ฅผ ํ†ตํ•ด ์ž๋™์ƒ์„ฑํ‚ค๋ฅผ ์ง€์›ํ•œ๋‹ค. ์„ ์ƒ์„ฑํ‚ค(pre-generated - ์ด๋ฅผ ํ…Œ๋ฉด ์˜ค ๋ผํด)๊ณผ ํ›„์ƒ์„ฑํ‚ค(post-generated - ์ด๋ฅผ ํ…Œ๋ฉด MS-SQL ์„œ๋ฒ„) ๋ชจ๋‘ ์ง€์›ํ•œ๋‹ค. ์—ฌ๊ธฐ์— ๊ทธ ์˜ˆ์ œ๊ฐ€ ์žˆ๋‹ค. <!โ€”Oracle SEQUENCE Example --> <insert id="insertProduct-ORACLE" parameterClass="com.domain.Product"> <selectKey resultClass="int"> SELECT STOCKIDSEQUENCE.NEXTVAL AS ID FROM DUAL </selectKey> insert into PRODUCT (PRD_ID,PRD_DESCRIPTION) values (#id#,#description#) </insert> <!โ€” Microsoft SQL Server IDENTITY Column Example --> <insert id="insertProduct-MS-SQL" parameterClass="com.domain.Product"> insert into PRODUCT (PRD_DESCRIPTION) values (#description#) <selectKey resultClass="int"> SELECT @@IDENTITY AS ID </selectKey> </insert> ์ €์žฅ ํ”„๋กœ์‹œ์ € ์ €์žฅ ํ”„๋กœ์‹œ์ €๋Š” <procedure> statement์š”์†Œ๋ฅผ ํ†ตํ•ด ์ง€์›๋œ๋‹ค. ์ €์žฅ ํ”„๋กœ์‹œ์ €๋ฅผ ์ถœ๋ ฅ๋ฌผ ํŒŒ๋ผ๋ฏธํ„ฐ์™€ ํ•จ๊ป˜ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•˜ ๋Š”์ง€ ๋‹ค์Œ ์˜ˆ์ œ์—์„œ ๋ณด์—ฌ์ค€๋‹ค. <parameterMap id="swapParameters" class="map" > <parameter property="email1" jdbcType="VARCHAR" javaType="java.lang.String" mode="INOUT"/> <parameter property="email2" jdbcType="VARCHAR" javaType="java.lang.String" mode="INOUT"/> </parameterMap> <procedure id="swapEmailAddresses" parameterMap="swapParameters" > {call swap_email_address (?, ?)} </procedure> ์œ„์ฒ˜๋Ÿผ ํ”„๋กœ์‹œ์ €๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ์€ ํŒŒ๋ผ๋ฏธํ„ฐ ๊ฐ์ฒด(map)๋‚ด์—์„œ ๋‘๊ฐœ์˜ ์นผ๋Ÿผ์‚ฌ์ด์— ๋‘๊ฐœ์˜ ์ด๋ฉ”์ผ์ฃผ์†Œ๋ฅผ ๊ต์ฒดํ•˜๋Š”๊ฒƒ์ด๋‹ค. ํŒŒ ๋ผ๋ฏธํ„ฐ ๊ฐ์ฒด๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ ๋งตํ•‘์˜ mode์†์„ฑ๊ฐ’์ด โ€œINOUTโ€๋˜๋Š” โ€œOUTโ€์ผ ๊ฒฝ์šฐ์—๋งŒ ๋ณ€๊ฒฝ๋œ๋‹ค. ๋‹ค๋ฅธ ๊ฒฝ์šฐ๋ผ๋ฉด ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๊ณ  ๋‚จ๋Š” ๋‹ค. ๋ช…๋ฐฑํ•œ ๋ถˆ๋ณ€์˜ ํŒŒ๋ผ๋ฏธํ„ฐ ๊ฐ์ฒด(์ด๋ฅผ ํ…Œ๋ฉด String)๋Š” ๋ณ€๊ฒฝํ• ์ˆ˜ ์—†๋‹ค. ์ฃผ์˜! ์–ธ์ œ๋‚˜ ํ‘œ์ค€์ ์ธ JDBC์ €์žฅ ํ”„๋กœ์‹œ์ €๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ํ•˜๋ผ. ์ข€๋” ๋‹ค์–‘ํ•œ ์ •๋ณด๋ฅผ ๋ณด๊ธฐ ์œ„ํ•ด์„œ๋Š” JDBC CallableStatement๋ฌธ ์„œ๋ฅผ ๋ณด๋ผ. parameterClass parameterClass ์†์„ฑ๊ฐ’์€ ์ž๋ฐ”ํด๋ž˜์Šค์˜ ์ „์ฒด๊ฒฝ๋กœ๋ฅผ ํฌํ•จ(์˜ˆ๋ฅผ ๋“ค๋ฉด ํŒจํ‚ค์ง€๋ฅผ ํฌํ•จํ•œ)ํ•œ ์ด๋ฆ„์ด๋‹ค. parameterClass ์†์„ฑ์€ ์˜ต ์…˜์ด์ง€๋งŒ ์‚ฌ์šฉ์ด ๊ต‰์žฅํžˆ ์ถ”์ฒœ๋˜๋Š” ๊ฒƒ์ด๋‹ค. ์ด๊ฒƒ์€ ํ”„๋ ˆ์ž„์›Œํฌ ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚ค๋Š” ๋งŒํผ statement์— ์ „๋‹ฌํ•˜๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์ œ ํ•œํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋œ๋‹ค. ๋งŒ์•ฝ ๋‹น์‹ ์ด parameterMap์„ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด parameterClass์†์„ฑ์„ ์‚ฌ์šฉํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹น์‹ ์ด ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ „๋‹ฌํ•˜๊ธฐ ์œ„ํ•œ โ€œexamples.domain.Productโ€ ํƒ€์ž…์˜ ๊ฐ์ฒด๋ฅผ ํ—ˆ๋ฝํ•˜๊ธธ ์›ํ•œ๋‹ค๋ฉด ๋‹น์‹ ์€ ๋‹ค์Œ์ฒ˜๋Ÿผ ํ• ์ˆ˜ ์žˆ์„๊ฒƒ์ด๋‹ค. <statement id=โ€statementNameโ€ parameterClass=โ€ examples.domain.Productโ€> 13
  • 14. insert into PRODUCT values (#id#, #description#, #price#) </statement> ์ค‘์š”: ๋น„๋ก ์ด์ „๋ฒ„์ „๊ณผ์˜ ํ˜ธํ™˜์„ฑ์„ ์œ„ํ•œ ์˜ต์…˜์ด์ง€๋งŒ ์ด๊ฒƒ์€ ์–ธ์ œ๋‚˜ ํŒŒ๋ผ๋ฏธํ„ฐ ํด๋ž˜์Šค๋ฅผ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์€ ๋งค์šฐ ์ถ”์ฒœ๋˜๋Š” ์‚ฌํ•ญ ์ด๋‹ค(๋ฌผ๋ก  ์š”๊ตฌ๋˜๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ์—†๋”๋ผ๋„). ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ๋จผ์ € ํƒ€์ž…์„ ์•ˆ๋‹ค๋ฉด ์Šค์Šค๋กœ ์ตœ์ ํ™”๋Šฅ๋ ฅ์„ ๊ฐ€์ง€๊ธฐ ๋•Œ๋ฌธ์— ๋‹น์‹ ์€ ํด๋ž˜์Šค๋ฅผ ์ œ๊ณตํ•จ์œผ๋กœ์จ ์ข€๋” ๋‚˜์€ ์„ฑ๋Šฅ์„ ๋‹ฌ์„ฑํ• ์ˆ˜ ์žˆ๋‹ค. ๋ช…์‹œ๋œ parameterClass ์—†์ด ์„ ํ˜ธํ•˜๋Š” ์†์„ฑ(get/set๋ฉ”์†Œ๋“œ)์„ ๊ฐ€์ง€๋Š” ์ž๋ฐ”๋นˆ์ฆˆ๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๋ฐ›์„๊ฒƒ์ด๊ณ  ์–ด๋Š ์œ„์น˜์—์„œ ๋งค์šฐ ์œ ์šฉํ•˜๋‹ค. parameterMap parameterMap ์†์„ฑ๊ฐ’์€ ๋ช…์‹œ๋œ(๋ฐ‘์˜ ๊ฒฝ์šฐ์ฒ˜๋Ÿผ) parameterMap์š”์†Œ์˜ ์ด๋ฆ„์ด๋‹ค. parameterMap์†์„ฑ์€ parameterClass ์†์„ฑ ๊ณผ ์ธ๋ผ์ธ ํŒŒ๋ผ๋ฏธํ„ฐ์˜ ์ด์ต์ด ๋˜๋„๋ก ์‚ฌ์šฉ๋œ๋‹ค. XML์˜ ๊น”๋”ํ•จ๊ณผ ์ผ๊ด€์„ฑ์ด ๋‹น์‹ ์˜ ๊ฑฑ์ •์ด๊ฑฐ๋‚˜ ๋‹น์‹ ์ด ์ข€๋” ์ƒ์„ธํ•œ parameterMap(์ด๋ฅผ ํ…Œ๋ฉด ์ €์žฅํ”„๋กœ์‹œ์ €)์ด ํ•„์š”ํ•˜๋‹ค๋ฉด ์ด๊ฒƒ์€ ์ข‹์€ ์ ‘๊ทผ๋ฒ•์ด๋‹ค. ์ฃผ์˜! ๋™์ ์œผ๋กœ ๋งตํ•‘๋œ statement๋Š” ๋‹จ์ง€ ์ธ๋ผ์ธ ํŒŒ๋ผ๋ฏธํ„ฐ๋งŒ ์ง€์›ํ•˜๊ณ  ํŒŒ๋ผ๋ฏธํ„ฐ map๊ณผ๋Š” ์ž‘๋™ํ•˜์ง€ ์•Š๋Š”๋‹ค. parameterMap์˜ ์ƒ๊ฐ์€ JDBC PreparedStatement์˜ ๊ฐ’ ํ† ํฐ๊ณผ ๋งค์น˜๋˜๋Š” ์ •๋ ฌ๋œ ํŒŒ๋ผ๋ฏธํ„ฐ ๋ชฉ๋ก์„ ๋ช…์‹œํ•œ๋‹ค. ์˜ˆ๋ฅผ๋“ค๋ฉด: <parameterMap id=โ€insert-product-paramโ€ class=โ€com.domain.Productโ€> <parameter property=โ€idโ€/> <parameter property=โ€descriptionโ€/> </parameterMap> <statement id=โ€insertProductโ€ parameterMap=โ€insert-product-paramโ€> insert into PRODUCT (PRD_ID, PRD_DESCRIPTION) values (?,?); </statement> ์œ„์˜ ์˜ˆ์ œ์—์„œ, ํŒŒ๋ผ๋ฏธํ„ฐ map์€ SQL๋ฌธ์—์„œ ๊ฐ’ํ† ํฐ(โ€œ?โ€)์— ๋งค์น˜๋˜๊ณ  ์ •๋ ฌ๋˜๋Š” ๋‘๊ฐœ์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์„œ์ˆ ํ•œ๋‹ค. ๊ทธ๋ž˜์„œ ์ฒซ๋ฒˆ์งธ โ€œ?โ€๋Š” โ€œidโ€ ์†์„ฑ๊ฐ’์— ๋Œ€์ฒด๋˜๊ณ  ๋‘๋ฒˆ์งธ๋Š” โ€œdescriptionโ€ ์†์„ฑ๊ฐ’์— ๋Œ€์ฒด๋œ๋‹ค. ํŒŒ๋ผ๋ฏธํ„ฐ map๊ณผ ๊ทธ๋“ค์˜ ์˜ต์…˜์€ ์ด ๋ฌธ์„œ ๋‚˜์ค‘์— ์ข€ ๋” ๋‹ค์–‘ํ•˜๊ฒŒ ์„œ์ˆ ๋ ๊ฒƒ์ด๋‹ค. ์ธ๋ผ์ธ ํŒŒ๋ผ๋ฏธํ„ฐ์˜ ๋น ๋ฅธ ์–ธ๊ธ‰ ์ด ๋ฌธ์„œ์— ๋‚˜์ค‘์— ์ œ๊ณต๋˜๋Š” ์ข€๋” ์ƒ์„ธํ™”๋œ ์„ค๋ช…์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ์ธ๋ผ์ธ ํŒŒ๋ผ๋ฏธํ„ฐ์— ๋Œ€ํ•œ ๋น ๋ฅธ ์–ธ๊ธ‰์„ ํ•œ๋‹ค. ์ธ๋ผ์ธ ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” ๋งตํ•‘๋œ statement๋‚ด๋ถ€์—์„œ ์‚ฌ์šฉ๋ ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด : <statement id=โ€insertProductโ€ > insert into PRODUCT (PRD_ID, PRD_DESCRIPTION) values (#id#, #description#); </statement> ์œ„ ์˜ˆ์ œ์—์„œ ์ธ๋ผ์ธ ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” #id# ์™€ #description# ์ด๋‹ค. ๊ฐ๊ฐ์€ statementํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๋Œ€์ฒดํ•˜๋Š” ์ž๋ฐ”๋นˆ์ฆˆ ์†์„ฑ์„ ํ‘œํ˜„ํ•œ ๋‹ค. Productํด๋ž˜์Šค๋Š” ํฌํ•จ๋œ ํ”„๋ผํผํ‹ฐ ํ† ํฐ์ด ์œ„์น˜ํ•ด ์žˆ๋Š” statement๋‚ด์— ์œ„์น˜ํ•˜๋Š” ๊ฐ’์„ ์œ„ํ•ด ์ฝ๊ฒŒ ๋˜๋Š” id ์™€ description ํ”„ ๋ผํผํ‹ฐ์„ ๊ฐ€์ง„๋‹ค. id=5 ์™€ description=โ€dogโ€ ๋ฅผ ๊ฐ€์ง€๋Š” Product๋ฅผ ๋„˜๊ฒจ๋ฐ›์€ statement๋Š” ๋‹ค์Œ์ฒ˜๋Ÿผ ์ˆ˜ํ–‰๋œ๋‹ค. insert into PRODUCT (PRD_ID, PRD_DESCRIPTION) values (5, โ€˜dogโ€™); resultClass resultClass์†์„ฑ๊ฐ’์€ ์ž๋ฐ”ํด๋ž˜์Šค์˜ ์ „์ฒด๊ฒฝ๋กœ๋ฅผ ํฌํ•จ(์˜ˆ๋ฅผ ๋“ค๋ฉด ํŒจํ‚ค์ง€๋ฅผ ํฌํ•จํ•œ)ํ•œ ์ด๋ฆ„์ด๋‹ค. resultClass์†์„ฑ์€ ์šฐ๋ฆฌ์—๊ฒŒ ResultSetMetaData์— ๊ธฐ๋ฐ˜ํ•œ JDBC ResultSet์— ์ž๋™๋งตํ•‘๋˜๋Š” ํด๋ž˜์Šค๋ฅผ ๋ช…์‹œํ•˜๋„๋ก ํ•œ๋‹ค. ์ž๋ฐ”๋นˆ์ฆˆ์˜ ํ”„๋ผํผํ‹ฐ์™€ ResultSet์˜ ์นผ๋Ÿผ์ด ๋งค์น˜๋ ๋•Œ๋งˆ๋‹ค ํ”„๋ผํผํ‹ฐ๋Š” ์นผ๋Ÿผ๊ฐ’๊ณผ ํ•จ๊ป˜ ์ƒ์„ฑ๋œ๋‹ค. ์ด๊ฒƒ์€ ๋งค์šฐ ์งง๊ณ  ๋‹ฌ์ฝคํ•˜๊ฒŒ ๋งตํ•‘๋œ statement๋ฅผ ์ฟผ๋ฆฌํ•œ๋‹ค. ์˜ˆ๋ฅผ 14
  • 15. ๋“ค๋ฉด : <statement id="getPerson" parameterClass=โ€intโ€ resultClass="examples.domain.Person"> SELECT PER_ID as id, PER_FIRST_NAME as firstName, PER_LAST_NAME as lastName, PER_BIRTH_DATE as birthDate, PER_WEIGHT_KG as weightInKilograms, PER_HEIGHT_M as heightInMeters FROM PERSON WHERE PER_ID = #value# </statement> ์œ„์˜ ์˜ˆ์ œ์—์„œ Personํด๋ž˜์Šค๋Š” id, firstName, lastName, birthDate, weightInKilograms, heightInMeters๋ฅผ ํฌํ•จํ•˜๋Š” ํ”„๋ผํผํ‹ฐ ๋ฅผ ๊ฐ€์ง„๋‹ค. ์นผ๋Ÿผ๋ณ„์นญ๊ณผ ํ•จ๊ป˜ ๋Œ€์‘๋˜๋Š” ๊ฐ๊ฐ์€ SQL select๋ฌธ์— ์˜ํ•ด ์„œ์ˆ ๋œ๋‹ค. ์นผ๋Ÿผ๋ณ„์นญ์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์นผ๋Ÿผ์ด๋ฆ„์ด ๋งค์น˜๋˜์ง€ ์•Š์„๋•Œ๋งŒ ์š”๊ตฌ๋œ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ๋Š” ์š”๊ตฌ๋˜์ง€ ์•Š๋Š”๋‹ค. ์‹คํ–‰๋˜์—ˆ์„๋•Œ Person๊ฐ์ฒด๋Š” ํ”„๋ผํผํ‹ฐ์ด๋ฆ„๊ณผ ์นผ๋Ÿผ๋ช…์— ๊ธฐ๋ฐ˜ํ•ด์„œ ์ดˆ๊ธฐํ™” ๋˜๊ธฐ ์œ„ํ•ด ๋งตํ•‘๋˜๋Š” result set์œผ๋กœ๋ถ€ํ„ฐ ์ดˆ๊ธฐํ™”๋˜๊ณ  ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. resultClass์œผ๋กœ ์ž๋™๋งตํ•‘ํ•˜๋Š”๋ฐ๋Š” ๋ช‡ ๊ฐ€์ง€ ์ œํ•œ์ ์ด ์žˆ๋‹ค. ์ถœ๋ ฅ์นผ๋Ÿผ์˜ ํƒ€์ž…์„ ๋ช…์‹œํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์—†๋‹ค. ๊ด€๋ จ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์ž๋™์  ์œผ๋กœ ๋กœ๋“œํ•˜๋Š”๋ฐฉ๋ฒ•์ด ์—†๊ณ  ResultSetMetaData์— ์ ‘๊ทผํ•˜๋Š”๋ฐ ํ•„์š”ํ•œ ์ ‘๊ทผ๋ฒ•๋‚ด์—์„œ ํ•˜์ฐฎ์€ ์„ฑ๋Šฅ๊ฒฐ๊ณผ๊ฐ€ ์žˆ๋‹ค. ์ด ์ œํ•œ์  ๋ชจ๋“œ ๋Š” ๋ช…์‹œ์ ์ธ resultMap๋ฅผ ์‚ฌ์šฉํ•จ์œผ๋กœ์จ ๊ทน๋ณตํ• ์ˆ˜ ์žˆ๋‹ค. Result maps๋Š” ์ด ๋ฌธ์„œ ๋‚˜์ค‘์— ์ข€๋” ์ƒ์„ธํ•˜๊ฒŒ ๋‹ค๋ฃจ์–ด์งˆ๊ฒƒ์ด๋‹ค. resultMap resultMapํ”„๋ผํผํ‹ฐ๋Š” ์ข€๋” ๊ณตํ†ต์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๊ณ  ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด ๊ฐ€์žฅ ์ค‘์š”ํ•œ ์†์„ฑ์ค‘์— ํ•˜๋‚˜์ด๋‹ค. ์ด resultMap์†์„ฑ๊ฐ’์€ ๋ช…์‹œ๋œ resultMap์š”์†Œ์˜ ์ด๋ฆ„์ด๋‹ค. resultMap์†์„ฑ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ๋‹น์‹ ์—๊ฒŒ result set์œผ๋กœ๋ถ€ํ„ฐ ๋ฐ์ดํ„ฐ์™€ ์นผ๋Ÿผ์— ๋งตํ•‘๋˜ ๋Š” ํ”„๋ผํผํ‹ฐ๋ฅผ ์–ด๋–ป๊ฒŒ ๊บผ๋‚ด๋Š”์ง€ ์ œ์–ดํ•˜๋„๋ก ํ•œ๋‹ค. resultClass์†์„ฑ์„ ์‚ฌ์šฉํ•˜๋Š” ์ž๋™๋งตํ•‘์ ‘๊ทผ๋ฒ•๊ณผ๋Š” ๋‹ฌ๋ฆฌ resultMap๋Š” ๋‹น ์‹ ์—๊ฒŒ ์นผ๋Ÿผํƒ€์ž…์„ ๋ช…์‹œํ•˜๊ณ  null๊ฐ’์„ ๋Œ€์ฒด ๊ทธ๋ฆฌ๊ณ  ๋ณตํ•ฉ ํ”„๋ผํผํ‹ฐ๋งตํ•‘(๋‹ค๋ฅธ ์ž๋ฐ”๋นˆ์ฆˆ, Collections ๊ทธ๋ฆฌ๊ณ  ์›์‹œํƒ€์ž…๋ž˜ํผ) ์„ ํ—ˆ๋ฝํ•œ๋‹ค. resultMap ๊ตฌ์กฐ์˜ ๋ชจ๋“  ์ƒ์„ธ์ •๋ณด๋Š” ์ด ๋ฌธ์„œ ๋‚˜์ค‘์— ์„ค๋ช…๋œ๋‹ค. ํ•˜์ง€๋งŒ ๋‹ค์Œ์˜ ์˜ˆ์ œ๋Š” resultMap๊ฐ€ ์–ด๋–ป๊ฒŒ statement์— ๊ด€๋ จ ๋˜์—ˆ๋Š”์ง€ ๋ณด์—ฌ์ค€๋‹ค. <resultMap id=โ€get-product-resultโ€ class=โ€com.ibatis.example.Productโ€> <result property=โ€idโ€ column=โ€PRD_IDโ€/> <result property=โ€descriptionโ€ column=โ€PRD_DESCRIPTIONโ€/> </resultMap> <statement id=โ€getProductโ€ resultMap=โ€get-product-resultโ€> select * from PRODUCT </statement> ์œ„ ์˜ˆ์ œ์—์„œ SQL์ฟผ๋ฆฌ๋กœ๋ถ€ํ„ฐ ResultSet์€ resultMap์ •์˜๋ฅผ ์‚ฌ์šฉํ•ด์„œ Product์ธ์Šคํ„ด์Šค์— ๋งตํ•‘ํ• ๊ฒƒ์ด๋‹ค. resultMap์€ โ€œidโ€ํ”„ ๋ผํผํ‹ฐ๊ฐ€ โ€œPRD_IDโ€์นผ๋Ÿผ๊ณผ โ€œPRD_DESCRIPTIONโ€์นผ๋Ÿผ์— ์˜ํ•ด ์ƒ์„ฑ๋˜๋Š” โ€œdescriptionโ€ํ”„๋ผํผํ‹ฐ์— ์˜ํ•ด ์ƒ์„ฑ๋ ๊ฒƒ์ด๋‹ค. โ€œselect *โ€๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ์ง€์›๋œ๋‹ค๋Š” ๊ฒƒ์— ์ฃผ์˜ํ•˜๋ผ. ResultSet๋‚ด ๋ฐ˜ํ™˜์นผ๋Ÿผ ๋ชจ๋‘์— ๋งตํ•‘ํ•  ํ•„์š”๋Š” ์—†๋‹ค. cacheModel cacheModel์†์„ฑ๊ฐ’์€ ์ •์˜๋œ cacheModel์š”์†Œ์˜ ์ด๋ฆ„์ด๋‹ค. cacheModel์€ ์ฟผ๋ฆฌ๊ฐ€ ๋งตํ•‘๋œ statement๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ ์บ์‰ฌ๋ฅผ ์„œ์ˆ ํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋œ๋‹ค. ๊ฐ๊ฐ์˜ ์ฟผ๋ฆฌ๋งตํ•‘ statement๋Š” ๋‹ค๋ฅธ cacheModel์ด๋‚˜ ๊ฐ™์€๊ฒƒ์„ ์‚ฌ์šฉํ• ์ˆ˜ ์žˆ๋‹ค. cacheModel์š”์†Œ์™€ ๊ทธ๊ฒƒ ์˜ ์†์„ฑ์— ๋Œ€ํ•œ ๋ชจ๋“  ์ƒ์„ธ์„ค๋ช…์€ ๋‚˜์ค‘์— ์–ธ๊ธ‰๋œ๋‹ค. ๋‹ค์Œ ์˜ˆ์ œ๋Š” ์–ด๋–ป๊ฒŒ statement์™€ ๊ด€๋ จ๋˜๋Š”์ง€ ๋ณด์—ฌ์ค€๋‹ค. <cacheModel id="product-cache" imlementation="LRU"> <flushInterval hours="24"/> <flushOnExecute statement="insertProduct"/> <flushOnExecute statement="updateProduct"/> <flushOnExecute statement="deleteProduct"/> 15
  • 16. <property name=โ€sizeโ€ value=โ€1000โ€ /> </cacheModel> <statement id=โ€getProductListโ€ parameterClass=โ€intโ€ cacheModel=โ€product-cacheโ€> select * from PRODUCT where PRD_CAT_ID = #value# </statement> ์œ„ ์˜ˆ์ œ์—์„œ ์บ์‰ฌ๋Š” WEAK์ฐธ์กฐํƒ€์ž…์„ ์‚ฌ์šฉํ•˜๋Š” products๋ฅผ ์œ„ํ•ด ์ •์˜๋˜๊ณ  24์‹œ๊ฐ„๋งˆ๋‹ค ๋˜๋Š” ๊ด€๋ จ๋œ update๋ฌธ์ด ์ˆ˜ํ–‰๋ ๋•Œ ๋งˆ๋‹ค ์ง€์›Œ์ง„๋‹ค(flush) . xmlResultName mapping result๋ฅผ XML๋ฌธ์„œ๋กœ ์ง์ ‘์ ์œผ๋กœ ๋งŒ๋“ค ๋•Œ xmlResultName์˜ ๊ฐ’์€ XML๋ฌธ์„œ์˜ ๊ฐ€์žฅ ์ƒ์œ„ ์š”์†Œ์˜ ์ด๋ฆ„์ด ๋ ๊ฒƒ์ด๋‹ค. ์˜ˆ ๋ฅผ ๋“ค๋ฉด : <select id="getPerson" parameterClass=โ€intโ€ resultClass="xml" xmlResultName=โ€personโ€> SELECT PER_ID as id, PER_FIRST_NAME as firstName, PER_LAST_NAME as lastName, PER_BIRTH_DATE as birthDate, PER_WEIGHT_KG as weightInKilograms, PER_HEIGHT_M as heightInMeters FROM PERSON WHERE PER_ID = #value# </select> ์œ„ select statement๋Š” ๋‹ค์Œ ๊ตฌ์กฐ์˜ XML๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•  ๊ฒƒ์ด๋‹ค. <person> <id>1</id> <firstName>Clinton</firstName> <lastName>Begin</lastName> <birthDate>1900-01-01</birthDate> <weightInKilograms>89</weightInKilograms> <heightInMeters>1.77</heightInMeters> </person> remapResults remapResults ์†์„ฑ์€ <statement>, <select>, ๊ทธ๋ฆฌ๊ณ  <procedure> ์—์„œ ์‚ฌ์šฉ๊ฐ€๋Šฅํ•˜๋‹ค. ์ด๊ฒƒ์€ ์„ ํƒ์ ์ธ ์†์„ฑ์ด๊ณ  ๋””ํดํŠธ๋Š” false์ด๋‹ค. remapResults์†์„ฑ์€ ์ฟผ๋ฆฌ๊ฐ€ ๋ฐ˜ํ™˜ ์นผ๋Ÿผ์˜ ๋‹ค์–‘ํ•œ ์„ธํŠธ๋ฅผ ๊ฐ€์งˆ๋•Œ true์…‹ํŒ…๋˜์–ด์•ผ๋งŒ ํ•œ๋‹ค. ๋‹ค์Œ ์ฟผ๋ฆฌ๋ฅผ ๋ณด์ž. SELECT $fieldList$ FROM table ์ด์ „ ์˜ˆ์ œ์—์„œ ์นผ๋Ÿผ์˜ ๋ชฉ๋ก์€ ํ…Œ์ด๋ธ”์ด ์–ธ์ œ๋‚˜ ๊ฐ™๋”๋ผ๋„ ๋™์ ์ด๋‹ค. SELECT * FROM $sometable$ ์ด์ „ ์˜ˆ์ œ์—์„œ ํ…Œ์ด๋ธ”์€ ๋‹ค๋ฅผ์ˆ˜ ์žˆ๋‹ค. Select์ ˆ์˜ * ์‚ฌ์šฉ๋•Œ๋ฌธ์—, ๊ฒฐ๊ณผ์ ์ธ ์นผ๋Ÿผ์ด๋ฆ„์€ ๋‹ค๋ฅผ์ˆ˜ ์žˆ๋‹ค. ๋™์  ์š”์†Œ๋Š” ํ•˜๋‚˜์˜ ์ฟผ๋ฆฌ ์ˆ˜ํ–‰์—์„œ ๋‹ค์Œ ์ˆ˜ํ–‰๊นŒ์ง€ ๋ณ€๊ฒฝํ•˜๊ธฐ ์œ„ํ•œ ๋ชฉ๋ก์„ ์•ผ๊ธฐํ• ์ˆ˜์žˆ๋‹ค. resultset๋ฉ”ํƒ€๋ฐ์ดํƒ€๋ฅผ ์•Œ๊ณ /ํŒ๋‹จํ•˜๊ธฐ ์œ„ํ•œ ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ๋ช…๋ฐฑํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์—, iBATIS๋Š” ๋งˆ์ง€๋ง‰ ์ฟผ๋ฆฌ ์ˆ˜ํ–‰์— ๋ฐ˜ํ™˜๋œ ๊ฒƒ๋งŒ์„ ๊ธฐ ์–ตํ• ๊ฒƒ์ด๋‹ค. ์ด๊ฒƒ์€ ์œ„ ์˜ˆ์ œ์™€ ๋น„์Šทํ•œ ์ƒํ™ฉ์—์„œ ๋ฌธ์ œ๋ฅผ ๋ฐœ์ƒ์‹œํ‚จ๋‹ค. 16
  • 17. ๋งŒ์•ฝ ๋ฐ˜ํ™˜ ์นผ๋Ÿผ์ด ๋ณ€๊ฒฝ๋œ๋‹ค๋ฉด, remapResults๋ฅผ true๋กœ ์…‹ํŒ…ํ•˜๋ผ. ๊ทธ๋ ‡์ง€ ์•Š๋‹ค๋ฉด ๋ฉ”ํƒ€๋ฐ์ดํƒ€ ๊ฒ€์ƒ‰์˜ ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ์ œ๊ฑฐํ•˜๊ธฐ ์œ„ํ•ด remapResults๋ฅผ false๋กœ ์…‹ํŒ…ํ•˜๋ผ. resultSetType SQL๊ตฌ๋ฌธ์˜ resultSetType์„ ๋ช…์‹œํ•˜๊ธฐ ์œ„ํ•ด, ๋‹ค์Œ์„ ์‚ฌ์šฉํ• ์ˆ˜ ์žˆ๋‹ค. โ€ข FORWARD_ONLY: ์ปค์„œ๋Š” ์•ž์ชฝ์œผ๋กœ๋งŒ ์ด๋™ํ•œ๋‹ค. โ€ข SCROLL_INSENSITIVE: ์ปค์„œ๋Š” ์Šคํฌ๋กค๊ฐ€๋Šฅํ•˜์ง€๋งŒ ๋‹ค๋ฅธ๊ฒƒ์— ์˜ํ•œ ๋ณ€๊ฒฝ์—๋Š” ๋Œ€๊ฐœ ๋ฏผ๊ฐํ•˜์ง€ ์•Š๋‹ค. โ€ข SCROLL_SENSITIVE: ์ปค์„œ๋Š” ์Šคํฌ๋กค๊ฐ€๋Šฅํ•˜๊ณ  ๋‹ค๋ฅธ๊ฒƒ์— ์˜ํ•œ ๋ณ€๊ฒฝ์— ๋Œ€๊ฐœ ๋ฏผ๊ฐํ•˜๋‹ค. resultSetType์€ ๋Œ€๊ฐœ ์š”๊ตฌ๋˜์ง€ ์•Š๋Š”๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์„œ๋กœ ๋‹ค๋ฅธ JDBC๋“œ๋ผ์ด๋ฒ„๋Š” ๊ฐ™์€ resultSetType์…‹ํŒ…์„ ์‚ฌ์šฉํ•˜๋”๋ผ๋„ ๋‹ค๋ฅด๊ฒŒ ํ–‰ ๋™ํ• ๊ฒƒ์ด๋‹ค. (์ด๋ฅผํ…Œ๋ฉด. Oracle์€ SCROLL_SENSITIVE๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š๋Š”๋‹ค.). fetchSize SQL๊ตฌ๋ฌธ์˜ fetchSize๋ฅผ ์…‹ํŒ…ํ•˜๋Š” ๊ฒƒ์€ ์ˆ˜ํ–‰๋ ๊ฒƒ์ด๋‹ค. ์ด๊ฒƒ์€ JDBC๋“œ๋ผ์ด๋ฒ„์— ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์„œ๋ฒ„๋กœ์˜ ์™•๋ณต์„ ์ค„์ด๊ธฐ ์œ„ํ•ด prefetching ํžŒํŠธ๋ฅผ ์ œ๊ณตํ•œ๋‹ค. ํŒŒ๋ผ๋ฏธํ„ฐ Maps ์™€ ์ธ๋ผ์ธ ํŒŒ๋ผ๋ฏธํ„ฐ ๋‹น์‹ ์ด ์œ„์—์„œ ๋ณธ๊ฒƒ์ฒ˜๋Ÿผ parameterMap๋Š” ์ž๋ฐ”๋นˆ์ฆˆ ํ”„๋ผํผํ‹ฐ๋ฅผ statement์˜ ํ”„๋ผํผํ‹ฐ์— ๋งตํ•‘์‹œํ‚ค๋Š” ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•œ๋‹ค. ๋น„ ๋ก parameterMaps๊ฐ€ ์™ธ๋ถ€ํ˜•ํƒœ๋‚ด์— ๋“œ๋ฌผ๊ฒŒ ๋ฐœ์ƒํ•˜๋”๋ผ๋„ ๊ทธ๊ฒƒ๋“ค์ด ๋‹น์‹ ์—๊ฒŒ ์ธ๋ผ์ธ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์ดํ•ดํ•˜๋„๋ก ๋„์™€์ค€๋‹ค๋Š” ๊ฒƒ์„ ์ดํ•ดํ•˜๋ผ. <parameterMap id=โ€parameterMapNameโ€ [class=โ€com.domain.Productโ€]> <parameter property =โ€propertyNameโ€ [jdbcType=โ€VARCHARโ€] [javaType=โ€stringโ€] [nullValue=โ€NUMERICโ€] [null=โ€-9999999โ€] [typeName=โ€{REF or user-defined type}โ€/> <parameter โ€ฆโ€ฆ /> <parameter โ€ฆโ€ฆ /> </parameterMap> [๊ด„ํ˜ธ]๋‚ด์˜ ๋ถ€๋ถ„์€ ์˜ต์…˜์ด๋‹ค. parameterMap๋Š” ์Šค์Šค๋กœ๋Š” statement๊ฐ€ ๊ทธ๊ฒƒ์„ ์ฐธ์กฐํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๊ตฌ๋ถ„์ž๋กœ์จ ๋‹จ์ง€ id์†์„ฑ ๋งŒ ํ•„์š”ํ•˜๋‹ค. Class์†์„ฑ์€ ์˜ต์…˜์ด์ง€๋งŒ ํฌ๊ฒŒ ์‚ฌ์šฉ์ด ์ถ”์ฒœ๋˜๋Š” ๊ฒƒ์ด๋‹ค. Statement์˜ parameterClass์†์„ฑ๊ณผ ์œ ์‚ฌํ•˜๊ฒŒ class์† ์„ฑ์€ ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ์„ฑ๋Šฅ์„ ์œ„ํ•ด ์—”์ง„์„ ์ตœ์ ํ™”ํ•˜๋Š” ๊ฒƒ๋งŒํผ ๋“ค์–ด์˜ค๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์ฒดํฌํ•˜๋„๋ก ํ•œ๋‹ค. <parameter> ์š”์†Œ parameterMap์€ statement์˜ ํŒŒ๋ผ๋ฏธํ„ฐ์— ์ง์ ‘ ๋งตํ•‘ํ•˜๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ๋งตํ•‘์˜ ์–ด๋–ค ์ˆซ์ž๋ฅผ ํฌํ•จํ•œ๋‹ค. ๋‹ค์Œ์˜ ์ผ๋ถ€ ์„น์…˜์€ property ์š”์†Œ์˜ ์†์„ฑ์„ ์„œ์ˆ ํ•œ๋‹ค. property ํŒŒ๋ผ๋ฏธํ„ฐ map์˜ property์†์„ฑ์€ ๋งตํ•‘๋œ statement์— ์ „๋‹ฌ๋˜๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ์ฒด์˜ ์ž๋ฐ”๋นˆ์ฆˆ ํ”„๋ผํผํ‹ฐ(get๋ฉ”์†Œ๋“œ)์˜ ์ด๋ฆ„์ด๋‹ค. ๊ทธ ์ด๋ฆ„์€ statement๋‚ด์— ํ•„์š”ํ•œ ํšŸ์ˆ˜์— ์˜์กดํ•˜๋Š”๊ฒƒ๋ณด๋‹ค ์ข€๋” ์‚ฌ์šฉ๋ ์ˆ˜ ์žˆ๋‹ค. jdbcType jdbcType์†์„ฑ์€ ์ด ํ”„๋ผํผํ‹ฐ์— ์˜ํ•ด ์…‹ํŒ…๋˜๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ์˜ ์นผ๋Ÿผํƒ€์ž…์„ ๋ช…์‹œ์ ์œผ๋กœ ์ •์˜ํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋œ๋‹ค. ๋ช‡๋ช‡ JDBC๋“œ๋ผ์ด ๋ฒ„๋Š” ๋ช…์‹œ์ ์ธ ๋“œ๋ผ์ด๋ฒ„ ์นผ๋Ÿผํƒ€์ž…์„ ๋ถ€๋ฅด๋Š” ๊ฒƒ ์—†์ด ์–ด๋–ค ์ž‘๋™์„ ์œ„ํ•ด ์นผ๋Ÿผ์˜ ํƒ€์ž…์„ ํ™•์ธํ• ์ˆ˜ ์—†๋‹ค. ์ด๊ฒƒ์˜ ์™„๋ฒฝํ•œ ์˜ˆ์ œ๋Š” PreparedStatement.setNull(int parameterIndex, int sqlType) ๋ฉ”์†Œ๋“œ์ด๋‹ค. ์ด ๋ฉ”์†Œ๋“œ๋Š” ์ •์˜ํ•˜๊ธฐ ์œ„ํ•œ ํƒ€์ž…์„ ์š”๊ตฌํ•œ๋‹ค. ๋ช‡ ๋ช‡ ๋“œ๋ผ์ด๋ฒ„๋Š” ๊ฐ„๋‹จํ•˜๊ฒŒ Types.OTHER ๋˜๋Š” Types.NULL์„ ๋ณด๋ƒ„์œผ๋กœ์จ ํ•จ์ถ•๋˜๋Š” ํƒ€์ž…์„ ํ—ˆ๋ฝํ•œ๋‹ค. ์–ด์จŒ๋“  ํ–‰์œ„๋Š” ๋น„์ผ๊ด€์  ์ด๊ณ  ๋ช‡๋ช‡ ๋“œ๋ผ์ด๋ฒ„๋Š” ์ •์˜๋˜๊ธฐ ์œ„ํ•œ ์ •ํ™•ํ•œ ํƒ€์ž…์„ ํ•„์š”๋กœํ•œ๋‹ค. ๊ทธ๋Ÿฐ ๊ฒฝ์šฐ๋ฅผ ์œ„ํ•ด์„œ SQL Maps API๋Š” parameterMapํ”„๋ผ ํผํ‹ฐ ์š”์†Œ์˜ jdbcType ์†์„ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ •์˜๋˜๊ธฐ ์œ„ํ•œ ํƒ€์ž…์„ ํ—ˆ๋ฝํ•œ๋‹ค. ์ด ์†์„ฑ์€ ์นผ๋Ÿผ์ด null์ด ๊ฐ€๋Šฅํ•  ๋•Œ(nullable)๋งŒ ์š”๊ตฌ๋œ๋‹ค. Type์†์„ฑ์„ ์‚ฌ์šฉํ•˜๋Š” ๋‹ค๋ฅธ ์ด์œ ๋Š” ๋ช…์‹œ์ ์œผ๋กœ dateํƒ€์ž…์„ ์ •์˜ํ•˜ 17
  • 18. ๋Š” ๊ฒƒ์ด๋‹ค. ์ž๋ฐ”๋Š” ๋‹จ์ง€ ํ•˜๋‚˜์˜ Date๊ฐ’ํƒ€์ž…(java.util.Date)์„ ๊ฐ€์ง€๋Š”๋ฐ ๋ฐ˜ํ•ด ๋Œ€๊ฐœ์˜ SQL๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” ๋งŽ์€, ๋Œ€๊ฐœ ์ตœ์†Œ 3๊ฐ€ ์ง€ ์ด์ƒ์˜ ํƒ€์ž…์„ ๊ฐ€์ง„๋‹ค. ๋‹น์‹ ์˜ ์นผ๋Ÿผ ํƒ€์ž…์ด DATE๋‚˜ DATETIME์ค‘์— ํ•˜๋‚˜๋กœ ๋ช…์‹œ์ ์œผ๋กœ ์ •์˜ํ•˜๊ธธ ๋ฐ”๋ž„์ง€๋„ ๋ชจ๋ฅด๊ธฐ ๋•Œ๋ฌธ์ด ๋‹ค. jdbcType ์†์„ฑ์€ JDBCํƒ€์ž… ํด๋ž˜์Šค๋‚ด ๋ณ€์ˆ˜์™€ ๋งค์น˜๋˜๋Š” ์–ด๋–ค ๋ฌธ์ž์—ด๊ฐ’์— ์…‹ํŒ…๋ ์ˆ˜ ์žˆ๋‹ค. ๋น„๋ก ์ด๊ฒƒ์€ ๊ทธ๊ฒƒ๋“ค์ค‘์— ์–ด๋–ค๊ฒƒ ์— ์…‹ํŒ…๋ ์ˆ˜ ์žˆ์ง€๋งŒ ๋ช‡๋ช‡ ํƒ€์ž…์€ ์ง€์›๋˜์ง€ ์•Š๋Š”๋‹ค(์ด๋ฅผ ํ…Œ๋ฉด blobs). ์ด ๋ฌธ์„œ์˜ ๋‚˜์ค‘ ์„น์…˜์—์„œ ํ”„๋ ˆ์ž„์›Œํฌ์— ์˜ํ•ด ์ง€์›๋˜ ๋Š” ํƒ€์ž…์— ๋Œ€ํ•ด์„œ ์„œ์ˆ ํ•œ๋‹ค. ์ฃผ์˜! ๋Œ€๋ถ€๋ถ„์˜ ๋“œ๋ผ์ด๋ฒ„๋Š” ๋‹จ์ง€ null์ด ๊ฐ€๋Šฅํ•œ ์นผ๋Ÿผ์„ ์œ„ํ•ด ์ •์˜๋˜๋Š” ํƒ€์ž…์„ ํ•„์š”๋กœ ํ•œ๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ ๊ทธ๋Ÿฐ ๋“œ๋ผ์ด๋ฒ„๋ฅผ ์œ„ํ•ด ๋‹น์‹ ์€ null์ด ๊ฐ€๋Šฅํ•œ ์นผ๋Ÿผ์„ ์œ„ํ•ด ํƒ€์ž…์„ ์ •์˜ํ•  ํ•„์š”๊ฐ€ ์žˆ๋‹ค. ์ฃผ์˜! ์˜ค๋ผํด ๋“œ๋ผ์ด๋ฒ„๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ๋‹น์‹ ์€ ์ด๊ฒƒ์˜ ํƒ€์ž…์„ ์ •์˜ํ•˜์ง€ ์•Š๊ณ ์„œ๋Š” ์นผ๋Ÿผ์— null๊ฐ’์„ ๋„ฃ์„ ๋•Œ โ€œInvalid column typeโ€ ์—๋Ÿฌ๋ฅผ ๋ณด๊ฒŒ๋ ๊ฒƒ์ด๋‹ค. javaType javaType ์†์„ฑ์€ ์…‹ํŒ…๋˜๊ธฐ ์œ„ํ•œ ํŒŒ๋ผ๋ฏธํ„ฐ์˜ ์ž๋ฐ” ํ”„๋ผํผํ‹ฐ๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ์ •์˜ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋œ๋‹ค. ๋Œ€๊ฒŒ ์ด๊ฒƒ์€ ๋ฆฌํ”Œ๋ ‰์…˜ (reflection)์„ ํ†ตํ•ด ์ž๋ฐ”๋นˆ์ฆˆ ํ”„๋ผํผํ‹ฐ๋กœ๋ถ€ํ„ฐ ํŒŒ์ƒ๋œ๋‹ค. ํ•˜์ง€๋งŒ Map๊ณผ XML๋งตํ•‘ ๊ฐ™์€ ํŠน์ • ๋งตํ•‘์€ ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์œ„ํ•œ ํƒ€์ž… ์„ ์ œ๊ณตํ•˜์ง€ ์•Š๋Š”๋‹ค. ๋งŒ์•ฝ javaType๊ฐ€ ์…‹ํŒ…๋˜์ง€ ์•Š๊ณ  ํ”„๋ ˆ์ž„์›Œํฌ๋„ ์–ด๋–คํƒ€์ž…์ธ์ง€ ๊ตฌ๋ณ„ํ• ์ˆ˜ ์—†๋‹ค๋ฉด ํƒ€์ž…์€ ๊ฐ์ฒด๋กœ ๊ฐ„์ฃผ๋  ๊ฒƒ์ด๋‹ค. typeName typeName ์†์„ฑ์€ REFํƒ€์ž…์ด๋‚˜ ์‚ฌ์šฉ์ž ์ •์˜ ํƒ€์ž…์„ ๋ช…์‹œํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋œ๋‹ค. javadoc์— ๋ณด๋ฉด.. typeName ์†์„ฑ์€ ์‚ฌ์šฉ์ž-์ •์˜๋‚˜ REF์ถœ๋ ฅ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์œ„ํ•ด ์‚ฌ์šฉ๋œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด, ์‚ฌ์šฉ์ž-์ •์˜ ํƒ€์ž…์€ STRUCT, DISTINCT, JAVA_OBJECT, ๊ทธ๋ฆฌ๊ณ  ๋ช…๋ช…๋œ ๋ฐฐ์—ด ํƒ€์ž…์„ ํฌํ•จํ•œ๋‹ค. ์‚ฌ์šฉ์ž-์ •์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์œ„ํ•ด, ํŒŒ๋ผ๋ฏธํ„ฐ์˜ ์ „์ฒด ๊ฒฝ๋กœ๊ฐ€ ํฌํ•จ๋œ SQLํƒ€์ž… ๋ช…์ด ์ฃผ์–ด์ง„๋‹ค. ๋ฐ˜๋ฉด์— REFํŒŒ๋ผ๋ฏธํ„ฐ๋Š” ์ฃผ์–ด์ง„ ์ฐธ์กฐํƒ€์ž…์˜ ์ „์ฒด ๊ฒฝ๋กœ๊ฐ€ ํฌํ•จ๋œ ํƒ€์ž…๋ช…์„ ์š”๊ตฌํ•œ๋‹ค. JDBC๋“œ๋ผ์ด๋ฒ„๋Š” ํƒ€์ž…์ฝ”๋“œ ๋ฅผ ํ•„์š”๋กœ ํ•˜์ง€ ์•Š์œผ๋ฉฐ ํƒ€์ž…๋ช… ์ •๋ณด๋Š” ์ด๊ฒƒ์„ ๋ฌด์‹œํ•œ๋‹ค. ์ด์‹๊ฐ€๋Šฅํ•˜๊ธฐ ์œ„ํ•ด, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ์ด๋Ÿฌํ•œ ์‚ฌ์šฉ์ž์ •์˜์™€ REFํŒŒ๋ผ๋ฏธ ํ„ฐ๋ฅผ ์œ„ํ•œ ๊ฐ’์„ ์ œ๊ณตํ•ด์•ผ๋งŒ ํ•œ๋‹ค. ๋น„๋ก ์ด๊ฒƒ์ด ์‚ฌ์šฉ์ž-์ •์˜์™€ REFํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ๋˜๋”๋ผ๋„, ์ด ์†์„ฑ์€ JDBCํƒ€์ž…์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๋“ฑ ๋กํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋œ๋‹ค. ๋งŒ์•ฝ ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ์‚ฌ์šฉ์ž-์ •์˜๋‚˜ REFํƒ€์ž…์„ ๊ฐ€์ง€์ง€ ์•Š๋Š”๋‹ค๋ฉด, typeNameํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๋ฌด์‹œ๋œ๋‹ค. nullValue nullValue ์†์„ฑ์€ ์–ด๋–ค ์œ ํšจํ•œ ๊ฐ’(ํ”„๋ผํผํ‹ฐ ํƒ€์ž…์— ๊ธฐ์ดˆ๋กœ ํ•ด์„œ)์— ์…‹ํŒ…ํ• ์ˆ˜ ์žˆ๋‹ค. null ์†์„ฑ์€ null๊ฐ’ ๋Œ€์ฒด๋ฅผ ์ •์˜ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ ์šฉ๋œ๋‹ค. ์ด๊ฒƒ์ด ์˜๋ฏธํ•˜๋Š” ๊ฒƒ์€ ์ž๋ฐ”๋นˆ์ฆˆ ํ”„๋ผํผํ‹ฐ๋‚ด์—์„œ ๊ฒ€์ƒ‰๋˜๋Š” ๊ฐ’์ธ NULL์ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์“ฐ์—ฌ์งˆ๊ฒƒ์ด๋ผ๋Š”๊ฒƒ์ด๋‹ค(๋“ค์–ด ์˜ค๋Š” null๊ฐ’ ๋Œ€์ฒด์˜ ์ƒ๋ฐ˜๋œ ํ–‰์œ„). ์ด๊ฒƒ์€ ๋‹น์‹ ์—๊ฒŒ null๊ฐ’์„ ์ง€์›ํ•˜์ง€ ์•Š๋Š” ํƒ€์ž…(์ด๋ฅผ ํ…Œ๋ฉด int, double, float๋“ฑ๋“ฑ)์„ ์œ„ํ•ด ๋‹น์‹  ์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๋‚ด์— โ€œmagicโ€ null ์ˆซ์ž๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ํ—ˆ๋ฝํ•œ๋‹ค. ํ”„๋ผํผํ‹ฐ์˜ ๊ทธ๋Ÿฐ ํƒ€์ž…์€ ์ ํ•ฉํ•œ null๊ฐ’์„ ํฌํ•จํ•  ๋•Œ NULL์€ ๊ฐ’ ๋Œ€์‹ ์— ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์“ฐ์—ฌ์งˆ๊ฒƒ์ด๋‹ค. <parameterMap> ์˜ˆ์ œ ๋ชจ๋“  ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” parameterMap์˜ ์˜ˆ์ œ๊ฐ€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค. <parameterMap id=โ€insert-product-paramโ€ class=โ€com.domain.Productโ€> <parameter property=โ€idโ€ jdbcType=โ€NUMERICโ€ javaType=โ€intโ€ nullValue=โ€-9999999โ€/> <parameter property=โ€descriptionโ€ jdbcType=โ€VARCHARโ€ nullValue=โ€NO_ENTRYโ€/> </parameterMap> <statement id=โ€insertProductโ€ parameterMap=โ€insert-product-paramโ€> insert into PRODUCT (PRD_ID, PRD_DESCRIPTION) values (?,?); </statement> ์œ„ ์˜ˆ์ œ์—์„œ ์ž๋ฐ”๋นˆ์ฆˆ ํ”„๋ผํผํ‹ฐ์ธ id ์™€ description๋Š” ๋ชฉ๋กํ™”๋˜๋Š” ์ˆœ์„œ๋Œ€๋กœ ๋งตํ•‘๋œ Statement ์ธ insertProduct ์˜ ํŒŒ๋ผ๋ฏธํ„ฐ ์— ์ ์šฉ๋ ๊ฒƒ์ด๋‹ค. ๊ทธ๋ž˜์„œ id๋Š” ์ฒซ๋ฒˆ์งธ ํŒŒ๋ผ๋ฏธํ„ฐ(?)์— ์ ์šฉ๋˜๊ณ  description ๋Š” ๋‘๋ฒˆ์งธ ํŒŒ๋ผ๋ฏธํ„ฐ์— ์ ์šฉ๋œ๋‹ค. ๋งŒ์•ฝ์— ์ˆœ์„œ๊ฐ€ ๋ฐ˜ 18
  • 19. ๋Œ€๋ผ๋ฉด XML์€ ๋‹ค์Œ์ฒ˜๋Ÿผ ๋ณด์ผ๊ฒƒ์ด๋‹ค. <parameterMap id=โ€insert-product-paramโ€ class=โ€com.domain.Productโ€> <parameter property=โ€descriptionโ€ /> <parameter property=โ€idโ€/> </parameterMap> <statement id=โ€insertProductโ€ parameterMap=โ€insert-product-paramโ€> insert into PRODUCT (PRD_DESCRIPTION, PRD_ID) values (?,?); </statement> ์ฃผ์˜! Parameter Map ์ด๋ฆ„์€ ์ •์˜๋œ SQL Map XMLํŒŒ์ผ์— ์œ„์น˜ํ•œ๋‹ค. ๋‹น์‹ ์€ SQL Map(<sqlMap> rootํƒœ๊ทธ์— ์…‹ํŒ…๋œ)์˜ id์™€ ํ•จ๊ป˜ ํŒŒ๋ผ๋ฏธํ„ฐ Map์˜ id๋ฅผ ์•ž์— ๋ถ™์ž„์œผ๋กœ์จ ๋‹ค๋ฅธ SQL Map XMLํŒŒ์ผ๋‚ด์— ํŒŒ๋ผ๋ฏธํ„ฐ Map์„ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค๋ฅธ ํŒŒ ์ผ๋กœ๋ถ€ํ„ฐ ์œ„์˜ ํŒŒ๋ผ๋ฏธํ„ฐ map๋ฅผ ์ฐธ์กฐํ•˜๊ธฐ ์œ„ํ•ด ์ฐธ์กฐํ•˜๊ธฐ ์œ„ํ•œ ์ „์ฒด์ด๋ฆ„์€ โ€œProduct.insert-product-paramโ€์ด ๋ ๊ฒƒ์ด๋‹ค. ์ธ๋ผ์ธ ํŒŒ๋ผ๋ฏธํ„ฐ Maps ๋งค์šฐ ์ƒ์„ธํ•œ ์„ค๋ช…์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  parameterMaps์„ ์„ ์–ธํ•˜๊ธฐ ์œ„ํ•œ ์œ„์˜ ๋ฌธ๋ฒ•์€ ๋งค์šฐ ์žฅํ™ฉํ•˜๋‹ค. ํŒŒ๋ผ๋ฏธํ„ฐ Maps์„ ์œ„ํ•œ ์ •์˜ (definition)์„ ๊ฐ„๋‹จํ•˜๊ฒŒ ํ•˜๊ณ  ์ฝ”๋“œ๋ฅผ ์ค„์ผ์ˆ˜ ์žˆ๋Š” ์ข€๋” ๋‹ค์–‘ํ•œ ๋ฌธ๋ฒ•์ด ์žˆ๋‹ค. ๊ทธ ๋Œ€์•ˆ์ ์ธ ๋ฌธ๋ฒ•์€ ์ž๋ฐ”๋นˆ์ฆˆ ํ”„๋ผํผํ‹ฐ์ด๋ฆ„์„ ๋งต ํ•‘๋œ statement์— ์ธ๋ผ์ธ์‹œํ‚ค๋Š” ๊ฒƒ์ด๋‹ค. ์ดˆ๊ธฐ์„ค์ •์— ์˜ํ•ด ๋ช…์‹œ์ ์œผ๋กœ ์ •์˜๋œ parameterMap ์ด ์—†๋Š” ์–ด๋–ค ๋งตํ•‘๋œ statement ๋Š” ์ธ๋ผ์ธ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์œ„ํ•ด ํŒŒ์‹ฑ๋ ๊ฒƒ์ด๋‹ค. ์ด์ „์˜ ์ธ๋ผ์ธ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๊ตฌํ˜„ํ•œ ์˜ˆ์ œ(์ด๋ฅผ ํ…Œ๋ฉด Product)๋Š” ๋‹ค์Œ์ฒ˜๋Ÿผ ๋ณด์ผ๊ฒƒ์ด ๋‹ค. <statement id=โ€insertProductโ€ parameterClass=โ€com.domain.Productโ€> insert into PRODUCT (PRD_ID, PRD_DESCRIPTION) values (#id#, #description#); </statement> ํƒ€์ž…์„ ์„ ์–ธํ•˜๋Š” ๊ฒƒ์€ ๋‹ค์Œ์˜ ๋ฌธ๋ฒ•์„ ์‚ฌ์šฉํ•จ์œผ๋กœ์จ ์ธ๋ผ์ธ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ํ• ์ˆ˜ ์žˆ๋‹ค. <statement id=โ€insertProductโ€ parameterClass=โ€com.domain.Productโ€> insert into PRODUCT (PRD_ID, PRD_DESCRIPTION) values (#id:NUMERIC#, #description:VARCHAR#); </statement> ํƒ€์ž…์„ ์„ ์–ธํ•˜๋Š” ๊ฒƒ๊ณผ null๊ฐ’ ๋Œ€์ฒด๋Š” ๋‹ค์Œ ๋ฌธ๋ฒ•์„ ์‚ฌ์šฉํ•จ์œผ๋กœ์จ ์ธ๋ผ์ธ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ํ• ์ˆ˜ ์žˆ๋‹ค. <statement id=โ€insertProductโ€ parameterClass=โ€com.domain.Productโ€> insert into PRODUCT (PRD_ID, PRD_DESCRIPTION) values (#id:NUMERIC:-999999#, #description:VARCHAR:NO_ENTRY#); </statement> ์ฃผ์˜! ์ธ๋ผ์ธ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ๋‹น์‹ ์€ ํƒ€์ž…์ •์˜์—†์ด null๊ฐ’ ๋Œ€์ฒด๋ฅผ ๋ช…์‹œํ• ์ˆ˜ ์—†๋‹ค. ๋‹น์‹ ์€ ์ˆœ์„œ๋Œ€๋กœ ํŒŒ์‹ฑํ•˜๊ธฐ ์œ„ํ•ด ๋‘˜๋‹ค ๋ช…์‹œํ•ด์•ผ ํ•œ๋‹ค. ์ฃผ์˜! Null๊ฐ’์˜ ์™„์ „ํ•œ ํˆฌ๋ช…์„ฑ์„ ์›ํ•œ๋‹ค๋ฉด ๋‹น์‹ ์€ ์ด ๋ฌธ์„œ์˜ ๋‚˜์ค‘์— ์„ค๋ช…๋˜๋Š”๊ฒƒ์ฒ˜๋Ÿผ ๋‹น์‹ ์˜ result maps๋‚ด์— null๊ฐ’ ๋Œ€์ฒด๋ฅผ ๋ฐ˜๋“œ์‹œ ๋ช…์‹œํ•ด์•ผ ํ•œ๋‹ค. ์ฃผ์˜! ๋‹น์‹ ์ด ๋งŽ์€ ์ˆ˜์˜ ํƒ€์ž… ์„œ์ˆ ์ž์™€ null๊ฐ’ ๋Œ€์ฒด๊ฐ€ ํ•„์š”ํ•˜๋‹ค๋ฉด ๋‹น์‹ ์€ ์™ธ๋ถ€์ ์ธ ๊ฒƒ์„ ์‚ฌ์šฉํ•ด์„œ ์ฝ”๋“œ๋ฅผ ์ •๋ฆฌํ• ์ˆ˜ ์žˆ์–ด ์•ผ ํ• ๊ฒƒ์ด๋‹ค. ์›์‹œํƒ€์ž… ํŒŒ๋ผ๋ฏธํ„ฐ ํŒŒ๋ผ๋ฏธํ„ฐ์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ์ž๋ฐ”๋นˆ์„ ์“ฐ๋Š” ๊ฒƒ์€ ์–ธ์ œ๋‚˜ ํ•„์š”ํ•˜๊ณ  ํŽธ๋ฆฌํ•œ ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค. ์ด๋Ÿฐ ๊ฒฝ์šฐ์— ๋‹น์‹ ์€ ์ง์ ‘์ ์œผ๋กœ ํŒŒ ๋ผ๋ฏธํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๊ฒƒ์ฒ˜๋Ÿผ ์›์‹œํƒ€์ž… ๋ž˜ํผ๊ฐ์ฒด(String, Integer, Date๋“ฑ๋“ฑ)๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ํ™˜์˜ํ• ๊ฒƒ์ด๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด : 19
  • 20. <statement id=โ€insertProductโ€ parameter=โ€java.lang.Integerโ€> select * from PRODUCT where PRD_ID = #value# </statement> PRD_ID๊ฐ€ ์ˆซ์ž ํƒ€์ž…์ด๋ผ๊ณ  ๊ฐ€์ •ํ•˜์ž. ํ˜ธ์ถœ์ด ๋˜์—ˆ์„ ๋•Œ java.lang.Integer๊ฐ์ฒด๋ฅผ ์ „๋‹ฌํ• ์ˆ˜ ์žˆ๋Š” ๋งตํ•‘๋œ statement๋ฅผ ๋งŒ๋“ค๊ฒƒ ์ด๋‹ค. #value# ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” Integer์ธ์Šคํ„ด์Šค์˜ ๊ฐ’์œผ๋กœ ๋Œ€์ฒด๋ ๊ฒƒ์ด๋‹ค. โ€œvalueโ€๋ผ๋Š” ์ด๋ฆ„์€ ๊ฐ„๋‹จํ•œ ๋ฌธ๋ฒ•(์ด๋ฅผ ํ…Œ๋ฉด ๊ด„ํ˜ธ)์•ˆ ์˜ ์š”์†Œ์ด๊ณ  ๋ณ„๋ช…์ด ๋ ์ˆ˜ ์žˆ๋‹ค. Result Map๋Š” result์ฒ˜๋Ÿผ ์›์‹œํƒ€์ž…์„ ์ž˜ ์ง€์›ํ•œ๋‹ค. ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์›์‹œํƒ€์ž…์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด์„œ ์ข€๋” ๋‹ค์–‘ํ•œ ์ •๋ณด๋ฅผ ์œ„ํ•ด์„œ๋Š” Result Map์„น์…˜๊ณผ ํ”„๋กœ๊ทธ๋ž˜๋ฐ SQL Maps(API)๋ฅผ ๋ณด๋ผ. ์›์‹œ ํƒ€์ž…์€ ์ข€๋” ๊ฐ„๊ฒฐํ•œ ์ฝ”๋“œ๋ฅผ ์œ„ํ•ด์„œ ๋ณ„์นญ๋œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด โ€œintโ€๋Š” โ€œjava.lang.Integerโ€๋Œ€์‹ ์— ์‚ฌ์šฉ๋ ์ˆ˜ ์žˆ๋‹ค. ๋ณ„์นญ์€ ์•„ ๋ž˜์˜ โ€œํŒŒ๋ผ๋ฏธํ„ฐ Map๊ณผ result Map์„ ์œ„ํ•ด ์ง€์›๋˜๋Š” ํƒ€์ž…โ€ ์ด๋ผ๋Š” ์ œ๋ชฉ์˜ ํ…Œ์ด๋ธ”์—์„œ ์ด์•ผ๊ธฐ ๋œ๋‹ค. Map ํƒ€์ž… ํŒŒ๋ผ๋ฏธํ„ฐ ๋‹น์‹ ์ด ์ž๋ฐ”๋นˆ์ฆˆ ํด๋ž˜์Šค๋ฅผ ์“ฐ๋Š” ๊ฒƒ์ด ํ•„์š”ํ•˜์ง€ ์•Š๊ฑฐ๋‚˜ ํŽธ๋ฆฌํ•˜์ง€ ์•Š์€ ์œ„์น˜์— ์žˆ๊ณ  ํ•˜๋‚˜์˜ ์›์‹œํƒ€์ž… ํŒŒ๋ผ๋ฏธํ„ฐ์„ ์“ฐ์ง€๋Š” ์•Š ๋Š”๋‹ค๋ฉด ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ์ฒด๋กœ Map(์ด๋ฅผ ํ…Œ๋ฉด HashMap, TreeMap)์„ ์‚ฌ์šฉํ• ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด : <statement id=โ€insertProductโ€ parameterClass=โ€java.util.Mapโ€> select * from PRODUCT where PRD_CAT_ID = #catId# and PRD_CODE = #code# </statement> ๋งตํ•‘๋œ statement๊ตฌํ˜„๋‚ด์—์„œ๋Š” ์ฐจ์ด์ ์ด ์—†๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๋ผ. ์œ„์˜ ์˜ˆ์ œ์—์„œ ๋งŒ์•ฝ Map์ธ์Šคํ„ด์Šค๊ฐ€ statement๋ฅผ ์œ„ํ•œ ํ˜ธ์ถœ๋กœ ์ „ ๋‹ฌ๋˜์—ˆ๋‹ค๋ฉด Map์€ โ€œcatIdโ€ ๊ณผ โ€œcodeโ€ ๋ผ๋Š” ์ด๋ฆ„์˜ ํ‚ค๋ฅผ ํฌํ•จํ•ด์•ผ๋งŒ ํ•œ๋‹ค. ์ด ๊ฐ’์€ Integer๊ณผ String๊ณผ ๊ฐ™์€ ์„ ํ˜ธ๋˜๋Š” ํƒ€์ž…์ด ๋˜ ๋Š” ๊ทธ๋Ÿฐ ํ‚ค์— ์˜ํ•ด ์ฐธ์กฐ๋œ๋‹ค. Result Map์€ result์ฒ˜๋Ÿผ Mapํƒ€์ž…์„ ์•„์ฃผ ์ž˜ ์ง€์›ํ•œ๋‹ค. ํŒŒ๋ผ๋ฏธํ„ฐ์ฒ˜๋Ÿผ Mapํƒ€์ž…์„ ์‚ฌ์šฉํ•˜๋Š”๊ฒƒ์— ๋Œ€ํ•œ ์ข€๋” ์ƒ์„ธํ•œ ์ •๋ณด๋ฅผ ์œ„ํ•ด์„œ๋Š” result Map์„น์…˜๊ณผ ํ”„๋กœ๊ทธ๋ž˜๋ฐ SQL Map(API)๋ฅผ ๋ณด๋ผ. Map ํƒ€์ž… ์—ญ์‹œ ์ข€๋” ๊ฐ„๊ฒฐํ•œ ์ฝ”๋“œ๋ฅผ ์œ„ํ•ด ๋ณ„์นญ๋œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด โ€œmapโ€๋Š” โ€œjava.util.Mapโ€์„ ๋Œ€์‹ ํ• ์ˆ˜ ์žˆ๋‹ค. ๋ณ„์นญ์€ ์•„๋ž˜์˜ โ€œํŒŒ ๋ผ๋ฏธํ„ฐ Map๊ณผ result Map์„ ์œ„ํ•ด ์ง€์›๋˜๋Š” ํƒ€์ž…โ€ ์ด๋ผ๋Š” ์ œ๋ชฉ์˜ ํ…Œ์ด๋ธ”์—์„œ ์ด์•ผ๊ธฐ ๋œ๋‹ค. Result Maps Result maps๋Š” SQL Maps์˜ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ์ปดํฌ๋„ŒํŠธ์ด๋‹ค. resultMap๋Š” ์ž๋ฐ”๋นˆ์ฆˆ ํ”„๋ผํผํ‹ฐ๋ฅผ ๋งตํ•‘๋œ ์ฟผ๋ฆฌ statement๋ฅผ ์‹คํ–‰ํ•จ์œผ๋กœ์จ ์ƒ์‚ฐ๋œ ResultSet์˜ ์นผ๋Ÿผ์— ๋งตํ•‘์‹œํ‚ค๋Š” ์ฑ…์ž„์„ ์ง„๋‹ค. resultMap์˜ ๊ตฌ์กฐ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ณด์ธ๋‹ค. <resultMap id=โ€resultMapNameโ€ class=โ€some.domain.Classโ€ [extends=โ€parent-resultMapโ€]> <result property=โ€propertyNameโ€ column=โ€COLUMN_NAMEโ€ [columnIndex=โ€1โ€] [javaType=โ€intโ€] [jdbcType=โ€NUMERICโ€] [nullValue=โ€-999999โ€] [select=โ€someOtherStatementโ€] /> <result โ€ฆโ€ฆ/> <result โ€ฆโ€ฆ/> <result โ€ฆโ€ฆ/> </resultMap> [๊ด„ํ˜ธ] ๋ถ€๋ถ„์€ ์˜ต์…˜์ด๋‹ค. resultMap๋Š” ์Šค์Šค๋กœ statement๊ฐ€ ๊ทธ๊ฒƒ์„ ์ฐธ์กฐํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•  id์†์„ฑ์„ ๊ฐ€์ง„๋‹ค. resultMap๋Š” ํด๋ž˜ ์Šค๋‚˜ ํƒ€์ž…๋ณ„์นญ์˜ ์ „์ฒด๊ฒฝ๋กœ๋ฅผ ํฌํ•จํ•œ ์ด๋ฆ„์ธ class์†์„ฑ์„ ๊ฐ€์ง„๋‹ค. ์ด ํด๋ž˜์Šค๋Š” ์ด๊ฒƒ์„ ํฌํ•จํ•˜๋Š” result๋งตํ•‘์— ๊ธฐ๋ฐ˜ํ•˜์—ฌ ์ดˆ๊ธฐ ํ™”๋˜๊ณ  ์ƒ์„ฑ๋ ๊ฒƒ์ด๋‹ค. Extends์†์„ฑ์€ resultMap์— ๊ธฐ์ดˆํ•œ ๋‹ค๋ฅธ resultMap์˜ ์ด๋ฆ„์„ ์˜ต์…˜์ ์œผ๋กœ ์…‹ํŒ…ํ• ์ˆ˜ ์žˆ๋‹ค. ์ด๊ฒƒ์€ ์ƒ ์œ„ resultMap์˜ ๋ชจ๋“  ํ”„๋ผํผํ‹ฐ๊ฐ€ ํ•˜์œ„ resultMap์˜ ๋ถ€๋ถ„์„ ํฌํ•จํ•˜๋Š”๊ฒƒ์ฒ˜๋Ÿผ ์ž๋ฐ”๋‚ด์—์„œ ํด๋ž˜์Šค๋ฅผ ํ™•์žฅํ•˜๋Š”๊ฒƒ๊ณผ ์œ ์‚ฌํ•˜๋‹ค. ์ƒ ์œ„ resultMap์˜ ํ”„๋ผํผํ‹ฐ๋Š” ํ•˜์œ„ resultMapํ”„๋ผํผํ‹ฐ์™€ ๋ถ€๋ชจ resultMap๊ฐ€ ์ž์‹ ์•ž์—์„œ ์ •์˜๋˜๊ธฐ ์ „์— ์–ธ์ œ๋‚˜ ์ถ”๊ฐ€๋œ๋‹ค. ์ƒ์œ„/ ํ•˜์œ„ resultMap๋ฅผ ์œ„ํ•œ ํด๋ž˜์Šค๋Š” ๊ฐ™์€ ๊ฒƒ์„ ํ•„์š”๋กœ ํ•˜์ง€ ์•Š์„๋ฟ ์•„๋‹ˆ๋ผ ๋ชจ๋“  ๊ฒƒ์ด ๊ด€๋ จ๋  ํ•„์š”๋„ ์—†๋‹ค. resultMap ์€ ์ž๋ฐ”๋นˆ์ฆˆ๋ฅผ ResultSet์˜ ์นผ๋Ÿผ์— ๋งตํ•‘์‹œํ‚ค๋Š” ์–ด๋Š์ •๋„์˜ ํ”„๋ผํผํ‹ฐ ๋งตํ•‘์„ ํฌํ•จํ• ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋Ÿฐ ํ”„๋ผํผํ‹ฐ ๋งตํ•‘ ์€ ๋ฌธ์„œ๋‚ด์—์„œ ์ •์˜ํ•˜๊ธฐ ์œ„ํ•ด ์ ์šฉ๋ ๊ฒƒ์ด๋‹ค. ๊ด€๋ จ ํด๋ž˜์Šค๋Š” ๊ฐ๊ฐ์˜ ํ”„๋ผํผํ‹ฐ, Map๋˜๋Š” XML์„ ์œ„ํ•œ get/set๋ฉ”์†Œ๋“œ๋ฅผ ๊ฐ€์ง„ ์ž๋ฐ”๋นˆ์ฆˆ์™€ ํ˜ธํ™˜๋˜๋Š” ํด๋ž˜์Šค์—ฌ์•ผ๋งŒ ํ•œ๋‹ค. 20
  • 21. ์ฃผ์˜! ์นผ๋Ÿผ์€ Result Map๋‚ด์—์„œ ์ •์˜๋˜๊ธฐ ์œ„ํ•ด์„œ ๋ช…์‹œ์ ์œผ๋กœ ์ฝ์„๊ฒƒ์ด๋‹ค. ๋‹ค์Œ์˜ ์„น์…˜์€ property์š”์†Œ์˜ ์†์„ฑ๋“ค์„ ์„œ์ˆ ํ•œ๋‹ค. property result map์˜ property ์†์„ฑ์€ ๋งตํ•‘ statement์— ์˜ํ•ด ๋ฐ˜ํ™˜๋˜๋Š” result๊ฐ์ฒด์˜ ์ž๋ฐ”๋นˆ์ฆˆ ํ”„๋ผํผํ‹ฐ(get๋ฉ”์†Œ๋“œ) ์ด๋ฆ„์ด๋‹ค. ์ด๋ฆ„ ์€ results๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ํ•„์š”ํ•œ ํšŸ์ˆ˜์— ์˜์กด์ ์ธ ๊ฐ’๋ณด๋‹ค ๋” ํฌ๊ฒŒ ์‚ฌ์šฉ๋ ์ˆ˜ ์žˆ๋‹ค. column column ์†์„ฑ๊ฐ’์€ ํ”„๋ผํผํ‹ฐ๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋  ๊ฐ’๋“ค๋กœ๋ถ€ํ„ฐ์˜ ResultSet๋‚ด์˜ ์นผ๋Ÿผ์˜ ์ด๋ฆ„์ด๋‹ค. columnIndex ์˜ต์…˜์ ์ธ(์ตœ์†Œํ•œ์˜) ์„ฑ๋Šฅํ–ฅ์ƒ์„ ์œ„ํ•ด์„œ columnIndex ์†์„ฑ๊ฐ’์€ ์ž๋ฐ”๋นˆ์ฆˆ ํ”„๋ผํผํ‹ฐ๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋  ๊ฐ’์œผ๋กœ๋ถ€ํ„ฐ์˜ ResultSet๋‚ด์˜ ์นผ๋Ÿผ์˜ ์ธ๋ฑ์Šค์ด๋‹ค. ์ด๊ฒƒ์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ 99%์ •๋„์—” ํ•„์š”ํ•˜์ง€ ์•Š์„๊ฒƒ์ด๊ณ  ์œ ์ง€๋ฅผ ์œ„ํ•œ ๋…ธ๋ ฅ๊ณผ ์†๋„๋ฅผ ์œ„ ํ•ด ๊ฐ€๋…์„ฑ์„ ํฌ์ƒํ•œ๋‹ค. ๋ช‡๋ช‡ JDBC๋“œ๋ผ์ด๋ฒ„๋Š” ๋‹ค๋ฅธ๊ฒƒ๋“ค์ด ๋™์ ์œผ๋กœ ์†๋„๋ฅผ ์˜ฌ๋ ค์ฃผ๋Š” ๋™์•ˆ ์–ด๋–ค ์„ฑ๋Šฅ์ด๋“๋„ ๊ตฌ์ฒดํ™”ํ•˜์ง€ ์•Š์„ ๊ฒƒ์ด๋‹ค. jdbcType jdbcType ์†์„ฑ์€ ์ž๋ฐ”๋นˆ์ฆˆ ํ”„๋ผํผํ‹ฐ๋ฅผ ์ƒ์„ฑํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋˜๋Š” ResultSet ์นผ๋Ÿผ์˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์นผ๋Ÿผ ํƒ€์ž…์„ ๋ช…์‹œ์ ์œผ๋กœ ์ •์˜ ํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋œ๋‹ค. ๋น„๋ก result maps์ด null๊ฐ’๊ณผ ํ•จ๊ป˜ ๊ฐ™์€ ์–ด๋ ค์›€์„ ๊ฐ€์ง€์ง€ ์•Š๋Š”๋‹ค๊ณ  ํ•˜๋”๋ผ๋„ Dateํ”„๋ผํผํ‹ฐ์ฒ˜๋Ÿผ ์–ด๋–ค ๋งตํ•‘ ํƒ€์ž…์„ ์œ„ํ•ด ์œ ์šฉํ• ์ˆ˜ ์žˆ๋Š” ํƒ€์ž…์„ ์ •์˜ํ•œ๋‹ค. ์ž๋ฐ”๋Š” ์˜ค์ง ํ•˜๋‚˜์˜ Date๊ฐ’ ํƒ€์ž…์„ ๊ฐ€์ง€๊ณ  SQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” ์—ฌ๋Ÿฌ๊ฐ€์ง€๋ฅผ ๊ฐ€์ง€๊ธฐ ๋•Œ๋ฌธ์— dates(๋˜๋Š” ๋‹ค๋ฅธํƒ€์ž…)ํƒ€์ž…์„ ์ •ํ™•ํ•˜๊ฒŒ ์…‹ํŒ…ํ•˜๋Š” ๊ฒƒ์„ ํ™•์‹ ํ•˜๋Š” ๋ช‡๋ช‡๊ฒฝ์šฐ์— ํ•„์š”ํ•˜๊ฒŒ ๋ ๊ฒƒ์ด๋‹ค. ์œ ์‚ฌํ•˜๊ฒŒ๋„ Stringํƒ€์ž…์€ VARCHAR, CHAR ๋˜๋Š” CLOB์— ์˜ํ•ด ์ƒ์„ฑ๋ ๊ฒƒ์ด๋‹ค. ๊ทธ๋ž˜์„œ ๊ทธ๋Ÿฐ ๊ฒฝ์šฐ์— ํ•„์š”ํ•œ ํƒ€์ž…์„ ์ •์˜ํ•˜๋ผ. javaType javaType ์†์„ฑ์€ ์…‹ํŒ…๋˜๋Š” ํ”„๋ผํผํ‹ฐ์˜ ์ž๋ฐ”ํ”„๋ผํผํ‹ฐํƒ€์ž…์„ ๋ช…์‹œ์ ์œผ๋กœ ์ •์˜ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋œ๋‹ค. ๋Œ€๊ฐœ ์ด๊ฒƒ์€ ๋ฆฌํ”Œ๋ ‰์…˜ (reflection)์„ ํ†ตํ•ด ์ž๋ฐ”๋นˆ์ฆˆ ํ”„๋ผํผํ‹ฐ๋กœ๋ถ€ํ„ฐ ๋Œ์–ด๋‚ผ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ Map์™€ XML๋งตํ•‘๊ณผ ๊ฐ™์€ ๋งตํ•‘์€ ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์œ„ํ•œ ํƒ€ ์ž…์„ ์ œ๊ณตํ• ์ˆ˜ ์—†๋‹ค. ๋งŒ์•ฝ javaType๊ฐ€ ์…‹ํŒ…๋˜์ง€ ์•Š๊ณ  ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ๊ทธ ํƒ€์ž…์„ ๊ตฌ๋ถ„ํ• ์ˆ˜ ์—†๋‹ค๋ฉด ํƒ€์ž…์€ ๊ฐ์ฒด๋กœ ๊ฐ€์ •๋˜์–ด ์ฒ˜ ๋ฆฌ๋ ๊ฒƒ์ด๋‹ค. nullValue nullValue ์†์„ฑ์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋‚ด์—์„œ NULL๊ฐ’์„ ๋Œ€์‹ ํ•ด์„œ ์‚ฌ์šฉ๋˜๊ธฐ ์œ„ํ•œ ๊ฐ’์„ ์ •์˜ํ•œ๋‹ค. ๊ทธ๋ž˜์„œ ๋งŒ์•ฝ ResultSet์œผ๋กœ๋ถ€ํ„ฐ NULL์ด ์ฝ์—ˆ๋‹ค๋ฉด ์ž๋ฐ”๋นˆ ํ”„๋ผํผํ‹ฐ๋Š” NULL๋Œ€์‹ ์— nullValue์†์„ฑ์— ์˜ํ•ด ์ •์˜๋œ ๊ฐ’์„ ์…‹ํŒ…ํ• ๊ฒƒ์ด๋‹ค. null ์†์„ฑ๊ฐ’์€ ์–ด๋– ํ•œ ๊ฐ’ ์„ ๋ ์ˆ˜ ์žˆ์ง€๋งŒ ํ”„๋ผํผํ‹ฐํƒ€์ž…์„ ์œ„ํ•ด์„œ๋Š” ์ ์ ˆํ•ด์•ผ๋งŒ ํ•œ๋‹ค. ๋งŒ์•ฝ ๋‹น์‹ ์˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ NULL์ด ๊ฐ€๋Šฅํ•œ ์นผ๋Ÿผ์„ ๊ฐ€์ง„๋‹ค๋ฉด ๋‹น์‹ ์€ ๋‹น์‹ ์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๋‹ค์Œ์ฒ˜๋Ÿผ result map๋‚ด์— ์„œ ๊ทธ๊ฒƒ์„ ์ •์˜ํ• ์ˆ˜ ์žˆ๋Š” ๋ณ€์ˆ˜๊ฐ’๊ณผ ํ•จ๊ป˜ NULL์„ ํ‘œ์‹œํ•˜๊ธฐ๋ฅผ ์›ํ•œ๋‹ค. <resultMap id=โ€get-product-resultโ€ class=โ€com.ibatis.example.Productโ€> <result property=โ€idโ€ column=โ€PRD_IDโ€/> <result property=โ€descriptionโ€ column=โ€PRD_DESCRIPTIONโ€/> <result property=โ€subCodeโ€ column=โ€PRD_SUB_CODEโ€ nullValue=โ€-999โ€/> </resultMap> ์œ„ ์˜ˆ์ œ์—์„œ ๋งŒ์•ฝ PRD_SUB_CODE์ด NULL๋กœ ์ฝํ˜€์ง„๋‹ค๋ฉด subCode ํ”„๋ผํผํ‹ฐ๋Š” -999๋ผ๋Š” ๊ฐ’์œผ๋กœ ์…‹ํŒ…๋ ๊ฒƒ์ด๋‹ค. ์ด๊ฒƒ์€ ๋‹น์‹  ์—๊ฒŒ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋‚ด์—์„œ NULL์ด ๊ฐ€๋Šฅํ•œ ์นผ๋Ÿผ์„ ํ‘œํ˜„ํ•˜๊ธฐ ์œ„ํ•ด ๋‹น์‹ ์˜ ์ž๋ฐ”ํด๋ž˜์Šค๋‚ด์— ์›์‹œํƒ€์ž…์„ ์‚ฌ์šฉํ•˜๋„๋ก ํ—ˆ๋ฝํ• ๊ฒƒ์ด ๋‹ค. ๋งŒ์•ฝ ๋‹น์‹ ์ด updates/inserts๊ฐ™์€ ์ฟผ๋ฆฌ๋ฅผ ์œ„ํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ๋ฅผ ์›ํ•  ๋•Œ ๋‹น์‹ ์€ ํŒŒ๋ผ๋ฏธํ„ฐ map๋‚ด์— nullValue๋ฅผ ์ •์˜ํ•ด 21
  • 22. ์•ผ๋งŒ ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ๊ธฐ์–ตํ•ด๋ผ. select select ์†์„ฑ์€ ๊ฐ์ฒด์‚ฌ์ด์˜ ๊ด€๊ณ„๋ฅผ ์„œ์ˆ ํ•˜๊ณ  ์ž๋™์ ์œผ๋กœ ๋ณตํ•ฉ ํ”„๋ผํผํ‹ฐ ํƒ€์ž…์„ ๋กœ๋“œํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋œ๋‹ค. statementํ”„๋ผํผํ‹ฐ๊ฐ’ ์€ ๋‹ค๋ฅธ ๋งตํ•‘๋œ statement์˜ ์ด๋ฆ„์ด ๋˜์–ด์•ผ๋งŒ ํ•œ๋‹ค. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์นผ๋Ÿผ๊ฐ’์€ statement์†์„ฑ์ด ํŒŒ๋ผ๋ฏธํ„ฐ์ฒ˜๋Ÿผ ๊ด€๊ณ„๋œ ๋งตํ•‘ statement๋กœ ์ „๋‹ฌํ•˜๋Š”๊ฒƒ์ฒ˜๋Ÿผ ๊ฐ™์€ property์š”์†Œ๋‚ด์— ์ •์˜๋œ๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ ์นผ๋Ÿผ์€ ์›์‹œํƒ€์ž…์œผ๋กœ ์ง€์›์ด ๋˜์–ด์•ผ ํ•œ๋‹ค. ์ง€์›๋˜ ๋Š” ์›์‹œํƒ€์ž…๊ณผ ๋ณตํ•ฉ ํ”„๋ผํผํ‹ฐ ๋งตํ•‘/๊ด€๊ณ„์— ๋Œ€ํ•œ ์ƒ์„ธ์ •๋ณด๋Š” ์ด ๋ฌธ์„œ ๋‚˜์ค‘์— ์ด์•ผ๊ธฐ ๋œ๋‹ค. ๋‚ดํฌํ•˜๋Š” Result Maps ๋งŒ์•ฝ ๋‹น์‹ ์ด ๋ช…์‹œ์ ์œผ๋กœ ์ •์˜๋œ resultMap์˜ ์žฌ์‚ฌ์šฉ์„ ์š”๊ตฌํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๋งค์šฐ ๊ฐ„๋‹จํ•œ ์š”๊ตฌ์‚ฌํ•ญ์„ ๊ฐ€์ง„๋‹ค๋ฉด ๋งตํ•‘๋œ statement์˜ resultClass์†์„ฑ์„ ์…‹ํŒ…ํ•จ์œผ๋กœ์จ result map์„ ํ•จ์ถ•์ ์œผ๋กœ ์ •์˜ํ•˜๋Š” ๋น ๋ฅธ ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค. ์ด ๋ฌ˜๊ธฐ๋Š” ๋‹น์‹ ์ด ๋ฐ˜ํ™˜๋˜ ๋Š” result set์ด ๋‹น์‹ ์˜ ์ž๋ฐ”๋นˆ์˜ ์“ฐ๊ธฐ ๊ฐ€๋Šฅํ•œ ํ”„๋ผํผํ‹ฐ ์ด๋ฆ„์— ๋งค์น˜๋˜๋Š” ์นผ๋Ÿผ์ด๋ฆ„(๋˜๋Š” ๋ผ๋ฒจ/๋ณ„์นญ)์„ ๊ฐ€์ง€๋Š” ๊ฒƒ์„ ํ™•์‹คํ•ด์•ผ๋งŒ ํ•œ๋‹ค๋Š”๊ฒƒ์ด๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋งŒ์•ฝ ์šฐ๋ฆฌ๊ฐ€ ์œ„์—์„œ ์„œ์ˆ ๋œ Productํด๋ž˜์Šค๋ฅผ ์ƒ๊ฐํ•  ๋•Œ ์šฐ๋ฆฌ๋Š” ๋‹ค์Œ์ฒ˜๋Ÿผ ๋‚ดํฌํ•˜๋Š” result map์œผ๋กœ ๋งตํ•‘๋œ statement๋ฅผ ์ƒ์„ฑํ• ์ˆ˜ ์žˆ๋‹ค. <statement id=โ€getProductโ€ resultClass=โ€com.ibatis.example.Productโ€> select PRD_ID as id, PRD_DESCRIPTION as description from PRODUCT where PRD_ID = #value# </statement> ์œ„์˜ ๋งตํ•‘๋œ statement๋Š” resultClass๋ฅผ ํ‘œ๊ธฐํ•˜๊ณ  Productํด๋ž˜์Šค์˜ ์ž๋ฐ”๋นˆ์ฆˆ ํ”„๋ผํผํ‹ฐ์— ๋งค์น˜๋˜๋Š” ๊ฐ๊ฐ์˜ ์นผ๋Ÿผ๋ฅผ ์œ„ํ•œ ๋ณ„์นญ ์„ ๋ช…์‹œํ•œ๋‹ค. ์ด๊ฒƒ์€ ๋ชจ๋‘ ํ•„์ˆ˜(required) ์ด๋‹ค. Result map์€ ํ•„์š”ํ•˜์ง€ ์•Š๋‹ค. ์—ฌ๊ธฐ์„œ ๊ตํ™˜(tradeoff)์€ ๋‹น์‹ ์ด ์นผ๋Ÿผํƒ€์ž…(๋Œ€๊ฐœ ํ•„์ˆ˜๊ฐ€ ์•„๋‹Œ)๊ณผ null๊ฐ’(๋˜๋Š” ๋‹ค๋ฅธ ์–ด๋–ค ํ”„๋ผํผํ‹ฐ ์†์„ฑ)์„ ์ •์˜ํ•˜๋Š” ๊ธฐํšŒ๋ฅผ ๊ฐ€์ง€์ง€ ์•Š๋Š”๊ฒƒ์ด๋‹ค. ๋งŽ์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ๋Œ€์†Œ๋ฌธ ์ž๋ฅผ ๊ฐ€๋ฆฌ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋‚ดํฌ๋œ result map๋Š” ๋˜ํ•œ ๊ฐ€๋ฆฌ์ง€ ์•Š๋Š”๋‹ค. ๋งŒ์•ฝ ๋‹น์‹ ์˜ ์ž๋ฐ”๋นˆ์ด ๋‘๊ฐœ์˜ ํ”„๋ผํผํ‹ฐ๋ฅผ ๊ฐ€์ง„๋‹ค๋ฉด ํ•˜๋‚˜ ์˜ ์ด๋ฆ„์€ firstName์ด๊ณ  ๋‹ค๋ฅธ ๊ฒƒ์€ firstname์ด๋‹ค(๋‘๊ฐœ์˜ ๊ฐ’์€ ๋Œ€์†Œ๋ฌธ์ž์˜ ์ฐจ์ด์ด๋‹ค). ๊ทธ๊ฒƒ๋“ค์€ ๋™์ผํ•˜๊ณ  ๋‹น์‹ ์€ ๋‚ดํฌ๋œ result map๋ฅผ ์‚ฌ์šฉํ• ์ˆ˜์—†์„๊ฒƒ์ด๋‹ค(์ด๊ฒƒ์€ ์ž๋ฐ”๋นˆ ํด๋ž˜์Šค์˜ ๋””์ž์ธ์—์„œ ์ž ์žฌ์ ์ธ ๋ฌธ์ œ์ ์„ ํŒŒ์•…ํ•˜๊ฒŒ ๋ ๊ฒƒ์ด๋‹ค.). ๊ฒŒ๋‹ค๊ฐ€ resultClass๋ฅผ ํ†ตํ•ด ์ž๋™๋งตํ•‘์„ ํ•˜๋ฉด ๋ช‡๋ช‡ ์„ฑ๋Šฅ์— ๊ด€๋ จ๋œ ๋ถ€ํ•˜๊ฐ€ ๋ฐœ์ƒํ• ๊ฒƒ์ด๋‹ค. ResultSetMetaData์— ์ ‘๊ทผํ•˜๋Š” ๊ฒƒ์€ ๋ช‡๋ช‡ ์“ฐ ์—ฌ์ง„ JDBC๋“œ๋ผ์ด๋ฒ„๋กœ๋Š” ๋Š๋ฆฌ๊ฒŒ ๋งŒ๋“ค์ˆ˜ ์žˆ๋‹ค. ์›์‹œํƒ€์ž…์˜ Results (์ด๋ฅผ ํ…Œ๋ฉด String, Integer, Boolean) ์ž๋ฐ”๋นˆ ํ˜ธํ™˜ ํด๋ž˜์Šค๋ฅผ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•ด ์ถ”๊ฐ€์ ์œผ๋กœ result Map์€ String, Integer, Boolean ๋“ฑ๋“ฑ๊ณผ ๊ฐ™์€ ๊ฐ„๋‹จํ•œ ์ž๋ฐ”ํƒ€์ž… ๋ž˜ํผ๋ฅผ ํŽธ๋ฆฌํ•˜๊ฒŒ ์ƒ์„ฑํ• ์ˆ˜ ์žˆ๋‹ค. ์›์‹œํƒ€์ž…๊ฐ์ฒด์˜ collection์€ ๋ฐ‘์—์„œ ์ด์•ผ๊ธฐ ๋˜๋Š” API(executeQueryForList()๋ฅผ ๋ณด๋ผ)๋“ค์„ ์‚ฌ์šฉํ•ด์„œ ๊ฐ€์ ธ์˜ฌ์ˆ˜ ์žˆ๋‹ค. ์›์‹œํƒ€์ž…์€ ์ž๋ฐ”๋นˆ์ฒ˜๋Ÿผ ๊ฐ™์€ ๋ฐฉ๋ฒ•์œผ๋กœ ์ •ํ™•ํ•˜๊ฒŒ ๋งตํ•‘๋œ๋‹ค. ์›์‹œํƒ€์ž…์€ ๋‹น์‹ ์ด ์„ ํ˜ธํ•˜๋Š”(๋Œ€๊ฐœ โ€œvalueโ€ ๋˜๋Š” โ€œvalโ€) ์ด๋ฆ„ํ˜•์‹์˜ ์–ด๋–ค๊ฒƒ์ฒ˜๋Ÿผ ๋ ์ˆ˜ ์žˆ๋Š” ํ•˜๋‚˜์˜ ํ”„๋ผํผํ‹ฐ๋งŒ์„ ๊ฐ€์งˆ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด ์šฐ๋ฆฌ๊ฐ€ ์ „์ฒด Productํด๋ž˜์Šค ๋Œ€์‹ ์— ๋ชจ ๋“  product์„œ์ˆ ์ž(description)์˜ ๋ชฉ๋ก๋งŒ์„ ๋กœ๋“œํ•˜๊ธธ ์›ํ•œ๋‹ค๋ฉด map์€ ๋‹ค์Œ์ฒ˜๋Ÿผ ๋ณด์—ฌ์งˆ๊ฒƒ์ด๋‹ค. <resultMap id=โ€get-product-resultโ€ class=โ€java.lang.Stringโ€> <result property=โ€valueโ€ column=โ€PRD_DESCRIPTIONโ€/> </resultMap> ์ข€๋” ๊ฐ„๋‹จํ•œ ์ ‘๊ทผ๋ฒ•์€ ๋งตํ•‘๋œ statement์•ˆ์—์„œ ๊ฐ„๋‹จํ•˜๊ฒŒ result class๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๊ฒƒ์ด๋‹ค.(โ€œasโ€ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์„œ โ€œvalueโ€ ๋ผ๋Š” ์นผ๋Ÿผ๋ณ„์นญ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ์ฃผ์˜๊นŠ๊ฒŒ ๋ณด๋ผ.) <statement id=โ€getProductCountโ€ resultClass=โ€java.lang.Integerโ€> select count(1) as value from PRODUCT </statement> 22
  • 23. Map Results Result Maps์€ HashMap๋˜๋Š” TreeMap์ฒ˜๋Ÿผ Map์ธ์Šคํ„ด์Šค๋ฅผ ํŽธ๋ฆฌํ•˜๊ฒŒ ์ƒ์„ฑํ• ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋Ÿฐ ๊ฐ์ฒด(Map์˜ List)์˜ collection์€ ์•„๋ž˜์—์„œ ์ด์•ผ๊ธฐ๋˜๋Š” API(executeQueryForList()๋ฅผ ๋ณด๋ผ)๋“ค์„ ์‚ฌ์šฉํ•ด์„œ ๊ฐ€์ ธ์˜ฌ์ˆ˜ ์žˆ๋‹ค. Mapํƒ€์ž…์€ ์ž๋ฐ”๋นˆ๊ณผ ๊ฐ™์€ ๋ฐฉ๋ฒ•์œผ๋กœ ์ •ํ™•ํ•˜๊ฒŒ ๋งตํ•‘๋œ๋‹ค. ํ•˜์ง€๋งŒ ์ž๋ฐ”๋นˆ ํ”„๋ผํผํ‹ฐ์…‹ํŒ… ๋Œ€์‹ ์— Map์˜ key๋“ค์€ ๋Œ€์‘๋˜๋Š” ๋งตํ•‘์นผ๋Ÿผ์„ ์œ„ํ•œ ๊ฐ’์„ ์ฐธ์กฐํ•˜๋„๋ก ์…‹ํŒ…ํ•œ ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋งŒ์•ฝ ์šฐ๋ฆฌ๊ฐ€ product์˜ ๊ฐ’์„ Map์œผ๋กœ ๋นจ๋ฆฌ ๋กœ๋“œ์‹œํ‚ค๊ธธ ์›ํ•œ๋‹ค๋ฉด ์šฐ๋ฆฌ๋Š” ๋‹ค์Œ์ฒ˜๋Ÿผ ํ• ๊ฒƒ์ด๋‹ค. <resultMap id=โ€get-product-resultโ€ class=โ€java.util.HashMapโ€> <result property=โ€idโ€ column=โ€PRD_IDโ€/> <result property=โ€codeโ€ column=โ€PRD_CODEโ€/> <result property=โ€descriptionโ€ column=โ€PRD_DESCRIPTIONโ€/> <result property=โ€suggestedPriceโ€ column=โ€PRD_SUGGESTED_PRICEโ€/> </resultMap> ์œ„ ์˜ˆ์ œ์—์„œ HashMap์ธ์Šคํ„ด์Šค๋Š” Product๋ฐ์ดํ„ฐ๋ฅผ ์ƒ์„ฑํ• ๊ฒƒ์ด๋‹ค. ํ”„๋ผํผํ‹ฐ ์ด๋ฆ„ ์†์„ฑ(์ด๋ฅผ ํ…Œ๋ฉด โ€œidโ€)์€ HashMap์˜ ํ‚ค๊ฐ€ ๋  ๊ฒƒ์ด๋‹ค. ๋งตํ•‘์นผ๋Ÿผ์˜ ๊ฐ’์€ HashMap์˜ ๊ฐ’์ด ๋ ๊ฒƒ์ด๋‹ค. ๋ฌผ๋ก  ๋‹น์‹ ์€ Mapํƒ€์ž…์„ ๊ฐ€์ง€๊ณ  ๋‚ดํฌ๋œ result map์„ ์‚ฌ์šฉํ• ์ˆ˜๋„ ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด : <statement id=โ€getProductCountโ€ resultClass=โ€java.util.HashMapโ€> select * from PRODUCT </statement> ์œ„์˜ ๊ฒƒ์€ ๋ฐ˜ํ™˜๋œ ResultSet์˜ Mapํ‘œํ˜„์„ ๋‹น์‹ ์—๊ฒŒ ์ค„๊ฒƒ์ด๋‹ค. ๋ณตํ•ฉ(Complex) Properties (์ด๋ฅผ ํ…Œ๋ฉด ์‚ฌ์šฉ์ž์— ์˜ํ•ด ์ •์˜๋œ ํด๋ž˜์Šค์˜ ํ”„๋ผํผํ‹ฐ) ์ด๊ฒƒ์€ ์„ ํ˜ธํ•˜๋Š” ๋ฐ์ดํ„ฐ์™€ ํด๋ž˜์Šค๋ฅผ ๋กœ๋“œํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ๊ณ ์žˆ๋Š” ๋งตํ•‘๋œ statement์™€ ํ•จ๊ป˜ ๊ด€๋ จ๋œ resultMapํ”„๋ผํผํ‹ฐ์— ์˜ํ•ด ๋ณตํ•ฉํƒ€์ž…์˜ ํ”„๋ผํผํ‹ฐ(์‚ฌ์šฉ์ž์— ์˜ํ•ด ์ƒ์„ฑ๋œ ํด๋ž˜์Šค)๋ฅผ ์ž๋™์ ์œผ๋กœ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์€ ๊ฐ€๋Šฅํ•˜๋‹ค. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋‚ด ๋ฐ์ดํ„ฐ๋Š” ์–ธ์ œ ๋‚˜ ๋ณตํ•ฉํ”„๋ผํผํ‹ฐ๋Š” ๊ด€๊ณ„์˜ โ€œmany sideโ€๋กœ๋ถ€ํ„ฐ์ด๊ณ  ํ”„๋ผํผํ‹ฐ ์ž์‹ ์€ ๊ด€๊ณ„์˜ โ€œone sideโ€๋กœ ๋ถ€ํ„ฐ์ด๋‹ค๋ผ๋Š” ๊ฒƒ์„ ๊ณ ์ •ํ•˜๋Š” ํด๋ž˜ ์Šค์—์„œ 1:1๊ด€๊ณ„ ๋˜๋Š” 1:M๊ด€๊ณ„๋ฅผ ํ†ตํ•ด ํ‘œํ˜„๋œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด : <resultMap id=โ€get-product-resultโ€ class=โ€com.ibatis.example.Productโ€> <result property=โ€idโ€ column=โ€PRD_IDโ€/> <result property=โ€descriptionโ€ column=โ€PRD_DESCRIPTIONโ€/> <result property=โ€categoryโ€ column=โ€PRD_CAT_IDโ€ select=โ€getCategoryโ€/> </resultMap> <resultMap id=โ€get-category-resultโ€ class=โ€com.ibatis.example.Categoryโ€> <result property=โ€idโ€ column=โ€CAT_IDโ€/> <result property=โ€descriptionโ€ column=โ€CAT_DESCRIPTIONโ€/> </resultMap> <statement id=โ€getProductโ€ parameterClass=โ€intโ€ resultMap=โ€get-product-resultโ€> select * from PRODUCT where PRD_ID = #value# </statement> <statement id=โ€getCategoryโ€ parameterClass=โ€intโ€ resultMap=โ€get-category-resultโ€> select * from CATEGORY where CAT_ID = #value# </statement> ์œ„ ์˜ˆ์ œ์—์„œ Product์˜ ์ธ์Šคํ„ด์Šค๋Š” Categoryํƒ€์ž…์˜ category๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ํ”„๋ผํผํ‹ฐ๋ฅผ ๊ฐ€์ง„๋‹ค. Category๋Š” ๋ณตํ•ฉ์‚ฌ์šฉ์žํƒ€์ž…์ด ๊ธฐ ๋•Œ๋ฌธ์— JDBC๋Š” ๊ทธ๊ฒƒ์„ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๊ฐ€์ง€์ง€ ์•Š๋Š”๋‹ค. ํ”„๋ผํผํ‹ฐ๋งตํ•‘๊ณผ ํ•จ๊ป˜ ๋‹ค๋ฅธ ๋งตํ•‘๋œ statement๋ฅผ ๊ด€๋ จ์‹œํ‚ด์œผ๋กœ์จ ์šฐ ๋ฆฌ๋Š” ๊ทธ๊ฒƒ์„ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•œ SQL Map์—”์ง„์„ ์œ„ํ•ด ์ถฉ๋ถ„ํ•œ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•œ๋‹ค. getProduct๋ฅผ ์ˆ˜ํ–‰ํ•˜๋ฉด get-product-result result map์ด PRD_CAT_ID์นผ๋Ÿผ๋‚ด ๋ฐ˜ํ™˜๋˜๋Š” ๊ฐ’์„ ์‚ฌ์šฉํ•ด์„œ getCategory์„ ํ˜ธ์ถœํ• ๊ฒƒ์ด๋‹ค. get-category-result result map์€ Category ๋ฅผ ์ดˆ๊ธฐํ™”ํ• ๊ฒƒ์ด๊ณ  ๊ทธ๊ฒƒ์„ ์ƒ์„ฑํ•œ๋‹ค. ์ „์ฒด Category์ธ์Šคํ„ด์Šค๋Š” Product์˜ categoryํ”„๋ผํผํ‹ฐ๋กœ ์…‹ํŒ…ํ•œ๋‹ค. N+1 Selects (1:1) ํ”ผํ•˜๊ธฐ 23
  • 24. ์œ„ ์†”๋ฃจ์…˜์„ ์‚ฌ์šฉํ•  ๋•Œ ๋ฌธ์ œ์ ์€ ๋‹น์‹ ์ด Product๋ฅผ ๋กœ๋“œํ• ๋•Œ๋งˆ๋‹ค ๋‘๊ฐœ(Product๋ฅผ ์œ„ํ•ด ํ•˜๋‚˜ ๊ทธ๋ฆฌ๊ณ  Category๋ฅผ ์œ„ํ•ด์„œ ํ•˜๋‚˜. ์ด 2๊ฐœ)์˜ SQL๋ฌธ์ด ์‹ค์ œ์ ์œผ๋กœ ๊ตฌ๋™๋œ๋‹ค๋Š”๊ฒƒ์ด๋‹ค. ์ด ๋ฌธ์ œ๋Š” ํ•˜๋‚˜์˜ Product๋ฅผ ๋กœ๋“œํ• ๋•Œ๋Š” ํฐ๋ฌธ์ œ๊ฐ€ ์•„๋‹Œ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋งŒ ๋งŒ์•ฝ 10๊ฐœ์˜ Product๋ฅผ ๋กœ๋“œํ•˜๋Š” ์ฟผ๋ฆฌ๋ฅผ ํ•œ๋‹ค๋ฉด ๊ฐ๊ฐ์˜ ์ฟผ๋ฆฌ๋Š” ๊ด€๋ จ๋œ category๋ฅผ ๋กœ๋“œํ•˜๊ธฐ ์œ„ํ•œ Product๋ฅผ ์œ„ํ•ด์„œ๋„ ์‹คํ–‰๋  ๊ฒƒ์ด๋‹ค. ๊ฒฐ๊ณผ์ ์œผ๋กœ 11๋ฒˆ์˜ ์ฟผ๋ฆฌ๋ฅผ ํ•˜๊ฒŒ ๋œ๋‹ค. Product์˜ ๋ชฉ๋ก์„ ์œ„ํ•ด ํ•˜๋‚˜, ๊ด€๋ จ๋œ Category๋ฅผ ๋กœ๋“œํ•˜๊ธฐ ์œ„ํ•ด ๋ฐ˜ํ™˜๋˜๋Š” Product๋ฅผ ์œ„ํ•ด ํ•˜๋‚˜์”ฉ(N+1 ๋˜๋Š” ์ด ๊ฒฝ์šฐ์—” 10+1=11) ํ•ด๊ฒฐ๋ฒ•์€ ๋ถ„๋ฆฌ๋œ select ๋ฌธ ๋Œ€์‹ ์— ์กฐ์ธ๊ณผ ๋‚ดํฌ๋œ(nested)ํ”„๋ผํผํ‹ฐ ๋งตํ•‘์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ์—ฌ๊ธฐ์— ๊ทธ์™€ ๊ฐ™์€ ์ƒํ™ฉ์„ ์‚ฌ์šฉ ํ•œ ์˜ˆ์ œ๊ฐ€ ์žˆ๋‹ค. <resultMap id=โ€get-product-resultโ€ class=โ€com.ibatis.example.Productโ€> <result property=โ€idโ€ column=โ€PRD_IDโ€/> <result property=โ€descriptionโ€ column=โ€PRD_DESCRIPTIONโ€/> <result property=โ€category.idโ€ column=โ€CAT_IDโ€ /> <result property=โ€category.descriptionโ€ column=โ€CAT_DESCRIPTIONโ€ /> </resultMap> <statement id=โ€getProductโ€ parameterClass=โ€intโ€ resultMap=โ€get-product-resultโ€> select * from PRODUCT, CATEGORY where PRD_CAT_ID=CAT_ID and PRD_ID = #value# </statement> ๋Šฆ์€(Lazy) ๋กœ๋”ฉ ๋Œ€ ์กฐ์ธ(1:1) ์กฐ์ธ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์–ธ์ œ๋‚˜ ๋” ์ข‹์€ ๊ฒฐ๊ณผ๋ฅผ ๋‚ด์ง€๋Š” ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์— ์ฃผ์˜ํ•˜๋Š” ๊ฒƒ์€ ์ค‘์š”ํ•˜๋‹ค. ๋งŒ์•ฝ ๋‹น์‹ ์ด ๊ด€๊ณ„๊ฐ์ฒด์— ์ ‘๊ทผ ํ•˜๋Š” ๊ฒƒ์ด ๊ฑฐ์˜ ์—†๋Š” ์ƒํ™ฉ์ด๋ผ๋ฉด ์กฐ์ธ์„ ํ”ผํ•˜๋Š” ๊ฒƒ์ด ๋” ๋น ๋ฅด๊ณ  ๋ชจ๋“  categoryํ”„๋ผํผํ‹ฐ์˜ ๋กœ๋”ฉ์ด ๋ถˆํ•„์š”ํ•˜๋‹ค. ์ด๊ฒƒ์€ outer ์กฐ์ธ์„ ํฌํ•จํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋””์ž์ธ์ด๋‚˜ null๊ฐ’์ด ๊ฐ€๋Šฅํ•˜๊ฑฐ๋‚˜ ์ธ๋ฑ์Šค๊ฐ€ ์—†๋Š” ์นผ๋Ÿผ์—๋Š” ์‚ฌ์‹ค์ด๋‹ค. ์ด๋Ÿฐ ์ƒํ™ฉ์—์„œ ๋Šฆ์€ ๋กœ ๋”ฉ๊ณผ bytecodeํ–ฅ์ƒ ์˜ต์…˜์œผ๋กœ sub-select์†”๋ฅ˜์„ ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ์ข€๋” ํ–ฅ์ƒ๋œ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์—ฌ์ค€๋‹ค. ์ผ๋ฐ˜์ ์ธ ๊ทœ์น™์€ ์—ฐ๊ด€๋œ ํ”„๋ผ ํผํ‹ฐ์— ์ ‘๊ทผํ•˜๋Š” ๊ฒƒ์„ ์ข€๋” ํ•˜๊ณ ์ž ํ• ๋•Œ๋งŒ ์กฐ์ธ์„ ์‚ฌ์šฉํ•˜๋ผ. ๋ฐ˜๋ฉด์— ๋Šฆ์€ ๋กœ๋”ฉ์ด ์˜ต์…˜์ด ์•„๋‹๋•Œ์—๋งŒ ๊ทธ๊ฒƒ์„ ์‚ฌ์šฉํ•˜๋ผ. ๋งŒ์•ฝ ๋‹น์‹ ์ด ์‚ฌ์šฉํ•  ๋ฐฉ๋ฒ•์„ ๊ฒฐ์ •ํ•˜๋Š”๋ฐ ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค๋ฉด ๊ฑฑ์ •ํ•˜์ง€ ๋งˆ๋ผ. ๊ทธ๊ฒƒ์€ ๋ฌธ์ œ๋„ ์•„๋‹ˆ๋‹ค. ๋‹น์‹ ์€ ์ž๋ฐ”์ฝ”๋“œ ์ถฉ๋Œ์—†์ด ์ด๊ฒƒ์„ ํ•ญ์ƒ ๋ณ€๊ฒฝํ• ์ˆ˜์žˆ๋‹ค. ์œ„์˜ ๋‘ ์˜ˆ์ œ๋Š” ๊ฐ™์€ ๊ฐ์ฒดํ˜•ํƒœ์˜ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์ด๊ณ  ์ •ํ™•ํ•˜๊ฒŒ ๊ฐ™์€ ๋ฉ”์†Œ๋“œ ํ˜ธ์ถœ์„ ์‚ฌ์šฉํ•ด์„œ ๋กœ๋“œ๋œ ๋‹ค. ๋งŒ์•ฝ ๋‹น์‹ ์ด ์บ์‰ฌ๋ฅผ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๋ฉด ๋‹จ์ง€ ํ•˜๋‚˜์˜ ๊ณ ๋ ค์‚ฌํ•ญ์€ separate select(์กฐ์ธ์ด ์•„๋‹Œ) ์†”๋ฃจ์…˜์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋ฐ˜ํ™˜ ๋˜๋Š” ์บ์‰ฌ๋œ ์ธ์Šคํ„ด์Šค๋‚ด์— ๊ฒฐ๊ณผ๋ฅผ ๋ณด์ด๊ฒŒ ๋œ๋‹ค. ๋ณตํ•ฉ Collection ํ”„๋ผํผํ‹ฐ ๋ณตํ•ฉ ๊ฐ์ฒด์˜ ๋ชฉ๋ก์„ ํ‘œํ˜„ํ•˜๋Š” ํ”„๋ผํผํ‹ฐ๋ฅผ ๋กœ๋“œํ•˜๋Š” ๊ฒƒ์€ ๊ฐ€๋Šฅํ•˜๋‹ค. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋‚ด์˜ ๋ฐ์ดํ„ฐ๋Š” M:M๊ด€๊ณ„๋‚˜ 1:M๊ด€๊ณ„์— ์˜ ํ•ด ํ‘œํ˜„๋ ๊ฒƒ์ด๋‹ค. ๊ฐ์ฒด๋ชฉ๋ก์„ ๋กœ๋“œํ•˜๋Š” ๊ฒƒ์€ statement์— ์–ด๋–ค ๋ณ€๊ฒฝ์‚ฌํ•ญ๋„ ์ฃผ์ง€ ์•Š๋Š”๋‹ค. SQL Mapํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ๋น„์ฆˆ๋‹ˆ์Šค๊ฐ ์ฒด๋‚ด์—์„œ ๋ฆฌ์ŠคํŠธ์ฒ˜๋Ÿผ ํ”„๋ผํผํ‹ฐ๋ฅผ ๋กœ๋“œํ•˜๊ธฐ์œ„ํ•ด ์š”๊ตฌ๋˜๋Š” ๋‹จ ํ•˜๋‚˜์˜ ์ฐจ์ด์ ์€ java.util.List ๋˜๋Š” java.util.Collection ํƒ€์ž…์ด ๋˜์–ด์•ผ ํ•œ๋‹ค๋Š”๊ฒƒ์ด๋‹ค. ์˜ˆ๋ฅผ๋“ค๋ฉด Category๊ฐ€ Product ์ธ์Šคํ„ด์Šค ๋ชฉ๋ก์„ ๊ฐ€์ง„๋‹ค๋ฉด ๋งตํ•‘์€ ๋‹ค์Œ์ฒ˜๋Ÿผ ๋ณด์ผ๊ฒƒ์ด๋‹ค.(Category๊ฐ€ java.util.Listํƒ€์ž…์˜ โ€œproductListโ€๋ผ๊ณ  ๋ถˆ๋ฆฌ๋Š” ํ”„๋ผํผํ‹ฐ๋ฅผ ๊ฐ€์ง„๋‹ค๊ณ  ๊ฐ€์ •ํ•˜์ž.) <resultMap id=โ€get-category-resultโ€ class=โ€com.ibatis.example.Categoryโ€> <result property=โ€idโ€ column=โ€CAT_IDโ€/> <result property=โ€descriptionโ€ column=โ€CAT_DESCRIPTIONโ€/> <result property=โ€productListโ€ column=โ€CAT_IDโ€ select=โ€ getProductsByCatIdโ€/> </resultMap> <resultMap id=โ€get-product-resultโ€ class=โ€com.ibatis.example.Productโ€> <result property=โ€idโ€ column=โ€PRD_IDโ€/> <result property=โ€descriptionโ€ column=โ€PRD_DESCRIPTIONโ€/> </resultMap> <statement id=โ€getCategoryโ€ parameterClass=โ€intโ€ resultMap=โ€get-category-resultโ€> select * from CATEGORY where CAT_ID = #value# </statement> <statement id=โ€getProductsByCatIdโ€ parameterClass=โ€intโ€ resultMap=โ€get-product-resultโ€> select * from PRODUCT where PRD_CAT_ID = #value# </statement> 24
  • 25. N+1 Selects (1:M ๊ณผ M:N) ํ”ผํ•˜๊ธฐ ์ด๊ฒƒ์€ ์œ„์˜ 1:1 ์ƒํ™ฉ๊ณผ ์œ ์‚ฌํ•˜๋‹ค. ํ•˜์ง€๋งŒ ๊ต‰์žฅํžˆ ๋งŽ์€ ๋ฐ์ดํ„ฐ๋ฅผ ํฌํ•จํ•  ๋•Œ ์ข€๋” ํฐ ๊ฑฑ์ •๊ฑฐ๋ฆฌ๊ฐ€ ๋ ๊ฒƒ์ด๋‹ค. ์œ„ ํ•ด๊ฒฐ๋ฒ•๊ณผ ํ•จ๊ป˜ ๋ฌธ์ œ๋Š” ๋‹น์‹ ์ด Category๋ฅผ ๋กœ๋“œํ• ๋•Œ๋งˆ๋‹ค ๋‘๊ฐœ์˜ SQL๋ฌธ(ํ•˜๋‚˜๋Š” Category๋ฅผ ์œ„ํ•œ ํ•˜๋‚˜์ด๊ณ  ํ•˜๋‚˜๋Š” Products์— ๋Œ€ํ•œ ๋ชฉ๋ก์„ ์œ„ ํ•œ ๊ฒƒ)์€ ์‹ค์งˆ์ ์œผ๋กœ ์ˆ˜ํ–‰๋œ๋‹ค. ์ด ๋ฌธ์ œ๋Š” ํ•˜๋‚˜์˜ Category๋ฅผ ๋กœ๋“œํ•  ๋•Œ ํ‰๋ฒ”ํ•œ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋งŒ 10๊ฐœ์˜ Category๋ฅผ ๋กœ๋“œํ•˜ ๋Š” ์ฟผ๋ฆฌ๋ฌธ์„ ์‹คํ–‰ํ• ๋•Œ๋Š” ๊ฐ๊ฐ์˜ ์ฟผ๋ฆฌ๊ฐ€ Product์˜ ๋ชฉ๋ก์„ ๋กœ๋“œํ•˜๊ธฐ ์œ„ํ•œ ๊ฐ๊ฐ์˜ Category๋ฅผ ์œ„ํ•ด์„œ ์ˆ˜ํ–‰๋ ๊ฒƒ์ด๋‹ค. ๊ฒฐ๊ณผ์ ์œผ ๋กœ 11๊ฐœ์˜ ์ฟผ๋ฆฌ๊ฐ€ ์ˆ˜ํ–‰๋œ๋‹ค. ํ•˜๋‚˜๋Š” Category ๋ชฉ๋ก์„ ์œ„ํ•œ๊ฒƒ์ด๊ณ  ๊ฐ๊ฐ์˜ Product ๊ด€๋ จ ๋ชฉ๋ก์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฐ๊ฐ์˜ Category๋ฅผ ์œ„ํ•œ ๊ฒƒ์ด๋‹ค(N+1 ๋˜๋Š” ์ด ๊ฒฝ์šฐ์—” 10+1=11). ์ด ์ƒํ™˜์„ ๋”์šฑ ๋‚˜์˜๊ฒŒ ๋งŒ๋“ค๋ ค๋ฉด ์šฐ๋ฆฌ๋Š” ๊ต‰์žฅํžˆ ๋งŽ์€ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฃจ๋ฉด ๋œ๋‹ค. 1:N ๊ณผ M:N ํ•ด๊ฒฐ๋ฒ• iBATIS๋Š” ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•œ๋‹ค. ๋‹ค์Œ์€ ๊ทธ ์˜ˆ์ œ์ด๋‹ค. <sqlMap namespace="ProductCategory"> <resultMap id=โ€categoryResultโ€ class=โ€com.ibatis.example.Categoryโ€ groupBy=โ€idโ€> <result property=โ€idโ€ column=โ€CAT_IDโ€/> <result property=โ€descriptionโ€ column=โ€CAT_DESCRIPTIONโ€/> <result property=โ€productListโ€ resultMap=โ€ProductCategory.productResultโ€/> </resultMap> <resultMap id=โ€productResultโ€ class=โ€com.ibatis.example.Productโ€> <result property=โ€idโ€ column=โ€PRD_IDโ€/> <result property=โ€descriptionโ€ column=โ€PRD_DESCRIPTIONโ€/> </resultMap> <select id=โ€getCategoryโ€ parameterClass=โ€intโ€ resultMap=โ€categoryResultโ€> select C.CAT_ID, C.CAT_DESCRIPTION, P.PRD_ID, P.PRD_DESCRIPTION from CATEGORY C left outer join PRODUCT P on C.CAT_ID = P.PRD_CAT_ID where CAT_ID = #value# </select> </sqlMap> ๋‹น์‹ ์ด ํ˜ธ์ถœํ• ๋•Œ, List myList = executeQueryForList("ProductCategory.getCategory", new Integer(1002)); ...๋ฉ”์ธ ์ฟผ๋ฆฌ๋Š” ์ˆ˜ํ–‰๋˜๊ณ  ๊ฒฐ๊ณผ๋Š” โ€œ com.ibatis.example.Category โ€œํƒ€์ž…์˜ bean์ธ myList๋ณ€์ˆ˜์— ์ €์žฅ๋œ๋‹ค. List๋‚ด ๊ฐ๊ฐ์˜ ๊ฐ์ฒด๋Š” ๊ฐ™์€ ์ฟผ๋ฆฌ๋กœ๋ถ€ํ„ฐ ์ƒ์„ฑ๋˜๋Š” List์ธ โ€œ productList โ€œํ”„๋ผํผํ‹ฐ๋ฅผ ๊ฐ€์งˆ๊ฒƒ์ด๋‹ค. ํ•˜์ง€๋งŒ ํ•˜์œ„ ๋ชฉ๋ก๋‚ด bean์„ ์ƒ์„ฑํ•˜๋Š” โ€œ productResult โ€œ ๊ฒฐ๊ณผ ๋งต์„ ์‚ฌ์šฉํ•œ๋‹ค. ๊ทธ๋ž˜์„œ ๋‹น์‹ ์€ ํ•˜์œ„๋ชฉ๋ก์„ ํฌํ•จํ•˜๋Š” ๋ชฉ๋ก์œผ๋กœ ์ข…๋ฃŒํ•˜๊ณ  ์˜ค์ง ํ•˜๋‚˜์˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ฟผ๋ฆฌ ๋งŒ์ด ์ˆ˜ํ–‰๋œ๋‹ค. ๊ฐ€์žฅ ์ค‘์š”ํ•œ ํ•ญ๋ชฉ์€ "categoryResult" ๊ฒฐ๊ณผ ๋งต๋‚ด groupBy="id" ...์†์„ฑ์ด๊ณ  ... <result property="productList" resultMap="ProductCategory.productResult"/> ...ํ”„๋ผํผํ‹ฐ ๋งตํ•‘์ด๋‹ค. ๋‹ค๋ฅธ ์ค‘์š”ํ•œ ์‚ฌํ•ญ์€ productListํ”„๋ผํผํ‹ฐ๋ฅผ ์œ„ํ•œ ๊ฒฐ๊ณผ๋งตํ•‘์ด ๋ช…๋ช…๊ณต๊ฐ„์„ ์ธ์‹(์ด๊ฒƒ์€ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” โ€œproductResult โ€œ์ด ๋ ๊ฒƒ์ด๋‹ค.)ํ•˜๋Š”๊ฒƒ์ด๋‹ค. ์ด ์ ‘๊ทผ๋ฒ•์„ ์‚ฌ์šฉํ•˜์—ฌ, ๋‹น์‹ ์€ N+1 ๋ฌธ์ œ๋ฅผ ํ’€์ˆ˜ ์žˆ๋‹ค. 25
  • 26. ๋Šฆ์€(Lazy) ๋กœ๋”ฉ ๋Œ€ ์กฐ์ธ(1:M and M:N) ๋จผ์ € ์ด์•ผ๊ธฐ๋œ 1:1์ƒํ™ฉ์ฒ˜๋Ÿผ ์กฐ์ธ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์–ธ์ œ๋‚˜ ๋” ์ข‹๋‹ค๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ๋Š” ๊ฒƒ์„ ์•„๋Š” ๊ฒƒ์€ ์ค‘์š”ํ•˜๋‹ค. ์ด๊ฒƒ์€ ๋Œ€๋Ÿ‰์˜ ๋ฐ์ดํ„ฐ๋กœ ์ธํ•˜์—ฌ ๊ฐœ๋ณ„์ ์ธ ๊ฐ’ ํ”„๋ผํผํ‹ฐ๋ฅผ ์œ„ํ•œ ๊ฒƒ๋ณด๋‹ค collectionํ”„๋ผํผํ‹ฐ์—์„œ ์ข€๋” ์‚ฌ์‹ค์ ์ด๋‹ค. ๋งŒ์•ฝ ๋‹น์‹ ์ด ๊ด€๋ จ๋œ ๊ฐ์ฒด์— ์ ‘๊ทผํ•˜๋Š” ๊ฒƒ์ด ๋“œ๋ฌธ ์ƒํ™ฉ(์ด๋ฅผ ํ…Œ๋ฉด Categoryํด๋ž˜์Šค์˜ productList ํ”„๋ผํผํ‹ฐ)์ด๋ผ๋ฉด ์ด๊ฒƒ์€ ์กฐ์ธ๊ณผ product๋ชฉ๋ก์˜ ํ•„์š”์—†๋Š” ๋กœ๋”ฉ์„ ํ”ผํ•œ๋‹ค๋ฉด ์ •๋ง ๋น ๋ฅด๊ฒŒ ๋ ๊ฒƒ์ด๋‹ค. ์ด๊ฒƒ์€ outer์กฐ์ธ๊ณผ null์ด ๊ฐ€๋Šฅํ•˜๊ณ  ์•„๋‹ˆ๋ฉด ๋˜๋Š” ์ธ๋ฑ์Šค๊ฐ€ ์—†๋Š” ์นผ๋Ÿผ์„ ํฌํ•จํ•œ ๋ฐ์ด ํ„ฐ๋ฒ ์ด์Šค ๋””์ž์ธ์—๋Š” ํŠน๋ณ„ํžˆ ์‚ฌ์‹ค์ด๋‹ค. ์ด๋Ÿฐ ์ƒํ™ฉ์—์„œ ๋Šฆ์€(lazy)๋กœ๋”ฉ๊ณผ bytecodeํ–ฅ์ƒ์˜ต์…˜์œผ๋กœ sub-select์†”๋ฃจ์…˜์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ์ข€๋” ํ–ฅ์ƒ์‹œ์ผœ์ค€๋‹ค. ์ผ๋ฐ˜์ ์ธ ๊ทœ์น™์€ ์—ฐ๊ด€๋œ ํ”„๋ผํผํ‹ฐ์— ์ ‘๊ทผํ•˜๋Š” ๊ฒƒ์„ ์ข€๋” ํ•˜๊ณ ์ž ํ• ๋•Œ๋งŒ ์กฐ์ธ์„ ์‚ฌ์šฉํ•˜๋ผ. ๋ฐ˜๋ฉด์— ๋Šฆ ์€ ๋กœ๋”ฉ์ด ์˜ต์…˜์ด ์•„๋‹๋•Œ์—๋งŒ ๊ทธ๊ฒƒ์„ ์‚ฌ์šฉํ•˜๋ผ. ๋จผ์ € ์–ธ๊ธ‰ํ–ˆ๋˜ ๊ฒƒ ์ฒ˜๋Ÿผ ๋งŒ์•ฝ ๋‹น์‹ ์ด ์–ด๋–ค ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š”์ง€ ๊ฒฐ์ •ํ•˜๋Š”๋ฐ ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค๋ฉด ๊ฑฑ์ •ํ•˜์ง€ ๋งˆ๋ผ. ์–ด๋–ค ๋ฐฉ๋ฒ•์„ ์‚ฌ ์šฉํ• ์ง€์— ๋Œ€ํ•ด์„œ ๊ฑฑ์ •ํ•˜๋Š” ๊ฒƒ์€ ํ•„์š”์—†๋Š” ์ผ์ด๋‹ค. ๋‹น์‹ ์€ ๋‹น์‹ ์˜ ์ž๋ฐ”์ฝ”๋“œ์— ์ถฉ๋Œ์—†์ด ๊ทธ๊ฒƒ์„ ๋ณ€ํ™”์‹œํ‚ฌ์ˆ˜ ์žˆ๋‹ค. ์œ„์˜ ๋‘ ์˜ˆ์ œ ๋Š” ๊ฐ™์€ ๊ฐ์ฒดํ˜•ํƒœ์˜ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์ด๊ณ  ์ •ํ™•ํ•˜๊ฒŒ ๊ฐ™์€ ๋ฉ”์†Œ๋“œ ํ˜ธ์ถœ์„ ์‚ฌ์šฉํ•ด์„œ ๋กœ๋“œ๋œ๋‹ค. ๋งŒ์•ฝ ๋‹น์‹ ์ด ์บ์‰ฌ๋ฅผ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๋ฉด ๋‹จ์ง€ ํ•˜๋‚˜์˜ ๊ณ ๋ ค์‚ฌํ•ญ์€ separate select(์กฐ์ธ์ด ์•„๋‹Œ) ์†”๋ฃจ์…˜์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋ฐ˜ํ™˜๋˜๋Š” ์บ์‰ฌ๋œ ์ธ์Šคํ„ด์Šค๋‚ด์— ๊ฒฐ๊ณผ๋ฅผ ๋ณด์ด๊ฒŒ ๋œ ๋‹ค. ๋ณตํ•ฉ ํ‚ค๋˜๋Š” ๋‹ค์ค‘ ๋ณตํ•ฉ ํŒŒ๋ผ๋ฏธํ„ฐ ํ”„๋ผํผํ‹ฐ ๋‹น์‹ ์€ ์œ„ ์˜ˆ์ œ์—์„œ column ์†์„ฑ์— ์˜ํ•ด resultMap๋‚ด์— ์ •์˜๋œ ๊ฒƒ์ฒ˜๋Ÿผ ์‚ฌ์šฉ๋˜์–ด์ง€๋Š” ๊ฒƒ์€ ํ•˜๋‚˜์˜ ํ‚ค๋ผ๋Š” ๊ฒƒ์ด ์–ธ๊ธ‰๋˜์—ˆ๋‹ค. ์ด๊ฒƒ์€ ๋‹จ์ง€ ํ•˜๋‚˜์˜ ํ‚ค๋งŒ์ด ๊ด€๊ณ„๋œ ๋งตํ•‘ statement์— ๊ด€๋ จ ๋  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์ œ์•ˆํ–ˆ๋‹ค. ์–ด์จŒ๋“  ๊ด€๊ณ„๋œ ๋งตํ•‘ statement์— ์ „ ๋‹ฌํ•  ๋‹ค์ค‘ ์นผ๋Ÿผ์„ ํ—ˆ๋ฝํ•˜๋Š” ๋Œ€์•ˆ์ ์ธ ๋ฌธ๋ฒ•์ด ์žˆ๋‹ค. ์ด๊ฒƒ์€ ๋ณตํ•ฉํ‚ค ๊ด€๊ณ„๊ฐ€ ์กด์žฌํ•˜๋Š” ์ƒํ™ฉ์ด๋‚˜ ๋‹น์‹ ์ด ๊ฐ„๋‹จํ•˜๊ฒŒ #value#์™€ ๋‹ค ๋ฅธ ์ด๋ฆ„์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ ์ž ํ•  ๋•Œ ํŽธ๋ฆฌํ•˜๋‹ค. Column ์†์„ฑ์ด ๊ฐ„๋‹จ{param1=column1, param2=column2, โ€ฆ, paramN=columnN}ํ•  ๋•Œ ๋Œ€์•ˆ์ ์ธ ๋ฌธ๋ฒ•์ด๋‹ค. PAYMENTํ…Œ์ด๋ธ”์ด Customer ID์™€ Order ID๋ฅผ ๋‘˜๋‹ค ํ‚ค๋กœ ํ•  ๋•Œ ๋‹ค์Œ์˜ ์˜ˆ์ œ๋ฅผ ๋ณด๊ณ  ์ƒ๊ฐํ•ด๋ณด๋ผ. <resultMap id=โ€get-order-resultโ€ class=โ€com.ibatis.example.Orderโ€> <result property=โ€idโ€ column=โ€ORD_IDโ€/> <result property=โ€customerIdโ€ column=โ€ORD_CST_IDโ€/> โ€ฆ <result property=โ€paymentsโ€ column=โ€{itemId=ORD_ID, custId=ORD_CST_ID}โ€ select=โ€ getOrderPaymentsโ€/> </resultMap> <statement id=โ€getOrderPaymentsโ€ resultMap=โ€get-payment-resultโ€> select * from PAYMENT where PAY_ORD_ID = #itemId# and PAY_CST_ID = #custId# </statement> ์˜ต์…˜์ ์œผ๋กœ ๋‹น์‹ ์€ ๊ทธ๊ฒƒ๋“ค์ด ํŒŒ๋ผ๋ฏธํ„ฐ์ฒ˜๋Ÿผ ๊ฐ™์€ ์ˆœ์„œ๋กœ ์ •๋ ฌ๋˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ์นผ๋Ÿผ์ด๋ฆ„์„ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด {ORD_ID, ORD_CST_ID} ์–ธ์ œ๋‚˜ ์ฒ˜๋Ÿผ ์ด๊ฒƒ์€ ์ฝ๊ธฐ์™€ ์œ ์ง€๋ผ๋Š” ๊ฒƒ์˜ ์˜ํ–ฅ๊ณผ ํ•จ๊ป˜ ๋ฏธ์„ธํ•œ ์„ฑ๋Šฅ ํš๋“์ด ์žˆ๋‹ค. ์ค‘์š”! ํ˜„์žฌ์˜ SQL Mapํ”„๋ ˆ์ž„์›Œํฌ๋Š” ์ˆœํ™˜ํ•˜๋Š” ๊ด€๊ณ„๋ฅผ ์ž๋™์œผ๋กœ ํ•ด์„ํ•˜์ง€ ์•Š๋Š”๋‹ค. ๋ถ€๋ชจ/์ž์‹ ๊ด€๊ณ„(ํŠธ๋ฆฌ)๋ฅผ ๊ตฌํ˜„ํ•  ๋•Œ ์ด๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์–ด๋ผ. ์‰ฌ์šด ๋Œ€์•ˆ์€ ๊ฐ„๋‹จํ•˜๊ฒŒ ๋ถ€๋ชจ๊ฐ์ฒด๋ฅผ ๋กœ๋“œํ•˜๊ธฐ ์•Š๋Š” ๊ฒฝ์šฐ๋ฅผ ์œ„ํ•œ ํ•˜๋‚˜ ๋˜๋Š” โ€œN+1 avoidanceโ€ ํ•ด๊ฒฐ๋ฒ•์—์„œ ์„œ์ˆ ๋œ ์กฐ์ธ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๋ฅผ ์œ„ํ•œ ๋‘๋ฒˆ์งธ result map๋ฅผ ์ •์˜ํ•˜๋Š”๊ฒƒ์ด๋‹ค. ์ฃผ์˜! ๋ช‡๋ช‡ JDBC๋“œ๋ผ์ด๋ฒ„(์ด๋ฅผ ํ…Œ๋ฉด ๋‚ด์žฅ๋œ PointBase)๋Š” ๋™์‹œ์— ๋‹ค์ค‘ ResultSet(connection๋งˆ๋‹ค)์„ ์ง€์›ํ•˜์ง€ ์•Š๋Š”๋‹ค. ๊ทธ๋Ÿฐ ๋“œ๋ผ์ด๋ฒ„๋Š” SQL Map์—”์ง„์ด ๋‹ค์ค‘ ResultSet connection์„ ์š”๊ตฌํ•˜๊ธฐ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋ณต์žกํ•œ ๊ฐ์ฒด ๋งตํ•‘๊ณผ๋Š” ์ž‘๋™ํ•˜์ง€ ์•Š์„๊ฒƒ์ด๋‹ค. ๋‹ค์‹œ ๋งํ•ด ์กฐ์ธ์„ ์‚ฌ์šฉํ•˜๋Š”๊ฑฐ ๋Œ€์‹ ์— ์ด๊ฒƒ์„ ํ•ด์„ํ• ์ˆ˜ ์žˆ๋‹ค. ์ฃผ์˜! Result Map ์ด๋ฆ„์€ ์–ธ์ œ๋‚˜ ๊ทธ๊ฒƒ๋“ค์ด ์ •์˜๋œ SQL Map XMLํŒŒ์ผ์— ์œ„์น˜ํ•œ๋‹ค. ๋‹น์‹ ์€ SQL Map์˜ ์ด๋ฆ„์„ Result map ์˜ ์ด๋ฆ„์•ž์— ์œ„์น˜์‹œํ‚ด์œผ๋กœ์จ ๋‹ค๋ฅธ SQL Map XMLํŒŒ์ผ๋‚ด์˜ Result Map๋ฅผ ์ฐธ์กฐํ• ์ˆ˜ ์žˆ๋‹ค. 26
  • 27. ๋งŒ์•ฝ ๋‹น์‹ ์ด JDBC๋ฅผ ์œ„ํ•ด MS์˜ SQL Server2000 ๋“œ๋ผ์ด๋ฒ„๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ๋‹น์‹ ์€ ์ˆ˜๋™ ํŠธ๋žœ์žญ์…˜ ๋ชจ๋“œ์ธ ๋™์•ˆ ๋‹ค์ค‘ statement ๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด connection url์— SelectMethod=Cursor์„ ์ถ”๊ฐ€ํ•  ํ•„์š”๊ฐ€ ์žˆ์„์ง€๋„ ๋ชจ๋ฅธ๋‹ค.(MS์˜ ์ง€์‹ ๊ธฐ๋ฐ˜ ๊ธฐ์‚ฌ 313181์„ ๋ณด๋ผ. http://support.microsoft.com/default.aspx?scid=kb%3Ben-us%3B313181). ํŒŒ๋ผ๋ฏธํ„ฐ Maps์™€ Result Maps๋ฅผ ์œ„ํ•ด ์ง€์›๋˜๋Š” ํƒ€์ž…๋“ค ํŒŒ๋ผ๋ฏธํ„ฐ์™€ result๋ฅผ ์œ„ํ•ด iBATIS ํ”„๋ ˆ์ž„์›Œํฌ์— ์˜ํ•ด ์ง€์›๋˜๋Š” ์ž๋ฐ”ํƒ€์ž…์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค. Java Type JavaBean/Map Result Class / Type Alias** Property Mapping Parameter Class*** boolean YES NO boolean java.lang.Boolean YES YES boolean byte YES NO byte java.lang.Byte YES YES byte short YES NO short java.lang.Short YES YES short int YES NO int/integer java.lang.Integer YES YES int/integer long YES NO long java.lang.Long YES YES long float YES NO float java.lang.Float YES YES float double YES NO double java.lang.Double YES YES double java.lang.String YES YES string java.util.Date YES YES date java.math.BigDecimal YES YES decimal * java.sql.Date YES YES N/A * java.sql.Time YES YES N/A * java.sql.Timestamp YES YES N/A * java.sql. date ํƒ€์ž… ์‚ฌ์šฉ์€ ์ข‹์ง€์•Š๋‹ค(discouraged). ๋Œ€์‹ ์— java.util.Date ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ œ์ผ์ข‹๋‹ค. ** .ํŒŒ๋ผ๋ฏธํ„ฐ๋‚˜ resultํด๋ž˜์Šค๋ฅผ ์ •์˜ํ•  ๋•Œ ํƒ€์ž…๋ณ„์นญ์€ ์ „์ฒด๊ฒฝ๋กœ์˜ ํด๋ž˜์Šค๋ช…์— ๋‘๋Š” ๊ฒƒ์ด ์ข‹๋‹ค. *** int, boolean and float ์™€ ๊ฐ™์€ ์›์‹œํƒ€์ž…์€ iBATIS ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ ˆ์ด์–ด๊ฐ€ ์™„์ „ํ•œ ๊ฐ์ฒด์ง€ํ–ฅ์ ‘๊ทผ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋Š”๊ฒƒ์ฒ˜๋Ÿผ ์ง ์ ‘์ ์œผ๋กœ ์›์‹œํƒ€์ž…์„ ์ง€์›ํ•˜์ง€๋Š” ์•Š๋Š”๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ ๋ชจ๋“  ํŒŒ๋ผ๋ฏธํ„ฐ์™€ result๋Š” ๊ทธ๋“ค์˜ ์ƒ์œ„๋ ˆ๋ฒจ์—์„œ ๊ฐ์ฒด๊ฐ€ ๋˜์–ด์•ผ ํ•œ๋‹ค. ๋ถ€์ˆ˜ ์ ์œผ๋กœ JDK1.5์˜ autoboxing๊ธฐ๋Šฅ์€ ์ž˜ ์‚ฌ์šฉ๋˜๊ธฐ ์œ„ํ•ด ์›์‹œํƒ€์ž…์„ ํ—ˆ๋ฝํ•œ๋‹ค. ์‚ฌ์šฉ์ž ์ •์˜ ํƒ€์ž… ํ•ธ๋“ค๋Ÿฌ ์ƒ์„ฑํ•˜๊ธฐ ํƒ€์ž…์€ TypeHandlerCallback์ธํ„ฐํŽ˜์ด์Šค์˜ ์‚ฌ์šฉ์„ ํ†ตํ•ด iBATIS๋‚ด์—์„œ ํ™•์žฅ๋ ์ˆ˜ ์žˆ๋‹ค. ๋‹น์‹  ์ž์‹ ์˜ ํƒ€์ž… ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ ํ•ด, TypeHandlerCallback์„ ๊ตฌํ˜„ํ•œ ํด๋ž˜์Šค๋ฅผ ์ƒ์„ฑํ•  ํ•„์š”๊ฐ€ ์žˆ๋‹ค. ์‚ฌ์šฉ์ž์ •์˜ ํƒ€์ž… ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‹น์‹ ์€ ์ง€์›๋˜์ง€ ์•Š๋Š” ํƒ€์ž…์„ ๋‹ค๋ฃจ๊ฑฐ๋‚˜ ์ง€์›๋˜๋Š” ํƒ€์ž…์„ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์œผ๋กœ ๋‹ค๋ค„์„œ ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ํ™•์žฅํ• ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ๋ฅป๋“ค๋ฉด, ๋‹น์‹ ์€ ์ ์ ˆํ•œ BLOB์ง€์›์„ ๊ตฌํ˜„ํ•˜๋Š” ์‚ฌ์šฉ์ž ์ •์˜ ํƒ€์ž… ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ๋Œ€๊ฐœ 0/1๋Œ€์‹ ์— โ€œYโ€์™€ โ€œNโ€์„ ์‚ฌ์šฉํ•˜๋Š” boolean์„ ๋‹ค๋ฃจ๊ธฐ ์œ„ํ•ด ์ด๊ฒƒ์„ ์‚ฌ์šฉ ํ• ์ˆ˜ ์žˆ๋‹ค. ๋‹ค์Œ์€ โ€œYesโ€์™€ โ€œNoโ€๋ฅผ ์‚ฌ์šฉํ•˜๋Š” booleanํ•ธ๋“ค๋Ÿฌ์˜ ๊ฐ„๋‹จํ•œ ์˜ˆ์ œ์ด๋‹ค. public class YesNoBoolTypeHandlerCallback implements TypeHandlerCallback { private static final String YES = "Y"; private static final String NO = "N"; public Object getResult(ResultGetter getter) 27
  • 28. throws SQLException { String s = getter.getString(); if (YES.equalsIgnoreCase(s)) { return new Boolean (true); } else if (NO.equalsIgnoreCase(s)) { return new Boolean (false); } else { throw new SQLException ( "Unexpected value " + s + " found where " + YES + " or " + NO + " was expected."); } } public void setParameter(ParameterSetter setter, Object parameter) throws SQLException { boolean b = ((Boolean)parameter).booleanValue(); if (b) { setter.setString(YES); } else { setter.setString(NO); } } public Object valueOf(String s) { if (YES.equalsIgnoreCase(s)) { return new Boolean (true); } else if (NO.equalsIgnoreCase(s)) { return new Boolean (false); } else { throw new SQLException ( "Unexpected value " + s + " found where " + YES + " or " + NO + " was expected."); } } iBATIS๋‚ด ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ ์ด๋Ÿฌํ•œ ํƒ€์ž…์„ ์„ ์–ธํ•˜๊ธฐ ์œ„ํ•ด, ๋‹น์‹ ์€ sqlMapConfig.xml๋‚ด ๋‹ค์Œ์˜ ๋ฌธ๋ฒ•์„ ์‚ฌ์šฉํ•œ๋‹ค. <typeHandler javaType="boolean" jdbcType=โ€VARCHARโ€ callback="org.apache.ibatis.sqlmap.extensions.YesNoBoolTypeHandlerCallback"/> iBATIS ๊ฐ€ javaํƒ€์ž…๊ณผ jdbcํƒ€์ž…๊ฐ„์˜ ์ด์ „์„ ๋‹ค๋ฃจ๋Š”๊ฒƒ์„ ์•Œ๊ณ  ๋‚œ๋’ค์—, ํŠน์ • ํƒ€์ž… ํ•ธ๋“ค๋Ÿฌ ์ฝœ๋ฐฑ์€ ์ž‘์„ฑ๋œ๋‹ค. ์บ์‰ฌ์ƒํƒœ์˜ ๋งตํ•‘๋œ Statement Results ๋งตํ•‘๋œ statement ์ฟผ๋ฆฌ๋กœ๋ถ€ํ„ฐ์˜ result๋Š” statementํƒœํฌ๋‚ด์— cacheModelํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์ •์˜ํ•จ์œผ๋กœ์จ ๊ฐ„๋‹จํ•˜๊ฒŒ ์บ์‰ฌ๋ ์ˆ˜ ์žˆ๋‹ค. ์บ์‰ฌ ๋ชจ๋ธ์€ ๋‹น์‹ ์˜ SQL Map๋‚ด์—์„œ ์ •์˜๋œ ์„ค์ •๋œ ์บ์‰ฌ๋‹ค. ์บ์‰ฌ ๋ชจ๋ธ์€ ๋‹ค์Œ์ฒ˜๋Ÿผ cacheModel์š”์†Œ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์„ค์ •๋œ๋‹ค. <cacheModel id="product-cache" type ="LRU" readOnly=โ€trueโ€ serialize=โ€falseโ€> <flushInterval hours="24"/> <flushOnExecute statement="insertProduct"/> <flushOnExecute statement="updateProduct"/> <flushOnExecute statement="deleteProduct"/> <property name=โ€cache-sizeโ€ value=โ€1000โ€ /> </cacheModel> 28