본문 바로가기
교재 실습/자바 웹 개발 워크북

114. 동적 SQL의 사용 (1)

by Jint 2022. 9. 18.

이번 절에서는 SQL문을 동적으로 구성하는 방법에 대해 알아본다. SQL을 실행하다 보면 상황에 따라 SQL문을 변경해야 할 경우가 있다. 예제의 프로젝트 목록을 보면 프로젝트 목록을 출력할 때 프로젝트 번호의 내림차순(descending order)으로 정렬한다.

<select id="selectList" resultMap="projectResultMap">
    SELECT PNO, PNAME, STA_DATE, END_DATE, STATE
    FROM PROJECTS
    ORDER BY PNO DESC
</select>

만약 프로젝트 제목이나 시작일, 종료일, 상태에 대해서도 정렬하려면 다음과 같이 여러 개의 SQL문을 준비해야 한다.

<select id="selectList" resultMap="projectResultMap">
    SELECT PNO, PNAME, STA_DATE, END_DATE, STATE
    FROM PROJECTS
    ORDER BY PNAME ASC
</select>

<select id="selectList" resultMap="projectResultMap">
    SELECT PNO, PNAME, STA_DATE, END_DATE, STATE
    FROM PROJECTS
    ORDER BY STA_DATE ASC
</select>

<select id="selectList" resultMap="projectResultMap">
    SELECT PNO, PNAME, STA_DATE, END_DATE, STATE
    FROM PROJECTS
    ORDER BY END_DATE ASC
</select>

<select id="selectList" resultMap="projectResultMap">
    SELECT PNO, PNAME, STA_DATE, END_DATE, STATE
    FROM PROJECTS
    ORDER BY STATE ASC
</select>

오름차순(ascending order)뿐만 아니라 내림차순까지 고려하면 프로젝트 목록에 대한 SQL문은 더 많아질 것이다. 이런 경우 mybatis에서 제공하는 '동적 SQL(dynamic SQL)' 기능을 이용하면 하나의 SQL문으로 여러 상황에 대처할 수 있다.

 

1. 동적 SQL 엘리먼트

mybatis는 동적 SQL을 위한 엘리먼트를 제공한다. 이 엘리먼트들은 JSTL 코어 라이브러리에 정의된 태그들과 비슷하므로 JSTL을 알고 있는 개발자라면 손쉽게 사용할 수 있다. 다음은 mybatis에서 동적 SQL을 만들 때 사용할 수 있는 태그들을 정리한 표이다.

엘리먼트 예 설명
<if test="조건">SQL문</if> <if> 태그는 어떤 값의 상태를 검사하여 참일 경우에만 SQL문을 포함하고 싶을 때 사용한다. test 속성에 지정된 조건이 참이면 <if> 태그의 내용을 반환한다.
<choose>
    <when test="조건1">SQL문</when>
    <when test="조건2">SQL문</when>
    <otherwise>SQL문</otherwise>
</choose>
<choose> 태그는 검사할 조건이 여러 개일 경우에 사용한다. test 속성에 지정된 조건이 참이면 <when> 태그의 내용을 반환한다. 일치하는 조건이 없으면 <otherwise> 태그의 내용을 반환한다.
<where>
    <if test="조건1">SQL문</if>
    <if test="조건2">SQL문</if>
</where>
<where> 태그는 WHERE절을 반환한다. <where> 태그 안의 하위 태그를 실행하고 나서 반환값이 있으면 WHERE 절을 만들어 반환하고, 없으면 WHERE 절을 반환하지 않는다.
<trim prefix="단어" prefixOverrides="문자열|문자열">
    <if test="조건1">SQL문</if>
    <if test="조건2">SQL문</if>
</trim>
<trim> 태그는 특정 단어로 시작하는 SQL문을 반환하고 싶을 때 사용한다. prefix는 반환값 앞에 붙일 접두어를 지정한다. prefixOverrides는 반환할 값에서 제거해야 하는 접두어를 지정한다.
다시 말하면 <trim> 태그의 반환값이 있다면, 그 값의 앞 부분이 prefixOverride에 지정된 문자열과 일치할 경우 그 문자열을 제거한다. 그리고 그 값의 앞부분에 prefix로 지정한 접두어를 붙여 반환한다.
<set>
    <if test="조건1">SQL문</if>
    <if test="조건2">SQL문</if>
</set>
<set> 태그는 UPDATE문의 SET절을 만들 때 사용한다. 조건이 참인 <if> 태그의 내용은 SET절에 포함된다. SET절의 항목이 여러 개일 경우 자동으로 콤마(,)를 붙인다.
<foreach item="항목" index="인덱스" collection="목록" open="시작문자열" close="종료문자열" separator="구분자">
</foreach>
<foreach> 태그는 목록의 값을 가지고 SQL문을 만들 때 사용한다. 특히 IN(값, 값, ...) 조건을 만들 때 좋다.
item 속성에는 항목을 가리킬 때 사용할 변수의 이름을 지정한다.
index 속성에는 항목의 인덱스 값을 꺼낼 때 사용할 변수 이름을 지정한다.
collection 속성에는 java.util.List 인터페이스 구현체나 배열 객체가 온다.
open 속성에는 최종 반환값의 접두어를 지정한다.
close 속성에는 최종 반환값의 접미어를 지정한다.
separator 속성은 반복으로 생성하는 값을 구분하기 위해 붙이는 문자열을 지정한다.
<bind name="변수명" value="값"/> <bind> 태그는 변수를 생성할 때 사용한다.

앞에 있는 표의 태그들을 보면 역시 이전에 56. JSTL 사용하기 (1), 57. JSTL 사용하기 (2), 58. JSTL 사용하기(3), 59. JSTL 사용하기(4), 60. JSTL 사용하기(5), 61. JSTL 사용하기(6)에서 배운 JSTL 태그와 비슷함을 알 수 있다.

 

참고도서 : https://freelec.co.kr/book/1674/

 

[열혈강의] 자바 웹 개발 워크북

[열혈강의] 자바 웹 개발 워크북

freelec.co.kr

'교재 실습 > 자바 웹 개발 워크북' 카테고리의 다른 글

116. 동적 SQL의 사용 (3)  (2) 2022.09.20
115. 동적 SQL의 사용 (2)  (1) 2022.09.19
113. 로그 출력 켜기 (2)  (0) 2022.09.14
112. 로그 출력 켜기 (1)  (2) 2022.09.13
111. mybatis 설정 파일 (3)  (1) 2022.09.09

댓글