ModelAndView 를 하며 메서드를 익히던 중에 Controller annotation 방식을 배우게 되었는데 훨씬 쉽고 귀찮은 메서드 안 사용해도 되고 직관적으로 session 에 저장할 수 있어서 쉬운 @Controller 방식을 배우게 되었다.
Controller 사용법을 정리해 보자.
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd">
<context:annotation-config/>
<bean id="viewResolver"
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="WEB-INF/board/"/>
<property name="suffix" value=".jsp"/>
</bean>
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="oracle.jdbc.driver.OracleDriver" />
<property name="url" value="jdbc:oracle:thin:@localhost:1521:xe" />
<property name="username" value="fin01" />
<property name="password" value="fin01" />
</bean>
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource">
<ref bean="dataSource"/>
</property>
</bean>
<bean id="boardDAO" class="board.dao.BoardDAOImpl">
<property name="jdbcTemplate" ref="jdbcTemplate"/>
</bean>
<bean class="board.controller.BoardController"/>
</beans>
이 중에서 컨트롤러를 등록해 주는 부분은
<bean class="board.controller.BoardController"/>
이렇게 짧은 부분이다. 그럼 Controller 에 DAO 를 Auto 주입해 보자.
springBoard-servlet.xml 파일 하단에 보면 Namespaces 라는 부분이 있다.
그 부분에서 context 를 추가해 준다. 이후 xml 파일의 가장 상단을 확인하면
xmlns:context
부분이 추가 되어 있다.
그리고 자동 등록을 위해 xml 시작 부분에
<context:annotation-config/>
를 추가해 준다.
eclipse 에서 보면 이렇다.
이렇게 하면 DAO 의 자동 추가는 끝난다.
그리고 boardController 에 미리 계획한 이름대로 BoardController를 만들어 주는데 아무것도 상속받지 않아도 된다. 우리는 Annotation으로 이게 Controller라는 사실을 알려줄 것이기 때문이다.
⭐ Annotation
어노테이션은 코드에 메타데이터를 제공하는 데 사용되며, 주로 컴파일러, 런타임, 또는 개발 도구에게 정보를 제공하는 데 활용된다.
우리가 아는 가장 쉬운 예로 @Override Annotation 이 존재한다.@Override public void myMethod() { // 재정의된 메소드 내용 }
아래 메서드는 그냥... 이전이랑 아예 똑같이 쓰면 되고 특이사항만 추가한다.
@Autowired
private BoardDAO boardDAO;
의존성 주입.
이렇게 Autowired 로 챙겨 써 주면 자동으로 autowired 어노테이션으로 DAO를 받아 준다.
@RequestMapping("/list_board.do")
public String listBoard(HttpServletRequest req, @RequestParam(required=false) String pageNum
) {
int pageSize = 5;
String pageNum = req.getParameter("pageNum");
if (pageNum == null) {
pageNum = "1";
}
@RequestParam(required=false)
이 부분은 pageNum 이 null값이어도 넘어가는 부분이다.
@RequestMapping(value="/write_board.do", method=RequestMethod.GET)
public String writeForm_board() {
return "writeForm";
}
@RequestMapping(value="/write_board.do", method=RequestMethod.POST)
public String writePro_board(HttpServletRequest req,
@ModelAttribute BoardDTO dto, BindingResult result) {
if (result.hasErrors()) {
dto.setNum(0);
dto.setRe_step(0);
dto.setRe_level(0);
}
dto.setIp(req.getRemoteAddr());
int res = boardDAO.insertBoard(dto);
if (res>0) {
req.setAttribute("msg", "게시글 등록 성공!! 게시글 목록 페이지로 이동합니다.");
req.setAttribute("url", "list_board.do");
}else {
req.setAttribute("msg", "게시글 등록 실패!! 게시글 등록 페이지로 이동합니다.");
req.setAttribute("url", "write_board.do");
}
return "forward:message.jsp";
}
이렇게 하면 GET 값 들어왔을 땐 이동만, Post 값 들어왔을 땐 처리를 해 줘서 하나의 경로로 쉽게 갈 수 있음
@RequestMapping(value="/write_board.do", method=RequestMethod.POST)
public String writePro_board(HttpServletRequest req,
@ModelAttribute BoardDTO dto, BindingResult result) {
if (result.hasErrors()) {
dto.setNum(0);
dto.setRe_step(0);
dto.setRe_level(0);
}
dto.setIp(req.getRemoteAddr());
int res = boardDAO.insertBoard(dto);
if (res>0) {
req.setAttribute("msg", "게시글 등록 성공!! 게시글 목록 페이지로 이동합니다.");
req.setAttribute("url", "list_board.do");
}else {
req.setAttribute("msg", "게시글 등록 실패!! 게시글 등록 페이지로 이동합니다.");
req.setAttribute("url", "write_board.do");
}
return "forward:message.jsp";
}
⭐ 오류 받아줄 때는 @ModelAttribute BoardDTO dto
ModelAttribute 어노테이션 생략 불가
@RequestMapping(value="/delete_board.do", method=RequestMethod.POST)
public String deletePro_board(HttpServletRequest req,
@RequestParam Map<String, String> params) {
int res = boardDAO.deleteBoard
(Integer.parseInt(params.get("num")), params.get("passwd"));
if (res>0) {
req.setAttribute("msg", "게시글 삭제 성공!! 게시글 목록 페이지로 이동합니다.");
req.setAttribute("url", "list_board.do");
}else if (res<0){
req.setAttribute("msg", "비밀번호가 틀렸습니다. 다시 입력해 주세요");
req.setAttribute("url", "deleteForm_board.do?num="+params.get("num"));
}else {
req.setAttribute("msg", "게시글 삭제 실패!! 게시글 보기 페이지로 이동합니다.");
req.setAttribute("url", "content_board.do?num="+params.get("num"));
}
return "forward:message.jsp";
}
package board.controller;
import board.dao.*;
import board.dto.BoardDTO;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.ModelAttribute;
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;
@Controller
public class BoardController {
@Autowired
private BoardDAO boardDAO;
@RequestMapping("/list_board.do")
public String listBoard(HttpServletRequest req,
@RequestParam(required=false) String pageNum) {
int pageSize = 5;
if (pageNum == null) pageNum = "1";
int currentPage = (Integer.parseInt(pageNum));
int startRow = (currentPage-1) * pageSize + 1;
int endRow = startRow + pageSize - 1;
int count = boardDAO.getCount();
if (endRow > count) endRow = count;
List<BoardDTO> list = boardDAO.listBoard(startRow, endRow);
req.setAttribute("listBoard", list);
int number = count - startRow + 1;
int pageBlock = 3;
int pageCount = count/pageSize + (count%pageSize == 0 ? 0 : 1);
int startPage = (currentPage-1)/pageBlock * pageBlock + 1;
int endPage = startPage + pageBlock - 1;
if (endPage > pageCount) endPage = pageCount;
req.setAttribute("number", number);
req.setAttribute("count", count);
req.setAttribute("pageBlock", pageBlock);
req.setAttribute("pageCount", pageCount);
req.setAttribute("startPage", startPage);
req.setAttribute("endPage", endPage);
return "list";
}
@RequestMapping(value="/write_board.do", method=RequestMethod.GET)
public String writeForm_board() {
return "writeForm";
}
@RequestMapping(value="/write_board.do", method=RequestMethod.POST)
public String writePro_board(HttpServletRequest req,
@ModelAttribute BoardDTO dto, BindingResult result) {
if (result.hasErrors()) {
dto.setNum(0);
dto.setRe_step(0);
dto.setRe_level(0);
}
dto.setIp(req.getRemoteAddr());
int res = boardDAO.insertBoard(dto);
if (res>0) {
req.setAttribute("msg", "게시글 등록 성공!! 게시글 목록 페이지로 이동합니다.");
req.setAttribute("url", "list_board.do");
}else {
req.setAttribute("msg", "게시글 등록 실패!! 게시글 등록 페이지로 이동합니다.");
req.setAttribute("url", "write_board.do");
}
return "forward:message.jsp";
}
@RequestMapping("/content_board.do")
public String content_board(HttpServletRequest req, int num) {
BoardDTO dto = boardDAO.getBoard(num, "content");
req.setAttribute("getBoard", dto);
return "content";
}
@RequestMapping(value="/delete_board.do", method=RequestMethod.GET)
public String deleteForm_board() {
return "deleteForm";
}
@RequestMapping(value="/delete_board.do", method=RequestMethod.POST)
public String deletePro_board(HttpServletRequest req,
@RequestParam Map<String, String> params) {
int res = boardDAO.deleteBoard
(Integer.parseInt(params.get("num")), params.get("passwd"));
if (res>0) {
req.setAttribute("msg", "게시글 삭제 성공!! 게시글 목록 페이지로 이동합니다.");
req.setAttribute("url", "list_board.do");
}else if (res<0){
req.setAttribute("msg", "비밀번호가 틀렸습니다. 다시 입력해 주세요");
req.setAttribute("url", "deleteForm_board.do?num="+params.get("num"));
}else {
req.setAttribute("msg", "게시글 삭제 실패!! 게시글 보기 페이지로 이동합니다.");
req.setAttribute("url", "content_board.do?num="+params.get("num"));
}
return "forward:message.jsp";
}
@RequestMapping(value="/update_board.do", method=RequestMethod.GET)
public String updateForm_board(HttpServletRequest req, int num) {
BoardDTO dto = boardDAO.getBoard(num, "update");
req.setAttribute("getBoard", dto);
return "updateForm";
}
@RequestMapping(value="/update_board.do", method=RequestMethod.POST)
public String updatePro_board(HttpServletRequest req, BoardDTO dto) {
int res = boardDAO.updateBoard(dto);
if (res>0) {
req.setAttribute("msg", "게시글 수정 성공!! 게시글 목록 페이지로 이동합니다.");
req.setAttribute("url", "list_board.do");
}else if (res<0){
req.setAttribute("msg", "비밀번호가 틀렸습니다. 다시 입력해 주세요");
req.setAttribute("url", "updateForm_board.do?num="+dto.getNum());
}else {
req.setAttribute("msg", "게시글 수정 실패!! 게시글 보기 페이지로 이동합니다.");
req.setAttribute("url", "content_board.do?num="+dto.getNum());
}
return "forward:message.jsp";
}
@RequestMapping("/find_board.do")
public String writeProBoard(HttpServletRequest req) {
String search = req.getParameter("search");
String searchString = req.getParameter("searchString");
int pageSize = 5;
String pageNum = req.getParameter("pageNum");
if (pageNum == null) {
pageNum = "1";
}
int currentPage = (Integer.parseInt(pageNum));
int startRow = (currentPage-1) * pageSize + 1;
int endRow = startRow + pageSize - 1;
int count = 0;
int number = 0;
List<BoardDTO> list = null;
try{
if (search == null) {
count = boardDAO.getCount();
if (endRow > count) endRow = count;
list = boardDAO.listBoard(startRow, endRow);
number = count - startRow + 1;
}else {
list = boardDAO.findBoard(search, searchString);
number = list.size();
}
}catch(Exception e) {
e.printStackTrace();
req.setAttribute("msg", "DB서버 오류 발생!! 관리자에게 문의해 주세요");
req.setAttribute("url", "index.do");
return "message.jsp";
}
int pageBlock = 3;
int pageCount = count/pageSize + (count%pageSize == 0 ? 0 : 1);
int startPage = (currentPage-1)/pageBlock * pageBlock + 1;
int endPage = startPage + pageBlock - 1;
if (endPage > pageCount) endPage = pageCount;
req.setAttribute("number", number);
req.setAttribute("count", count);
req.setAttribute("pageBlock", pageBlock);
req.setAttribute("pageCount", pageCount);
req.setAttribute("startPage", startPage);
req.setAttribute("endPage", endPage);
req.setAttribute("listBoard", list);
return "list";
}
}