Spring

210712_1~210713_1(SpringBoot)

너굴셉 2021. 7. 12. 18:00

https://sas-study.tistory.com/274

스프링과 스프링부트의 차이점 참고

 

 

와! 스프링부트!

war방식으로 생성해서 실제로 tomcat 서버에 배포했을때 실행이 가능하다.

1) boot 프로젝트 생성

2) pom.xml

라이브러리 추가

	<!-- 외부 레포지토리 추가 -->
	<repositories>
		<repository>
			<id>ojdbc14</id>
			<name>oracle.com</name>
			<url>http://maven.geomajas.org</url>
		</repository>
	</repositories>
	
	
	<dependencies>
	<!-- https://mvnrepository.com/artifact/taglibs/standard -->
<dependency>
    <groupId>taglibs</groupId>
    <artifactId>standard</artifactId>
    <version>1.1.2</version>
</dependency>
	
	
	<!-- https://mvnrepository.com/artifact/javax.servlet/jstl -->
<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>jstl</artifactId>
    <version>1.2</version>
</dependency>
	
	
	<!-- https://mvnrepository.com/artifact/org.apache.tomcat.embed/tomcat-embed-jasper -->
<dependency>
    <groupId>org.apache.tomcat.embed</groupId>
    <artifactId>tomcat-embed-jasper</artifactId>
    <version>9.0.50</version>
</dependency>

 

3) SpringBoot1Application.java

실행클래스에 인코딩 추가

	@Bean //인코딩
	public HttpMessageConverter<String> responseBConverter(){
		
		return new StringHttpMessageConverter(Charset.forName("UTF-8"));
	}
	//인코딩때문에
	public CharacterEncodingFilter characterEncodingFilter() {
		CharacterEncodingFilter characterEncodingFilter = new CharacterEncodingFilter();
		characterEncodingFilter.setEncoding("UTF-8");
		characterEncodingFilter.setForceEncoding(true);
		return characterEncodingFilter;
	}

4) application.properties

기본환경 설정

#===server setting
server.port=8888
server.tomcat.uri-encoding=UTF-8

#===view resolver
#spring.mvc.view.prefix=/WEB-INF/views/
#spring.mvc.view.suffix=.jsp

#===dataSource setting
spring.datasource.url=jdbc:oracle:thin:@localhost:1521:XE
spring.datasource.username=jspuser
spring.datasource.password=1234

기본설정


주의) Autowired 자동주입 방속을 사용할때 구현 클래스로 변수를 만들자

        인터페이스로 만들면 구현메서드를 찾지 못하더라..왜?

요청작업단위

1-1. 글쓰기 폼

매핑계획 /board/writeBoard.do(GET방식) ===> writeBoard() ===>WEB-INF/board/writeBoard.jsp 

1) Mapper : X

2) Dao : X

3) Service : X

4) Controller : O

package com.example.demo;

import java.util.ArrayList;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;

@Controller
@RequestMapping("/board") // board/writeForm.do 의 경로가 된다.
public class BoardController {
	
	private int recordsForPage = 5;
	
	@Autowired
	BoardServiceImpl boardService;
	
	//로그
	private static final Logger logger = 
			LoggerFactory.getLogger(BoardController.class);
	
	// 요청단위 본격적인 매핑 메서드들이 추가됨
	
	// 글 입력폼
	// 매핑계획/writeBoard.do ===> writeBoard() ===>board/writeBoard.jsp
	@RequestMapping(value = "/writeBoard.do", method = RequestMethod.GET)
	public String writeBoard(Model model,BoardBean boardBean) {
		logger.debug("writeForm called!!!");
		
		model.addAttribute("boardBean",boardBean); //뷰 폼값 자동 매핑
		
		return "writeBoard";
	}

5) View(JSP) : O

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    <%@page import="java.io.*, java.text.*" %>
    <%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
    <%@taglib uri="http://www.springframework.org/tags/form" prefix="sf"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>글입력하기</title>
