๐Ÿ“Œ MyBatis Mapper ์™„์ „ ์ •๋ณต โ‘ค - ๋™์  SQL ์™„์ „ ์ •๋ณต

My Pale Blue Dotยท2025๋…„ 4์›” 25์ผ
0

SPRING

๋ชฉ๋ก ๋ณด๊ธฐ
18/36
post-thumbnail

๐Ÿ“… ๋‚ ์งœ

2025-04-25


๐Ÿ“ 1๏ธโƒฃ ๋™์  SQL์ด๋ž€?

๋™์  SQL(Dynamic SQL)์€ ์กฐ๊ฑด์— ๋”ฐ๋ผ SQL๋ฌธ์ด ์œ ๋™์ ์œผ๋กœ ์ƒ์„ฑ๋˜๋Š” ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค.

๋ณต์žกํ•œ ๊ฒ€์ƒ‰ ์กฐ๊ฑด, ์„ ํƒ์  ํ•„ํ„ฐ๋ง์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ์— ํ•„์ˆ˜์ ์œผ๋กœ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

๐Ÿ’ก ์˜ˆ์‹œ ์ƒํ™ฉ

  • ๊ฒ€์ƒ‰์ฐฝ์—์„œ ์ž…๋ ฅํ•œ ๊ฐ’์— ๋”ฐ๋ผ WHERE ์กฐ๊ฑด์ด ๋‹ฌ๋ผ์งˆ ๋•Œ
  • ํŠน์ • ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ์žˆ์„ ๋•Œ๋งŒ ์ฟผ๋ฆฌ ์กฐ๊ฑด ์ถ”๊ฐ€

๐Ÿ“ 2๏ธโƒฃ MyBatis ๋™์  SQL ํƒœ๊ทธ ์ •๋ฆฌ

ํƒœ๊ทธ์„ค๋ช…
<if>์กฐ๊ฑด์— ๋”ฐ๋ผ SQL ์ผ๋ถ€๋ฅผ ํฌํ•จ
<choose>์ž๋ฐ”์˜ switch-case์™€ ์œ ์‚ฌ
<when><choose> ๋‚ด๋ถ€ ์กฐ๊ฑด ๋ถ„๊ธฐ
<otherwise>๋ชจ๋“  <when> ์กฐ๊ฑด์ด false์ผ ๋•Œ ์‹คํ–‰
<where>์ž๋™์œผ๋กœ WHERE ์ ˆ ์ถ”๊ฐ€, ๋ถˆํ•„์š”ํ•œ AND/OR ์ œ๊ฑฐ
<trim>SQL ์•ž๋’ค๋กœ ํŠน์ • ๋ฌธ์ž์—ด ์ถ”๊ฐ€/์ œ๊ฑฐ

๐Ÿ“ 3๏ธโƒฃ ์‹ค์Šต ์˜ˆ์ œ โ‘  - <if> ํƒœ๊ทธ ํ™œ์šฉ

๐Ÿ”น XML ๋งคํผ ์ฝ”๋“œ

