[MYBATIS] CONFIGURATION & MAPPER

์„ฑ์žฅ์ผ๊ธฐยท2024๋…„ 8์›” 25์ผ
2

[SWCAMP] MYBATIS

๋ชฉ๋ก ๋ณด๊ธฐ
3/4

MyBatis Configuration by JAVA

Environment class

๐Ÿ’ก ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ ‘์†์— ๊ด€ํ•œ ํ™˜๊ฒฝ ์„ค์ • ์ •๋ณด๋ฅผ ๊ฐ€์ง„ ๊ฐ์ฒด๋กœ, MyBatis ํ™˜๊ฒฝ ์„ค์ • ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•œ๋‹ค.

  • MyBatis framework ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ์ œ๊ณตํ•˜๋Š” ํด๋ž˜์Šค์ด๋‹ค.

Environment ๊ฐ์ฒด ์ƒ์„ฑ ๋ฐฉ๋ฒ•

Environment environment = new Environment(*ํ™˜๊ฒฝ ์ •๋ณด ์ด๋ฆ„*
    , *ํŠธ๋žœ์žญ์…˜ ๋งค๋‹ˆ์ € ์ข…๋ฅ˜*
    , *์ปค๋„ฅ์…˜ํ’€ ์‚ฌ์šฉ ์—ฌ๋ถ€*);
  • Environment ํด๋ž˜์Šค๋Š” ๊ธฐ๋ณธ ์ƒ์„ฑ์ž๋ฅผ ์ œ๊ณตํ•˜์ง€ ์•Š๋Š”๋‹ค.
  • ๊ฐ์ฒด ์ƒ์„ฑ ์‹œ ์ „๋‹ฌํ•˜๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ์ฐจ๋ก€๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.
  1. ํ™˜๊ฒฝ ์ •๋ณด ์ด๋ฆ„ : ์ƒ์„ฑํ•  ํ™˜๊ฒฝ ์ •๋ณด์˜ ์ด๋ฆ„์„ ์„ค์ •ํ•œ๋‹ค.
  2. ํŠธ๋žœ์žญ์…˜ ๋งค๋‹ˆ์ € ์ข…๋ฅ˜๋Š” ๋‘ ๊ฐ€์ง€๊ฐ€ ์žˆ๊ณ , ์•ˆ์ „ํ•œ ํŠธ๋žœ์žญ์…˜ ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•ด JdbcTransactionFactory ์‚ฌ์šฉ์„ ๊ถŒ์žฅํ•œ๋‹ค.
    • JdbcTransactionFactory : ์ฝ”๋“œ ์ž‘์„ฑ์„ ํ†ตํ•ด ์ˆ˜๋™์œผ๋กœ ์ปค๋ฐ‹์„ ์กฐ์ž‘
    • ManagedTransactionFactory : JDBC๊ฐ€ ์ž๋™์œผ๋กœ ์ปค๋ฐ‹์„ ์ˆ˜ํ–‰
  3. ์ปค๋„ฅ์…˜ํ’€ ์‚ฌ์šฉ ์—ฌ๋ถ€์— ๋”ฐ๋ผ ๋‘ ๊ฐ€์ง€ ์„ค์ •์„ ํ•  ์ˆ˜ ์žˆ๊ณ , ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ Connection ์†๋„ ๋ฐ ๋ฉ”๋ชจ๋ฆฌ ํšจ์œจ์ด ์ฆ๋Œ€๋˜๋Š” ์žฅ์ ์ด ์žˆ๋‹ค.
    • ์–ด๋–ค ์„ค์ •์„ ์‚ฌ์šฉํ•˜๋“  ์ƒ์„ฑ ์‹œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ์„ ์œ„ํ•œ ์„ค์ • ์ •๋ณด(๋“œ๋ผ์ด๋ฒ„, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค URL, USER, ๋น„๋ฐ€๋ฒˆํ˜ธ)๋ฅผ ์ธ์ž๊ฐ’์œผ๋กœ ์ฃผ์–ด์•ผ ํ•œ๋‹ค.
    • PooledDataSource : ConnectionPool ์‚ฌ์šฉ
    • UnpooledDataSource : ConnectionPool ์‚ฌ์šฉํ•˜์ง€ ์•Š์Œ

Environment class ์‚ฌ์šฉ ์˜ˆ์‹œ

Environment environment = new Environment("dev"
    , new JdbcTransactionFactory()
    , new PooledDataSource(DRIVER, URL, USER, PASSWORD));

Configuration class

๐Ÿ’ก ํ™˜๊ฒฝ ์„ค์ • ์ •๋ณด Environment ๊ฐ์ฒด๋ฅผ ๊ฐ€์ง€๊ณ  ์ƒ์„ฑํ•œ MyBatis ์„ค์ • ๊ฐ์ฒด๋กœ, DB ์ ‘์† ๊ด€๋ จ ์ •๋ณด, mapper ๋“ฑ๋ก, ๋ณ„์นญ ๋“ฑ๋ก ๋“ฑ myBatis ์ „์—ญ ์„ค์ • ์ •๋ณด๋ฅผ ๋‹ด๊ณ  ์žˆ๋‹ค.

Configuration ๊ฐ์ฒด ์‚ฌ์šฉ ์˜ˆ์‹œ

Configuration configuration = new Configuration(environment);
configuration.addMapper(Mapper.class);
  • addMapper() ๋ฉ”์†Œ๋“œ๋Š” ์„ค์ • ๊ฐ์ฒด์— ๋งคํผ๋ฅผ ๋“ฑ๋กํ•œ๋‹ค.

SqlSessionFactory์™€ SqlSession

SqlSessionFactory์™€ SqlSessionFactoryBuilder

SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(configuration);
  1. SqlSessionFactory

    1. SqlSession ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•œ ํŒฉํ† ๋ฆฌ ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค์ด๋‹ค.
    2. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์‹คํ–‰๋˜๋Š” ๋™์•ˆ ์—ฌ๋Ÿฌ ์ฐจ๋ก€ ๋นŒ๋“œํ•˜์ง€ ์•Š๋„๋ก, ์‹ฑ๊ธ€ํ†ค ํŒจํ„ด ๋“ฑ์„ ์ด์šฉํ•˜์—ฌ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ์Šค์ฝ”ํ”„๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.
  2. SqlSessionFactoryBuilder

    1. SqlSessionFactory ์ธํ„ฐํŽ˜์ด์Šค ํƒ€์ž…์˜ ํ•˜์œ„ ๊ตฌํ˜„ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•œ ๋นŒ๋“œ ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.

    2. build() ๋ฉ”์†Œ๋“œ๋Š” ์„ค์ • ์ •๋ณด๋ฅผ ๋‹ด๊ณ  ์žˆ๋Š” Configuration ํƒ€์ž…์˜ ๊ฐ์ฒด ํ˜น์€ ์™ธ๋ถ€ ์„ค์ • ํŒŒ์ผ๊ณผ ์—ฐ๊ฒฐ๋œ ์ŠคํŠธ๋ฆผ์„ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ „๋‹ฌํ•˜๋ฉด SqlSessionFactory ์ธํ„ฐํŽ˜์ด์Šค ํƒ€์ž…์˜ ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

    3. SqlSessionFactoryBuilder ๋ฉ”์†Œ๋“œ

      method ๊ตฌ๋ถ„์„ค๋ช…
      build(InputStream)config.xml ํŒŒ์ผ๋งŒ ๋ถˆ๋Ÿฌ์˜ด
      build(InputStream, String)config.xml ํŒŒ์ผ๊ณผ ์ง€์ •ํ•œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๋ถˆ๋Ÿฌ์˜ด
      build(InputStream, Properties)config.xmlํŒŒ์ผ๊ณผ property ๋กœ ์„ค์ •ํ•œ ๋‚ด์šฉ์œผ๋กœ ๋ถˆ๋Ÿฌ์˜ด(โ€œ${key}โ€)
      build(InputStream, String, Properties)config.xml ํŒŒ์ผ๊ณผ ์ง€์ •ํ•œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค, properties ํŒŒ์ผ ๋ถˆ๋Ÿฌ์˜ด
      build(configuration)configuration ๊ฐ์ฒด์— ์„ค์ •ํ•œ ๋‚ด์šฉ์„ ๋ถˆ๋Ÿฌ์˜ด
      • config.xml์€ Resource๊ฐ์ฒด์˜ getResourceAsStream ๋ฉ”์†Œ๋“œ๋ฅผ ์ด์šฉํ•ด InputStream์œผ๋กœ ๊ฐ€์ ธ์˜จ๋‹ค.

SqlSession

