게시판목록 검색기능
- 게시판 목록 조회 기능 개발 추가기능 개선
1. 검색 조건 기능 추가
- 화면 설계서와 같이 전체 목록 조회가 아닌, 사용자의 검색 조건에 따른 전체 목록 조회 가능하도록 기능 개선
- 검색 조건 대상 : 게시물 제목 / 게시물 본문 내용 / 작성자명
- 단, 게시물 제목과 게시물 본문 내용의 경우에는 검색 키워드가 포함되는 조건이고, 작성자명은 검색 키워드가 동일한 조건
ex) 제목/내용 : '수빈'으로 검색 > '수빈'이 포함된 목록 전체 조회(제목 또는 본문내용이 '최수빈'인 경우도 조회 대상)
ex) 작성자명 : '수빈'으로 검색 > 작성자명이 '최수빈'인 경우는 조회 대상 아님. 포함 아닌 일치 조건
2. postman으로 검색 조건에 대한 request 결과에 따른 목록 확인
https://victorydntmd.tistory.com/333?category=764331
[SpringBoot] 게시판 (4) - 검색과 페이징
Springboot로 디자인이 하나도 없고 매우 간단한 게시판을 구현하는 시리즈입니다. 최종 소스는 깃헙에서 확인하실 수 있습니다. [SpringBoot] 게시판 (1) - 준비작업 [SpringBoot] 게시판 (2) - 게시글 추
victorydntmd.tistory.com
https://kuzuro.blogspot.com/2019/09/12-1.html
스프링 게시판 만들기 #12. 검색 구현 1
개발자, 웹개발, PC앱개발, Java, C#, HTML/CSS, JavaScript, Spring, ASP, .NET
kuzuro.blogspot.com
맵퍼에서 CData 와 마이바티스 때문에 정말 애먹었던 검색기능 구현 하하
<BoardMapper.java>
package com.example.board.mapper;
import java.util.List;
import org.apache.ibatis.annotations.Mapper;
import org.springframework.web.bind.annotation.RequestParam;
import com.example.board.BoardDTO;
@Mapper
// 데이터 접근 객체인 DAO와 같은 역할. 마이바티스에서는 DAO보다 SqlSessionDaoSupport나 SqlSessionTemplate를 사용하기를 권장함.
// 매퍼를 사용하면 일일이 DAO를 만들지 않고, 인터페이스만을 이용해 편하게 개발이 가능
public interface BoardMapper {
// 게시물 목록
public List<BoardDTO> boardList() throws Exception;
// 게시글 목록 + 검색
public List<BoardDTO> boardListSearch(@RequestParam("searchType") String searchType,
@RequestParam("keyword") String keyword) throws Exception;
// 게시글 상세
public BoardDTO boardContent(int bno) throws Exception;
}
<BoardMapper.xml>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.board.mapper.BoardMapper"> <!-- xml파일을 사용할 mapper가 있는 경로 -->
<!-- 게시물 목록 -->
<!-- <select> 태그를 이용하여 select 쿼리임을 나타냄. 앞서 mapper에서 말했던 메소드의 이름은 select 쿼리의 id값과 같아야함. -->
<select id="boardList" resultType="com.example.board.BoardDTO">
<![CDATA[
SELECT
idx, title, writer, regdate
FROM
board_table
ORDER BY idx DESC
]]>
</select>
<!-- 게시물 목록 + 검색 -->
<select id="boardListSearch" parameterType="String" resultType="com.example.board.BoardDTO">
SELECT
idx, title, writer, regdate
FROM
board_table
<if test='searchType.equals("title")'>
WHERE title LIKE <![CDATA[ concat('%', #{keyword}, '%')]]>
</if>
<if test='searchType.equals("content")'>
WHERE content LIKE <![CDATA[ concat('%', #{keyword}, '%')]]>
</if>
<if test='searchType.equals("writer")'>
WHERE writer = <![CDATA[#{keyword, jdbcType=VARCHAR}]]>
</if>
ORDER BY idx DESC
</select>
</mapper>
파라미터에 해당하는 부분을 CDATA로 감싸주었다.
원래는 select문 전체를 감싸고 있었는데 그 부분에서 문제가 생겼던 것 같다.
<BoardService.java>
package com.example.board.service;
import java.util.List;
import com.example.board.BoardDTO;
public interface BoardService {
// 게시물 목록
List<BoardDTO> boardList() throws Exception;
// 게시물 목록 + 검색
List<BoardDTO> boardListSearch(String searchType, String keyword) throws Exception;
}
<BoardServiceImpl.java>
package com.example.board.service;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.example.board.BoardDTO;
import com.example.board.mapper.BoardMapper;
@Service // 서비스임을 선언
public class BoardServiceImpl implements BoardService{
@Autowired // Mapper와 연결
private BoardMapper boardMapper;
// 게시물 목록
@Override
public List<BoardDTO> boardList() throws Exception {
return boardMapper.boardList();
}
// 게시물 목록 + 검색
@Override
public List<BoardDTO> boardListSearch (String searchType, String keyword) throws Exception {
return boardMapper.boardListSearch(searchType, keyword);
}
}
<BoardController.java>
package com.example.board.controller;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;
import com.example.board.BoardDTO;
import com.example.board.service.BoardService;
@Controller // 컨트롤러 선언
@RequestMapping("/board/*")
public class BoardController {
@Autowired
private BoardService boardService; //서비스와 연결
// Slf4j 로그
//private static final Logger logger = LoggerFactory.getLogger(BoardController.class);
/*
* RequestMapping을 통해 해당 url을 호출 시 해당되는 화면(view)을 매핑시켜주는 역할
* localhost:8080/openBoardList.do 에서 "/openBoardList.do" 맵핑 설정
* 해당 request 호출 시 리턴되는 화면 (BoardList.jsp) 호출
*/
//@RequestMapping("/openBoardList.do")
//게시물 목록
@RequestMapping(value = "/openBoardList", method = RequestMethod.GET)
public ModelAndView openBoardList() throws Exception{
/*
* logger.debug("boardController dedug");
* logger.info("boardController info");
* logger.error("boardController error");
*/
// jsp파일 부르기 - 방법1
// return "BoardList"; (String 메소드로 변경)
// jsp파일 부르기 - 방법2
ModelAndView mv = new ModelAndView("/BoardList");
//게시글 목록을 조회하기 위해 ServiceImpl 클래스의 boardList 메서드 호출
List<BoardDTO> boardlist = boardService.boardList();
mv.addObject("list", boardlist);
return mv;
}
// 게시판 목록 조회 - 검색 기능
@RequestMapping(value = "/search", method = RequestMethod.GET)
public ModelAndView search(@RequestParam(value="searchType") String searchType,
@RequestParam(value="keyword") String keyword) throws Exception{
// URL을 통해 searchType과 keyword를 받아낼 수 있도록
ModelAndView mv = new ModelAndView("/BoardList");
List<BoardDTO> boardlist = boardService.boardListSearch(searchType, keyword);
mv.addObject("list", boardlist);
return mv;
}
}
<BoardList.jsp>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <!-- forEach사용 -->
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>게시판</title>
</head>
<body>
<!-- 검색기능. action 기능을 통해 넘어가게 -->
<form action="/board/search" method="GET">
<select name = "searchType" >
<option value="title" <c:if test="${page.searchType eq 'title'}">selected</c:if>>제목</option>
<option value="content" <c:if test="${page.searchType eq 'content'}">selected</c:if>>내용</option>
<option value="writer" <c:if test="${page.searchType eq 'writer'}">selected</c:if>>작성자</option>
</select>
<input value="${page.keyword}" name="keyword" type="text">
<input type="submit" value="검색">
</form>
<br>
<div class="container">
<table class="table">
<colgroup>
<col width="15%"/>
<col width="40%"/>
<col width="25%"/>
<col width="30%"/>
</colgroup>
<thead>
<tr>
<th scope="col">번호</th>
<th scope="col">제목</th>
<th scope="col">작성자</th>
<th scope="col">등록일</th>
</tr>
</thead>
<tbody>
<tr>
<c:forEach var="l" items="${list }"> <!-- items 안에는 Controller의 mv.addObject명 -->
<td>${l.idx}</td>
<td>${l.title}</td>
<td>${l.writer}</td>
<td>${l.regdate}</td>
</c:forEach>
</tr>
</tbody>
</table>
</div>
</body>
</html>
로컬서버에 띄운 결과
postman으로 볼땐 이렇게