** ๐Ÿ“Œ 4.1๋‹จ๊ณ„: , , , ์‹ค์Šต โ€“ ์กฐ๊ฑด ์กฐํ•ฉ ๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ **

(๐Ÿ“‚ StudentMapper1.xml ํ™•์žฅ / DTO: main.Student ๊ธฐ๋ฐ˜)


๐ŸŽฏ ํ•™์Šต ๋ชฉํ‘œ

ํ•ญ๋ชฉ ์„ค๋ช…
๋ชฉ์  ์‚ฌ์šฉ์ž๊ฐ€ ์ž…๋ ฅํ•œ ์กฐ๊ฑด์— ๋”ฐ๋ผ ์œ ๋™์ ์œผ๋กœ WHERE์ ˆ์„ ๊ตฌ์„ฑ
ํ•ต์‹ฌ ํƒœ๊ทธ <if>, <choose>, <where>, <trim>
์กฐ๊ฑด ์˜ˆ์‹œ ์„ฑ(๊น€), ํ•™๋…„(1~4), ์ „ํ™”๋ฒˆํ˜ธ ํฌํ•จ ์—ฌ๋ถ€

โœ… 1. ์ „์ œ: ๊ฒ€์ƒ‰ ์กฐ๊ฑด DTO ์„ค๊ณ„

โ†’ ์ด๋ฏธ ์‚ฌ์šฉ ์ค‘์ธ main.Student๋ฅผ ๊ทธ๋Œ€๋กœ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์–ด.

Student s = new Student();
s.setIrum("๊น€");       // ์„ฑ์œผ๋กœ ์‹œ์ž‘ํ•˜๋Š” ์ด๋ฆ„
s.setGrade(1);         // 1ํ•™๋…„
s.setPhone("010");     // "010" ํฌํ•จ๋œ ์ „ํ™”๋ฒˆํ˜ธ

โœ… 2. ๋งคํผ XML ๋™์  SQL ์ •์˜ ์˜ˆ์‹œ