</head>
<body>
<c:url var="insertUrl" value="writeBoard.do"/>
<sf:form modelAttribute="boardBean" method="POST" action="${insertUrl}">
이름 : <sf:input path="name" size="50" maxlength="50"/>&nbsp;
<sf:errors path="name" cssClass="error"/><br>
이메일 : <sf:input path="mail" size="50" maxlength="50"/>&nbsp;
<sf:errors path="mail" cssClass="error"/><br>
제목 : <sf:input path="subject" size="50" maxlength="50"/>&nbsp;
<sf:errors path="subject" cssClass="error"/><br>
내용 : <sf:textarea path="memo" size="200" cssStyle="width:350px; height:100px;" maxlength="200"/>&nbsp;
<sf:errors path="memo" cssClass="error"/><br>
<input type="submit" value="등록하기">



</sf:form>

</body>
</html>

 


1-2. 글쓰기 처리

매핑계획 /board/writeBoard.do(POST방식) ===> writeBoardOk() ===>WEB-INF/board/writeBoardOk.jsp 

1) Mapper : O

package com.example.demo;

import java.util.ArrayList;

import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Result;
import org.apache.ibatis.annotations.Results;
import org.apache.ibatis.annotations.Select;




@Mapper
public interface BoardMapper {

	//sql 상수 
	//연결 @ 어노테이션
	// 호출함수
	// 글입력처리
	final String INSERT = "insert into spring_board (id, subject, name, created_date, mail, memo, hits) "
			+ " values (seq_id.nextval, #{subject}, #{name}, sysdate, #{mail}, #{memo}, 0 ) ";

	@Insert(INSERT)
	void insertBoard(BoardBean boardBean);

2) Dao : O

package com.example.demo;

import java.util.ArrayList;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

@Repository
public class BoardDaoImpl  {
	
	@Autowired
	private BoardMapper boardMapper;
	//매퍼클라이언트

	
	public void insertBoard(BoardBean boardBean) {
		
		boardMapper.insertBoard(boardBean);

	}

3) Service : O

package com.example.demo;

import java.util.ArrayList;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class BoardServiceImpl  {
//business layer 용도
	
	@Autowired
	private BoardDaoImpl boardDao ;

	//글쓰기
	
	public void insertBoard(BoardBean boardBean) {
		boardDao.insertBoard(boardBean);
		
	}

4) Controller : O

	//글쓰기 처리
	@RequestMapping(value = "/writeBoard.do", method = RequestMethod.POST)
	public String writeBoardOk(Model model,BoardBean boardBean) {
		logger.debug("writeFormOk called!!!");
		boardService.insertBoard(boardBean);
		model.addAttribute("result",1); //뷰 폼값 자동 매핑
		
		return "writeBoardOk";
	}

5) View(JSP) : O

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<c:if test="${result==1}">
		<script type="text/javascript">
			alert('글이 입력되었습니다.')
			location.href = 'listBoard.do?current_page=1'
		</script>
	</c:if>
</body>
</html>

 


2. 글 목록

매핑계획 /board/listBoard.do(POST방식) ===> listBoardOk() ===>WEB-INF/board/listBoard.jsp

1) Mapper : O

	//글 목록갯수
		final String SELECT_CNT_ALL = "SELECT count(1) FROM SPRING_BOARD";
		//전체 글 갯수를 조회
		@Select(SELECT_CNT_ALL)
		int getTotalCnt();
		
		//글목록 - 일부 반환
		final String SELECT_PAGE=
				"SELECT * FROM (select a.*, ceil(rownum/ #{rowsPerPage}) as page "
				+ "FROM ( SELECT id, subject, name, created_date, mail, memo, hits "
				+ "FROM spring_board order by id desc )a )b WHERE b.page = #{page}";
		// #{속성} : preparedStatement , ${속성} : Statement
		//BoardBean 의 속성들과 동일한 이름으로 #{mail} 등을 지정해야 한다.
		@Select(SELECT_PAGE)
		@Results( id= "queryResult", value= {
				@Result(property = "id", column="ID"),
				@Result(property = "subject", column="SUBJECT"),
				@Result(property = "name", column="NAME"),
				@Result(property = "created_date", column="CREATED_DATE"),
				@Result(property = "mail", column="MAIL"),
				@Result(property = "memo", column="MEMO"),
				@Result(property = "hits", column="HITS")
		})
			ArrayList<BoardBean> getList(@Param("page") int page, @Param("rowsPerPage") int rowsPerPage);

