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

115. 동적 SQL의 사용 (2)

by Jint 2022. 9. 19.

# <choose> 엘리먼트의 활용

프로젝트 목록을 정렬하기 위해 <choose> 태그를 사용하여 동적 SQL을 구성해 본다. 현재 프로젝트 목록을 출력하는 SELECT문은 다음과 같다.

SELECT PNO, PNAME, STA_DATE, END_DATE, STATE
FROM PROJECTS
ORDER BY PNO DESC

ORDER BY절을 보면 프로젝트 번호에 대해 내림차순으로 정렬하고 있다. 이것을 프로젝트 제목으로 정렬하려면 ORDER BY절을 바꿔야 한다. 다음은 프로젝트 목록의 정렬 조건을 정리한 표이다.

정렬 조건 'orderCond' 매개변수 값 ORDER BY절
프로젝트 제목 오름차순 'TITLE_ASC' ORDER BY PNAME ASC
프로젝트 제목 내림차순 'TITLE_DESC' ORDER BY PNAME DESC
시작일 오름차순 'STARTDATE_ASC' ORDER BY STA_DATE ASC
시작일 내림차순 'STARTDATE_DESC' ORDER BY STA_DATE DESC
종료일 오름차순 'ENDDATE_ASC' ORDER BY END_DATE ASC
종료일 내림차순 'ENDDATE_DESC' ORDER BY END_DATE DESC
상태(준비 → 종료) 'STATE_ASC' ORDER BY STATE ASC
상태(종료 → 준비) 'STATE_DESC' ORDER BY STATE DESC

'orderCond'는 mybatis에서 넘기는 매개변수이다. 매개변수의 값에 따라 ORDER BY절이 달라질 것이다. 이제 표에 나와있는 내용대로 SQL 맵퍼 파일에 적용해본다.

spms.dao 패키지의 MySqlProjectDao.xml 파일을 열고 다음과 같이 프로젝트 목록을 가져오는 SQL문을 편집한다.

<select id="selectList" resultMap="projectResultMap" parameterType="map">
    SELECT PNO, PNAME, STA_DATE, END_DATE, STATE
    FROM PROJECTS
    ORDER BY
    <choose> 
        <when test="orderCond == 'TITLE_ASC'">PNAME ASC</when>
        <when test="orderCond == 'TITLE_DESC'">PNAME DESC</when>
        <when test="orderCond == 'STARTDATE_ASC'">STA_DATE ASC</when>
        <when test="orderCond == 'STARTDATE_DESC'">STA_DATE DESC</when>
        <when test="orderCond == 'ENDDATE_ASC'">END_DATE ASC</when>
        <when test="orderCond == 'ENDDATE_DESC'">END_DATE DESC</when>
        <when test="orderCond == 'STATE_ASC'">STATE ASC</when>
        <when test="orderCond == 'STATE_DESC'">STATE DESC</when>
        <when test="orderCond == 'PNO_ASC'">PNO ASC</when>
        <otherwise>PNO DESC</otherwise>
    </choose>
</select>

매개변수를 받기 위해 <select> 태그에 parameterType 속성을 추가했다. orderCond의 값은 매개변수 객체 "map"에 들어 있다.

<select id="selectList" resultMap="projectResultMap" parameterType="map">

 

- ORDER BY절에 <choose> 적용

매개변수 객체가 들어있는 orderCond 값을 검사하는 <choose> 태그를 추가했다. <when> 태그의 조건과 일치하는 경우 <when> 태그에 정의된 SQL 조각을 반환한다.

<choose> 
    <when test="orderCond == 'TITLE_ASC'">PNAME ASC</when>
    <when test="orderCond == 'TITLE_DESC'">PNAME DESC</when>
    <when test="orderCond == 'STARTDATE_ASC'">STA_DATE ASC</when>
    <when test="orderCond == 'STARTDATE_DESC'">STA_DATE DESC</when>
    <when test="orderCond == 'ENDDATE_ASC'">END_DATE ASC</when>
    <when test="orderCond == 'ENDDATE_DESC'">END_DATE DESC</when>
    <when test="orderCond == 'STATE_ASC'">STATE ASC</when>
    <when test="orderCond == 'STATE_DESC'">STATE DESC</when>
    <when test="orderCond == 'PNO_ASC'">PNO ASC</when>
    <otherwise>PNO DESC</otherwise>
</choose>

 

- test 속성

test 속성에는 조건을 검사하는 OGNL 기반 표현식이 온다. 표현식의 결과가 참인지 거짓인지 검사하여 참일 경우 <when> 태그의 내용을 반환한다.

※ OGNL

OGNL(Open-Graph Navigation Language)은 자바 객체의 프로퍼티 값을 좀 더 쉽게 꺼내고 할당하기 쉽도록 만든 표현식 언어이다.

OGNL은 Luke Blanshard와 Drew Davidson가 만들었다. 2011년까지 OpenSymphony에서 개발 및 유지보수를 하였고, 현재는 아파치 소프트웨어 재단에 이관되어 Apache Commons의 일부 모듈로 관리되고 있다. [출처 위키피디아]

 

- <otherwise> 엘리먼트

<otherwise> 태그는 일치하는 조건이 없을 경우 수행된다. 기본으로 프로젝트 번호에 대해 내림차순으로 정렬하게 했다. 즉 최근에 등록된 순서로 정렬한다.

<otherwise>PNO DESC</otherwise>

 

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

 

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

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

freelec.co.kr

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

117. 동적 SQL의 사용 (4)  (0) 2022.09.21
116. 동적 SQL의 사용 (3)  (2) 2022.09.20
114. 동적 SQL의 사용 (1)  (0) 2022.09.18
113. 로그 출력 켜기 (2)  (0) 2022.09.14
112. 로그 출력 켜기 (1)  (2) 2022.09.13

댓글