<select id="searchStudentDynamic" parameterType="main.Student" resultType="main.Student">
  SELECT * FROM student
  <where>
    <if test="irum != null and irum != ''">
      irum LIKE CONCAT(#{irum}, '%')
    </if>
    <if test="grade != null">
      AND grade = #{grade}
    </if>
    <if test="phone != null and phone != ''">
      AND phone LIKE CONCAT('%', #{phone}, '%')
    </if>
  </where>
</select>


โœ… 3. ํƒœ๊ทธ๋ณ„ ์„ค๋ช… ์š”์•ฝ

ํƒœ๊ทธ ์„ค๋ช… ์‚ฌ์šฉ ์œ„์น˜
<if test="์กฐ๊ฑด"> ํ•ด๋‹น ์กฐ๊ฑด์ด true์ผ ๊ฒฝ์šฐ์—๋งŒ SQL ํฌํ•จ WHERE, SET ์•ˆ
<where> ๋‚ด๋ถ€ ์กฐ๊ฑด์ด ์žˆ์„ ๋•Œ ์ž๋™์œผ๋กœ WHERE ์ถ”๊ฐ€, AND/OR ์ž๋™ ์ •๋ฆฌ SELECT, DELETE
<trim prefix="SET" suffixOverrides=","> UPDATE ๊ตฌ๋ฌธ ๋“ฑ์—์„œ ๋งˆ์ง€๋ง‰ ์‰ผํ‘œ ์ œ๊ฑฐ UPDATE
<choose>, <when>, <otherwise> if-else์ฒ˜๋Ÿผ ํ•˜๋‚˜๋งŒ ์„ ํƒ ๋™์  ์กฐ๊ฑด ๋ถ„๊ธฐ

โœ… 4. Java ํ˜ธ์ถœ ์˜ˆ์‹œ (๋™์  ์กฐ๊ฑด ๊ตฌ์„ฑ)

Student s = new Student();
s.setIrum("๊น€");          // ์„ฑ์ด '๊น€'์œผ๋กœ ์‹œ์ž‘
s.setGrade(1);            // 1ํ•™๋…„๋งŒ
// s.setPhone("010");    // ์ƒ๋žตํ•˜๋ฉด ์กฐ๊ฑด์— ํฌํ•จ๋˜์ง€ ์•Š์Œ

List<Student> result = session.selectList("student.searchStudentDynamic", s);
for (Student stu : result) {
    System.out.println(stu.getHakbun() + " / " + stu.getIrum());
}

โœ… 5. SQL ๋กœ๊ทธ ์˜ˆ์‹œ (log4j)

Preparing: SELECT * FROM student WHERE irum LIKE ? AND grade = ?
Parameters: ๊น€(String), 1(Integer)

โœ… 6. ๋™์  ์กฐ๊ฑด ์กฐ๋ฆฝ ์‹œ ์ฃผ์˜์‚ฌํ•ญ

ํ•ญ๋ชฉ ๋ฌธ์ œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•
์ฒซ ์กฐ๊ฑด์ด ์—†์œผ๋ฉด AND๊ฐ€ ์•ž์— ์˜ด ๊ตฌ๋ฌธ ์˜ค๋ฅ˜ ๋ฐœ์ƒ <where> ์‚ฌ์šฉ ์‹œ ์ž๋™ ์ •๋ฆฌ๋จ
๋งˆ์ง€๋ง‰ ์‰ผํ‘œ๊ฐ€ ๋‚จ๋Š” ๊ฒฝ์šฐ (SET) ๊ตฌ๋ฌธ ์˜ค๋ฅ˜ ๋ฐœ์ƒ <trim suffixOverrides=",">๋กœ ์ œ๊ฑฐ
์—ฌ๋Ÿฌ ์กฐ๊ฑด ์ค‘ ํ•˜๋‚˜๋งŒ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์„ ๋•Œ if ์ค‘๋ณต ์‚ฌ์šฉ <choose>๋กœ ๋‹จ์ผ ์„ ํƒ ๋ถ„๊ธฐ ์ฒ˜๋ฆฌ

โœ… ์‹ค์Šต ์ฒดํฌ๋ฆฌ์ŠคํŠธ

ํ•ญ๋ชฉ ํ™•์ธ
XML์— <where>, <if>๊ฐ€ ์ •ํ™•ํžˆ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋Š”๊ฐ€ โœ…
๋นˆ ์กฐ๊ฑด์€ WHERE์ ˆ์— ํฌํ•จ๋˜์ง€ ์•Š๋Š”๊ฐ€ โœ…
์กฐ๊ฑด๋ณ„๋กœ SELECT ์ฟผ๋ฆฌ๊ฐ€ ๋™์ ์œผ๋กœ ์กฐ๋ฆฝ๋˜๋Š”๊ฐ€ โœ…
log4j๋กœ ์‹ค์ œ ์‹คํ–‰๋œ SQL์„ ํ™•์ธํ–ˆ๋Š”๊ฐ€ โœ…

โœ… ํ™•์žฅ ์‹ค์Šต ์•„์ด๋””์–ด

๊ธฐ๋Šฅ ๋ฐฉ๋ฒ•
ํ•™๋…„ ๋˜๋Š” ์ฃผ์†Œ๋กœ ์กฐ๊ฑด ๊ฒ€์ƒ‰ <if> ์ถ”๊ฐ€
์„ฑ๋ณ„(์ฃผ๋ฏผ๋ฒˆํ˜ธ 8๋ฒˆ์งธ ์ž๋ฆฌ) ์„ ํƒ ๋ถ„๊ธฐ <choose> ์‚ฌ์šฉ
์ „ํ™”๋ฒˆํ˜ธ ๋์ž๋ฆฌ๊ฐ€ ํŠน์ • ๋ฒˆํ˜ธ LIKE CONCAT('%', #{phoneTail})

โœ… 4.2๋‹จ๊ณ„: ์‚ฌ์šฉ โ€“ ๋‹ค์ค‘ ํ•™๋ฒˆ ์กฐํšŒ ์‹ค์Šต

(๐Ÿ“‚ StudentMapper1.xml ํ™•์žฅ)


๐ŸŽฏ ํ•™์Šต ๋ชฉํ‘œ

ํ•ญ๋ชฉ ์„ค๋ช…
๋ชฉ์  ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํ•™๋ฒˆ์„ ํ•œ ๋ฒˆ์— ์กฐํšŒ (IN ์กฐ๊ฑด)
ํ•ต์‹ฌ ํƒœ๊ทธ <foreach>
์‹ค์Šต ๋Œ€์ƒ List<Integer>, int[], List<Student> ๋“ฑ ์ „๋‹ฌ๋ฐ›์€ ๋ฆฌ์ŠคํŠธ ์ฒ˜๋ฆฌ

โœ… 1. ๋งคํผ XML ์˜ˆ์‹œ: ๋‹ค์ค‘ ํ•™๋ฒˆ ์กฐํšŒ (IN ์กฐ๊ฑด)

<!-- โœ… id: Java ์ฝ”๋“œ์—์„œ ์ด SQL์„ ํ˜ธ์ถœํ•  ๋•Œ ์‚ฌ์šฉํ•  ์ด๋ฆ„ -->
<!-- โœ… parameterType="list": Java์—์„œ List<Integer> ํ˜•ํƒœ๋กœ ๊ฐ’์„ ์ „๋‹ฌ๋ฐ›์Œ -->
<!-- โœ… resultType="main.Student": ๊ฒฐ๊ณผ๋Š” Student ๊ฐ์ฒด๋กœ ์ž๋™ ๋งคํ•‘๋จ -->
<select id="getStudentsByHakbunList" parameterType="list" resultType="main.Student">
  
  <!-- โœ… ์ „์ฒด SQL์˜ ์‹œ์ž‘ -->
  SELECT * FROM student
  WHERE hakbun IN

  <!-- โœ… <foreach>: List ์•ˆ์˜ ๊ฐ’๋“ค์„ ํ•˜๋‚˜์”ฉ ๊บผ๋‚ด์„œ ๋ฐ˜๋ณต ์ถœ๋ ฅํ•ด์ฃผ๋Š” ํƒœ๊ทธ -->
  <!-- โœ… item="id": ๋ฐ˜๋ณต๋ฌธ์—์„œ ์‚ฌ์šฉํ•  ๋ณ€์ˆ˜๋ช… (list์—์„œ ๊บผ๋‚ธ ๊ฐ ์›์†Œ๋ฅผ id๋ผ๊ณ  ๋ถ€๋ฆ„) -->
  <!-- โœ… collection="list": Java์—์„œ ๋„˜๊ฒจ์ค€ List์˜ ์ด๋ฆ„ (๋ณดํ†ต ๊ทธ๋ƒฅ list๋กœ ์”€) -->
  <!-- โœ… open="(" / close=")": ๋ฐ˜๋ณต๋ฌธ์œผ๋กœ ๋งŒ๋“ค์–ด์ง„ ๊ฒฐ๊ณผ ์•ž๋’ค์— ๊ด„ํ˜ธ ๋ถ™์ž„ -->
  <!-- โœ… separator=",": ์š”์†Œ ์‚ฌ์ด๋งˆ๋‹ค ,(์‰ผํ‘œ)๋ฅผ ์ž๋™์œผ๋กœ ๋ถ™์—ฌ์คŒ -->
  <!-- โœ… ๊ฒฐ๊ณผ์ ์œผ๋กœ (101, 102, 103) ๊ฐ™์€ SQL ์กฐ๊ฑด์ด ์™„์„ฑ๋จ -->
  <foreach item="id" collection="list" open="(" separator="," close=")">
    #{id}
    <!-- โœ… #{id}๋Š” ํ•˜๋‚˜์”ฉ ๊บผ๋‚ธ ๊ฐ’์„ ์‹ค์ œ SQL์— ๋ฐ”์ธ๋”ฉํ•จ (PreparedStatement๋กœ ์ฒ˜๋ฆฌ๋จ) -->
  </foreach>

</select>

์†์„ฑ ์„ค๋ช…
collection="list" Java์—์„œ ์ „๋‹ฌ๋ฐ›๋Š” ๋ฆฌ์ŠคํŠธ (List ๋˜๋Š” ๋ฐฐ์—ด)
item="id" ๋ฃจํ”„ ๋‚ด์—์„œ ์‚ฌ์šฉ๋  ๋ณ€์ˆ˜๋ช…
open="(", close=")" IN ์ ˆ ๊ด„ํ˜ธ ์ฒ˜๋ฆฌ
separator="," ํ•ญ๋ชฉ ๊ตฌ๋ถ„์ž (์‰ผํ‘œ)

โœ… 2. Java ํ˜ธ์ถœ ์ฝ”๋“œ ์˜ˆ์‹œ

java
๋ณต์‚ฌํŽธ์ง‘
List<Integer> hakbunList = Arrays.asList(1001, 1002, 1003);
List<Student> list = session.selectList("student.getStudentsByHakbunList", hakbunList);

for (Student s : list) {
    System.out.println(s.getHakbun() + " / " + s.getIrum());
}


โœ… 3. ๋กœ๊ทธ ์ถœ๋ ฅ ์˜ˆ์‹œ (log4j ์„ค์ • ์‹œ)

sql
๋ณต์‚ฌํŽธ์ง‘
Preparing: SELECT * FROM student WHERE hakbun IN (?, ?, ?)
Parameters: 1001(Integer), 1002(Integer), 1003(Integer)


โœ… 4. ๋‹ค๋ฅธ collection ์œ ํ˜• ์ง€์›

Java ์ „๋‹ฌ๊ฐ’ parameterType collection ๊ฐ’
List<Integer> list collection="list"
int[] array collection="array"
Map<String, List<Integer>> map collection="mapKey"

โœ… 5. ์‹ค์Šต ์ฒดํฌ๋ฆฌ์ŠคํŠธ

ํ•ญ๋ชฉ ์„ค๋ช… ย 
XML์— <foreach> ๋ฌธ๋ฒ•์ด ์ •ํ™•ํžˆ ์ž‘์„ฑ๋˜์—ˆ๋Š”๊ฐ€ โœ… ย 
๊ด„ํ˜ธ ๋ฐ ์‰ผํ‘œ ์ฒ˜๋ฆฌ (open/close/separator)๊ฐ€ ์ •ํ™•ํ•œ๊ฐ€ โœ… ย 
์ „๋‹ฌํ•œ ๋ฆฌ์ŠคํŠธ๊ฐ€ ์ž˜ ๋งคํ•‘๋˜๋Š”๊ฐ€ (#{id}) โœ… ย 
๋กœ๊ทธ์—์„œ IN (?, ?, ?) ํ˜•์‹์œผ๋กœ ์ถœ๋ ฅ๋˜๋Š”๊ฐ€ โœ… ย 

โœ… ํ™•์žฅ ์‹ค์Šต ์•„์ด๋””์–ด

๊ธฐ๋Šฅ ์„ค๋ช…
๋‹ค์ค‘ ํ•™๋ฒˆ ์‚ญ์ œ DELETE FROM student WHERE hakbun IN <foreach> ...
๋‹ค์ค‘ ์ด๋ฆ„ ๊ฒ€์ƒ‰ WHERE irum IN <foreach>
์—ฌ๋Ÿฌ ์กฐ๊ฑด์„ <foreach>๋กœ ์กฐํ•ฉ grade IN (...) + hakgwa IN (...)

๐Ÿง  ์‹ค๋ฌด ํŒ

โœ… 4.3๋‹จ๊ณ„: ๋™์  INSERT โ€“ null/๋นˆ๊ฐ’ ์ œ์™ธํ•˜๊ณ  INSERT ์ฒ˜๋ฆฌ

(๐Ÿ“‚ StudentMapper1.xml ํ™•์žฅ / DTO: main.Student ๊ธฐ์ค€)


๐ŸŽฏ ํ•™์Šต ๋ชฉํ‘œ

ํ•ญ๋ชฉ ์„ค๋ช…
๋ชฉ์  ๊ฐ’์ด ์žˆ๋Š” ํ•„๋“œ๋งŒ INSERT ๋˜๋„๋ก ์œ ์—ฐํ•œ SQL ์ƒ์„ฑ
ํ•ต์‹ฌ ํƒœ๊ทธ <trim>, <if>
์‚ฌ์šฉ ์ƒํ™ฉ INSERT ์‹œ null ํ•„๋“œ๋Š” ์ œ์™ธํ•˜๊ณ  INSERT ์ˆ˜ํ–‰ํ•˜๊ณ  ์‹ถ์„ ๋•Œ

โœ… 1. ๋งคํผ XML โ€“ ๋™์  INSERT ์˜ˆ์‹œ


<insert id="insertStudentDynamic" parameterType="main.Student">
  INSERT INTO student
  <trim prefix="(" suffix=")" suffixOverrides=",">
    <if test="hakbun != null">hakbun,</if>
    <if test="irum != null and irum != ''">irum,</if>
    <if test="hakgwa != null">hakgwa,</if>
    <if test="addr != null">addr,</if>
    <if test="phone != null">phone,</if>
    <if test="jumin != null">jumin,</if>
    <if test="grade != null">grade,</if>
  </trim>
  VALUES
  <trim prefix="(" suffix=")" suffixOverrides=",">
    <if test="hakbun != null">#{hakbun},</if>
    <if test="irum != null and irum != ''">#{irum},</if>
    <if test="hakgwa != null">#{hakgwa},</if>
    <if test="addr != null">#{addr},</if>
    <if test="phone != null">#{phone},</if>
    <if test="jumin != null">#{jumin},</if>
    <if test="grade != null">#{grade},</if>
  </trim>
</insert>

โœ… 2. Java ํ˜ธ์ถœ ์ฝ”๋“œ ์˜ˆ์‹œ

Student s = new Student();
s.setHakbun(2027);
s.setIrum("๋ฐ•์ˆ˜๋นˆ");
s.setHakgwa("AIํ•™๊ณผ");
// ์ฃผ์†Œ์™€ ์ฃผ๋ฏผ๋ฒˆํ˜ธ๋Š” ์ž…๋ ฅํ•˜์ง€ ์•Š์Œ (null)

int result = session.insert("student.insertStudentDynamic", s);
session.commit();

System.out.println("์ž…๋ ฅ ๊ฒฐ๊ณผ: " + result);

โœ… ์œ„ ์ฝ”๋“œ ์‹คํ–‰ ์‹œ, addr, jumin์€ INSERT ๊ตฌ๋ฌธ์—์„œ ์ž๋™์œผ๋กœ ์ œ์™ธ๋จ

โœ… log4j๋ฅผ ํ†ตํ•ด SQL ๋กœ๊ทธ์—์„œ ๋™์ ์œผ๋กœ ๊ตฌ์„ฑ๋œ INSERT ๋ฌธ ํ™•์ธ ๊ฐ€๋Šฅ


โœ… 3. ๋กœ๊ทธ ์ถœ๋ ฅ ์˜ˆ์‹œ (log4j ์„ค์ • ์‹œ)

==> Preparing: INSERT INTO student (hakbun, irum, hakgwa) VALUES (?, ?, ?)
==> Parameters: 2027(Integer), ๋ฐ•์ˆ˜๋นˆ(String), AIํ•™๊ณผ(String)

โœ… 4. ํƒœ๊ทธ๋ณ„ ๊ธฐ๋Šฅ ์„ค๋ช… ์š”์•ฝ

ํƒœ๊ทธ ์„ค๋ช…
<if test="..."> ์กฐ๊ฑด์„ ๋งŒ์กฑํ•  ๋•Œ๋งŒ ํ•ด๋‹น SQL ์กฐ๊ฐ ์‚ฝ์ž…
<trim> ์‰ผํ‘œ(,) ์ œ๊ฑฐ ์ฒ˜๋ฆฌ: suffixOverrides=","
prefix/suffix (, ) ๋“ฑ์œผ๋กœ ์ฟผ๋ฆฌ ๊ด„ํ˜ธ ๊ฐ์‹ธ๊ธฐ

โœ… 5. ์‹ค์Šต ์ฒดํฌ๋ฆฌ์ŠคํŠธ

ํ•ญ๋ชฉ ์„ค๋ช… ํ™•์ธ
null/๋นˆ๊ฐ’ ํ•„๋“œ๊ฐ€ ์ž๋™์œผ๋กœ ์ œ์™ธ๋˜๋Š”๊ฐ€ โœ… ย 
SQL ๊ตฌ๋ฌธ์ด ์œ ํšจํ•œ ํ˜•ํƒœ๋กœ ์กฐ๋ฆฝ๋˜๋Š”๊ฐ€ โœ… ย 
๋งˆ์ง€๋ง‰ ์‰ผํ‘œ๊ฐ€ ์ž๋™์œผ๋กœ ์ œ๊ฑฐ๋˜๋Š”๊ฐ€ โœ… ย 
log4j๋กœ ์‹ค์ œ SQL ์กฐํ•ฉ ํ™•์ธํ–ˆ๋Š”๊ฐ€ โœ… ย 
๋ˆ„๋ฝ๋œ ํ•„๋“œ๋Š” DB์— null๋กœ ์ €์žฅ๋˜๋Š”๊ฐ€ (๊ธฐ๋ณธ๊ฐ’ ์—†์Œ ์‹œ) โœ… ย 

โœ… ํ™•์žฅ ์‹ค์Šต ์•„์ด๋””์–ด

๊ธฐ๋Šฅ ์„ค๋ช…
ํ•„์ˆ˜๊ฐ’๋งŒ ๋™์  INSERT + ์„ ํƒ ํ•„๋“œ๋งŒ if ์ฒ˜๋ฆฌ hakbun, irum์€ ํ•„์ˆ˜, ๋‚˜๋จธ์ง€๋Š” optional
์œ ํšจ์„ฑ ๊ฒ€์‚ฌ ์ถ”๊ฐ€ null์ด๊ฑฐ๋‚˜ ๊ณต๋ฐฑ์ผ ๊ฒฝ์šฐ insert ์ œ์™ธ
๋™์  INSERT + ์ž๋™ ํ‚ค ๋ฐ˜ํ™˜ (4.4๋‹จ๊ณ„) useGeneratedKeys="true" ์ ์šฉ ๊ฐ€๋Šฅ

๐Ÿง  ์‹ค๋ฌด ํŒ

โœ… 4.4๋‹จ๊ณ„: SQL ์žฌ์‚ฌ์šฉ โ€“ + ์‹ค์Šต

(๐Ÿ“‚ StudentMapper1.xml ๊ธฐ์ค€ / DTO: main.Student)


๐ŸŽฏ ํ•™์Šต ๋ชฉํ‘œ

ํ•ญ๋ชฉ ์„ค๋ช…
๋ชฉ์  ๋ฐ˜๋ณต๋˜๋Š” SELECT ์ปฌ๋Ÿผ, WHERE ์กฐ๊ฑด์„ ํ•œ ๊ณณ์— ์ •์˜ํ•˜๊ณ  ์žฌ์‚ฌ์šฉ
์ฃผ์š” ํƒœ๊ทธ <sql>, <include>
๊ธฐ๋Œ€ ํšจ๊ณผ ์ฝ”๋“œ ์ค‘๋ณต ์ œ๊ฑฐ, ์œ ์ง€๋ณด์ˆ˜ ํŽธ์˜์„ฑ ํ–ฅ์ƒ

โœ… 1. ๊ณตํ†ต SELECT ์ปฌ๋Ÿผ ์ •์˜ (๊ธฐ๋ณธ ํ•„๋“œ์…‹)

๐Ÿ”ง StudentMapper1.xml ์ƒ๋‹จ์— ์ถ”๊ฐ€:

<sql id="studentBaseColumns">
  hakbun, irum, hakgwa, addr, phone, jumin, grade
</sql>

โœ… ์ด ์ปฌ๋Ÿผ์…‹์€ SELECT๋ฌธ์—์„œ ๋ฐ˜๋ณตํ•ด์„œ ์“ฐ๋Š” ๋ถ€๋ถ„์„ ์žฌ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•จ์ด์•ผ.


โœ… 2. ๊ณตํ†ต WHERE ์กฐ๊ฑด ์ •์˜ (๋™์  ์กฐ๊ฑด ์กฐ๋ฆฝ)

<sql id="dynamicStudentWhere">
  <where>
    <if test="irum != null and irum != ''">
      irum LIKE CONCAT(#{irum}, '%')
    </if>
    <if test="grade != null">
      AND grade = #{grade}
    </if>
    <if test="phone != null and phone != ''">
      AND phone LIKE CONCAT('%', #{phone}, '%')
    </if>
  </where>
</sql>

โœ… ๊ณตํ†ต ๊ฒ€์ƒ‰ ์กฐ๊ฑด์„ ์ •์˜ํ•˜์—ฌ ์—ฌ๋Ÿฌ SELECT ๋ฌธ์—์„œ ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•ด.


โœ… 3. ์‹ค์ œ SELECT ๋ฌธ์—์„œ <include>๋กœ ์žฌ์‚ฌ์šฉํ•˜๊ธฐ

<select id="searchStudentReusable" parameterType="main.Student" resultType="main.Student">
  SELECT
    <include refid="studentBaseColumns"/>
  FROM student
  <include refid="dynamicStudentWhere"/>
</select>

โœ… 4. Java ํ˜ธ์ถœ ์ฝ”๋“œ ์˜ˆ์‹œ

Student s = new Student();
s.setIrum("๊น€");       // '๊น€'์œผ๋กœ ์‹œ์ž‘ํ•˜๋Š” ์ด๋ฆ„
s.setGrade(2);         // 2ํ•™๋…„๋งŒ

List<Student> list = session.selectList("student.searchStudentReusable", s);
for (Student stu : list) {
    System.out.println(stu.getHakbun() + " / " + stu.getIrum());
}

โœ… 5. SQL ๋กœ๊ทธ ์˜ˆ์‹œ (log4j ์ถœ๋ ฅ)

==> Preparing: SELECT hakbun, irum, hakgwa, addr, phone, jumin, grade FROM student WHERE irum LIKE ? AND grade = ?
==> Parameters: ๊น€(String), 2(Integer)

โœ… 6. ์‹ค์Šต ์ฒดํฌ๋ฆฌ์ŠคํŠธ

ํ•ญ๋ชฉ ์„ค๋ช… ์ฒดํฌ
<sql id="...">๋กœ ๊ณตํ†ต ๋ธ”๋ก์„ ์ •์˜ํ–ˆ๋Š”๊ฐ€ โœ… ย 
<include refid="..."/>๋กœ ๋ถˆ๋Ÿฌ์˜ค๊ณ  ์žˆ๋Š”๊ฐ€ โœ… ย 
์ปฌ๋Ÿผ ๋ฆฌ์ŠคํŠธ ๋ฐ ์กฐ๊ฑด์ด ๋ฐ˜๋ณต๋˜์ง€ ์•Š๊ณ  ํ•œ ๊ณณ์— ๊ด€๋ฆฌ๋˜๋Š”๊ฐ€ โœ… ย 
log4j ์ถœ๋ ฅ์œผ๋กœ SQL ๊ฒฐ๊ณผ๋ฅผ ํ™•์ธํ–ˆ๋Š”๊ฐ€ โœ… ย 

โœ… ์‹ค๋ฌด ํŒ

ํ•ญ๋ชฉ ํŒ
์ปฌ๋Ÿผ์ด ๋งŽ๊ณ  ์—ฌ๋Ÿฌ ๋งคํผ์— ๊ณตํ†ต์ด๋ฉด BaseColumns๋ฅผ ๋ณ„๋„์˜ xml๋กœ ๋ถ„๋ฆฌ ๊ฐ€๋Šฅ (๊ณ ๊ธ‰)
์—ฌ๋Ÿฌ ๊ฒ€์ƒ‰ ์กฐ๊ฑด์ด ์œ ์‚ฌํ•œ ๊ฒฝ์šฐ ๊ณตํ†ต WHERE์ ˆ์„ <sql>๋กœ ๊ด€๋ฆฌํ•ด๋‘๋ฉด ๋งค์šฐ ํŽธ๋ฆฌ
<sql> ์•ˆ์—์„œ๋Š” ๋‹ค๋ฅธ <sql> ์ค‘์ฒฉ ๋ถˆ๊ฐ€ ์กฐ๋ฆฝ์€ <include>๋กœ๋งŒ ๊ฐ€๋Šฅ

โœ… ์˜ˆ์‹œ ๊ตฌ์กฐ ์ •๋ฆฌ (์š”์•ฝ์šฉ)

<sql id="studentBaseColumns">
  hakbun, irum, hakgwa, addr, phone, jumin, grade
</sql>

<sql id="dynamicStudentWhere">
  <where>
    <if test="...">...</if>
  </where>
</sql>

<select id="searchStudentReusable" ...>
  SELECT <include refid="studentBaseColumns"/>
  FROM student
  <include refid="dynamicStudentWhere"/>
</select>