2) Dao : O

	public int getTotalCnt() {
		// TODO Auto-generated method stub
		boardMapper.getTotalCnt();
		return boardMapper.getTotalCnt();
	}

	
	public ArrayList<BoardBean> getList(int nStartPage, int list_num) {
		// TODO Auto-generated method stub
		return boardMapper.getList(nStartPage, list_num);
	}

3) Service : O

	public int getTotalCnt() {
		// TODO Auto-generated method stub
		return boardDao.getTotalCnt();
	}

	
	public ArrayList<BoardBean> getList(int nStartPage, int list_num) {
		// TODO Auto-generated method stub
		return boardDao.getList(nStartPage, list_num);
	}

4) Controller : O

	//글목록
	@RequestMapping(value = "/listBoard.do", method = RequestMethod.GET)
	public String listBoard(Model model, @RequestParam("current_page") String current_page) {
		logger.debug("listBoard called!!!");
	      int totcnt = boardService.getTotalCnt();
	      ArrayList arraylist = boardService.getList(Integer.parseInt(current_page), 5);
	      model.addAttribute("totalCnt",totcnt);
	      model.addAttribute("current_page", current_page);//글을 작성후에는 처음 페이지로 돌아간다.
	      model.addAttribute("boardList", arraylist);
		
		return "listBoard";
	}

5) View(JSP) : O

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@taglib prefix="s" uri="http://www.springframework.org/tags"%>
<%@page session="false"%>
<%@page
	import="com.example.demo.BoardBean, java.util.ArrayList, java.util.Properties, java.io.IOException,
    java.io.FileInputStream, com.example.demo.PageNumberingManager "%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>목록</title>
</head>
<body>

	<c:set var="current_page" value="${current_page}" />
	<c:set var="total_cnt" value="${totalCnt}" />
	<%
		int c_page = Integer.parseInt((String) (pageContext.getAttribute("current_page")));
	pageContext.setAttribute("c_page", c_page);
	%>

	<table cellspacing=1 width=700 border=0>
		<tr>
			<td>총 게시물 수 <c:out value="${totalCnt}" /></td>
			<td><p align="right">
					페이지 :
					<c:out value="${current_page}" /></td>
		</tr>
	</table>

	<table cellspacing=1 width=700 border=1>
		<tr>
			<td width=50><p align="center">번호</p></td>
			<td width=100><p align="center">이름</p></td>
			<td width=320><p align="center">제목</p></td>
			<td width=100><p align="center">등록일</p></td>
			<td width=100><p align="center">조회수</p></td>
		</tr>

		<c:forEach var="board" items="${boardList}">
			<tr>
				<td width=50><p align="center">${board.id}</p></td>
				<td width=100><p align="center">${board.name}</p></td>
				<td width=320><p align="center">
<%-- 			<a href="viewWork.do?memo_id=${board.id}&current_page=
				<c:out value="${current_page}"/>&searchStr=None"title="${board.memo}"> --%>
				<a href="viewWork.do?memo_id=${board.id}&current_page=
				<c:out value="${current_page}"/>&searchStr=None"title="${board.memo}">
				<c:out value="${board.subject}" /></a></p></td>
				<td width=100><p align="center"><c:out value="${board.created_date}" />
					</p></td>
				<td width=100><p align="center"><c:out value="${board.hits}" />
					</p></td>
			</tr>
		</c:forEach>
		
		<!-- 페이징 -->
		<%
			int rowsPerPage =5; //가져올 데이터 갯수
		int total_cnt = ((Integer)(pageContext.getAttribute("total_cnt"))).intValue();
		
		//전체 페이지
		int total_pages = PageNumberingManager.getInstance().getTotalPage(total_cnt, rowsPerPage);
		pageContext.setAttribute("t_pages",total_pages);
		%>
	</table>
	
