[코드로 배우는 스프링 웹 프로젝트] ch15 검색 처리 1(sql, MyBatis 동적 태그)
bobo122023. 3. 31. 01:00
728x90
반응형
◎ 검색 조건
▷ <select> 태그를 이용하거나 <checkbox> 이용하는 경우가 많음
▷ 최근 일반 웹사이트 사용자들의 경우 <selec>를 사용, 관리자용이나 검색 기능이 강한 경우 <checkbox> 이용
1. 검색 기능과 SQL
▷ 게시물 검색 기능은 다음과 같이 분류 가능
▶ 제목/내용/작성자와 같이 단일 항목 검색
▶ 제목 or 내용, 제목 or 작성자, 내용 or 작성자, 제목 or 내용 or 작성자와 같은 다중 항목 검색
where문 뒤에 검색 조건이 추가되고, rownum 조건이 뒤따르게 하면 문제가 없음
(1) 다중 항목 검색
▷ 2개 이상의 조건이 붙는 다중 항목의 검색이 문제
◎ 제목이나 내용 중에 'TEST'라는 문자열이 있는 게시물들을 검색하는 SQL
select
*
from
(
select /*+ INDEX_DESC(tbl_board pk_board) */
rownum rn, bno, title, content, writer, regdate, updatedate
from
tbl_board
where
title like '%테스트%' or content like '%테스트%'
and rownum <= 20
)
where rn > 10;
▷ 구문 자체는 이상이 없지만, 실제로 동작 시켜보면 10개의 데이터가 아니라 많은 양의 데이터가 나오는 것 확인 가능
많은 양의 데이터가 나온 이유는 위 SQL문에서 AND 연산자가 OR 연산자 보다 우선 순위가 높기 때문에 'ROWNUM이 20보다 작거나 같은면서(AND) 내용에 '테스트'라는 문자열이 있는 게시물들을 검색
제목에 '테스트'라는 문자열이 있는 경우는 많기 때문에 위의 그림과 같이 많은 양의 데이터를 가져옴
◎ 따라서 우선 순위 연산자인 '( )'를 이용해서 OR 조건을 처리해야 함
select
*
from
(
select /*+ INDEX_DESC(tbl_board pk_board) */
rownum rn, bno, title, content, writer, regdate, updatedate
from
tbl_board
where
(title like '%테스트%' or content like '%테스트%')
and rownum <= 20
)
where rn > 10;
결과를 확인하면 원하는 10개의 데이터만 출력되는 것을 볼 수 있음
2. MyBatis의 동적 SQL
▷ 검색 조건이 변하면 SQL 내용 역시 변하기 때문에 XML이나 어노테이션 같이 고정된 문자열을 작성하는 방식으로 제대로 처리할 수 없음
▷ MyBatis는 동적(Dynamic) 태그 기능을 통해 SQL을 파라미터들의 조건에 맞게 조정할수 있음
(1) MyBatis의 동적 태그들
▷ if
▷ choose(when, otherwise)
▷ trim(where, set)
▷ foreach
◎ if
▷ test라는 속성과 함께 특정한 조건이 true가 되었을 때 포함된 SQL을 사용하고자할 때 작성
▷ 단일 항목으로 제목(title), 내용(content), 작성자(writer)에 대해 검색해야하는 상황
1. 검색 조건이 'I'면 제목(title)이 키워드인 항목을 검색 2. 검색 조건이 'C'면 내용(content)이 키워드인 항목을 검색 3. 검색 조건이 'W'면 작성자(writer)이 키워드인 항목을 검색