SqlSession sqlSession = sqlSessionFactory.openSession(false);
  1. SqlSessionFactory์˜ openSession() ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ SqlSession ์ธํ„ฐํŽ˜์ด์Šค ํƒ€์ž…์˜ ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜๋ฐ›๋Š”๋‹ค.

  2. SqlSession์€ ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ ์•ˆ์ „ํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ(= Thread-safe ํ•˜์ง€ ์•Š์Œ), ์Šค๋ ˆ๋“œ๋งˆ๋‹ค ์ƒ์„ฑํ•˜์—ฌ ๊ณต์œ ๋˜์ง€ ์•Š๋„๋ก ํ•ด์•ผ ํ•œ๋‹ค.

    • ๋”ฐ๋ผ์„œ HTTP ์š”์ฒญ ๋ผ์ดํ”„์‚ฌ์ดํด๊ณผ ์œ ์‚ฌํ•˜๊ฒŒ, ์š”์ฒญ ์‹œ ์ƒ์„ฑํ•˜๊ณ  ์š”์ฒญ ์ฒ˜๋ฆฌ๊ฐ€ ์™„๋ฃŒ๋˜๋ฉด closeํ•˜๋Š” ์Šค์ฝ”ํ”„๋ฅผ ๊ถŒ์žฅํ•œ๋‹ค.
  3. openSession() ๋ฉ”์†Œ๋“œ

    • boolean ํƒ€์ž…์„ ์ธ์ž๋กœ ์ „๋‹ฌํ•˜๋Š”๋ฐ, ์ด๋Š” Connection ์ธํ„ฐํŽ˜์ด์Šค ํƒ€์ž… ๊ฐ์ฒด๋กœ DML ์ˆ˜ํ–‰ ํ›„ auto commit ์—ฌ๋ถ€์— ๋Œ€ํ•œ ์˜ต์…˜์„ ์˜๋ฏธํ•œ๋‹ค.

    • auto commit ์˜ต์…˜์€ false๋กœ ์ง€์ •ํ•˜์—ฌ ํŠธ๋žœ์žญ์…˜์„ ์ง์ ‘ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•œ๋‹ค.

    • Mybatis SqlSessionFactory๋ฅผ ํ†ตํ•ด Session์„ ์ƒ์„ฑํ•˜๋Š” openSession() ๋ฉ”์†Œ๋“œ๋Š” ์—ฌ๋Ÿฌ๊ฐ€์ง€ ํ˜•์‹์œผ๋กœ ์˜ค๋ฒ„๋กœ๋”ฉ ๋˜์–ด์žˆ๋Š”๋ฐ, ๊ทธ์ค‘ ๋Œ€ํ‘œ์ ์ธ ๊ฒƒ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

      method ๊ตฌ๋ถ„์„ค๋ช…
      openSession()๊ธฐ๋ณธ๊ฐ’์„ ํ†ตํ•ด SqlSession ์ƒ์„ฑ
      openSession(Boolean)- SqlSession ์ƒ์„ฑ ์‹œ AutoCommit ์—ฌ๋ถ€ ์ง€์ •
      - ๊ธฐ๋ณธ๊ฐ’ = true
      openSession(Connection)- ์ง์ ‘ ์ƒ์„ฑํ•œ Connection ๊ฐ์ฒด๋ฅผ ์ด์šฉํ•ด SqlSession ์ƒ์„ฑ
      - ๊ธฐ๋ณธ๊ฐ’ = X
      openSession(ExecutorType)- ์ฟผ๋ฆฌ ์‹คํ–‰ ์‹œ PreparedStatement์˜ ์žฌ์‚ฌ์šฉ์—ฌ๋ถ€ ์„ค์ •
      - ๊ธฐ๋ณธ๊ฐ’ = ExecutorType.SIMPLE
  4. SqlSession์€ ์‚ฌ์šฉ ํ›„ ๋ฐ˜๋“œ์‹œ close()ํ•˜์—ฌ ๋ฐ˜๋‚ฉํ•ด์•ผ ํ•œ๋‹ค.

    sqlSession.close();
  5. mapper.xml์—์„œ ์„ ์–ธํ•œ ์ฟผ๋ฆฌ ๊ตฌ๋ฌธ์„ SqlSession์—์„œ ์‹คํ–‰ํ•˜๋Š” ๋ฉ”์†Œ๋“œ๋Š” ์ด 6๊ฐ€์ง€๋กœ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

    method๋ช…์„ค๋ช…
    Object selectOne(String mapper, Object param)ํ•˜๋‚˜์˜ ๊ฐ์ฒด๋งŒ์„ ๋ฐ›์„ ๋•Œ ์‚ฌ์šฉ
    List<E> selectList(String mapper, Object param)๊ฒฐ๊ณผ์— ๋Œ€ํ•œ ๊ฐ’์„ List๋กœ ๋ฐ›์„ ๋•Œ ์‚ฌ์šฉ
    Map<K,V> selectMap(String mapper, Object param, String mapKey)๊ฒฐ๊ณผ์— ๋Œ€ํ•œ ๊ฐ’์„ Map์œผ๋กœ ๋ฐ›์„ ๋•Œ ์‚ฌ์šฉ (๋งˆ์ง€๋ง‰ ์ธ์ž๋กœ key๋กœ ์‚ฌ์šฉ๋  ์ปฌ๋Ÿผ ๋ช…์‹œ)
    int insert(String mapper, Object param)Database์— ๋ฐ์ดํ„ฐ๋ฅผ ์ž…๋ ฅํ•  ๋•Œ ์‚ฌ์šฉ
    int update(String mapper, Object param)Database์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ •ํ•  ๋•Œ ์‚ฌ์šฉ
    int delete(String mapper, Object param)Database์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ญ์ œํ•  ๋•Œ ์‚ฌ์šฉ

MyBatis Configuration by XML

XML Configuration ํŒŒ์ผ ๊ตฌ์กฐ

MyBatis Config XML ํŒŒ์ผ ์ž‘์„ฑ ๋ฐฉ๋ฒ•

(์ฐธ๊ณ ) https://mybatis.org/mybatis-3/getting-started.html

  1. ์„ค์ • ์ •๋ณด๋ฅผ ์ž‘์„ฑํ•˜๊ธฐ ์œ„ํ•œ mybatis-config.xml ํŒŒ์ผ์„ ๋“ฑ๋กํ•œ๋‹ค.

    • (์„ค์ • ํŒŒ์ผ ๊ฒฝ๋กœ๋Š” src > main > resources ํ•˜์œ„์— ํด๋”๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ์ง€์ •ํ•˜๋„๋ก ํ•œ๋‹ค.)
  2. xml ํŒŒ์ผ ์ตœ์ƒ๋‹จ์— ๋‹ค์Œ๊ณผ ๊ฐ™์ด xml ํ˜•์‹์„ ์ง€์ •ํ•˜์—ฌ ์ดํ•˜์˜ ์„ค์ • ๋‚ด์šฉ์ด mybatis ์„ค์ •์ž„์„ ์„ ์–ธํ•œ๋‹ค.

    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
    • DOCTYPE์œผ๋กœ ์„ค์ •ํ•˜๋Š” ๋‚ด์šฉ์€ ํ•˜์œ„์— ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ํƒœ๊ทธ, ์†์„ฑ๋“ค์ด ์ •์˜๋˜์–ด ์žˆ๋Š” ํŒŒ์ผ์ด๋‹ค.
      • โ†’ ๋”ฐ๋ผ์„œ ํ•ด๋‹น ํŒŒ์ผ์— ์ž‘์„ฑํ•˜๋Š” ํƒœ๊ทธ ํ˜น์€ ์†์„ฑ ๋“ฑ์ด ๋งž๊ฒŒ ์ž‘์„ฑ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•œ๋‹ค.
  3. ์„ค์ • ๋‚ด์šฉ ์•„๋ž˜ ์ตœ์ƒ์œ„ ํƒœ๊ทธ์ธ <configuration>์„ ์ž‘์„ฑํ•˜๊ณ  ๋‚ด๋ถ€์— ํ•„์š”ํ•œ ์„ค์ •์„ ์ •๋ณด๋ฅผ ์ž‘์„ฑํ•œ๋‹ค.

    <?xml version="1.0" encoding="utf-8"?>
    <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
    <configuration>
    . . .
    </configuration>

MyBatis Configuration XML Tags

<properties>

  1. ์„ค์ • ํŒŒ์ผ์—์„œ ๊ณตํ†ต์ ์ธ ์†์„ฑ์„ ์ •์˜ํ•˜๊ฑฐ๋‚˜ ์™ธ๋ถ€ ํŒŒ์ผ์—์„œ ๊ฐ’์„ ๊ฐ€์ ธ์˜ค๋Š” ํƒœ๊ทธ์ด๋‹ค.

  2. ์™ธ๋ถ€ ํ”„๋กœํผํ‹ฐ ํŒŒ์ผ์€ resource ํ•˜์œ„์˜ ๊ฒฝ๋กœ๋ฅผ ๊ธฐ์ˆ ํ•˜๋ฉด ๋œ๋‹ค.

    • ํด๋ž˜์ŠคํŒจ์Šค ๊ฒฝ๋กœ๊ฐ€ ์•„๋‹Œ ๊ฒฝ์šฐ url์†์„ฑ์— "file:d:\"๋กœ ์‹œ์ž‘ํ•˜๋Š” ๊ฒฝ๋กœ๋ฅผ ๊ธฐ์ˆ ํ•˜๋ฉด ๋œ๋‹ค.
  3. <properties> ํƒœ๊ทธ ์•ˆ์ชฝ์— <property> ํƒœ๊ทธ๋ฅผ ์ž‘์„ฑํ•˜์—ฌ properties ํŒŒ์ผ์— ๊ฐ’์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

  4. ์‚ฌ์šฉ ๋ฐฉ๋ฒ•

    • ํ”„๋กœํผํ‹ฐ์— ์„ค์ •๋œ ๊ฐ’์„ ๊บผ๋‚ด์˜ฌ ๋•Œ๋Š” ${ key } ํ‘œํ˜„์‹์„ ์‚ฌ์šฉํ•œ๋‹ค.
    <properties resource = โ€œ*๊ฒฝ๋กœ+ํŒŒ์ผ๋ช….properties*โ€>
    	<property name=โ€œ*key๋ช…*โ€ value=โ€œ*์„ค์ •๊ฐ’*โ€>
    </properties>