<table cellspacing=1 width=700 border=1 >
	<tr>
	<td align="center">
	<c:forEach var="i" begin="1" end="${t_pages}">
	<a href="listBoard.do?current_page=${i}">
	[
	<b><c:if test="${i==c_page}"></c:if>
	${i}
	<c:if test="${i==c_page}"></c:if></b>
	]</a>
	</c:forEach>
	</td>
	</tr>
	</table>
	
	<table width=700>
	<tr>
	<td><input type="button" value="글쓰기" onclick="window.location='writeBoard.do'"></td>
	<td><form name="searchString" method="post" action="searchWithSubject.do">
	<p align="center"><input type="Text" name="searchStr" size="50" maxlength="50">
	<input type="submit" value="글찾기"></p></form>
</td>
</tr>	
	</table>

</body>
</html>

 

3. 글보기

매핑계획 /boardviewBoard.do(GET방식) ===> writeBoard() ===>WEB-INF/board/viewBoard.jsp 

1) Mapper : O

		//글 보기
		final String SELECT_BY_ID = "SELECT id, subject, name, created_date, mail, memo, hits "
				+ " FROM spring_board where id=#{id}";
		
		@Select(SELECT_BY_ID)
		@ResultMap("queryResult") //위에사용한 @Results 에 id를 만들어놓으면 다음과같이 재사용할수있다.
		BoardBean getView(@Param("id") String id);

2) Dao : O

	public BoardBean getView(String id) {
		// TODO Auto-generated method stub
		// 조회수증가
		boardMapper.hitup(id);
		return boardMapper.getView(id);
	}

3) Service : O

	public BoardBean getView(String id) { 
		// TODO Auto-generated method stub
		return boardDao.getView(id);
	}

4) Controller : O

	   @RequestMapping(value = "/viewBoard.do", method = RequestMethod.GET)
	   public String viewBoard(
			   @RequestParam("memo_id") String memo_id,
			   @RequestParam("current_page") String current_page,
			   @RequestParam("searchStr") String searchStr,
			   Model model
			   ) {
		   logger.info("viewWork called!");
		   BoardBean boardBean = boardService.getView(memo_id);
		   
		   model.addAttribute("memo_id",memo_id);
		   model.addAttribute("current_page",current_page);
		   model.addAttribute("searchStr",searchStr);
		   model.addAttribute("boardBean",boardBean);
		   return "viewBoard";

5) view : viewBoard.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <c:set var="memo_id" value="${memo_id}"/>
    <c:set var="current_page" value="${current_page}"/>
    <c:set var="searchStr" value="${searchStr}"/>
    

<html>
<head>
<meta charset="UTF-8">
<title>글보기</title>
</head>

<%
String searchStr = (String) (pageContext.getAttribute("searchStr"));
%>
<script type="text/javascript">
function boardlist(){
	var s = "<%=searchStr%>"
	if(s=="None")
		location.href='/board/listBoard.do?current_page=${current_page}';
	else
location.href='/board/listSearchBoard.do?current_page=${current_page}&searchStr=${searchStr}';
		}

function boardmodify(){
location.href='/board/updateBoard.do?memo_id=${memo_id}&current_page=${current_page}';
		}
		
function boarddelete(){
location.href='/board/deleteBoard.do?memo_id=${memo_id}&current_page=${current_page}';
		}
</script>

