
2025-04-25
MyBatis์์ XML ๋งคํผ๋ SQL์ ์ธ๋ถ ํ์ผ(XML)๋ก ๋ถ๋ฆฌํ์ฌ ์์ฑํ๋ ๋ฐฉ์์ผ๋ก,
๋ณต์กํ SQL, ๋์ ์ฟผ๋ฆฌ, ์ ์ง๋ณด์๊ฐ ํ์ํ ํ๋ก์ ํธ์์ ํ์์ ์ผ๋ก ์ฌ์ฉ๋ฉ๋๋ค.
| ๊ตฌ๋ถ | ์ด๋ ธํ ์ด์ ๋ฐฉ์ | XML ๋งคํผ ๋ฐฉ์ |
|---|---|---|
| ๊ฐ๋จํ CRUD | ์ ํฉ | ๊ฐ๋ฅ |
| ๋ณต์กํ SQL | ์ ํ์ | ์ฐ์ |
| ๋์ SQL | ๋ถ๊ฐ๋ฅ | ์ง์ |
| ์ ์ง๋ณด์ | ์ด๋ ค์ | ์ ๋ฆฌ |
| ์ค์ ํ์ผ | ์ต์ํ | ๋ณ๋ XML ํ์ |
| ๊ฐ๋ ์ฑ | ์ฝ๋์ ํผํฉ | SQL ๋ถ๋ฆฌ๋ก ๋ช ํ |
๐ก Tip:
์ด๋ ธํ ์ด์ ๋ฐฉ์์ ๋จ์ ์์ ์,
XML ๋งคํผ๋ ํ์ฅ์ฑ๊ณผ ์ ์ง๋ณด์๋ฅผ ๊ณ ๋ คํ ๋ณต์กํ ์์ ์ ์ ํฉํฉ๋๋ค.
<mapper namespace="com.example.app.domain.mapper.MemoMapper">
<insert id="insertXml" parameterType="MemoDto">
INSERT INTO tbl_memo (id, text) VALUES (#{id}, #{text})
</insert>
<select id="selectAtXml" parameterType="int" resultType="MemoDto">
SELECT * FROM tbl_memo WHERE id = #{id}
</select>
</mapper>
| ์์ฑ | ์ค๋ช |
|---|---|
| namespace | Mapper ์ธํฐํ์ด์ค์ ์ฐ๊ฒฐ (ํจํค์ง๋ช ํฌํจ) |
| id | ์ธํฐํ์ด์ค ๋ฉ์๋๋ช ๊ณผ ๋งคํ |
| parameterType | ์ ๋ฌ ํ๋ผ๋ฏธํฐ ํ์
(๊ธฐ๋ณธํ: int, ์ฐธ์กฐํ: ์ ์ฒด ๊ฒฝ๋ก) |
| resultType | ๋ฐํ ํ์ (DTO ํด๋์ค ์ ์ฒด ๊ฒฝ๋ก or Map ๋ฑ) |
โ ๏ธ ์ฃผ์:
parameterType,resultType์ ์ ํํ ๊ฒฝ๋ก์ ํ์ ์ ์ง์ ํด์ผ ์ค๋ฅ๋ฅผ ๋ฐฉ์งํ ์ ์์ต๋๋ค.
<insert id="insertXml" parameterType="MemoDto">
<selectKey keyProperty="id" order="AFTER" resultType="int">
SELECT MAX(id) + 1 FROM tbl_memo
</selectKey>
INSERT INTO tbl_memo (id, text) VALUES (#{id}, #{text})
</insert>
selectKey๋ฅผ ํ์ฉํ์ฌ ์ปค์คํ
ํค ์์ฑ.useGeneratedKeys="true" ์ต์
์ฌ์ฉ.๐ก ํค ์์ฑ ์ ๋ต์ ๋ค์ ํธ์์ ๋ ์์ธํ ๋ค๋ฃน๋๋ค!
<select id="selectDynamic" parameterType="Map" resultType="MemoDto">
SELECT * FROM tbl_memo
<where>
<if test="text != null">
AND text = #{text}
</if>
<if test="writer != null">
AND writer = #{writer}
</if>
</where>
</select>
โ ํ๊ทธ ์๋ ์ฒ๋ฆฌ
<sql id="memoColumns">
id, text, writer, createAt
</sql>
<select id="selectWithColumns" resultType="MemoDto">
SELECT <include refid="memoColumns"/> FROM tbl_memo
</select>
sessionFactory.setMapperLocations(
new PathMatchingResourcePatternResolver().getResources("classpath:/mappers/*.xml")
);
namespace โ Mapper ์ธํฐํ์ด์ค ๊ฒฝ๋ก์ ์ผ์นid ์์ฑ๊ฐ๊ณผ ์ผ์น์์:
public interface MemoMapper {
int insertXml(MemoDto dto); // โ XML์ id="insertXml"
}
@Test
void testInsertXml() {
MemoDto dto = new MemoDto(null, "XML Insert Test", "user@domain.com", LocalDateTime.now(), null);
int result = memoMapper.insertXml(dto);
assertEquals(1, result);
}
setMapperLocations ์ค์ ๋๋ฝ"Parameter 'id' not found"@Param ์ฌ์ฉ