<settings>

  1. SqlSessionFactory ๊ฐ์ฒด๊ฐ€ SqlSession ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค ๋•Œ, ์ƒ์„ฑํ•  ๊ฐ์ฒด์˜ ํŠน์„ฑ์„ ์„ค์ •ํ•œ๋‹ค.

  2. settings ์—˜๋ฆฌ๋จผํŠธ์˜ ํ•˜์œ„ ์—˜๋ฆฌ๋จผํŠธ๋“ค์€ ๋Œ€๋ถ€๋ถ„ ๋””ํดํŠธ๊ฐ’์„ ๊ฐ€์ง€๋ฉฐ, ํŠน๋ณ„ํ•œ ๊ฒฝ์šฐ๊ฐ€ ์•„๋‹ˆ๋ฉด ๋””ํดํŠธ๊ฐ’์„ ์‚ฌ์šฉํ•ด๋„ ๋ฌด๋ฐฉํ•˜๋‹ค.

  3. ์‚ฌ์šฉ ์˜ˆ์‹œ

    <settings>
    	<setting name="jdbcTypeForNull" value="NULL"/>
    </settings>
    • ์œ„ ์†์„ฑ์€ JDBC ํƒ€์ž…์— ๋Œ€ํ•˜์—ฌ Null ๊ฐ’์ด ๋ฐœ์ƒํ•  ๊ฒฝ์šฐ ๋นˆ์นธ์ด ์•„๋‹Œ null๋กœ ์ธ์‹ํ•˜๊ฒŒ ํ•œ๋‹ค.
    • ์†์„ฑ ๊ฐ’ ์ฐธ์กฐ ์‚ฌ์ดํŠธ : http://www.mybatis.org/mybatis-3/ko/configuration.html
  4. <setting>ํƒœ๊ทธ์˜ ํ•˜์œ„ ์—˜๋ฆฌ๋จผํŠธ๋Š” ๋‹ค์Œ 11๊ฐ€์ง€์ด๋‹ค.

    ์—˜๋ฆฌ๋จผํŠธ ํƒœ๊ทธ์„ค๋ช…
    <cacheEnabled>์บ์‹œ ์‚ฌ์šฉ ์—ฌ๋ถ€ ์„ค์ • (๊ธฐ๋ณธ๊ฐ’: true)
    <lazyLodingEnabled>๋ฐ์ดํ„ฐ๋ฅผ ํ•„์š” ์‹œ์ ์— ๊ฐ€์ ธ์™€ ๋™์ž‘ํ•˜๊ฒŒ ํ•˜๋Š” ์˜ต์…˜ (์„ฑ๋Šฅ๊ฐœ์„  / ๊ธฐ๋ณธ๊ฐ’: true)
    <aggressiveLazyLoding>๋Šฆ์€ ๋กœ๋”ฉ ํ™œ์„ฑํ™”/๋น„ํ™œ์„ฑํ™” ์˜ต์…˜ (๊ธฐ๋ณธ๊ฐ’: true)
    <multipleResultSetEnabled>ํ•œ ๊ฐœ์˜ ๊ตฌ๋ฌธ์—์„œ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๊ฒฐ๊ณผ ์…‹์— ๋Œ€ํ•œ ํ—ˆ์šฉ์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ์˜ต์…˜ (๋ฏธ์ง€์› ๋“œ๋ผ์ด๋ฒ„๋„ ์žˆ์Œ / ๊ธฐ๋ณธ๊ฐ’: true)
    <useColumnLabel>์ปฌ๋Ÿผ ์ด๋ฆ„ ๋Œ€์‹  ์ปฌ๋Ÿผ ๋ผ๋ฒจ ์‚ฌ์šฉ ์—ฌ๋ถ€ ์„ค์ • (๋“œ๋ผ์ด๋ฒ„๋งˆ๋‹ค ๊ธฐ๋ณธ๊ฐ’ ๋‹ค๋ฆ„ / ๊ธฐ๋ณธ๊ฐ’: true)
    <useGeneratedKeys>์ƒ์„ฑํ‚ค ์‚ฌ์šฉ ์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ • (๊ธฐ๋ณธ๊ฐ’: false)
    <autoMappingBehavior>์กฐํšŒ ๊ฒฐ๊ณผ ์ž๋™ ๋งคํ•‘ ์„ค์ • (๊ธฐ๋ณธ๊ฐ’: PARTIAL)
    โ€ป mapper ํƒœ๊ทธ์™€ ๋™์ผํ•œ ์„ค์ •์ด์ง€๋งŒ, ์—ฌ๊ธฐ์„œ๋Š” ์ „์—ญ ์„ค์ •์„ ํ•จ
    <defaultExecutorType>- Statement๋ฅผ ์žฌ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ์„ค์ •์ธ SIMPLE (= ๊ธฐ๋ณธ๊ฐ’)
    - PreparedStatement ์žฌ์‚ฌ์šฉ์€ REUSE
    - ์ผ๊ด„์ฒ˜๋ฆฌ ํ•˜๋Š” BATCH
    <defaultStatementTimeout>ํƒ€์ž„์•„์›ƒ์— ๋Œ€ํ•œ ์–‘์ˆ˜์˜ ์ดˆ ๋‹จ์œ„ ์ „์—ญ ์„ค์ • (๊ธฐ๋ณธ๊ฐ’: JDBC ๋“œ๋ผ์ด๋ฒ„ ์ž์ฒด ์„ค์ •๊ฐ’)
    <mapUnderscoreToCamelCase>DB์˜ ์–ธ๋”๋ฐ”๋ฅผ ์ด์šฉํ•œ ๋„ค์ด๋ฐ ๊ทœ์น™๊ณผ ์ž๋ฐ”์˜ ๋‚™ํƒ€๋ด‰ ํ‘œํ˜„์‹์„ ์‚ฌ์šฉํ•ด ์ž๋™ ๋งคํ•‘ํ• ์ง€์— ๋Œ€ํ•œ ์˜ต์…˜ (๊ธฐ๋ณธ๊ฐ’: false)
    <localCacheScope>- ์บ์‹œ ์ €์žฅ ๋ฒ”์œ„๋ฅผ SqlSession์œผ๋กœ ํ•  ๋•Œ SESSION (= ๊ธฐ๋ณธ๊ฐ’)
    - ๊ตฌ๋ฌธ๋ณ„๋กœ ์บ์‹œํ•  ๋•Œ๋Š” STATEMENT๋ฅผ ์„ ํƒ

<typeAliases>

  1. MyBatis์—์„œ ์‚ฌ์šฉํ•  ์ž๋ฃŒํ˜•์˜ ๋ณ„์นญ์„ ์„ ์–ธํ•œ๋‹ค.

  2. ๋งคํผ์˜ ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•  ๋•Œ ResultType์ด๋‚˜ parameter ์†์„ฑ์— ํ’€ํด๋ž˜์Šค๋ช…์œผ๋กœ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ํด๋ž˜์Šค์˜ ๋ณ„์นญ์„ ๋“ฑ๋กํ•˜์—ฌ ๊ฐ„๋žตํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

  3. ์‚ฌ์šฉ ์˜ˆ์‹œ

    • type ์†์„ฑ์—๋Š” ํ’€ํด๋ž˜์Šค๋ช…์„ ์ž‘์„ฑํ•˜๊ณ , alias ์†์„ฑ์— ์‚ฌ์šฉํ•  ๋ณ„์นญ์„ ์ž‘์„ฑํ•œ๋‹ค.
    <typeAliases>
    	<typeAlias type="member.model.vo.Member" alias="Member" />
    </typeAliases>
  4. Mybatis ๋‚ด์žฅ ๋ณ„์นญ ์ฐธ๊ณ  (for parameterType / resultType)

<environments>

  1. MyBatis์—์„œ ์—ฐ๋™ํ•  Database ์ •๋ณด๋ฅผ ๋“ฑ๋กํ•œ๋‹ค.

  2. <environments>ํƒœ๊ทธ๋Š” ์—ฌ๋Ÿฌ ๊ฐœ์˜ <environment>ํƒœ๊ทธ๋ฅผ ํฌํ•จํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, default ์†์„ฑ์œผ๋กœ ๊ธฐ๋ณธ ์‚ฌ์šฉํ•  ํ™˜๊ฒฝ ์„ค์ •์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

  3. <environment>ํƒœ๊ทธ ๋‚ด๋ถ€์—์„œ ์‚ฌ์šฉํ•˜๋Š” ํƒœ๊ทธ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

    1. <transactionManager> : ํŠธ๋žœ์žญ์…˜ ๋งค๋‹ˆ์ €๋ฅผ JDBC ํ˜น์€ MANAGED๋กœ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

      • JDBC : MyBatis API์—์„œ ์ œ๊ณตํ•˜๋Š” commit, rollback ๋ฉ”์†Œ๋“œ ๋“ฑ์„ ์‚ฌ์šฉํ•ด์„œ ํŠธ๋žœ์ ์…˜์„ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐฉ์‹ (์ˆ˜๋™ commit)
      • MANAGED : MyBatis API ๋ณด๋‹ค๋Š” ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ง์ ‘ ํŠธ๋žœ์ ์…˜์„ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐฉ์‹ (์ž๋™ commit)
    2. <dataSource> : ์†์„ฑ์œผ๋กœ ์ปค๋„ฅ์…˜ํ’€ ์‚ฌ์šฉ ์—ฌ๋ถ€๋ฅผ POOLED์™€ UNPOOLED๋กœ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

      • ์„ค์ • ๊ฐ€๋Šฅํ•œ type ์ค‘ JNDI๋„ ์žˆ๋Š”๋ฐ, ์ด๋Š” MyBatis์—์„œ Connection ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ๊ด€๋ฆฌํ•˜์ง€ ์•Š๊ณ  Web Application์˜ ์„ค์ •์„ ๋”ฐ๋ฅด๊ฒ ๋‹ค๋Š” ์˜๋ฏธ์ด๋‹ค.

      • (์ฐธ๊ณ ) POOLED ์™€ UNPOOLED

        • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ์„ ๊ด€๋ฆฌํ•˜๋Š” DataSource์˜ ํƒ€์ž…์€ ํฌ๊ฒŒ POOLED์™€ UNPOOLED๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๋Š”๋ฐ, ๊ทธ ์ฐจ์ด๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

          ๊ตฌ๋ถ„POOLEDUNPOOLED
          ํŠน์ง•์ตœ์ดˆ Connection ๊ฐ์ฒด ์ƒ์„ฑ ์‹œ ํ•ด๋‹น ์ •๋ณด๋ฅผ pool ์˜์—ญ์— ์ €์žฅํ•ด ๋‘๊ณ  ์ดํ›„ Connection ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ์ด๋ฅผ ์žฌ์‚ฌ์šฉํ•œ๋‹ค.Connection ๊ฐ์ฒด๋ฅผ ๋ณ„๋„๋กœ ์ €์žฅํ•˜์ง€ ์•Š๊ณ , ํ˜ธ์ถœ ์‹œ๋งˆ๋‹ค ๋งค๋ฒˆ ์ƒ์„ฑํ•˜์—ฌ ์‚ฌ์šฉํ•œ๋‹ค.
          ์žฅ์ - Connection ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ์—ฐ๊ฒฐ์„ ๊ตฌ์ถ•ํ•˜๋Š”๋ฐ ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„์ด ๋‹จ์ถ•๋œ๋‹ค.- Connection ์—ฐ๊ฒฐ์ด ๋งŽ์ง€ ์•Š์€ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ๋•Œ ๊ฐ„๋‹จํ•˜๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.
          ๋‹จ์ - ๋‹จ์ˆœํ•œ ๋กœ์ง์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค๊ธฐ์—๋Š” ์„ค์ •ํ•ด์•ผ ํ•  ์ •๋ณด๊ฐ€ ๋งŽ๋‹ค.- ๋งค๋ฒˆ ์ƒˆ๋กœ์šด Connection ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋ฏ€๋กœ ์†๋„๊ฐ€ ์ƒ๋Œ€์ ์œผ๋กœ ๋А๋ฆฌ๋‹ค.
    3. <property> : <dataSource>ํƒœ๊ทธ ๋‚ด๋ถ€์— ์ž‘์„ฑ๋˜๋ฉฐ, <properties>ํƒœ๊ทธ๋ฅผ ํ†ตํ•ด ๋ถˆ๋Ÿฌ์˜จ ํŒŒ์ผ์˜ ๊ฐ’์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ •๋ณด๋ฅผ ์„ค์ •ํ•œ๋‹ค.

      • ์‚ฌ์šฉ ๋ฐฉ๋ฒ•
        <dataSource>
        	<property name=โ€œ*๋ช…์นญ*โ€ value=โ€œ${*properties์— ์„ค์ •๋œ key๋ช…*}โ€ />
        	<property name=โ€œ*๋ช…์นญ*โ€ value=โ€œ${*properties์— ์„ค์ •๋œ key๋ช…*}โ€ />
        </dataSource>
  4. ์‚ฌ์šฉ ์˜ˆ์‹œ

    1. <properties>ํƒœ๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ

      <environments default="development">
      	<environment id="development">
      		<transactionManager type="JDBC" />
      		<dataSource type="POOLED">
      			<property name="driver" value="com.mysql.cj.jdbc.Driver" />
      			<property name="url" value="jdbc:mysql://localhost/menu" />
      			<property name="username" value="sahmyook" />
      			<property name="password" value="sahmyook" />
      		</dataSource>
      	</environment>
      </environments>
    2. <properties>ํƒœ๊ทธ๋ฅผ ์‚ฌ์šฉํ•œ ๊ฒฝ์šฐ

      <properties resource="config/connection-info.properties"/>
      <environments default="dev">
      	<environment id="dev">
      		<transactionManager type="JDBC" />
      		<dataSource type="POOLED">
      			<property name="driver" value="${driver}" />
            <property name="url" value="${url}" />
            <property name="username" value="${username}" />
            <property name="password" value="${password}" />
      		</dataSource>
      	</environment>
      </environments>