<table cellspacing=0 cellpadding=5 border=1 width=500>
<tr><td><b>조회수</b></td><td><c:out value="${boardBean.hits}"/></td></tr>
<tr><td><b>이름</b></td><td><c:out value="${boardBean.name}"/></td></tr>
<tr><td><b>이메일</b></td><td><c:out value="${boardBean.mail}"/></td></tr>
<tr><td><b>제목</b></td><td><c:out value="${boardBean.subject}"/></td></tr>
<tr><td><b>내용</b></td><td width=350><c:out value="${boardBean.memo}"/></td></tr>
</table>
<table cellspacing=0 cellpadding=0 border=0 width=500>
<tr><td>
<input type="button" value="수정" onclick="javascript:boardmodify()">
<input type="button" value="목록" onclick="javascript:boardlist()">
<input type="button" value="삭제" onclick="javascript:boarddelete()">
</td></tr>
</table>

</html>

4-1. 글수정폼

매핑계획 /updateBoard.do(GET방식) ===> getEditView() ===>WEB-INF/board/updateBoard.jsp 

1) Mapper : O

		//글수정
		final String UPDATE_BY_ID = "UPDATE spring_board set subject = #{subject}, mail = #{mail}, "
				+ "memo = #{memo} WHERE id=#{id}";
		@Update(UPDATE_BY_ID)
		void updateBoard(BoardBean boardBean);

2) Dao : O

	public BoardBean getEditView(String id) {
		// TODO Auto-generated method stub
		return boardMapper.getView(id);
	}

3) Service : O

	public BoardBean getEditView(String id) {
		// TODO Auto-generated method stub
		return boardDao.getEditView(id);
	}

4) Controller : O

	   //글수정. 특정페이지 수정을 위한 내용 출력 폼
	   @RequestMapping(value = "/updateBoard.do", method = RequestMethod.GET)
	   public String updateBoard(
			   @RequestParam("memo_id") String memo_id,
			   @RequestParam("current_page") String current_page,
			   Model model
			   ) {
		   logger.info("updateBoard called!");
		   BoardBean boardBean = boardService.getEditView(memo_id);

		   model.addAttribute("memo_id",memo_id);
		   model.addAttribute("current_page", current_page);
		   model.addAttribute("boardBean", boardBean);
		   return "updateBoard";
	   }

5) view --updateBoard.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    <%@page import="java.io.*, java.text.*" %>
    <%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
    <%@taglib uri="http://www.springframework.org/tags/form" prefix="sf"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<script language="javascript">
function writeCheck(){
	var form = document.modifyform;
	if(!form.dbsubject.value){
		alert("제목을 적어주세요");
		form.dbsubject.focus();
		return;
	}
	if(!form.dbmemo.value){
		alert("내용을 적어주세요");
		form.dbmemo.focus();
		return;
	}
	form.submit();
}
function boardlist(){
	location.href='/board/listBoard.do?current_page=${current_page}';
}
</script>

<meta charset="UTF-8">
<title>글수정하기</title>
</head>
<body>
<c:url var="updateUrl" value="updateBoardOk.do"/>
<sf:form modelAttribute="boardBean" method="POST" action="${updateUrl}">
<table width=400 border=1 cellspacing=0 cellpadding=5>
<%--modelAttribute로 데이터를 넘기는데, 추가적인 정보를 넘기기위해서 hidden field를 사용함--%>
<input type="hidden" name="memo_id" value="${memo_id}">
<input type="hidden" name="current_page" value="${current_page}">
<tr>

<td><b>이름</b></td>
<%--이름은 readonly 처리 --%>
<td><sf:input readonly="true" path="name" size="50" maxlength="50"/>&nbsp;
<sf:errors path="name" cssClass="error"/><br></td>
</tr>
<tr>
<td><b>이메일</b></td>
<td><sf:input path="mail" size="50" maxlength="50"/>&nbsp;
<sf:errors path="mail" cssClass="error"/><br></td>
</tr>
<tr>
<td><b>제목</b></td>
<td><sf:input path="subject" size="50" maxlength="50"/>&nbsp;
<sf:errors path="subject" cssClass="error"/><br></td>
</tr>
<tr>
<td><b>내용</b></td>
<td><sf:textarea path="memo" size="200" cssStyle="width:350px; height:100px;" maxlength="200"/>&nbsp;
<sf:errors path="memo" cssClass="error"/><br></td>
</tr>
</table>

