728x90

소스 점검 하다가 아래와 같은 코드를 봤다.

//... 생략

	FROM TOMS_CO_M CM
		) T1
		WHERE 1 = 1
		<if test='param.srchCorpCd != null and param.srchCorpCd != ""'>
			AND CORP_CD = #{param.srchCorpCd}
		</if>
		<if test='param.srchCoCrtDtmFr != null and param.srchCoCrtDtmFr != ""'>
		   AND CO_CRT_DTM BETWEEN TO_DATE(#{param.srchCoCrtDtmFr}, 'yyyyMMdd') AND  TO_DATE('99991231', 'yyyyMMdd')
		</if>

참 성의 없는 코드다. 왜냐 ?  제목에서 처럼 1=1 를 써놨기때문이다. 물론 우리가 급식시절에 대충 게시판 하나 만들면서 CRUD 구현에 목숨걸고 있을시절에 자주 쓰고했다. 어? 그래 맞다 현재 SI 개발자들도 아니 그 흔한 고수급 스타트업 개발자들도 이런 코드를 자주 쓰더라.

그럼 오늘 이 where 1=1를 제거 해보자 케이스는 2가지가 있다.(내가 아니는 한도내에서, 또 다른 방법들이 있겠지만...)

 

이 쿼리의 문제 점을 생각해봐라 : 만일 corp_cd , co_crt_dtm  이런 값들이 모두 null 로 들어온다고하면? 그리고 KISA 같은 금융사같은 회사들을 대상으로 코드점검을 나오면 과대료 대상이다.

그래서 아래와 같이 2가지 방법을 제시하는 글들을 작성해 보았다.

방법1: 

<where> 태그를 사용한다.

SELECT 컬럼1, 컬럼2
FROM 테이블명
<where>
    <if test="컬럼1 != null">AND 컬럼1 = #{컬럼1} </if>
    <if test="컬럼2 != null">AND 컬럼2 = #{컬럼2} </if>
</where>

 

방법2

<trim> 태그 사용한다.

SELECT 컬럼1, 컬럼2
FROM 테이블
<trim prefix="WHERE" prefixOverrides="AND">
    <if test="컬럼1 != null">
        AND 컬럼1 = #{컬럼1}
    </if>
    <if test="컬럼2 != null">
        AND 컬럼2 = #{컬럼2}
    </if>
</trim>

여기서 약간의 문제점이 있어 보인다. 컬럼1,컬럼2 가 null 일시 테이블에 대한 전체 데이터를 조회하게 될거다.

그래서 <trim> 태그 사용 방식을 아래와 같이 조금 더 개선해 본다. 바로 Exception 을 유도 하는 것!

SELECT 컬럼1, 컬럼2
FROM member_test
WHERE
<trim prefixOverrides="AND">
    <if test="컬럼1 != null">
        AND 컬럼1 = #{컬럼1}
    </if>
    <if test="컬럼2 != null">
        AND 컬럼2 = #{컬럼2}
    </if>
</trim>

뭐 Exception 을 일부러 유도하는것 자체가 찝찝? 할수 있지만 우리는 table의 전체 조회를 막기위해서는 괜찮은 방법일듯 하다.

 

끝!

+ Recent posts