<mappers>

  1. ์‚ฌ์šฉํ•˜๊ณ ์ž ํ•˜๋Š” ์ฟผ๋ฆฌ๊ฐ€ ์ •์˜๋œ mapper ํŒŒ์ผ์„ ๋“ฑ๋กํ•œ๋‹ค.

  2. ์„ค์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋„ค ๊ฐ€์ง€๊ฐ€ ์žˆ์ง€๋งŒ ํ•œ ๊ฐ€์ง€ ๋ฐฉ์‹์œผ๋กœ ํ†ต์ผํ•˜์—ฌ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

    • <mapper resource=""> : (์ƒ๋Œ€๊ฒฝ๋กœ) ํด๋ž˜์ŠคํŒจ์Šค์— ์œ„์น˜ํ•œ xml ๋งคํผ ํŒŒ์ผ ์ง€์ •
    • <mapper url=""> : (์ ˆ๋Œ€๊ฒฝ๋กœ) URL์„ ์‚ฌ์šฉํ•œ xml ๋งคํผ ํŒŒ์ผ ์ง€์ •
    • <mapper class=""> : ๋งคํผ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค ์œ„์น˜ ์ง€์ •
    • <package name=""> : ํŒจํ‚ค์ง€ ์ง€์ •์œผ๋กœ ํŒจํ‚ค์ง€ ๋‚ด ์ž๋™์œผ๋กœ ๋งคํผ ๊ฒ€์ƒ‰
  3. ์‚ฌ์šฉ ์˜ˆ์‹œ

    <mappers>
    	<mapper resource="member/model/mapper/member-mapper.xml"/>
    	<mapper resource="notice/model/mapper/notice-mapper.xml" />
    	<mapper resource="board/model/mapper/board-mapper.xml" />
    </mappers>

<typeHandler>

  1. PreparedStatement์—์„œ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์„ค์ •ํ•˜๊ฑฐ๋‚˜ ๊ฒฐ๊ณผ์…‹์„ ๊ฐ€์ ธ์˜ฌ ๋•Œ ํ…Œ์ด๋ธ” ๊ฐ ์ปฌ๋Ÿผ์„ ์ž๋ฐ”์˜ ์ ์ ˆํ•œ ํƒ€์ž…์œผ๋กœ ์„ค์ •ํ•ด์„œ ๊ฐ€์ ธ์˜ค๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•œ๋‹ค.
  2. MyBatis ์ •์˜ํ•œ ํƒ€์ž… ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ์—๋Š” ๋ณ„๋„๋กœ ํƒ€์ž…ํ•ธ๋“ค๋Ÿฌ๋ฅผ ๋งŒ๋“ค ํ•„์š”๊ฐ€ ์—†๋‹ค.
  3. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅ๋œ ์ž๋ฐ” ์ฝ”๋“œ๋ฅผ ์ž๋ฐ”์˜ ENUM์œผ๋กœ ๋ณ€ํ™˜ํ•˜๊ฑฐ๋‚˜ ์•”ํ˜ธํ™”/๋ณตํ˜ธํ™” ์ฒ˜๋ฆฌ๋ฅผ ํ•˜๋Š”๋ฐ ์‚ฌ์šฉํ•˜๋ฉด ์œ ์šฉํ•˜๋‹ค.

<objectFactory>

  1. ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ๊ฒฐ๊ณผ์…‹์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๋ชจ๋ธ์„ ๋งŒ๋“ค ๋•Œ ์ปฌ๋Ÿผ์— ๋งคํ•‘ํ•˜๋Š” setter ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•ด์„œ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ ๋‹ค. ํ•˜์ง€๋งŒ setter ๋ฉ”์†Œ๋“œ๊ฐ€ ์—†์œผ๋ฉด ์ž๋ฐ”์˜ ๋ฆฌํ”Œ๋ ‰์…˜์„ ์‚ฌ์šฉํ•ด์„œ ๊ฐ’์„ ์„ค์ •ํ•œ๋‹ค.
  2. ํ…Œ์ด๋ธ”๊ฐ„์˜ ๊ด€๊ณ„๊ฐ€ ๋ณต์žกํ•˜๊ฑฐ๋‚˜ ๋‹จ์ˆœํžˆ setter ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ ์ด์ƒ์˜ ๊ณผ์ •์„ ๊ฑฐ์ณ์•ผ ํ•˜๋Š” ์•„์ฃผ ๊ทน์†Œ์ˆ˜์˜ ๊ฒฝ์šฐ objectFactory๋ฅผ ์ด์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

<plugins>

  1. MyBatis๊ฐ€ ๋งคํ•‘ ๊ตฌ๋ฌธ์„ ์‹คํ–‰ํ•˜๋Š” ๊ณผ์ •์—์„œ ํŠน์ • ์‹œ์ ์˜ ์ฒ˜๋ฆฌ๋ฅผ ๊ฐ€๋กœ์ฑ„ ๋ถ€๊ฐ€์ ์ธ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.
  2. ๋กœ๊ทธ๋ฅผ ์ถœ๋ ฅํ•  ์ˆ˜ ์žˆ๊ณ , ํŒŒ๋ผ๋ฏธํ„ฐ์— ๋Œ€ํ•ด ๊ณตํ†ต์ ์œผ๋กœ ํƒ€์ž…์ฒดํฌ๋ฅผ ํ•˜๊ฑฐ๋‚˜, ๊ฒฐ๊ณผ์…‹์— ๋Œ€ํ•œ ์ฒ˜๋ฆฌ๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค. (Spring์˜ AOP๋‚˜ ์ธํ„ฐ์…‰ํ„ฐ์™€ ์œ ์‚ฌํ•˜๋‹ค.)

MyBatis Mapper by JAVA

Mapper class

Mapper์˜ ์—ญํ• 

  • sqlSession ๊ฐ์ฒด๋ฅผ ํ†ตํ•ด configuration์— ๋“ฑ๋ก๋œ ๋งคํผ๋ฅผ ๋™์ผ ํƒ€์ž…์œผ๋กœ ๋ฐ˜ํ™˜๋ฐ›์•„ ์ฟผ๋ฆฌ๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค.

๋งคํผ ์‚ฌ์šฉ ์˜ˆ์‹œ

Mapper mapper = sqlSession.getMapper(Mapper.class);
java.util.Date date = mapper.selectSysdate();
  • ๋งคํผ๋ฅผ ๋™์ผํ•œ ๊ฐ์ฒด ํƒ€์ž…์œผ๋กœ sqlSessio ์„ค์ •์—์„œ ๋ฐ˜ํ™˜๋ฐ›์•„ ์ฟผ๋ฆฌ๋ฅผ ๋™์ž‘ํ•˜๋„๋ก ํ•œ๋‹ค.