<table>
<tr>
<td><input type="submit" value="수정하기">
<input type="button" value="목록" onclick="javascript:boardlist()">
</td>
</tr>
</table>
</sf:form>

</body>
</html>

4-2 글수정처리

매핑계획 /updateBoard.do(GET방식) ===> updateBoard() ===>WEB-INF/board/updateBoardOk.jsp 

1) Mapper : O

		//글수정
		final String UPDATE_BY_ID = "UPDATE spring_board set subject = #{subject}, mail = #{mail}, "
				+ "memo = #{memo} WHERE id=#{id}";
		@Update(UPDATE_BY_ID)
		void updateBoard(BoardBean boardBean);

2) Dao : O

	public void updateBoard(BoardBean boardBean) {
		// TODO Auto-generated method stub
		boardMapper.updateBoard(boardBean);
	}

3) Service : O

	public void updateBoard(BoardBean boardBean) {
		// TODO Auto-generated method stub
		boardDao.updateBoard(boardBean);
		
	}

4) Controller : O

	   //글수정. 특정페이지 수정을 위한 내용 출력 폼
	   @RequestMapping(value = "/updateBoardOk.do", method = RequestMethod.POST)
	   public String updateBoardOk(
			   BoardBean boardBean,
			   @RequestParam("memo_id") int memo_id,
			   @RequestParam("current_page") String current_page,
			   Model model
			   ) {
		   logger.info("updateBoardOk called!");
		   boardBean.setId(memo_id);
		   boardService.updateBoard(boardBean);
		   model.addAttribute("current_page", current_page);
		   model.addAttribute("memo_id", memo_id);
		   return "updateBoardOk";
	   }

5) view -- updateBoardOk.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    <%@taglib prefix="sf" uri="http://www.springframework.org/tags/form" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Context-Type" content="text/html" charset="UTF-8">
<meta http-equiv="refresh" content="3;url=/board/viewBoard.do?
memo_id=${memo_id}&current_page=${current_page}&searchStr=None">
<title>글수정처리</title>
</head>
<body>
<c:out value="${memo_id}"/>번 글이 수정되었습니다.
</body>
</html>

5. 글삭제

매핑계획 /deleteBoard.do(GET방식) ===> deleteBoard() ===>WEB-INF/board/deleteBoard.jsp 

1) Mapper : O

		// 글삭제
		final String DELETE_BY_ID = "DELETE FROM spring_board WHERE id=#{id}";

2) Dao : O

	public void deleteBoard(int id) {
		// TODO Auto-generated method stub
		boardMapper.deleteBoard(id);
	}

3) Service : O

	public void deleteBoard(int id) {
		// TODO Auto-generated method stub
		boardDao.deleteBoard(id);
	}

4) Controller : O

	   //글삭제 컨트롤파일 bbsController+ 매핑 @ 어노테이션 매핑을 사용함
	   @RequestMapping(value="/deleteBoard.do", method=RequestMethod.GET)
	   public String deleteBoard(
			   @RequestParam("memo_id") int memo_id,
			   @RequestParam("current_page") String current_page,
			   Model model) {
		   logger.info("deleteBoard called!");

		   boardService.deleteBoard(memo_id);
		   //페이지를 다시조회한다.
		   model.addAttribute("totalCnt", new Integer(boardService.getTotalCnt()));
		   model.addAttribute("current_page", current_page);
		   model.addAttribute("memo_id", memo_id);
		   
		   return "deleteBoard";
		   //글삭제는 뷰가 없다..근데 만듬
	   }

