본문으로 바로가기

Spring 이론(응용) - 검색 처리

category 웹/Spring 2019. 8. 19. 18:39

마이바티스 게시글 검색 처리

검색 기능은 2가지 유형이 있습니다.

  • 제목/작성자/내용 단일 항목 검색
  • 제목 or 내용, 제목 or 작성자, 내용 or 작성자, 제목 or 내용 or 작성자 다중 항목 검색

단일 항목 검색

간단하게 마이바티스로 처리할 수 있습니다. 아래는 TEST가 포함된 2페이지 게시글 단일 검색입니다.

select
*
from
	(
    	select /*+INDEX_DESC(tbl_board pk_board) */
        rownum rn, bno, title, content, writer, regdate,updatedate
        from
        	tbl_board
        where
        	title like '%TEST%'
            and rownum<=20
     )
where rn >10;

다중 항목 검색

AND와 OR이 섞여있으면 연산자 ()을 이용해서 OR을 처리해야합니다.

select
*
from
	(
    	select /*+INDEX_DESC(tbl_board pk_board) */
        rownum rn, bno, title, content, writer, regdate,updatedate
        from
        	tbl_board
        where
        	(title like '%TEST%' or content like '%TEST%')
            and rownum<=20
     )
where rn >10;

위 코드를 마이바티스 동적 SQL로 작성해봅시다.

동적 태그

  • if
  • choose(when,otherwise)
  • trim(where,set)
  • foreach

<if>

<if test = "type=='T'.toString()">
	(title like '%'||#{keyword}||'%')
</if>

<choose> =if else

<choose>
<when test="type=='T'.toString()">
	(title like '%'||#{keyword}||'%')
</when>
<when test="type=='C'.toString()">
	(content like '%'||#{keyword}||'%')
</when>
<when test="type=='W'.toString()">
	(writer like '%'||#{keyword}||'%')
</when>
<otherwise>
	(title like '%'||#{keyword}||'%' OR content like '%'||#{keyword}||'%')
</otherwise>
</choose>

<trim>

select * from tbl_board
	<where>
    	<if test="bno != null">
        	bno=#{bno}
        </if>
        <trim prefixOverrides = "and">
        rownum = 1
      	</trim>
    </where>
bno 존재
select * from tbl_board where bno=33 and rownum=1

bno null
select * from tbl_board where rownum = 1

<foreach>

List, 배열 , 맵 등 처리 가능

복잡한 where 조건 처리 가능

Map<String,String> map = new HashMap<>();
map.put("T","TTTT");
map.put("C","CCCC");

이를 파라미터로 전달하고 foreach사용

select * from tbl_board
	<trim prefix="where (" suffix=")" prefixOverrides="OR">
    	<foreach item="val" index="key" collection="map">
        	<trim prefix="OR">
            	<if test="key=='C'.toString()">
                	content = #{val}
                </if>
                <if test="key=='T'.toString()">
                	title = #{val}
                </if>
                <if test="key=='W'.toString()">
                	writer = #{val}
                </if>
            </trim>
         </foreach>
    </trim>

이제 검색처리를 위해 앞서 만든 Criteria클래스를 수정합시다.

package com.jeongchan.domain;

import org.springframework.web.util.UriComponentsBuilder;

import lombok.Getter;
import lombok.Setter;
import lombok.ToString;

@Getter
@Setter
@ToString
public class Criteria {
	private int pageNum; // 페이지 번호
	private int amount; //한 페이지당 데이터 개수
	
    //추가
    private String type;
    private String keyword;
	
	public Criteria() {
		this(1,10); //기본 값을 1페이지 10개로 지정
	}
	
	public Criteria(int pageNum,int amount) {
		this.pageNum = pageNum;
		this.amount = amount;
	}
    
    public String[] getTypeArr(){
    	return type == null ? new String[] {}:type.split("");
    }
}

이를 이용해서 마이바티스는 원하는 속성을 찾을 때 메소드 이름을 기반으로 찾기 때문에 getTypeArr을 collection typeArr으로 지정해주어야합니다.

 

<!-- 페이징 처리 -->
<!-- pageNum*amount는 끝번호 pageNum-1 *amount는 시작번호 -->
<select id="getListWithPaging" resultType="com.jeongchan.domain.BoardVO">
	<![CDATA[
		select bno,title,content,writer,regdate,updatedate,viewcnt,replycnt,filecnt
		from
		(
			select /*+INDEX_DESC(jeongchan_board pk_jc_board)*/
				rownum rn,bno,title,content,writer,regdate,updatedate,viewcnt,replycnt,filecnt
			from
				jeongchan_board
			where 
			
	]]>	
	<!-- prefixOverrides는 OR로 시작 될경우 제거해주고 시작한다. 밑에서 중간에 OR을 넣어주기 위함 -->
	<!-- collection이 typeArr인 이유는 마이바티스는 빈이아닌 get/set 메서드 이름을 보고 판단하기 때문에 Criteria에서 getTypeArr를 보고 typeArr로 판단한다. -->
	
    <!-- prefixOverrides는 맨 앞이 OR로 시작 될경우 제거해주고 시작한다. 밑에서 중간에 OR을 넣어주기 위함 즉 OR title like ~~ OR content like 으로 시작됨 -->
		<!-- collection이 typeArr인 이유는 마이바티스는 빈이아닌 get/set 메서드 이름을 보고 판단하기 때문에 Criteria에서 getTypeArr를 보고 typeArr로 판단한다. -->
		<trim prefix="(" suffix=") AND " prefixOverrides="OR">
			<foreach item='type' collection='typeArr'>
				<trim prefix="OR">
					<choose>
						<when test="type=='T'.toString()">
							title like '%'||#{keyword}||'%'
						</when>
						<when test="type=='C'.toString()">
							content like '%'||#{keyword}||'%'
						</when>
						<when test="type=='W'.toString()">
							writer like '%'||#{keyword}||'%'
						</when>
					</choose>
				</trim>
			</foreach>
		</trim>
	
	<![CDATA[
			rownum<=#{pageNum} * #{amount} 
		)
		where rn>(#{pageNum}-1)*#{amount}
		
	]]>
</select>

 

' > Spring' 카테고리의 다른 글

Spring 차트 그리기  (1) 2020.03.09
Spring 이론(응용) - ORACLE 페이징처리  (0) 2019.08.17
Spring 이론(응용) - ORACLE 페이징처리  (0) 2019.08.10
Spring 이론(재) - 스프링 기본 구성  (0) 2019.07.22
Spring 이론(재) - AOP  (0) 2019.07.21