Mapper ์ธํ„ฐํŽ˜์ด์Šค ์–ด๋…ธํ…Œ์ด์…˜

  • Annotation์„ ํ™œ์šฉํ•˜์—ฌ ๋ฌธ์ž์—ด๋กœ ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•œ๋‹ค.
    • ์–ด๋…ธํ…Œ์ด์…˜(Annotation)์ด๋ž€
      • ์‚ฌ์ „์  ์˜๋ฏธ๋กœ๋Š” โ€˜์ฃผ์„โ€™์˜ ๋œป์„ ๊ฐ€์ง€๊ณ  ์žˆ๊ณ , ์ฃผ์„์ฒ˜๋Ÿผ ์“ฐ์ด๋ฉฐ ํŠน๋ณ„ํ•œ ์˜๋ฏธ, ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ํ•˜๋„๋ก ํ•˜๋Š” ๊ธฐ์ˆ ์ด๋‹ค.
      • ํ”„๋กœ๊ทธ๋žจ์— ์ถ”๊ฐ€ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•ด์ฃผ๋Š” ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋กœ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.
  • ๋ฉ”์†Œ๋“œ๋ช…์€ ์ฟผ๋ฆฌ๋ฅผ ์ฐพ๊ธฐ ์œ„ํ•œ key์ด๊ณ , ์ฟผ๋ฆฌ ์ˆ˜ํ–‰ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•  ์ž๋ฃŒํ˜•์„ ๋ช…์‹œํ•œ๋‹ค.
  1. @Results

    1. ์ฟผ๋ฆฌ ์ˆ˜ํ–‰ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ›์•„์˜ฌ ResultMap์„ ์„ค์ •ํ•œ๋‹ค.
    2. @Result๋Š” ๊ฐ๊ฐ DTO๊ฐ์ฒด์˜ ํ•„๋“œ๋ช…(= property ์†์„ฑ)๊ณผ ๋Œ€์ƒ ํ…Œ์ด๋ธ”(= column ์†์„ฑ)์˜ ์ปฌ๋Ÿผ๋ช…์„ ๋งคํ•‘์‹œํ‚จ๋‹ค.
    3. @Result์˜ ์†์„ฑ ์ค‘ id๊ฐ€ true์ด๋ฉด ํ•ด๋‹น ๊ฐ’์ด ๋งคํ•‘๋˜๋Š” ํ…Œ์ด๋ธ”์˜ PK์ž„์„ ์˜๋ฏธํ•œ๋‹ค.
    4. ์‚ฌ์šฉ ์˜ˆ์‹œ
    @Results(id="menuResultMap", value = {
    	@Result(id = true, property = "code", column = "MENU_CODE"),
    	@Result(property = "name", column = "MENU_NAME"),
    	@Result(property = "price", column = "MENU_PRICE"),
    	@Result(property = "categoryCode", column = "CATEGORY_CODE"),
    	@Result(property = "orderableStatus", column = "ORDERABLE_STATUS"),
    })
  2. @Select

    1. ์กฐํšŒ ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•˜๋ฉฐ, @Results๋ฅผ ๋ฐ”๋กœ ์œ„์— ์ž‘์„ฑํ•ด ๋ฐ˜ํ™˜ ํƒ€์ž…์„ ์ง€์ •ํ•˜๊ฑฐ๋‚˜ @ResultMap ์–ด๋…ธํ…Œ์ด์…˜์„ ์ถ”๊ฐ€ํ•ด ์žฌ์‚ฌ์šฉํ•˜๋„๋ก ์ง€์ •ํ•œ๋‹ค.

    2. ์‚ฌ์šฉ ์˜ˆ์‹œ

      @Select("SELECT \n" +
                  "       MENU_CODE\n" +
                  "     , MENU_NAME\n" +
                  "     , MENU_PRICE\n" +
                  "     , CATEGORY_CODE\n" +
                  "     , ORDERABLE_STATUS\n" +
                  "  FROM TBL_MENU\n" +
                  " WHERE ORDERABLE_STATUS = 'Y'\n" +
                  "   AND MENU_CODE = #{ code }")
          @ResultMap("menuResultMap")
          MenuDTO selectMenuByCode(int code);
  3. @Insert, @Update, @Delete

    1. ๊ฐ๊ฐ ์‚ฝ์ž…, ์ˆ˜์ •, ์‚ญ์ œ ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•˜๋ฉฐ ๋ฐ˜ํ™˜ ํƒ€์ž…์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ž‘์—…์ด ์ˆ˜ํ–‰๋œ ๋กœ์šฐ ๊ฐฏ์ˆ˜๋ฅผ ๋‹ด์€ ์ •์ˆ˜ํ˜•์ด๋‹ค.

    2. @Insert ์‚ฌ์šฉ ์˜ˆ์‹œ

      @Insert("INSERT\n" +
                  "  INTO TBL_MENU\n" +
                  "(\n" +
                  "  MENU_NAME\n" +
                  ", MENU_PRICE\n" +
                  ", CATEGORY_CODE\n" +
                  ", ORDERABLE_STATUS\n" +
                  ")\n" +
                  "VALUES\n" +
                  "(\n" +
                  "  #{ name }\n" +
                  ", #{ price }\n" +
                  ", #{ categoryCode }\n" +
                  ", 'Y'\n" +
                  ")")
          int insertMenu(MenuDTO menu);
    3. @Update ์‚ฌ์šฉ ์˜ˆ์‹œ

      @Update("UPDATE\n" +
                  "        TBL_MENU\n" +
                  "   SET MENU_NAME = #{ name }\n" +
                  "     , MENU_PRICE = #{ price }\n" +
                  "     , CATEGORY_CODE = #{ categoryCode }\n" +
                  " WHERE MENU_CODE = #{ code }")
          int updateMenu(MenuDTO menu);
    4. @Delete ์‚ฌ์šฉ ์˜ˆ์‹œ

      @Delete("DELETE\n" +
                  "  FROM TBL_MENU\n" +
                  " WHERE MENU_CODE = #{ code }")
          int deleteMenu(int code);

MyBatis Mapper by XML

MyBatis Mapper XML

Mapper.xml ํŒŒ์ผ์˜ ์—ญํ• 

๐Ÿ’ก mapper.xml์—๋Š” ์‚ฌ์šฉํ•˜๊ณ ์ž ํ•˜๋Š” ์ฟผ๋ฆฌ๋‚˜ ๊ฒฐ๊ณผ๋กœ ๋ฐ›์„ ๊ฐ์ฒด(= resultMap)๋ฅผ ์„ ์–ธํ•  ์ˆ˜ ์žˆ๋‹ค.

Mapper XML ์ž‘์„ฑ ์‹œ ์œ ์˜์‚ฌํ•ญ

  1. Mapper ์ธํ„ฐํŽ˜์ด์Šค์™€ ๋™์ผํ•œ ํŒจํ‚ค์ง€์— ์œ„์น˜ํ•ด์•ผ ํ•œ๋‹ค.
    1. ํŒŒ์ผ ๊ฒฝ๋กœ๋Š” src > main > resources ํ•˜์œ„์— ํด๋”๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ์ง€์ •ํ•˜๋„๋ก ํ•˜๊ณ , Mapper ์ธํ„ฐํŽ˜์ด์Šค ํด๋ž˜์Šค์™€ ๋™์ผํ•œ ํŒจํ‚ค์ง€ ๊ตฌ์กฐ๋กœ ์ปดํŒŒ์ผ ๋˜๋„๋ก ๊ฒฝ๋กœ๋ฅผ ์„ค์ •ํ•ด์•ผ ํ•œ๋‹ค.
    2. IntelliJ์—์„œ๋Š” resources์™€ src๊ฐ€ ๋™๊ธ‰์œผ๋กœ ์ฒ˜๋ฆฌ๋˜๋ฏ€๋กœ ํ•˜์œ„ ํด๋” ๊ตฌ์กฐ๋ฅผ ๋™์ผํ•˜๊ฒŒ ์ƒ์„ฑํ•ด์•ผ ์ด๋ฅผ ๋งž์ถœ ์ˆ˜ ์žˆ๋‹ค.
  2. Mapper ์ธํ„ฐํŽ˜์ด์Šค์˜ ํ’€ํด๋ž˜์Šค๋ช…์„ namespace๋กœ ์ง€์ •ํ•ด์•ผ ํ•œ๋‹ค.
    1. namespace ์†์„ฑ์€ ํ•ด๋‹น ๋งคํผ๋ฅผ ๊ตฌ๋ถ„ํ•˜๋Š” id์™€ ๊ฐ™์€ ์—ญํ• ์ด๋ฏ€๋กœ ํ•„์ˆ˜๋กœ ์ง€์ •ํ•ด์•ผ ํ•œ๋‹ค.
  3. Mapper ์ธํ„ฐํŽ˜์ด์Šค์™€ ๋งคํผ XML์˜ ํŒŒ์ผ๋ช…์ด ๋™์ผํ•ด์•ผ ํ•œ๋‹ค.
  4. Mapper ์ธํ„ฐํŽ˜์ด์Šค์— ์ž‘์„ฑํ•œ ๋ฉ”์†Œ๋“œ์˜ ์ด๋ฆ„๊ณผ id๊ฐ€ ์ผ์น˜ํ•˜๊ณ , ๋ฐ˜ํ™˜ ํƒ€์ž…์ด ์ผ์น˜ํ•˜๋Š” ์ฟผ๋ฆฌ๋ฌธ์„ ๋ชจ๋‘ ์ž‘์„ฑํ•ด์•ผ ํ•œ๋‹ค.

MyBatis Mapper ํŒŒ์ผ ์ž‘์„ฑ ๋ฐฉ๋ฒ•

  1. xml ํŒŒ์ผ ์ตœ์ƒ๋‹จ์— ๋‹ค์Œ๊ณผ ๊ฐ™์ด xml ํ˜•์‹์„ ์ง€์ •ํ•˜์—ฌ ์ดํ•˜์˜ ์„ค์ • ๋‚ด์šฉ์ด MyBatis Mapper ์„ค์ •์ž„์„ ์„ ์–ธํ•œ๋‹ค.

    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  2. <mapper> ํƒœ๊ทธ๋ฅผ ์ž‘์„ฑํ•˜๊ณ , ์™ธ๋ถ€์—์„œ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ์ด๋ฆ„์ธ namespace ์†์„ฑ์„ ๊ธฐ์ž…ํ•œ๋‹ค.

    <?xml version="1.0" encoding="utf-8"?>
    <!DOCTYPE mapper PUBLIC "-[//mybatis.org//DTD](https://mybatis.org//DTD) Mapper 3.0//EN" "[http://mybatis.org/dtd/mybatis-3-mapper.dtd](http://mybatis.org/dtd/mybatis-3-mapper.dtd)">
    <mapper namespace="Member">
    . . .
    </mapper>
  3. ์ดํ›„ ์ž‘์„ฑ์ด ํ•„์š”ํ•œ CRUD ๋ฐ resultMap ์„ค์ • ๋“ฑ์˜ ํƒœ๊ทธ๋ฅผ <mapper> ํƒœ๊ทธ ์•„๋ž˜๋กœ ์ž‘์„ฑํ•œ๋‹ค.

MyBatis Mapper ํƒœ๊ทธ