5) View --deleteBoard.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html" charset="UTF-8">
<meta http-equiv="refresh"
	content="3;url=/board/listBoard.do?
current_page=${current_page}&searchStr=None">
<title>글삭제</title>
</head>
<body>
	<c:out value="${memo_id}" />
	번 글이 삭제되었습니다.
</body>
</html>

6. 글검색

매핑계획 /boardviewBoard.do(GET방식) ===> writeBoard() ===>WEB-INF/board/viewBoard.jsp 

1) Mapper : O

		// 글검색 갯수
		final String SELECT_CNT_BY_SUBJECT = "select count(1) from spring_board where"
				+ " subject like '%'||'${searchThis}'||'%'";
                // 해당 주제의 관련글 갯수를 조회
		@Select(SELECT_CNT_BY_SUBJECT)
		int getTotalCntBySubject(@Param("searchThis") String includingThis);

		// 글검색
		final String SELECT_ROWS_BY_SUBJECT = "SELECT * FROM (select a.*, ceil(rownum/ #{rowsPerPage}) as page "
				+ "FROM ( SELECT id, subject, name, created_date, mail, memo, hits "
				+ "FROM spring_board where subject like '%'||'${likeThis}'||'%' "
				+ " order by id desc )a )b WHERE b.page = #{page}";

		// 해당 주제의 관련글 조회
		@Select(SELECT_ROWS_BY_SUBJECT)
		@ResultMap("queryResult")

		public ArrayList<BoardBean> getSearchedList(@Param("page") int page, @Param("rowsPerPage") int rowsPerPage,
				@Param("likeThis") String strSearchThis);

2) Dao : O

	public int getTotalCntBySubject(String search) {
		// TODO Auto-generated method stub
		return boardMapper.getTotalCntBySubject(search);
	}

	public ArrayList<BoardBean> getSearchedList(int nStartPage, int list_num, String strSearchThis) {
		// TODO Auto-generated method stub
		return boardMapper.getSearchedList(nStartPage, list_num, strSearchThis);
	}

3) Service : O

	public int getTotalCntBySubject(String search) {
		// TODO Auto-generated method stub
		return boardDao.getTotalCntBySubject(search);
	}

	public ArrayList<BoardBean> getSearchedList(int nStartPage, int list_num, String strSearchThis) {
		// TODO Auto-generated method stub
		return boardDao.getSearchedList(nStartPage, list_num, strSearchThis);
	}

4) Controller : O

	   //글검색 메소드를 지정하지않으면 POST,GET 둘다 가능하다
	   @RequestMapping(value="/listSearchBoard.do", method = RequestMethod.POST)
	   public String listSearchBoard(@RequestParam("searchStr") String searchStr, Model model) {
		   //redirect
		   return listSearched("1", searchStr, model); //처음에는 1페이지만 보여줌
	   }
	   //검색된 상태에서 특정 페이지로 이동하기
	   @RequestMapping(value="/listSearchBoard.do", method=RequestMethod.GET)
	   public String listSearched(
			   @RequestParam("pageForView")String pageForView,
			   @RequestParam("searchStr") String searchStr,
			   Model model) {
		   logger.info("listSearched called!");

		   // 익스플로러에서 주소부분 인코딩때문에
//		   String searchStr2="";
//		   try {
//			searchStr2 = URLDecoder.decode(searchStr,"EUC-KR");
//		} catch (UnsupportedEncodingException e) {
//			// TODO Auto-generated catch block
//			e.printStackTrace();
//		}
//		   
//		   int searchCnt = boardService.getTotalCntBySubject(searchStr2);
//		   ArrayList searchList = boardService.getSearchedList(pageForView, 5, searchStr2);
//		   
//		   model.addAttribute("searchCnt", searchCnt);
	
//		   try {
//				searchStr = URLEncoder.encode(searchStr,"EUC-KR");
//			} catch (UnsupportedEncodingException e) {
//				// TODO Auto-generated catch block
//				e.printStackTrace();
//			}
//			model.addAttribute("searchStr",searchStr) ; // 페이징 때문에 계속 몰고 다닌다. 
//			model.addAttribute("pageForView",pageForView) ; 
//			model.addAttribute("boardList",searchList) ; 
//			
//			return "searchBoard";
//		}
		   
		   model.addAttribute("totalCnt", new Integer(boardService.getTotalCntBySubject(searchStr)));
		   model.addAttribute("searchedList", boardService.getSearchedList(Integer.parseInt(pageForView), 5, searchStr));
		   model.addAttribute("pageForView", Integer.parseInt(pageForView));
		   model.addAttribute("searchStr", searchStr);
		   

		   return "listSearchBoard";
	   
	   }

