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의 전체 조회를 막기위해서는 괜찮은 방법일듯 하다.
끝!
'Back-end' 카테고리의 다른 글
SQL Injection 에대해서 (0) | 2023.01.20 |
---|---|
Mybatis 항상 헷갈렸던 ${} vs #{} 를 너의 머리속에 심어줄게! (0) | 2023.01.20 |
Springboot 3가지 CROS 설정 (0) | 2023.01.09 |
Apache BeanUtils vs Spring BeanUtils 성능비교 (0) | 2023.01.06 |
Intellij가 있으므로 Java Stream 디버깅은 더이상 어렵지않다! (0) | 2023.01.05 |