<resultMap>

  1. DB์—์„œ ์กฐํšŒํ•œ ๊ฒฐ๊ณผ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ์ฒด์— ์›ํ•˜๋Š” ๊ฐ์ฒด์˜ ํ•„๋“œ์— ๋‹ด์•„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ •์˜ํ•œ๋‹ค.

  2. ํ•ด๋‹น ํƒœ๊ทธ์˜ id ์†์„ฑ์€ ํ•ด๋‹น resultMap์„ ๊ตฌ๋ถ„ํ•˜๋Š” ๋ช…์นญ์ด๊ณ , type ์†์„ฑ์€ ๋Œ€์ƒ ๊ฐ์ฒด์˜ ํ•„๋“œ๋ฅผ ๊ฐ€์ง„ ํด๋ž˜์Šค์˜ ํ’€ํด๋ž˜์Šค๋ช…์„ ์ž‘์„ฑํ•œ๋‹ค. (๋‹จ, MyBatis ์„ค์ • ์‹œ ๋ณ„์นญ(typeAlias)์„ ์ง€์ •ํ–ˆ์œผ๋ฉด ๋ณ„์นญ์œผ๋กœ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค.)

  3. <resultMap>ํƒœ๊ทธ์˜ ์†์„ฑ์€ ๋‹ค์Œ ํ‘œ์™€ ๊ฐ™๋‹ค.

    ์†์„ฑ๋ช…์„ค๋ช…
    id๋งคํ•‘ ๊ตฌ๋ฌธ์—์„œ ๊ฒฐ๊ณผ ๋งคํ•‘์„ ์‚ฌ์šฉํ•  ๋•Œ ๊ตฌ๋ถ„ํ•˜๊ธฐ ์œ„ํ•œ ID
    type๊ฒฐ๊ณผ ๋งคํ•‘์„ ์ ์šฉํ•˜๋Š” ๋Œ€์ƒ ๊ฐ์ฒด ํƒ€์ž…(= ๋งคํ•‘ ๊ตฌ๋ฌธ์˜ ๊ฒฐ๊ณผ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•  Java ํƒ€์ž…์ง€์ •)
    extends๊ธฐ์กด์— ์ •์˜๋œ ๋งคํ•‘ ๊ฒฐ๊ณผ๋ฅผ ์ƒ์†๋ฐ›์•„ ์ถ”๊ฐ€์ ์ธ ๋งคํ•‘ ์ •๋ณด๋กœ ํ™•์žฅํ•  ๋•Œ ์‚ฌ์šฉ
    autoMapping- ๊ฒฐ๊ณผ ๋งคํ•‘์„ ์ž๋™ ๋งคํ•‘์„ ํ•  ๊ฒƒ์ธ์ง€๋ฅผ ๊ฒฐ์ • (๊ธฐ๋ณธ๊ฐ’: PARTIAL)
    - NONE, PARTIAL, FULL์˜ ์„ธ ๊ฐ€์ง€ ์˜ต์…˜ ์„ค์ • ๊ฐ€๋Šฅ
    - auto ๋งคํ•‘ ์„ค์ •์€ ๋™์ผํ•œ ์ปฌ๋Ÿผ๋ช…์ด ์žˆ์œผ๋ฉด ์œ„ํ—˜์„ฑ์„ ๊ฐ€์ง€๋ฏ€๋กœ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ์•ˆ์ „ํ•จ
  4. <resultMap> ํƒœ๊ทธ์˜ ํ•˜์œ„ ์—˜๋ฆฌ๋จผํŠธ๋Š”๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

    1. <id> : ๊ฐ์ฒด์™€ ๋งค์นญ๋˜๋Š” ํ…Œ์ด๋ธ”์˜ Primary Key๋ฅผ ์˜๋ฏธํ•œ๋‹ค.
    2. <result> : ๊ฐ์ฒด์™€ ๋งค์นญ๋˜๋Š” ํ…Œ์ด๋ธ”์˜ Primary Key ์™ธ์˜ ๋ชจ๋“  ์ปฌ๋Ÿผ์„ ์˜๋ฏธํ•œ๋‹ค.
    3. <constructor> : ๊ฐ์ฒดํ™”๋˜๋Š” ํด๋ž˜์Šค์˜ ์ƒ์„ฑ์ž์— ๊ฒฐ๊ณผ๋ฅผ ์‚ฝ์ž…ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•œ๋‹ค.
      • <idArg>, <arg> ํ•˜์œ„ ์—˜๋ฆฌ๋จผํŠธ๊ฐ€ ์žˆ๋‹ค.
      • ์ƒ์„ฑ์ž๋Š” ์ˆœ์„œ์™€ ํƒ€์ž…์„ ๋งž์ถฐ์„œ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.
    4. <association> : ๋ณต์žกํ•œ ํƒ€์ž…์˜ ์—ฐ๊ด€ ๊ด€๊ณ„๋กœ 1:1 ํฌํ•จ ๊ด€๊ณ„์ธ ๊ฒฝ์šฐ ์‚ฌ์šฉํ•œ๋‹ค.
    5. <collection> : ๋ณต์žกํ•œ ํƒ€์ž…์˜ ์—ฐ๊ด€ ๊ด€๊ณ„๋กœ 1:๋‹ค ํฌํ•จ ๊ด€๊ณ„์ธ ๊ฒฝ์šฐ ์‚ฌ์šฉํ•œ๋‹ค.
    6. <discriminator> : ์กฐ๊ฑด์— ๋”ฐ๋ผ ๋‹ค๋ฅธ resultMap์ด ๋งคํ•‘๋˜๋„๋ก ํ•œ๋‹ค.
  5. resultMap์˜ type ์†์„ฑ์€ ์‹ค์ œ๋กœ ๊ตฌํ˜„ํ•ด ๋†“์€ ์ž๋ฐ” POJO ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.

    • POJO๋ž€ Plain Old Java Project์˜ ์•ฝ์–ด๋กœ, ํŠน์ • ์ž๋ฐ” ๋ชจ๋ธ์ด๋‚˜ ๊ธฐ๋Šฅ, ํ”„๋ ˆ์ž„์›Œํฌ ๋“ฑ์„ ๋”ฐ๋ฅด์ง€ ์•Š๋Š” ์ž๋ฐ” ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ง€์นญํ•˜๋Š” ๋ง์ด๋‹ค.
  6. ์‚ฌ์šฉ ์˜ˆ์‹œ

    <resultMap id="resultMember" type="Member">
    	<id property="userId" column="USER_ID" />
    	<result property="password" column="PASSWORD" />
    	<result property="userName" column="USER_NAME" />
    	. . .
    </resultMap>
    • ์†์„ฑ ์ค‘ property๋Š” ๊ฐ์ฒด์˜ ํ•„๋“œ๋ช…์ด๊ณ , column์€ ๋งคํ•‘๋˜๋Š” ํ…Œ์ด๋ธ”์˜ ์ปฌ๋Ÿผ๋ช…์ด๋‹ค.