<select id="Select_if_xml" parameterType="java.util.Map" resultType="java.util.Map">
    SELECT * FROM tbl_memo
    <if test="type != null and type.equals('text')">
        WHERE text LIKE CONCAT('%', #{keyword}, '%')
    </if>
</select>

๐Ÿ”น ํ…Œ์ŠคํŠธ ์ฝ”๋“œ

@Test
void testSelectIfXml() {
    Map<String,Object> param = new HashMap<>();
    param.put("type", "text");
    param.put("keyword", "a");

    List<Map<String,Object>> response = memoMapper.Select_if_xml(param);
    response.forEach(System.out::println);
}

๐Ÿ”น ์ถœ๋ ฅ ๊ฒฐ๊ณผ

{id=3002, text=aaaaa, writer=example@example.com, createAt=2025-04-25T15:38}

โšก ํฌ์ธํŠธ:

ํŒŒ๋ผ๋ฏธํ„ฐ type์ด "text"์ผ ๋•Œ๋งŒ WHERE ์กฐ๊ฑด์ด ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค.


๐Ÿ“ 4๏ธโƒฃ ์‹ค์Šต ์˜ˆ์ œ โ‘ก - <choose>๋กœ ์กฐ๊ฑด ๋ถ„๊ธฐ

๐Ÿ”น XML ๋งคํผ ์ฝ”๋“œ

<select id="Select_when_xml" parameterType="java.util.Map" resultType="java.util.Map">
    SELECT * FROM tbl_memo
    <if test="type != null">
        WHERE
        <choose>
            <when test="type.equals('id')">
                id LIKE CONCAT('%', #{keyword}, '%')
            </when>
            <when test="type.equals('writer')">
                writer LIKE CONCAT('%', #{keyword}, '%')
            </when>
            <otherwise>
                createAt <= #{keyword}
            </otherwise>
        </choose>
    </if>
</select>

๐Ÿ”น ํ…Œ์ŠคํŠธ ์ฝ”๋“œ

@Test
void testSelectWhenXml() {
    Map<String,Object> param = new HashMap<>();
    param.put("type", "writer");
    param.put("keyword", "example");

    List<Map<String,Object>> response = memoMapper.Select_when_xml(param);
    response.forEach(System.out::println);
}

๐Ÿ”น ์ถœ๋ ฅ ๊ฒฐ๊ณผ

{id=3001, text=asd, writer=example@example.com, createAt=2025-04-25T15:38}
{id=3002, text=aaaaa, writer=example@example.com, createAt=2025-04-25T15:38}
{id=3003, text=bbbb, writer=example@example.com, createAt=2025-04-25T15:38}

๐Ÿ’ก ํฌ์ธํŠธ:

type ๊ฐ’์— ๋”ฐ๋ผ ๊ฒ€์ƒ‰ ์ปฌ๋Ÿผ์ด ์œ ๋™์ ์œผ๋กœ ๋ณ€๊ฒฝ๋ฉ๋‹ˆ๋‹ค.

์กฐ๊ฑด์ด ์—†์œผ๋ฉด <otherwise>๊ฐ€ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.


โš ๏ธ ๋™์  SQL ์‚ฌ์šฉ ์‹œ ์ฃผ์˜์‚ฌํ•ญ

  1. โ— WHERE ์ ˆ ๋ˆ„๋ฝ ๋ฐฉ์ง€ โžก๏ธ <where> ํƒœ๊ทธ ์ ๊ทน ํ™œ์šฉ
  2. โ— Null ์ฒดํฌ ํ•„์ˆ˜ (test="param != null")
  3. โ— ๋ณต์žกํ•œ ์กฐ๊ฑด์€ ์„œ๋น„์Šค ๋กœ์ง์—์„œ ์‚ฌ์ „ ์ฒ˜๋ฆฌ
  4. โ— ๋„ˆ๋ฌด ๋งŽ์€ <if> ๋‚จ๋ฐœ ๊ธˆ์ง€ โžก๏ธ ๊ฐ€๋…์„ฑ ์ €ํ•˜

๐Ÿ“ Best Practice

  • ์กฐ๊ฑด๋ถ€ ์ฟผ๋ฆฌ๋Š” ๊ฐ€๊ธ‰์  ๋ช…ํ™•ํ•˜๊ฒŒ ๊ตฌ๋ถ„ํ•  ๊ฒƒ
  • ๋ฐ˜๋ณต๋˜๋Š” ์กฐ๊ฑด๋ฌธ์€ <trim>์œผ๋กœ ์ •๋ฆฌ
  • ์œ ์ง€๋ณด์ˆ˜์„ฑ์„ ์œ„ํ•ด SQL ๋กœ์ง์€ XML์—์„œ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ์œ ๋ฆฌ

๐Ÿ”ฅ ์š”์•ฝ

  • ๋™์  SQL์€ ๋ณต์žกํ•œ ๊ฒ€์ƒ‰ ์กฐ๊ฑด ์ฒ˜๋ฆฌ์— ํ•„์ˆ˜
  • <if>์™€ <choose>๋ฅผ ์ ์ ˆํžˆ ์กฐํ•ฉํ•˜๋ฉด ๊น”๋”ํ•œ ์ฟผ๋ฆฌ ์ž‘์„ฑ ๊ฐ€๋Šฅ
  • ์ฃผ์˜์‚ฌํ•ญ์„ ์ง€์ผœ์•ผ ๊ฐ€๋…์„ฑ๊ณผ ์„ฑ๋Šฅ์„ ๋ชจ๋‘ ์žก์„ ์ˆ˜ ์žˆ๋‹ค

๐Ÿ”— ์ฐธ๊ณ  ์ž๋ฃŒ


๐Ÿ’ญ ๋А๋‚€ ์ 

์ง์ ‘ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋ฉฐ ๋™์  SQL์˜ ๋™์ž‘ ๋ฐฉ์‹์„ ํ™•์‹คํžˆ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

๋ณต์žกํ•œ ์กฐ๊ฑด์ผ์ˆ˜๋ก XML ๋งคํผ์˜ ํ•„์š”์„ฑ์„ ๋‹ค์‹œ ํ•œ๋ฒˆ ๋А๊ผˆ๊ณ , ์‹ค๋ฌด์—์„œ ์–ด๋–ป๊ฒŒ ํ™œ์šฉํ• ์ง€ ๊ฐ์ด ์žกํ˜”์Šต๋‹ˆ๋‹ค! ๐Ÿ˜„


profile
Here, My Pale Blue.๐ŸŒ

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