1. 검색결과에 따른 게시물 수가 알맞게 뜨지 않을 때
- 총 게시물 수를 조회하는 count를 검색 타입에 따라 게시물 수가 다르게 뜨게 하기위해서 if로 조건을 건다.
- BoardMapper.xml
<select id="count" resultType="int">
SELECT COUNT(*)
FROM tbl_board
<if test="type == 'title'">
WHERE title LIKE CONCAT('%', #{keyword}, '%')
</if>
<if test="type == 'content'">
WHERE content LIKE CONCAT('%', #{keyword}, '%')
</if>
<if test="type == 'writer'">
WHERE writer LIKE CONCAT('%', #{keyword}, '%')
</if>
<if test="type == 'tc'">
WHERE title LIKE CONCAT('%', #{keyword}, '%')
OR content LIKE CONCAT('%', #{keyword}, '%')
</if>
</select>
sql에서 if문이 중복될 때 동적 SQL 조건을 분리
<sql id="search">
<if test="type == 'title'">
WHERE title LIKE CONCAT('%', #{keyword}, '%')
</if>
<if test="type == 'content'">
WHERE content LIKE CONCAT('%', #{keyword}, '%')
</if>
<if test="type == 'writer'">
WHERE writer LIKE CONCAT('%', #{keyword}, '%')
</if>
<if test="type == 'tc'">
WHERE title LIKE CONCAT('%', #{keyword}, '%')
OR content LIKE CONCAT('%', #{keyword}, '%')
</if>
</sql>
<select id="count" resultType="int">
SELECT COUNT(*)
FROM tbl_board
<include refid="search" />
</select>
- count를 수정했으니 그에 따른 Controller, Service, Mapper에서도 count부분 수정
- type, keyword를 받아야하므로 파라미터로 search 받음
- Mapper
- Controller
- Service
jsp에서 <<, >>은 가독성이 좋지 않다.
<<
: <<
>>
: >>
- 위처럼 대체 가능
2. 검색한 상태에서 다음 페이지나 이전 페이지 등을 눌렀을 때 검색이 유지되지 않고 초기화 되는 문제
- 예를 들어 검색창에 11이라고 검색하고 다음 페이지로 넘기게되면 검색 필터가 풀리고 초기화되어 다시 원래 board/list가 뜨게된다.
-> 검색한 상태에서 이전, 다음 페이지 등 페이지들을 눌렀을 때도 유지가 되어야 하므로 url에서 type, keyword를 기억해야 한다.
- 다시 돌아왔을 때도 위와같은 창이 나와야한다.
list.jsp에서 페이지 부분에 type, keyword를 보내서 url을 기억하게한다.
- Controller에서 s라는 이름으로 jsp로 보낼 때
@ModelAttribute("s")
라고 파라미터에 입력하게되면 model.addAttribute("s", search)
처럼 보내준다.
3. 검색하고 상세 조회한 이후 목록으로 다시 돌아왔을 때 검색 했던 화면으로 돌아오지 않고 기본 리스트화면으로 초기화 되는 문제
- 예를 들어 검색창에 11이라고 검색했을 때 뜨는 게시물을 들어갔다가 다시 목록버튼을 누르고 나간다고 했을 때 초기화면 리스트로 돌아오게 되는 문제가 발생한다.
이전 페이지의 주소를 얻어내서 반환하게 한다.
- detail 요청을 보낼 때 request를 통해서 header의 referer로 접근할 수 있다. referer에는 이전 페이지의 주소가 저장되어있고 이를 jsp로 보내어
- 목록을 눌렀을 때 검색이 유지된 채 돌아갈 수 있게된다!!
4. 검색 창에 입력했던 값이 유지되게 하는법
- 위 처럼 입력하고 난 후에 입력값이 유지되게 하려면 검색창 영역의 input에 value값을 줌!