<select>

  1. SQL ์กฐํšŒ ๊ตฌ๋ฌธ์„ ์ž‘์„ฑํ•  ๋•Œ ์“ฐ์ธ๋‹ค.

  2. ์ฟผ๋ฆฌid์™€ ๋ฐ˜ํ™˜ํ•  ํƒ€์ž…์„ ์„ค์ •ํ•˜๊ณ  ํƒœ๊ทธ ๋‚ด๋ถ€์— ์ฟผ๋ฆฌ๋ฌธ์„ ์ž‘์„ฑํ•œ๋‹ค.

    • โ€ป ํƒœ๊ทธ ๋‚ด๋ถ€์— ์ž‘์„ฑํ•œ ์ฟผ๋ฆฌ๋ฌธ ๋์—๋Š” ์„ธ๋ฏธ์ฝœ๋ก ์„ ์ž‘์„ฑํ•˜์ง€ ์•Š๋Š”๋‹ค.

    • resultMap ์†์„ฑ : ๋งคํผ ํŒŒ์ผ์—์„œ ๋ฏธ๋ฆฌ ์„ค์ •ํ•œ resultMap์„ ๋ฆฌํ„ด ํƒ€์ž…์œผ๋กœ ์ด์šฉํ•˜๋Š” ๊ฒฝ์šฐ์— ์ž‘์„ฑํ•œ๋‹ค.

    • resultType ์†์„ฑ : ์ด๋ฏธ ์ •์˜๋˜์–ด ์žˆ๋Š” ๊ฐ์ฒด ํƒ€์ž…์„ ๋ฆฌํ„ด ํƒ€์ž…์œผ๋กœ ์ด์šฉํ•˜๋Š” ๊ฒฝ์šฐ์— ์ž‘์„ฑํ•œ๋‹ค.

  3. ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” #{ field } ๋˜๋Š” ${ field } ํ˜•ํƒœ๋กœ ๊ธฐ์ˆ ํ•˜๋ฉฐ PreparedStatement์˜ ?(=placeholder)์˜ ์—ญํ• ์„ ํ•œ๋‹ค.

    • #{ field } ํ˜•ํƒœ์™€ ${ field } ํ˜•ํƒœ ๋ชจ๋‘ ์ž‘์„ฑ ๊ฐ€๋Šฅํ•˜๋‚˜, #{ field } ํ˜•ํƒœ ์‚ฌ์šฉ์„ ๊ถŒ์žฅํ•œ๋‹ค.
      • #{ field } : ์ฟผ๋ฆฌ ์ƒ์„ฑ ์‹œ ๋„˜๊ฒจ์ค€ ํ•„๋“œ ๊ฐ’์— ์ž๋™์œผ๋กœ ์‹ฑ๊ธ€ ์ฟผํ…Œ์ด์…˜ ๋ถ™์—ฌ์ค€๋‹ค.
      • ${ field } : ์‚ฌ์šฉ์ž๊ฐ€ ๋„˜๊ธด ๊ฐ’ ๊ทธ๋Œ€๋กœ ํ•„ํ„ฐ ์—†์ด ํ˜„์ถœ๋˜๋ฏ€๋กœ, ๋ฌธ์ž์ด๋ฉด ๋ณด๋‚ผ ๋•Œ ์ฟผํ…Œ์ด์…˜ ๋ถ™์—ฌ์„œ ๋ณด๋‚ด์•ผ ํ•œ๋‹ค.
    • parameterType์ด ๊ฐ์ฒด์ธ ๊ฒฝ์šฐ, getter ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋ฏ€๋กœ ํ•ด๋‹น ๊ฐ์ฒด์— ๋ฐ˜๋“œ์‹œ getter ๋ฉ”์†Œ๋“œ๊ฐ€ ์ž‘์„ฑ๋˜์–ด์•ผ ํ•œ๋‹ค.
    • ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ํ•œ ๊ฐœ์ธ ๊ฒฝ์šฐ ๋ฐ”์ธ๋”ฉ ๋˜๋Š” ์ด๋ฆ„์„ ๋ฌด์—‡์œผ๋กœ ์ž‘์„ฑํ•˜๋“  ๋ฌด๊ด€ํ•˜๊ณ , ํŒŒ๋ผ๋ฏธํ„ฐ ํƒ€์ž…์„ ์ง€์ •ํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค.
  4. ์‚ฌ์šฉ ์˜ˆ์‹œ

    <select id="memberInfo" parameterType="string" resultMap="resultMember">
    	SELECT * FROM MEMBER WHERE ID = #{ userid }
    </select>
  5. <select> ํƒœ๊ทธ์˜ ์ฃผ์š” ์†์„ฑ

    ์†์„ฑ๋ช…๋‚ด์šฉ
    id๊ตฌ๋ฌธ์„ ์ฐพ๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ๋Š” namespace ๋‚ด ์œ ์ผํ•œ ๊ตฌ๋ถ„์ž
    parameterType๊ตฌ๋ฌธ์— ์ „๋‹ฌ๋  ํŒŒ๋ผ๋ฏธํ„ฐ์˜ ํด๋ž˜์Šค๋ช…(ํŒจํ‚ค์ง€ ๊ฒฝ๋กœ ํฌํ•จ)์ด๋‚˜ ๋ณ„์นญ
    resultType- return ๋˜๋Š” ํƒ€์ž…์˜ ํŒจํ‚ค์ง€ ๊ฒฝ๋กœ๋ฅผ ํฌํ•จํ•œ ์ „์ฒด ํด๋ž˜์Šค๋ช…์ด๋‚˜ ๋ณ„์นญ
    - collection์ธ ๊ฒฝ์šฐ list, arraylist๋กœ ์„ค์ • ๊ฐ€๋Šฅ
    resultMap์‚ฌ์šฉํ•  resultMap์˜ id
    flushCache- true ์„ค์ •ํ•˜๋ฉด ๊ตฌ๋ฌธ ํ˜ธ์ถœ ์‹œ๋งˆ๋‹ค ๋กœ์ปฌ, 2nd ๋ ˆ๋ฒจ cache๊ฐ€ ์ง€์›Œ์ง(flush)
    - ๊ธฐ๋ณธ๊ฐ’ = false
    useCache- true ์„ค์ •ํ•˜๋ฉด ๊ตฌ๋ฌธ์˜ ๊ฒฐ๊ณผ๋ฅผ 2nd ๋ ˆ๋ฒจ cache์— ์ €์žฅ
    - ๊ธฐ๋ณธ๊ฐ’ = true
    timeout- ์˜ˆ์™ธ ๋ฐœ์ƒ ์ „์— ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ์š”์ฒญ ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๋Š” ์ตœ๋Œ€ ์‹œ๊ฐ„ ์„ค์ •
    - ๋“œ๋ผ์ด๋ฒ„์— ๋”ฐ๋ผ ์ง€์›ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Œ
    statementType- MyBatis์—๊ฒŒ ์‚ฌ์šฉํ•˜๊ฒŒ ํ•  Statement ์„ ํƒ ๊ฐ€๋Šฅ
    (STATEMENT, PREPARED, CALLABLE ์ค‘ ํ•˜๋‚˜)
    (Statement, PreparedStatement, CallableStatement ์‚ฌ์šฉํ•˜๊ฒŒ ํ•˜๋Š” ๊ฒƒ)
    - ๊ธฐ๋ณธ๊ฐ’ = PreparedStatement
    fetchSize์ง€์ •๋œ ์ˆ˜ ๋งŒํผ์˜ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ฒŒ ํ•˜๋Š” ๋“œ๋ผ์ด๋ฒ„ ํžŒํŠธ ํ˜•ํƒœ์˜ ๊ฐ’ (๋””ํดํŠธ: ์„ค์ •์•ˆํ•จ)
    resultSetType- ResultSet์˜ ์ปค์„œ ์ด๋™ ๋ฐฉํ–ฅ์„ ์ง€์ • (๊ธฐ๋ณธ๊ฐ’: FORWARD_ONLY)
    - FORWARD_ONLY, SCROLL_SENSITIVE, SCROLL_INSENCITIVE ์ค‘ ํ•˜๋‚˜๋กœ ์„ค์ •
    (1) FORWARD_ONLY : ์ปค์„œ๊ฐ€ ์•ž์œผ๋กœ๋งŒ ์ด๋™
    (2) SCROLL_SENSITIVE : ์ปค์„œ๊ฐ€ ์•ž๋’ค๋กœ ์ด๋™ ๋ฐ ResultSet ๊ฐ์ฒด ์ƒ์„ฑ ํ›„ ์ถ”๊ฐ€ ๋ฐ ์‚ญ์ œ๋œ ๋ฐ์ดํ„ฐ๋„ ๋ณผ ์ˆ˜ ์žˆ์Œ
    (3) SCROLL_INSENSITIVE : ์ปค์„œ๊ฐ€ ์•ž๋’ค๋กœ ์ด๋™ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ResultSet ๊ฐ์ฒด ์ƒ์„ฑ ํ›„ ์ถ”๊ฐ€ ๋ฐ ์‚ญ์ œ๋œ ๋ฐ์ดํ„ฐ๋Š” ๋ณผ ์ˆ˜ ์—†์Œ
    databaseId- ์„ค์ •๋œ databaseIdProvider๊ฐ€ ์žˆ์œผ๋ฉด databaseId ์†์„ฑ์ด ์—†๋Š” ๋ชจ๋“  ๊ตฌ๋ฌธ์„ ๋กœ๋“œํ•˜๊ฑฐ๋‚˜ ์ผ์น˜ํ•˜๋Š” databaseId์™€ ํ•จ๊ป˜ ๋กœ๋“œํ•จ
    - ๊ฐ™์€ ๊ตฌ๋ฌธ์—์„œ databaseId๊ฐ€ ์žˆ๊ฑฐ๋‚˜ ์—†๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋ชจ๋‘ ์žˆ๋‹ค๋ฉด ๋’ค์— ๋‚˜์˜จ ๊ฒƒ ๋ฌด์‹œ
    • (์ฐธ๊ณ ) FlushCache์™€ useCache
      • ์ผ๋ฐ˜์ ์œผ๋กœ ์ฟผ๋ฆฌ๋ฅผ ์ˆ˜ํ–‰ํ•  ๋•Œ, ์ฟผ๋ฆฌ์˜ ๊ฒฐ๊ณผ๋‚˜ ํ˜ธ์ถœ๋˜๋Š” ๋‚ด์šฉ์ด ๋ณ€๋™์ด ์—†๋Š” ์ •์  ์ฟผ๋ฆฌ๋‚˜ ๊ฒฐ๊ณผ๋ผ๋ฉด ์ˆ˜ํ–‰ ์‹œ๋งˆ๋‹ค ๊ตณ์ด ์ƒˆ๋กœ์šด ์ฟผ๋ฆฌ๋กœ ์ƒ์„ฑํ•˜์—ฌ ํ˜ธ์ถœํ•˜๊ฑฐ๋‚˜ ์ƒˆ๋กœ์šด ๊ฒฐ๊ณผ๋ฅผ ๋ฐ›์•„ ์˜ฌ ํ•„์š”๊ฐ€ ์—†๋‹ค.
      • ์ด๋Ÿฐ ์ƒํ™ฉ์— ๋Œ€ํ•ด Mybatis์—์„œ๋Š” Cache๋ผ๋Š” ์ €์žฅ์†Œ๋ฅผ ๋‚ด์žฅํ•œ๋‹ค. ๋ฐ˜๋ณต๋˜๋Š” ์ •์  ์ฟผ๋ฆฌ์˜ ํ˜ธ์ถœ์ด๋‚˜ ๊ฒฐ๊ณผ์— ๋Œ€ํ•œ ๋‚ด์šฉ์„ ํ•œ ๋ฒˆ ์ด์ƒ ์‹คํ–‰ํ•˜๋ฉด Cache์— ๋ฏธ๋ฆฌ ์ €์žฅํ•ด๋‘ ์œผ๋กœ์จ ์žฌํ˜ธ์ถœ์— ์†Œ์š”๋˜๋Š” ์‹œ๊ฐ„์„ ์ ˆ์•ฝํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค.