5. View -- listSearchBoard.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@taglib prefix="s" uri="http://www.springframework.org/tags"%>
<%@page session="false"%>
<%@page
	import="com.example.demo.BoardBean, java.util.ArrayList, java.util.Properties, java.io.IOException,
    java.io.FileInputStream, com.example.demo.PageNumberingManager "%>
<!DOCTYPE >
<html>
<head>
<meta charset="UTF-8">
<title>목록</title>
</head>
<body>


	<c:set var="total_cnt" value="${totalCnt}" />
	<c:set var="searchString" value="${searchStr}" />
	<c:set var="pageForView" value="${pageForView}" />
	<%
	int total_cnt = ((Integer)(pageContext.getAttribute("total_cnt"))).intValue();
	String searchStr = (String)pageContext.getAttribute("searchString");
	int rowsPerPage =5;
	int total_pages = PageNumberingManager.getInstance().getTotalPage(total_cnt, rowsPerPage);
	pageContext.setAttribute("t_pages", total_pages);
	%>

	<table cellspacing=1 width=700 border=0>
		<tr>
			<td>총 게시물 수 <c:out value="${totalCnt}" /></td>
			<td><p align="right">
					페이지 :
					<c:out value="${t_pages}" /></td>
		</tr>
	</table>

	<table cellspacing=1 width=700 border=1>
		<tr>
			<td width=50><p align="center">번호</p></td>
			<td width=100><p align="center">이름</p></td>
			<td width=320><p align="center">제목</p></td>
			<td width=100><p align="center">등록일</p></td>
			<td width=100><p align="center">조회수</p></td>
		</tr>

		<c:forEach var="board" items="${searchedList}">
			<tr>
				<td width=50><p align="center">${board.id}</p></td>
				<td width=100><p align="center">${board.name}</p></td>
				<td width=320><p align="center">
<%-- 			<a href="viewWork.do?memo_id=${board.id}&current_page=
				<c:out value="${current_page}"/>&searchStr=None"title="${board.memo}"> --%>
				<a href="viewBoard.do?memo_id=${board.id}&current_page=
				<c:out value="${current_page}"/>&searchStr=None"title="${board.memo}">
				<c:out value="${board.subject}" /></a></p></td>
				<td width=100><p align="center"><c:out value="${board.created_date}" />
					</p></td>
				<td width=100><p align="center"><c:out value="${board.hits}" />
					</p></td>
			</tr>
		</c:forEach>


	</table>
	
<table cellspacing=1 width=700 border=1 >
	<tr>
	<td align="center">
	<c:forEach var="i" begin="1" end="${t_pages}">
	<a href="listSearchBoard.do?pageForView=${i}&searchStr=<c:out value="${searchStr}"/>">
	[
	<b><c:if test="${i==c_page}"></c:if>
	${i}
	<c:if test="${i==c_page}"></c:if></b>
	]</a>
	</c:forEach>
	</td>
	</tr>
	</table>
	
	<table width=700>
	<tr>
	<td><input type="button" value="전체목록으로돌아가기" onclick="window.location='listBoard.do?current_page=1'"></td>

</tr>	
	</table>

</body>
</html>