๐Ÿ“Œโ€MyBatis ์„ค์ •๋„ ๊ฒฐ๊ตญ ์•„ํ‚คํ…์ฒ˜๋‹ค โ€“ SqlSessionFactory ์œ ํ‹ธ ์„ค๊ณ„๊ธฐโ€

๐Ÿ—“ 2025๋…„ 4์›” 29์ผ โœ๏ธ by ๋ฐ•์ฐฌํฌ

๐Ÿงญ ๋ฐฐ๊ฒฝ: MyBatis๋Š” ์‰ฝ๊ฒŒ ์“ธ ์ˆ˜ ์žˆ์ง€๋งŒ, ์•„๋ฌด๋ ‡๊ฒŒ๋‚˜ ์จ๋„ ๋œ๋‹ค๋Š” ๋œป์€ ์•„๋‹ˆ๋‹ค

ํŒ€ ํ”„๋กœ์ ํŠธ์—์„œ JDBC ์ฝ”๋“œ์˜ ๋ฐ˜๋ณต๊ณผ ๋ณต์žก๋„๊ฐ€ ์ ์  ๋Š˜์–ด๊ฐ”๋‹ค.

๊ทธ๋ž˜์„œ ๋„์ž…ํ•œ ๊ฒŒ ๋ฐ”๋กœ MyBatis์˜€๋‹ค. XML ๊ธฐ๋ฐ˜ ๋งคํ•‘์ด ๋‹ค์†Œ ๋ฒˆ๊ฑฐ๋กœ์šธ ์ˆ˜๋Š” ์žˆ์–ด๋„,

SQL ์ฃผ๋„ ๊ฐœ๋ฐœ, ๋ช…ํ™•ํ•œ ํŠธ๋žœ์žญ์…˜ ํ๋ฆ„, Mapper ๊ตฌ์กฐ์˜ ๋‹จ์ˆœํ•จ์€ ์—ฌ์ „ํžˆ ๋งค๋ ฅ์ ์ด๋‹ค.

ํ•˜์ง€๋งŒ ์‹ค์ œ๋กœ ์ ์šฉํ•  ๋•Œ๋Š” ๋‹จ์ˆœํ•œ ์„ค์ • ์ด์ƒ์˜ ๊ณ ๋ ค๊ฐ€ ํ•„์š”ํ–ˆ๋‹ค:

๊ณ ๋ ค ํฌ์ธํŠธ ์ด์œ 
โŒ ๋งค๋ฒˆ SqlSessionFactoryBuilder ์ƒ์„ฑ ์„ฑ๋Šฅ ๋‚ญ๋น„ + ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜ ๊ฐ€๋Šฅ์„ฑ
โŒ ์„ค์ • ํŒŒ์ผ ์ค‘๋ณต ๋กœ๋”ฉ ํ…Œ์ŠคํŠธ์™€ ์šด์˜ ๊ฐ„ ์„ค์ • ๊ฒฝ๋กœ ๋ถˆ์ผ์น˜ ๋ฐœ์ƒ ๊ฐ€๋Šฅ
โŒ ์Šค๋ ˆ๋“œ ๊ฐ„ ์„ธ์…˜ ์ถฉ๋Œ ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ์ธ์Šคํ„ด์Šค ์‚ฌ์šฉ์€ ๋‹ค์ค‘ ์š”์ฒญ ์‹œ ์น˜๋ช…์ 
โœ… ํ•„์š”ํ•œ ๊ฑด ๋‹จ ํ•˜๋‚˜ ์ „์—ญ์—์„œ ๊ณต์œ  ๊ฐ€๋Šฅํ•œ Thread-safeํ•œ SqlSessionFactory ์ธ์Šคํ„ด์Šค

๊ทธ๋ž˜์„œ ๋‚˜๋Š” Singleton ๊ธฐ๋ฐ˜์˜ MyBatis ์œ ํ‹ธ๋ฆฌํ‹ฐ ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค๊ธฐ๋กœ ํ–ˆ๋‹ค.


๐Ÿ”ง ๊ตฌํ˜„: MyBatisUtil ํด๋ž˜์Šค

public class MyBatisUtil {

    private static SqlSessionFactory sqlSessionFactory;

    static {
        try {
            String resource = "model/mapper/mybatis-config.xml";
            InputStream inputStream = Resources.getResourceAsStream(resource);

            sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);  // โ› 1ํšŒ ์ƒ์„ฑ
        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException("SqlSessionFactory ์ƒ์„ฑ ์‹คํŒจ: " + e.getMessage());
        }
    }

    public static SqlSessionFactory getSqlSessionFactory() {
        return sqlSessionFactory;  // โœ… ์ „์—ญ ์ ‘๊ทผ ๋ฉ”์„œ๋“œ
    }
}

๐Ÿง  ์„ค๊ณ„ ์ฒ ํ•™ & ๊ธฐ์ˆ  ๊ณ ์ฐฐ

