๐โ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();
}
- ๋ถํ์ํ ํฉํ ๋ฆฌ ์์ฑ ์์ด
openSession()
๋ง ํธ์ถ - Spring ์์ด๋ ๋์ ๊ฐ๋ฅ โ ์์ Java MVC ํ๊ฒฝ์์๋ ์์ ํธํ
try-with-resources
๊ตฌ์กฐ๋ก ์ธ์ ์๋ close ์ฒ๋ฆฌ
๐งฑ ์ค์ ํ์ผ ๊ตฌ์กฐ
<configuration>
<settings>
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
</configuration>
- XML์
src/main/resources
๊ธฐ์ค์ผ๋ก ์์น typeAliases
,mapper
๊ฒฝ๋ก๋ ๋ด๋ถ์ ์ผ๋ก ํ์ฅ ๊ฐ๋ฅmapUnderscoreToCamelCase
: DB ์ปฌ๋ผ๋ช ์ดuser_id
์ผ ๋, DTO ํ๋๋ฅผuserId
๋ก ๋งคํ
๐ง ์ค๋ฌด ์ด์ & ์ฅ์ ๋์
๐งจ ์ค๋ฅ: mybatis-config.xml not found
- ์์ธ: config ํ์ผ์ด
resources
๊ฐ ์๋ ๋ค๋ฅธ ๊ฒฝ๋ก์ ์์์ - ํด๊ฒฐ: Maven ๊ธฐ์ค
resources/
์ ๋ฐฐ์นํ๊ณ , ๊ฒฝ๋ก๋ classpath ๊ธฐ์ค์ผ๋ก ์์ฑ
๐งจ ์ค๋ฅ: SqlSessionFactory is null
- ์์ธ: ์ ์ ์ด๊ธฐํ๊ฐ ํธ๋ฆฌ๊ฑฐ๋์ง ์์ (JVM์ด ํด๋์ค ๋ก๋ฉ์ ์์ง ํ์ง ์์)
- ํด๊ฒฐ: DAO ์ฒซ ํธ์ถ ์ ์ ๊ฐ์ ์ ์ผ๋ก
MyBatisUtil.getSqlSessionFactory()
ํธ์ถ
๐ ํ์ฅ ๊ฐ๋ฅ์ฑ๊ณผ ๋ฆฌํฉํ ๋ง ๋ฐฉํฅ
๊ธฐ๋ฅ | ๋ฐฉํฅ |
---|---|
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
์ ํธ์ ๋จ์ํ ์ค์ ์ฝ๋ ์ด์์ ๊ฐ์น๋ฅผ ์ง๋๋ค.
- ์ ์ญ ํฉํ ๋ฆฌ ์ ๊ทผ โ ์ฑ๋ฅ/์์ ์ ์ฝ
- ๋ช ํํ ๋ก๋ฉ ์ง์ โ ์ค๋ฅ ๋ฐ์ ์์ ๊ณ ๋ฆฝ
- Spring ๋ฏธ์ฌ์ฉ ํ๊ฒฝ์์๋ ํ ์คํธ/์ด์ ๋ชจ๋ ์ปค๋ฒ ๊ฐ๋ฅ