๐
๋ ์ง
2025-04-25
๐ 1๏ธโฃ MyBatis์์ ์ค๋ฅ๊ฐ ์์ฃผ ๋ฐ์ํ๋ ์ด์
MyBatis๋ SQL์ ์ง์ ๋ค๋ฃจ๋ ํ๋ ์์ํฌ์ด๊ธฐ ๋๋ฌธ์,
์ค์ ์ค์, ๊ฒฝ๋ก ์ค๋ฅ, SQL ๊ตฌ๋ฌธ ์ค๋ฅ ๋ฑ ์ฌ์ํ ์ค์๊ฐ ์ฝ๊ฒ ๋ฐ์ํ ์ ์์ต๋๋ค.
ํ์ง๋ง, ์ด๋ฌํ ์ค๋ฅ๋ ํจํดํ๋ ์ค์๊ฐ ๋ง์ ๋ฏธ๋ฆฌ ์๊ณ ๋๋นํ๋ฉด ์ถฉ๋ถํ ์๋ฐฉํ ์ ์์ต๋๋ค.
๐ 2๏ธโฃ Mapper ์ค์ ๊ด๋ จ ์ค๋ฅ
โ ๏ธ 1. namespace ๋ถ์ผ์น
- ์์ธ: XML ๋งคํผ์
namespace
์ Mapper ์ธํฐํ์ด์ค ๊ฒฝ๋ก๊ฐ ๋ค๋ฅผ ๋ ๋ฐ์.
- ํด๊ฒฐ: ํญ์ ํจํค์ง ๊ฒฝ๋ก๊น์ง ์ ํํ ์ผ์น์์ผ์ผ ํฉ๋๋ค.
<mapper namespace="com.example.app.domain.mapper.MemoMapper">
โ ๏ธ 2. ๋งคํผ ์ค์บ ๋๋ฝ
- ์์ธ:
@MapperScan
๋๋ <mybatis-spring:scan>
์ค์ ๋๋ฝ.
- ํด๊ฒฐ: Spring ์ค์ ํ์ผ์์ ๋งคํผ ๊ฒฝ๋ก๋ฅผ ๋ฐ๋์ ๋ฑ๋ก.
<mybatis-spring:scan base-package="com.example.app.domain.mapper"/>
โ ๏ธ 3. XML ๊ฒฝ๋ก ์ค์ ์ค๋ฅ
- ์์ธ:
setMapperLocations
๊ฒฝ๋ก ์ง์ ์ค์.
- ํด๊ฒฐ: ๋ฆฌ์์ค ๊ฒฝ๋ก๋ฅผ ์ ํํ ์ค์ .
sessionFactory.setMapperLocations(
new PathMatchingResourcePatternResolver().getResources("classpath:/mappers/*.xml")
);
๐ 3๏ธโฃ SQL ์์ฑ ์ ์์ฃผ ๋ฐ์ํ๋ ์ค๋ฅ
โ ๏ธ 1. ์ธ๋ฏธ์ฝ๋ก (;) ์ฌ์ฉ
- MyBatis SQL ๊ตฌ๋ฌธ ๋์
;
์ ์์ฑํ๋ฉด ์ค๋ฅ ๋ฐ์.
- ํด๊ฒฐ: SQL ๋์๋ ์ธ๋ฏธ์ฝ๋ก ์ ๋ถ์ด์ง ์์ต๋๋ค.
โ ๏ธ 2. ์ปฌ๋ผ๋ช
์คํ
- ์์ธ: SQL ๋ด ์ปฌ๋ผ๋ช
์ ์๋ชป ์
๋ ฅ.
- ํด๊ฒฐ: DB ์คํค๋ง ๊ธฐ์ค์ผ๋ก ์ ํํ ์ปฌ๋ผ๋ช
์ฌ์ฉ.
โ ๏ธ 3. ํ๋ผ๋ฏธํฐ ๋งคํ ์ค๋ฅ
- ์ค๋ฅ ๋ฉ์์ง:
"Parameter 'id' not found. Available parameters are..."
- ์์ธ:
- DTO ํ๋๋ช
๊ณผ SQL ๋งคํ ๋ถ์ผ์น.
- ๋ค์ค ํ๋ผ๋ฏธํฐ ์ฌ์ฉ ์
@Param
๋๋ฝ.
- ํด๊ฒฐ:
- DTO ํ๋๋ช
๊ณผ SQL์
#{}
์ด๋ฆ์ ์ผ์น.
- ๋ค์ค ํ๋ผ๋ฏธํฐ ์
@Param
ํ์ฉ.
int deleteXml(@Param("id") int id);
๐ 4๏ธโฃ resultType & parameterType ์ค๋ฅ
โ ๏ธ 1. ๊ฒฝ๋ก ์ค๋ฅ
- ์์ธ: ํจํค์ง ์ ์ฒด ๊ฒฝ๋ก ๋๋ฝ.
- ํด๊ฒฐ: ํญ์ ํ ํจํค์ง ๊ฒฝ๋ก๋ฅผ ์์ฑ.
<select id="selectAtXml" resultType="com.example.app.domain.dto.MemoDto">
โ ๏ธ 2. ํ์
๋ฏธ์ค๋งค์นญ
- ๊ธฐ๋ณธํ์ ์๋ฌธ์ ์ฌ์ฉ (
int
, string
), ๊ฐ์ฒดํ์ ์ ์ฒด ๊ฒฝ๋ก ์ฌ์ฉ.
๐ 5๏ธโฃ ํค ์์ฑ ๊ด๋ จ ์ค๋ฅ
โ ๏ธ 1. useGeneratedKeys ์ค์ ๋๋ฝ
- ์ค๋ฅ ๋ฉ์์ง:
"Generated keys not requested"
- ํด๊ฒฐ: INSERT ๊ตฌ๋ฌธ์
useGeneratedKeys="true"
์ถ๊ฐ.
โ ๏ธ 2. selectKey ๋์์ฑ ๋ฌธ์
- ์์ธ:
SELECT MAX(id) + 1
๋ฐฉ์์ ๋์์ฑ ์ด์๊ฐ ๋ฐ์ํ ์ ์์.
- ํด๊ฒฐ: ๊ฐ๋ฅํ๋ค๋ฉด DB์ AUTO_INCREMENT ๋๋ ์ํ์ค ์ฌ์ฉ ๊ถ์ฅ.
๐ 6๏ธโฃ ๋์ SQL ์ค๋ฅ
โ ๏ธ 1. , ํ๊ทธ ์ค์ฉ
<where>
ํ๊ทธ ๋ด๋ถ์ ์กฐ๊ฑด์ด ์์ผ๋ฉด SQL ๋ฌธ๋ฒ ์ค๋ฅ ๋ฐ์.
- ํด๊ฒฐ: ์กฐ๊ฑด์ด ์์ ๋๋ฅผ ๋๋นํ์ฌ ๊ธฐ๋ณธ ์กฐ๊ฑด ์ค์ ์ ๊ณ ๋ ค.
โ ๏ธ 2. NullPointerException
- ์์ธ: ํ๋ผ๋ฏธํฐ๊ฐ null์ผ ๋ ๊ตฌ๋ฌธ์์ ๋ฐ์.
- ํด๊ฒฐ: ์์ ํ๊ฒ null ์ฒดํฌ ๋ก์ง ์์ฑ.
<if test="text != null and text != ''">
AND text = #{text}
</if>
๐ 7๏ธโฃ ์ค์ ํ ๋ชจ์
โ
1. ํ
์คํธ ์ฝ๋๋ก ๋น ๋ฅด๊ฒ ๊ฒ์ฆ
- CRUD ๊ธฐ๋ฅ๋ง๋ค JUnit ํ
์คํธ๋ฅผ ์์ฑํด ์ค๋ฅ๋ฅผ ์ฌ์ ์ ํ์ธ.
โ
2. SQL ๋ก๊ทธ ์ค์
- MyBatis ์คํ ์ฟผ๋ฆฌ๋ฅผ ํ์ธํ๊ธฐ ์ํด Log ์ค์ ์ ํ์ฉ.
<logger name="org.mybatis" level="DEBUG"/>
โ
3. Mapper & XML ๊ด๋ฆฌ ์ ๋ต
- ๋ค์ด๋ฐ ์ปจ๋ฒค์
ํต์ผ:
- ์ธํฐํ์ด์ค:
MemoMapper.java
- XML:
MemoMapper.xml
- ํจํค์ง ๊ตฌ์กฐ๋ฅผ ์ผ๊ด์ฑ ์๊ฒ ์ ์ง.
๐ฅ ์ ๋ฆฌ - MyBatis ์ค๋ฅ ๋ฐฉ์ง ์ฒดํฌ๋ฆฌ์คํธ โ
๐ ์ฐธ๊ณ ์๋ฃ