본문 바로가기
Spring

[스프링] 컬럼 복수값 검색 방법!!(feat.동적 SQL)

by GoodDayDeveloper 2021. 3. 12.
반응형

안녕하세요. 오늘은 체크박스 체크 후 검색할때 한 컬럼에 값이 두개 있을 경우 나누는 방법에 대해 알려드리겠습니다.

여기서는 Dynamic SQL에서 foreach를 사용해야합니다.

 

Dynamic SQL이란, 동적 SQL이라고도 불리며, String형 변수에 담아서 기술하는 SQL문을 말합니다. String변수를 사용하기 때문에 조건에 따라 SQL문을 동적으로 바꿀수 있습니다.

 

동적 SQL에서 foreach 사용방법은 다음과 같습니다.

collection 전달받는 인자값 (반드시 배열/리스트형태)
index 목록의 위치값 (index, count, 등)
item 전달받는 인자값을 다른 이름으로 재 정의
open 해당 구문이 시작할 때 넣을 문자
close 해당 구문이 끝날 때 넣을 문자
separator 한번 이상 반복할때 사이에 넣는 문자

표현이 서툴러서...말이 좀 어려운데 이미지로 보겠습니다.

 

 

 


 

 

 

화면에서 이렇게 체크박스를 두개 체크하고 검색을 하게되면

 

 

searchArea라는 컬럼에 1과 2이 쉼표가 붙어서 두개가 들어가있습니다.

 

 

이러면 검색이 작동되지 않기 때문에 나눠줘야 합니다.

searchArea=1,2 가 아니고,

searchArea=1 , searchArea=2

이런식으로 말이죠! 이젠 시작해보겠습니다.

 

 

 


 

 

우선 HTML 화면을 보겠습니다.

일반적으로 체크박스에 model로 보낼 name값을 적어주고, 값을 적어줍니다.

그리고 if문에 contains 함수를 사용하여 searchArea 값이 1이 포함되어 있으면 체크할 수 있도록 설정합니다.

 

1
2
3
4
5
6
7
8
9
10
<div class="business-srch">
<dl style="padding-left:140px;">
    <dt class="top0">분류</dt>
    <dd>
        <input type="checkbox" class="all" id="category_total" name="searchArea" value="" <c:if test="${empty searchVO.searchArea}">checked</c:if> /><span class="ml_10 mr_10">전체 </span>
        <input type="checkbox" class="elem" name="searchArea" value="1" <c:if test="${fn:contains(searchVO.searchArea, '1') }">checked</c:if> /><span class="ml_10 mr_10">테스트1</span>
        <input type="checkbox" class="elem" name="searchArea" value="2" <c:if test="${fn:contains(searchVO.searchArea, '2') }">checked</c:if> /><span class="ml_10 mr_10">테스트2</span>
    </dd>
</dl>
</div>
cs

 

 

콤마를 제거하고 값을 두개로 나누는 방법은 두가지가 있습니다.

 

첫번째

 

첫번째는 sql에서 foreach의 collection에서 split로 ,를 구분해주면 됩니다. 즉 동적 sql 처리를 해주는거죠!

위에서 foreach문 사용법을 가지고 해석해보자면,

 

searchArea가 값이 있다면

board_category 에서 in 조건절로 일치하는 값을 가지고 와라

그 값은 searchArea에 있는 값을 반복하면서 ,를 넣어서 구분해줘라

 

라는 말이죠

 

SQL

 

1
2
3
4
5
6
<if test="searchArea != null and searchArea !=''">
    AND board_category in    
        <foreach item="item" index="index" collection="searchArea.split(',')"  open="(" separator="," close=")">
            #{item}
        </foreach>
</if>
cs

 

 

결과값은 아래와 같이 나옵니다.

 

1
AND board_category in ( 1 , 2)
cs

 

두번째

 

VO에서 배열 변수를 만든다음, dao에서 searArea값을 배열에 넣어준다음 sql로 가지고가서 처리하는거죠!

 

VO

 

배열형태의 String 객체를 만들어줍니다.

 

1
private String[] searchArea2;
cs

 

 

DAO

 

searArea값이 있다면

a라는 변수에 searchArea값을 넣어주고,

b라는 변수에 searchArea를 콤마로 구분해줍니다.

그리고 그 값을 배열형태인 searchArea2에 넣어줍니다.

 

1
2
3
4
5
if(searchVO.getSearchArea() != null) {
    String a = searchVO.getSearchArea(); 
    String[] b = a.split(",");
    searchVO.setSearchArea2(b);
}
cs

 

 

SQL

 

그리고, searchArea가 값이 있다면

board_category 에서 in 조건절로 일치하는 값을 가지고 와라

그 값은 searchArea2에 있는 값을 반복하면서 ,를 넣어서 구분해줘라

 

입니다.

 

1
2
3
4
5
6
<if test="searchArea != null and searchArea !=''">
    AND board_category in    
        <foreach collection="searchArea2" item="item" index="index" separator="," open="(" close=")">
            #{item}
        </foreach>    
</if>
cs

 

 

첫번째나 두번째나 결과값은 searchArea=1&searchArea=2 로 구분되어 지게 됩니다.

 

반응형

댓글