<insert>, <update>, <delete>

  1. ๋ฐ์ดํ„ฐ ์‚ฝ์ž…, ์ˆ˜์ •, ์‚ญ์ œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  INSERT, UPDATE, DELETE ์ฟผ๋ฆฌ๋ฌธ์„ ์ž‘์„ฑํ•˜๋Š” ํƒœ๊ทธ๋กœ, ํƒœ๊ทธ์˜ ์„ค์ •์ด ๋™์ผํ•˜๋‹ค.

  2. ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๊ฐ์ฒด ํƒ€์ž…์„ ๋ฐ›๋Š” ๊ฒฝ์šฐ, ํ•ด๋‹น ๊ฐ์ฒด์˜ ํ•„๋“œ๋ช…์œผ๋กœ ๋ฐ”์ธ๋”ฉํ•˜์—ฌ ์‚ฌ์šฉํ•œ๋‹ค.

    • <select>ํƒœ๊ทธ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ํŒŒ๋ผ๋ฏธํ„ฐ์˜ getter ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋ฏ€๋กœ ํ•ด๋‹น ๊ฐ์ฒด์— ๋ฐ˜๋“œ์‹œ getter ๋ฉ”์†Œ๋“œ๊ฐ€ ์ž‘์„ฑ๋˜์–ด์•ผ ํ•œ๋‹ค.
    • ํŒŒ๋ผ๋ฏธํ„ฐ ํƒ€์ž…์ด ๊ฐ์ฒด์ธ ๊ฒฝ์šฐ fullClass๋ช…์œผ๋กœ ์ž‘์„ฑํ•˜๊ฑฐ๋‚˜ ๋ฏธ๋ฆฌ ๋“ฑ๋กํ•œ ๋ณ„์นญ์„ ์ด์šฉํ•œ๋‹ค.
  3. ์„ธ ๊ฐœ์˜ ํƒœ๊ทธ ๋ชจ๋‘ resultType์ด _int๋กœ ๊ธฐ๋ณธ ์„ค์ •๋˜์–ด ์žˆ์–ด, ์ˆ˜ํ–‰ ๊ฒฐ๊ณผ๋ฅผ ์ •์ˆ˜ํ˜•์œผ๋กœ ๋ฐ˜ํ™˜ํ•˜๋ฏ€๋กœ ์ž‘์„ฑํ•˜์ง€ ์•Š์•„๋„ ๋ฌด๋ฐฉํ•˜๋‹ค.

  4. <insert> ์‚ฌ์šฉ ์˜ˆ์‹œ

    <insert id="insertMember" parameterType="Member" flushCache="true" statementType="PREPARED" keyProperty="" keyColumn="" useGeneratedKeys="true" timeout="20">
    	INSERT INTO MEMBER 
    	VALUES(#{id}, #{passwd}, #{name},	#{email}, #{gender}, #{age}, #{phone}, #{address}, DEFAULT)
    </insert>
  5. <update> ์‚ฌ์šฉ ์˜ˆ์‹œ

    <update id="updateMember" parameterType="Member" flushCache="true" statementType="PREPARED" timeout="20">
    	UPDATE MEMBER
    		 SET PASSWD = #{passwd}, 
    					EMAIL = #{email}, 
    					AGE = #{age},
    					PHONE = #{phone},
    					ADDRESS = #{address}
    		WHERE ID = #{id}
    </update>
  6. <delete> ์‚ฌ์šฉ ์˜ˆ์‹œ

    <delete id="deleteMember" parameterType="string" flushCache="true" statementType="PREPARED" timeout="20">
    	DELETE FROM MEMBER WHERE ID = #{userid}
    </delete>
  7. <insert>, <update>, <delete> ํƒœ๊ทธ์˜ ์ฃผ์š” ์†์„ฑ

    ์†์„ฑ๋ช…๋‚ด์šฉ
    id๊ตฌ๋ฌธ์„ ์ฐพ๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ๋Š” namespace ๋‚ด ์œ ์ผํ•œ ๊ตฌ๋ถ„์ž
    parameterType๊ตฌ๋ฌธ์— ์ „๋‹ฌ๋  ํŒŒ๋ผ๋ฏธํ„ฐ์˜ ํด๋ž˜์Šค๋ช…(ํŒจํ‚ค์ง€ ๊ฒฝ๋กœ ํฌํ•จ)์ด๋‚˜ ๋ณ„์นญ
    flushCache- true๋กœ ์„ค์ •ํ•˜๋ฉด ๊ตฌ๋ฌธ ํ˜ธ์ถœ ์‹œ๋งˆ๋‹ค ์บ์‹œ ์‚ญ์ œ(flush)
    - ๊ธฐ๋ณธ๊ฐ’ = false
    timeout- ์˜ˆ์™ธ ๋ฐœ์ƒ ์ „ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ์š”์ฒญ ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๋Š” ์ตœ๋Œ€ ์‹œ๊ฐ„ ์„ค์ •
    - ๋“œ๋ผ์ด๋ฒ„์— ๋”ฐ๋ผ ์ง€์›ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Œ
    statementType- JDBC ๊ตฌ๋ฌธ ํƒ€์ž…์„ ์ง€์ • (๊ธฐ๋ณธ๊ฐ’: PREPARED)
    - STATEMENT, PREPARED, CALLABLE ์ค‘ ํ•˜๋‚˜ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
    useGeneratedKeys- insert, update ์—๋งŒ ์ ์šฉ
    - ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ๋‚ด๋ถ€์ ์œผ๋กœ ์ƒ์„ฑํ•œ ํ‚ค(์˜ˆ: MySQL๋˜๋Š” SQL Server์˜ ์ž๋™ ์ฆ๊ฐ€ ํ•„๋“œ)๋ฅผ ๋ฐ›๋Š” JDBC getGeneratedKeys method๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ์„ค์ •
    - ๊ธฐ๋ณธ๊ฐ’ = false
    keyProperty- insert, update ์—๋งŒ ์ ์šฉ
    - getGeneratedKeys method๋‚˜ insert ๊ตฌ๋ฌธ์˜ selectKeyํƒœ๊ทธ์˜ ์„ค์ •
    - select๋ฌธ์˜ ๊ฒฐ๊ณผ๋ฅผ ์ €์žฅํ•  property ์ง€์ •
    - ์„ค์ •ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด default
    - ์—ฌ๋Ÿฌ ์ปฌ๋Ÿผ์„ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด property๋ช…์— ์ฝค๋งˆ๋ฅผ ๊ตฌ๋ถ„์ž๋กœ ๋‚˜์—ด ๊ฐ€๋Šฅ
    keyColumn- insert ์—๋งŒ ์ ์šฉ
    - ์ƒ์„ฑ ํ‚ค๋ฅผ ๊ฐ€์ง„ ํ…Œ์ด๋ธ”์˜ ์ปฌ๋Ÿผ๋ช… ์„ค์ • (ํ‚ค ์ปฌ๋Ÿผ์ด ํ…Œ์ด๋ธ”์˜ ์ฒซ ๋ฒˆ์งธ ํ–‰์ด ์•„๋‹Œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ๋งŒ ํ•„์š”)

<cache>์™€ <cache-ref>

  1. ๋‘ ํƒœ๊ทธ ๋ชจ๋‘ ์บ์‹œ๋ฅผ ์„ค์ •ํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.

    • <cache>ํƒœ๊ทธ๋Š” ๋Š” ํ˜„์žฌ ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— ๋Œ€ํ•œ ์บ์‹œ๋ฅผ ์„ค์ •ํ•˜๊ณ , <cache-ref>ํƒœ๊ทธ๋Š” ๋‹ค๋ฅธ ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— ๋Œ€ํ•œ ์บ์‹œ ์„ค์ •์„ ์ฐธ์กฐํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.

    โ“ Cache๋ž€

    • ๋ฐ์ดํ„ฐ๋‚˜ ๊ฐ’์„ ๋ฏธ๋ฆฌ ๋ณต์‚ฌํ•ด ๋†“์€ ์ž„์‹œ ์žฅ์†Œ์ด๋‹ค.
    • ์บ์‹œ์— ๋ฐ์ดํ„ฐ๋ฅผ ๋ฏธ๋ฆฌ ๋ณต์‚ฌํ•ด ๋†“์œผ๋ฉด ๊ณ„์‚ฐ์ด๋‚˜ ์ ‘๊ทผ ์‹œ๊ฐ„ ์—†์ด ๋” ๋น ๋ฅธ ์†๋„๋กœ ๋ฐ์ดํ„ฐ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.
  2. ์บ์‹œ์˜ ๊ธฐ๋ณธ(default) ์„ค์ •์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

    1. ๋งคํผ XML์˜ ๋ชจ๋“  select ๊ตฌ๋ฌธ์˜ ๊ฒฐ๊ณผ๋ฅผ ์บ์‹œ์— ์ €์žฅํ•œ๋‹ค.
    2. ๋งคํผ XML์˜ insert, update, delete๋Š” ๋ชจ๋‘ ์บ์‹œ๋ฅผ ์ง€์šด๋‹ค.
    3. ๊ฐ€์žฅ ์˜ค๋ž˜ ์‚ฌ์šฉํ•˜์ง€ ์•Š์€ ์บ์‹œ๋ฅผ ์ง€์šฐ๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜(LRU-Least Recently Used)์„ ์‚ฌ์šฉํ•œ๋‹ค.
    4. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์‹คํ–‰๋˜๋Š” ๋™์•ˆ ์บ์‹œ๋ฅผ ์œ ์ง€ํ•œ๋‹ค. ํŠน์ • ์‹œ์ ์— ์‚ฌ๋ผ์ง€๊ฑฐ๋‚˜ ํ•˜์ง€ ์•Š๋Š”๋‹ค.
    5. ์บ์‹œ๋Š” ์ตœ๋Œ€ 1024๊ฐœ๊นŒ์ง€ ์ €์žฅํ•œ๋‹ค.
    6. ์บ์‹œ๋Š” ์ฝ๊ธฐ/์“ฐ๊ธฐ๊ฐ€ ๋ชจ๋‘ ๊ฐ€๋Šฅํ•˜๋‹ค.
  3. ์บ์‹œ ์‚ฌ์šฉ ์˜ˆ์‹œ

    <cache eviction="LRU" flushInterval="1000" size="512" readOnly="true"/>
  4. <cache>ํƒœ๊ทธ์˜ ์†์„ฑ

    ์†์„ฑ๋ช…์„ค๋ช…
    eviction- ์บ์‹œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์ข…๋ฅ˜ (๊ธฐ๋ณธ๊ฐ’: LRU)
    - FIFO, SOFT, WEAK๋กœ ์„ค์ • ๊ฐ€๋Šฅ
    flushInterval- ์„ค์ •๋œ ์บ์‹œ์˜ ์œ ์ง€ ์‹œ๊ฐ„์„ ์–‘์ˆ˜์˜ ๋ฐ€๋ฆฌ์ดˆ ๋‹จ์œ„๋กœ ์„ค์ •
    size- ์บ์‹œ์— ์ €์žฅํ•  ๊ฐ์ฒด์˜ ์ˆ˜๋ฅผ ์ง€์ • (๊ธฐ๋ณธ๊ฐ’: 1024)
    readonly์ฝ๊ธฐ์ „์šฉ ์„ค์ •์œผ๋กœ ์บ์‹œ ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ ๋ถˆ๊ฐ€ํ•˜๊ฒŒ ํ•จ
  5. ์บ์‹œ์˜ ์ œ์•ฝ ์‚ฌํ•ญ

    • ๊ธฐ๋ณธ์ ์œผ๋กœ ๋กœ์ปฌ ์˜์—ญ์ด๋ฏ€๋กœ ์„œ๋ฒ„๋ฅผ ์—ฌ๋Ÿฌ ๋Œ€ ๋‘๋Š” ๊ฒฝ์šฐ ์บ์‹œ ๋‚ด์šฉ์ด ์„œ๋กœ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ๋‹ค.

      • โ†’ ์„œ๋ฒ„๋งˆ๋‹ค ์บ์‹œ ๋‚ด์šฉ์„ ๋™์ผํ•˜๊ฒŒ ๋งž์ถ”๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋ถ„์‚ฐ์บ์‹œ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.
    • ์บ์‹œ์˜ ํƒ€์ด๋จธ ์„ค์ •์€ ๊ฐ€๋Šฅํ•œ ๋ฐ˜๋ฉด ์Šค์ผ€์ฅด๋ง์€ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.

      • โ‡’ ์ด๋Ÿฌํ•œ ์ œ์•ฝ์‚ฌํ•ญ์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด Cachenix, Ehcache, Hazelcast, OsCache ๋“ฑ์„ ์‚ฌ์šฉํ•œ๋‹ค.

<sql>

  1. ๋งคํ•‘ ๊ตฌ๋ฌธ์—์„œ ๊ณตํ†ต์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” SQL ๋ฌธ์ž์—ด์˜ ์ผ๋ถ€๋ฅผ ์ •์˜ํ•˜๊ณ  ์žฌ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•œ๋‹ค.
  2. ์‚ฌ์šฉ ์˜ˆ์‹œ
    1. <sql> ์ž‘์„ฑ

      <sql id="columns">
          MENU_CODE
        , MENU_NAME
        , MENU_PRICE
        , CATEGORY_CODE
        , ORDERABLE_STATUS
      </sql>
    2. <sql> ํ™œ์šฉ

      <select id="selectSqlTest" resultMap="menuResultMap2">
          SELECT
          <include refid="columns"/>
            FROM TBL_MENU A
           WHERE A.ORDERABLE_STATUS = 'Y'
      </select>
profile
์—”์ง€๋‹ˆ์–ด๋กœ์˜ ์„ฑ์žฅ์ผ์ง€

2๊ฐœ์˜ ๋Œ“๊ธ€

comment-user-thumbnail
2025๋…„ 5์›” 18์ผ

๋„์›€์ด ๋งŽ์ด ๋์Šต๋‹ˆ๋‹ค!

1๊ฐœ์˜ ๋‹ต๊ธ€