하나비 HANABI 2022. 8. 17. 22:43

02_2주차_과제 .txt
0.00MB

- 게시판 목록 조회 기능 개발 추가기능 개선

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으로 볼땐 이렇게