์„ค๊ณ„ ์š”์†Œ ์˜๋„
static {} ๋ธ”๋ก ์ดˆ๊ธฐํ™” ํด๋ž˜์Šค ์ตœ์ดˆ ๋กœ๋”ฉ ์‹œ 1ํšŒ ์‹คํ–‰ โ†’ Lazy Singleton ๋ณด์žฅ
Resources.getResourceAsStream() ์ž์› ๋กœ๋”ฉ ์‹คํŒจ ์‹œ ํ™•์‹คํ•œ ์˜ˆ์™ธ ๋ฐœ์ƒ ์œ ๋„
RuntimeException throw ์„ค์ • ์‹คํŒจ ์‹œ ์‹œ์Šคํ…œ ์ค‘๋‹จ โ†’ ์กฐ๊ธฐ ์˜ค๋ฅ˜ ์ธ์‹ ๊ฐ€๋Šฅ
SqlSessionFactory๋ฅผ ์บ์‹œ Factory๋Š” Thread-safe โ†’ ์žฌ์‚ฌ์šฉ์ด ์„ฑ๋Šฅ์ƒ ์œ ๋ฆฌ
๊ฒฝ๋กœ ํ•˜๋“œ์ฝ”๋”ฉ โ†’ ์ƒ์ˆ˜ํ™” ๊ณ ๋ ค ์œ ์ง€๋ณด์ˆ˜์„ฑ์„ ์œ„ํ•ด ์ถ”ํ›„ ์™ธ๋ถ€ config ์ „ํ™˜ ๊ฐ€๋Šฅ

๐Ÿงช DAO์™€์˜ ํ†ตํ•ฉ ํ๋ฆ„

try (SqlSession session = MyBatisUtil.getSqlSessionFactory().openSession()) {
    LectureMapper mapper = session.getMapper(LectureMapper.class);
    List<LectureDTO> lectures = mapper.findAll();
}

๐Ÿงฑ ์„ค์ • ํŒŒ์ผ ๊ตฌ์กฐ

<configuration>
  <settings>
    <setting name="mapUnderscoreToCamelCase" value="true"/>
  </settings>
</configuration>

๐Ÿšง ์‹ค๋ฌด ์ด์Šˆ & ์žฅ์•  ๋Œ€์‘

๐Ÿงจ ์˜ค๋ฅ˜: mybatis-config.xml not found

๐Ÿงจ ์˜ค๋ฅ˜: SqlSessionFactory is null


๐Ÿ” ํ™•์žฅ ๊ฐ€๋Šฅ์„ฑ๊ณผ ๋ฆฌํŒฉํ† ๋ง ๋ฐฉํ–ฅ

๊ธฐ๋Šฅ ๋ฐฉํ–ฅ
Spring ์ „ํ™˜ SqlSessionFactoryBean์„ ์‚ฌ์šฉํ•˜๋˜, ๊ตฌ์กฐ๋Š” ๋™์ผ
๋‹ค์ค‘ DB ๊ตฌ์„ฑ getFactory(String dbName) ๋ฐฉ์‹์œผ๋กœ ํŒฉํ† ๋ฆฌ ์ธ์Šคํ„ด์Šค ๋ถ„๊ธฐ
๋กœ๊ทธ ์ตœ์ ํ™” SLF4J + log4jdbc.log4j2.properties ์—ฐ๋™ ์‹œ ์ฟผ๋ฆฌ ์ถœ๋ ฅ ๊ฐ€๋Šฅ
Mapper ์ž๋™ ๋“ฑ๋ก ์„ค์ • ํŒŒ์ผ์—์„œ <mappers> ๋…ธ๋“œ๋กœ ๋ชจ๋“ˆ๋ณ„ XML ์ž๋™ ์ธ์‹

๐Ÿ’ฌ ์‹œ๋‹ˆ์–ด ๊ฐœ๋ฐœ์ž๊ฐ€ ์ฃผ๋ชฉํ•  ํ‚ค์›Œ๋“œ

ํ‚ค์›Œ๋“œ ํ•ต์‹ฌ ๋ฉ”์‹œ์ง€
SqlSessionFactory MyBatis์—์„œ ์„ธ์…˜์„ ์ƒ์„ฑํ•˜๋Š” ํ•ต์‹ฌ ๊ฐ์ฒด, Thread-safe
Singleton ํŒจํ„ด Java์˜ static block์œผ๋กœ ๊ตฌํ˜„ํ•œ Lazy Initialization
Resources.getResourceAsStream ์•ˆ์ „ํ•œ ์„ค์ • ํŒŒ์ผ ๋กœ๋”ฉ ๋ฐฉ์‹
์„ค์ • ๋‹จ์ผํ™” mybatis-config.xml ์œ„์น˜ ๋ณ€๊ฒฝ ์‹œ ๋‹จ 1๊ณณ๋งŒ ์ˆ˜์ •
Spring ์—†๋Š” ๊ตฌ์กฐ ํ”„๋ ˆ์ž„์›Œํฌ ๋…๋ฆฝ์ ์œผ๋กœ๋„ ORM ์ ์šฉ ๊ฐ€๋Šฅ

๐Ÿงพ ์‹ค์ œ DAO ์˜ˆ์‹œ

public class LectureDAO {
  public List<LectureDTO> getAllLectures() {
    try (SqlSession session = MyBatisUtil.getSqlSessionFactory().openSession()) {
      return session.selectList("LectureMapper.findAll");
    }
  }
}

โœ… ๊ฒฐ๊ณผ & ํšŒ๊ณ 

โ€œORM์€ ๋‹จ์ˆœํžˆ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์“ฐ๋Š” ๋ฌธ์ œ๊ฐ€ ์•„๋‹ˆ๋ผ, ์•„ํ‚คํ…์ฒ˜ ์ˆ˜์ค€์˜ ๊ฒฐ์ •์ด๋‹ค.โ€

์ด๋ฒˆ MyBatisUtil ์œ ํ‹ธ์€ ๋‹จ์ˆœํ•œ ์„ค์ • ์ฝ”๋“œ ์ด์ƒ์˜ ๊ฐ€์น˜๋ฅผ ์ง€๋‹Œ๋‹ค.