[프로젝트 개선] - 웹사이트 제작 19. (Spring/Java) 게시판 검색 기능 구현 (+ 검색 유형/키워드)

JINI·2023년 6월 23일
1
post-thumbnail

게시판에서 개선하고 싶었던 부분이 검색 기능이다.
게시판을 이용하다보면 게시글이나 유저 아이디를 검색해 찾고 싶은 경우가 생기기 때문에 타입과 키워드 입력시 해당 게시물을 찾는 기능을 구현했다.


🚩변경 전 ➡️ 이용후기 게시판
🚩변경 후 ➡️ 검색 기능이 있는 게시판



🔍게시판 검색 기능


📕DTO

게시판 dto에 검색 타입과 키워드 변수들을 추가한다.

public class boardDTO {
	private String keyword; // 검색 키워드
	private String type; // 검색 타입
    }

getter,setter도 생성한다.


📕게시판 JSP

	<form action="${contextPath }/board/review" method="get" id="searchFoam" name="search-form">
        <select name="type" class="type-box">
			<option value="">검색 유형 선택</option>
			<option value="title">제목</option>
			<option value="writer">작성자</option>
		</select>
		<td colspan="2">
          <input class="inputId" type="text" name="keyword" placeholder="검색어 입력">
        </td>
		<td>
          <input class="submitBtn" type="submit" value="검색하기">
		</td>
	</form>

검색 유형과 검색어를 입력하고 버튼을 클릭하면 submit에 의해 입력 값들이 form태그에 적힌 경로로 넘어간다.
검색옵션은 제목, 작성자로 검색할 수 있도록 하고 사용자가 선택한 값과 입력 값이 넘어가도록 한다.


📕Controller

검색 결과는 게시판 목록에서 조회되어야 하기 때문에 이전에 작성했던 게시판 목록 코드에 검색 코드를 추가했다.

	@GetMapping("review")
	public String review(Model model,@RequestParam(value="type", required=false) String type,@RequestParam(value="keyword", required=false) String keyword,@RequestParam(required = false, defaultValue = "1")int num)throws Exception { //db에 저장된 모든 값 가져오기,값이 없다면 default값으로 1주기) {
		if(type != null  && keyword !=null) {
			bs.selectSearch(model,type,keyword,num);
		}else {
			bs.boardList(model,num);
		}
		return "board/review";			
	}

@RequestParam으로 검색한 type/keyword를 받아오고
검색한 타입과 키워드가 있다면 게시판 목록에 페이징 처리와 함께 출력되고
아니라면 그냥 게시판 목록이 표시되도록 한다.


📕Service

public void selectSearch(Model model, String type, String keyword,int num)throws Exception{
		int pageLetter = 5;
		int allCount = mapper.selectSearchCount(type,keyword);
		int repeat = allCount / pageLetter;
		if(allCount % pageLetter != 0) {
			repeat += 1;
		}
        
        //시작,끝번호
		int end = num * pageLetter;
		int start = end + 1 - pageLetter;

		model.addAttribute("repeat", repeat);
		model.addAttribute("boardList", mapper.selectSearch(type,keyword, start, end));
	}

검색과 함께 처리될 페이징 부분이다.
타입/키워드 결과가 있다면 게시판 목록에 검색 결과가 5개씩 반복되고
mapper로 결과 총갯수와 타입,키워드,페이징이 넘어간다.

페이징 코드는 그 전 페이징 처리하는 방법에 대해 다뤘기 때문에 자세한 설명은 넘어간다.


📕mapper

	public ArrayList<boardDTO> selectSearch(@Param("type")String type,@Param("keyword")String keyword,@Param("s") int start, @Param("e") int end)throws Exception;
	public int selectSearchCount(@Param("type")String type,@Param("keyword")String keyword);

리스트 형식으로 검색 결과와 총 갯수를 출력하는 코드다.


📕mapper.xml

<resultMap type="com.care.root.board.dto.boardDTO" id="board">
		<result property="type" column="type" />
		<result property="keyword" column="keyword" />
</resultMap>

dto에 새로운 type,keyword 변수들을 추가했기 때문에 xml에도 연결해준다.

<select id="selectSearch" resultMap="board">
		select B.* from(select
		rownum rn,
		A.* from
		(select * from box_board where
		${type} like
		'%'||#{keyword}||'%'
		order by list_num desc)A)B where rn
		between #{s}
		and
		#{e}
	</select>

	<select id="selectSearchCount" resultType="Integer">
		select count(*) from
		box_board where ${type} like '%'||#{keyword}||'%'
	</select>

검색 조건에 따른 검색 결과를 페이징 처리해 게시판 목록에 출력해주는 쿼리문을 작성한다.
값이 존재하는 경우에는 like를 이용하여 입력 값이 포함된 데이터를 가져올 수 있도록 '%' 문자열을 넣어 sql 구문을 작성한다.

검색 조건에 해당하는 전체 게시물 수를 가져오는 쿼리문도 작성한다.

검색 유형을 제목으로 선택하고 수정을 검색하면 수정이 포함된 모든 게시글을 가지고오면서 페이징 처리가 된다.

이번엔 검색 유형을 작성자로 선택하고 dh를 검색하니 글쓴이가 dh인 게시글을 전부 가져오면서 한 페이지에 결과물을 5개씩 출력하며 페이징 처리가 된 것을 볼 수 있다.

profile
꾸준히 성장하는 개발자

0개의 댓글