๐Ÿ’ป ์ฝ”๋”ฉ ์ผ๊ธฐ : [Spring] 'Dynamic SQL' ํŽธ

ybkยท2024๋…„ 4์›” 30์ผ

spring

๋ชฉ๋ก ๋ณด๊ธฐ
20/55
post-thumbnail

๐Ÿ”” 'Dynamic SQL'์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด์ž!


๐Ÿ’Ÿ Dynamic SQL

SQL ์ฟผ๋ฆฌ๋ฅผ ๋™์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค. ์กฐ๊ฑด์— ๋”ฐ๋ผ ์ถ”๊ฐ€ ๋ฐ ์ƒ๋žต์ด ๊ฐ€๋Šฅํ•ด์ง‘๋‹ˆ๋‹ค.

  • <if>, <choose>, <when>, <otherwise>, <trim>, <foreach> ๋“ฑ์˜ XML ํƒœ๊ทธ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • <scrip> ํƒœ๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋™์  SQL์„ ์ž‘์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ’Ÿ if ํƒœ๊ทธ

์กฐ๊ฑด๋ฌธ์„ ์ƒ์„ฑํ•˜๊ณ  test ์†์„ฑ์˜ ๊ฐ’์— ๋”ฐ๋ผ ๋™์ ์œผ๋กœ SQL์„ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ์ƒ๋žตํ•ฉ๋‹ˆ๋‹ค.

@Select("""
        <script>
        SELECT * FROM Employees
        WHERE LastName = 'abc'
           <if test="true">
           OR FirstName = 'abc'
            </if>
        </script>
        """)
List<MyBean258Employee> query1();
  • test="true"๋ผ๊ณ  ์„ค์ •ํ•˜์—ฌ <if> ํƒœ๊ทธ ๋‚ด๋ถ€์˜ SQL ๋ฌธ์žฅ์ด ํ•˜์ƒ ์‹คํ–‰๋˜๋ฏ€๋กœ SQL ๋ฌธ์žฅ์ด ์™„์„ฑ๋ฉ๋‹ˆ๋‹ค.
SELECT * FROM Employees WHERE LastName = 'abc'OR FirstName = 'abc'

๐Ÿ’Ÿ trim ํƒœ๊ทธ

  • prefix="WHERE" : trim ํƒœ๊ทธ ์•ˆ์— ์กฐ๊ฑด์ด ์žˆ๋‹ค๋ฉด WHERE๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ์—†๋‹ค๋ฉด ์ถ”๊ฐ€ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • prefixOverrides="AND | OR" : trim ํƒœ๊ทธ ์•ˆ์— ์ฝ”๋“œ ์ค‘ ์•ž์— AND๋‚˜ OR์ด ์žˆ์„ ๊ฒฝ์šฐ ํ•ด๋‹น AND๋‚˜ OR์„ ์ž˜๋ผ๋ƒ…๋‹ˆ๋‹ค.
@Select("""
        <script>
            SELECT * FROM my_table
                <trim prefix="WHERE" prefixOverrides="OR">
                    <if test="lastName != null">
                    OR    LastName = #{lastName}
                    </if>
                    <if test="firstName != null">
                    OR    firstName = #{firstName}
                    </if>
                </trim>
        </script>
        """)

Object query5(MyBean258Employee employee);
  1. lastName์— ๊ฐ’์ด ์žˆ๊ณ  firstName์ด ์—†๋Š” ๊ฒฝ์šฐ
SELECT * FROM my_table WHERE LastName = ?
  1. lastName์— ๊ฐ’์ด ์—†๊ณ  firstName์ด ์žˆ๋Š” ๊ฒฝ์šฐ
SELECT * FROM my_table WHERE FirstName = ?
  1. lastName, firstName ๋ชจ๋‘ ๊ฐ’์ด ์žˆ๋Š” ๊ฒฝ์šฐ
SELECT * FROM my_table WHERE LastName = ? OR FirstName = ?
  1. lastName, firstName ๋ชจ๋‘ ๊ฐ’์ด ์—†๋Š” ๊ฒฝ์šฐ
SELECT * FROM my_table

๐Ÿ’Ÿ bind ํƒœ๊ทธ

OGNL(Object Graph Navigation Language) ํ‘œํ˜„์‹์„ ์‚ฌ์šฉํ•˜์—ฌ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์ž‘์„ฑํ•˜๊ณ , ์ด๋ฅผ ์ปจํ…์ŠคํŠธ์— ๋ฐ”์ธ๋”ฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค.

  • name : ์ƒ์„ฑ๋  ๋ณ€์ˆ˜์˜ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.
  • value : ํ‘œํ˜„์‹์„ ๋งŒ๋“ค์–ด ์ค๋‹ˆ๋‹ค.
@Select("""
        <script>
            <bind name="patternKeyword" value="'%' + keyword + '%'" />
            SELECT * FROM Employees
            WHERE notes LIKE #{patternKeyword}
        </script>
        """)
List<MyBean258Employee> query6(String keyword);
  • patternKeyword ๋ณ€์ˆ˜๊ฐ€ ์ƒ์„ฑ๋˜๊ณ  ์ด ๋ณ€์ˆ˜์˜ ๊ฐ’์€ '%' + keyword + '%' ์ž…๋‹ˆ๋‹ค. keyword์— ๋“ค์–ด๊ฐ€๋Š” ๊ฐ’์— ๋”ฐ๋ผ SQL ์ฟผ๋ฆฌ๊ฐ€ ๋‹ฌ๋ผ์ง‘๋‹ˆ๋‹ค.
SELECT * FROM Employees WHERE notes LIKE %{keyword}%;

๐Ÿ’Ÿ CDATA

์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•  ๋•Œ <,>,& ๊ธฐํ˜ธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋Š”๋ฐ ์ด๋Š” xml์—์„œ ํƒœ๊ทธ๋กœ ์ธ์‹ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ด๋ฅผ ํƒœ๊ทธ๊ฐ€ ์•„๋‹Œ ์ฟผ๋ฆฌ๋กœ ์ธ์‹ํ•˜๊ธฐ ์œ„ํ•ด <![CDATA[..์ฟผ๋ฆฌ.]]> ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

@Select("""
        <script>
        <![CDATA[
        SELECT * FROM Products
        WHERE Price < 5
        ]]>
        </script>
        """)
Object query7();
profile
๊ฐœ๋ฐœ์ž ์ค€๋น„์ƒ~

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