1. XML 에서 IF 문의 활용과 NULL값 처리
나는 사내 프로젝트를 진행하며 네이버 지도를 구현했다.
프로젝트는 두개의 TABLE을 활용했는데 하나는 Naver Map의 지도 정보를 담고있는 TABLE과 또 하나는 Naver Map의 누적 조회수를 담고 있는 테이블이었다.
프로젝트에서는 Naver에서 제공하는 API인 GeoCode와 Naver Map API를 사용해야 했는데 두가지 모두 300만회를 조회하면 유료 결제를 해야하기 때문에 그동안 몇회를 조회했는지 확인 할 수 있는 테이블을 만들어야 했다.
그 중에서도 네이버 지도 월간 조회수를 검색하는 쿼리에 대해서 트러블 슈팅한 것을 이야기해보려고 한다.
<!--네이버 지도 월간 조회 / 조회 결과 갯수 -->
<select id="selectNaverMapCount" parameterType="hashMap" resultType="Integer">
SELECT COUNT(CNT)
FROM TB_N_API_CNT_HIST
WHERE CURRENT_AT
<if test='start_date != "" and end_date == ""'>
<![CDATA[
>= #{start_date, jdbcType=VARCHAR}
]]>
</if>
<if test='end_date != "" and start_date == ""'>
<![CDATA[
<= #{end_date, jdbcType=VARCHAR}
]]>
</if>
<if test='start_date != "" and end_date != ""'>
<![CDATA[
BETWEEN #{start_date, jdbcType=VARCHAR} AND #{end_date, jdbcType=VARCHAR}
]]>
</if>
ORDER BY CURRENT_AT DESC;
</select>
최종적으로 만들어진 SQL은 다음과 같다.
이 SQL문은 다음 세가지의 조건문을 활용하게 되는데
<if test='start_date != "" and end_date != ""'>
<if test='end_date != "" and start_date == ""'>
<if test='start_date != "" and end_date == ""'>
초기에는 아래와 같이 null 값을 비교하였다.
<if test='start_date != null and end_date == null'>
하지만, 원하는 결과와 달리 CURRENT_AT >= '2023-03' 과 같은 조건에서 null값을 던졌다.
그 이유는 내가 제공한 파라미터 값이 null값으로 들어가지 않고 빈배열("")로 들어갔기 때문이다.
따라서 null 로 설정했던 조건을 ""로 바꿔주었다.
'개발일지 > Trouble Shooting' 카테고리의 다른 글
1. XML 에서 IF 문의 활용과 NULL값 처리
나는 사내 프로젝트를 진행하며 네이버 지도를 구현했다.
프로젝트는 두개의 TABLE을 활용했는데 하나는 Naver Map의 지도 정보를 담고있는 TABLE과 또 하나는 Naver Map의 누적 조회수를 담고 있는 테이블이었다.
프로젝트에서는 Naver에서 제공하는 API인 GeoCode와 Naver Map API를 사용해야 했는데 두가지 모두 300만회를 조회하면 유료 결제를 해야하기 때문에 그동안 몇회를 조회했는지 확인 할 수 있는 테이블을 만들어야 했다.
그 중에서도 네이버 지도 월간 조회수를 검색하는 쿼리에 대해서 트러블 슈팅한 것을 이야기해보려고 한다.
<!--네이버 지도 월간 조회 / 조회 결과 갯수 -->
<select id="selectNaverMapCount" parameterType="hashMap" resultType="Integer">
SELECT COUNT(CNT)
FROM TB_N_API_CNT_HIST
WHERE CURRENT_AT
<if test='start_date != "" and end_date == ""'>
<![CDATA[
>= #{start_date, jdbcType=VARCHAR}
]]>
</if>
<if test='end_date != "" and start_date == ""'>
<![CDATA[
<= #{end_date, jdbcType=VARCHAR}
]]>
</if>
<if test='start_date != "" and end_date != ""'>
<![CDATA[
BETWEEN #{start_date, jdbcType=VARCHAR} AND #{end_date, jdbcType=VARCHAR}
]]>
</if>
ORDER BY CURRENT_AT DESC;
</select>
최종적으로 만들어진 SQL은 다음과 같다.
이 SQL문은 다음 세가지의 조건문을 활용하게 되는데
<if test='start_date != "" and end_date != ""'>
<if test='end_date != "" and start_date == ""'>
<if test='start_date != "" and end_date == ""'>
초기에는 아래와 같이 null 값을 비교하였다.
<if test='start_date != null and end_date == null'>
하지만, 원하는 결과와 달리 CURRENT_AT >= '2023-03' 과 같은 조건에서 null값을 던졌다.
그 이유는 내가 제공한 파라미터 값이 null값으로 들어가지 않고 빈배열("")로 들어갔기 때문이다.
따라서 null 로 설정했던 조건을 ""로 바꿔주었다.