본문 바로가기
Computer Science/Database

MySQL/MyBatis | 동적 쿼리(Dynamic Query) 사용하기

by YIAN 2021. 10. 2.

🍰 요구사항 (Requirements)

A라는 서비스에 해당하는 테이블들을 조인하여 조회하는 기능에 사용 중입니다. 추후 공통화를 위해 B, C 서비스도 추가될 예정입니다. A, B, C 서비스 모두 하나의 쿼리에서 작업할 수 있도록 공통화 작업을 해야 합니다.

 

테이블은 필수로 사용되는 all_hist, 각 서비스에 해당하는 a_request, a_response, b_request, b_response, c_request, c_response가 있다고 가정합니다.

 

🏰 해결방법 (Solution or Next step)

DTO에 flag가 되는 변수가 있다면 SQL문 FROM 절에 해당 변수를 체크하는 조건을 추가해주면 됩니다. ReqDTO에 flag 역할을 하는 type이라는 변수가 있다고 가정합니다. 아래와 같이 FROM절에 '<choose>', '<when>' 을 사용하면 됩니다.

 

SELECT *
FROM all_hist ah
<choose>
    <when test="type != null and type == 'A_REQUEST'">
        , a_request areq, a_response ares
    </when>
</choose>

 

수정 전과 후의 코드로 비교해서 작성해보겠습니다.

 

수정 전

<select id="selectList" parameterType="ReqDTO" resultType="ResDTO">
    SELECT ah.id AS id,
        areq.name AS name,
        ares.ymdt AS ymdt
    FROM all_hist ah, a_request areq, a_response ares
    WHERE ah.id = areq.id
    AND areq.id = ares.id
    AND ah = #{id}
    AND ah.type = #{type}
    ORDER BY id DESC
</select>

 

수정 후 (A 추가)

<select id="selectList" parameterType="ReqDTO" resultType="ResDTO">
    SELECT ah.id AS id,
        areq.name AS name,
        ares.ymdt AS ymdt
    FROM all_hist ah
    <choose>
        <when test="type != null and type == 'A_REQUEST'">
            , a_request areq, a_response ares
        </when>
    </choose>
    WHERE ah.id = areq.id
    AND areq.id = ares.id
    AND ah = #{id}
    AND ah.type = #{type}
    ORDER BY id DESC
</select>

 

만약, B, C도 추가가 된다면 아래와 같이 코드가 될 것입니다.

 

수정 후 (B, C 추가)

SELECT * 
FROM all_hist ah
<choose>
    <when test="type != null and type == 'A_REQUEST'">
    	, a_request areq, a_response ares
    </when>
    <when test="type != null and type == 'B_REQUEST'">
    	, b_request areq, b_response ares
    </when>
    <when test="type != null and type == 'B_REQUEST'">
    	, c_request areq, c_response ares
    </when>
</choose>

 

🌊 회고 (Retrospective)

WHERE 절에 Dynamic Query를 사용하는 것은 자주 봐왔지만, FROM 절에 쓰는 것은 거의 보지 못한 터라 많이 헤맸습니다. 같이 일하는 동료분께 설명을 듣고 나서야 이해했습니다. Dynamic Query라는 키워드에 대해 많이 생소하고 잘 사용해보지 않았기에 몰랐습니다. 처음에는 A, B, C에 해당하는 DAO를 3번 작성해야 하는 게 맞는지 고민했는데 새롭게 알게 되었습니다. Dynamic Query에 대해서는 추후 다시 정리해보겠습니다.

 

🍊 참고자료 (References)

댓글