[Spring] Spring Controller

·2023년 11월 27일
0

Spring

목록 보기
3/9
post-thumbnail

ModelAndView 를 하며 메서드를 익히던 중에 Controller annotation 방식을 배우게 되었는데 훨씬 쉽고 귀찮은 메서드 안 사용해도 되고 직관적으로 session 에 저장할 수 있어서 쉬운 @Controller 방식을 배우게 되었다.

Controller 사용법을 정리해 보자.

1. Controller 로 게시판 만들기

(1) 컨트롤러 클래스 등록해 주기

📌 springBoard-servlet.xml

<?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() {
    // 재정의된 메소드 내용
}

📌 BoardController.java

아래 메서드는 그냥... 이전이랑 아예 똑같이 쓰면 되고 특이사항만 추가한다.

📎 의존성 주입

@Autowired
	private BoardDAO boardDAO;  

의존성 주입.
이렇게 Autowired 로 챙겨 써 주면 자동으로 autowired 어노테이션으로 DAO를 받아 준다.

📎 Parameter 값 받기

	@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값이어도 넘어가는 부분이다.

📎 GET, POST 방식으로 나누어 받아주기

	@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 어노테이션 생략 불가

📎 Map으로 여러 파라미터 한 번에 받아주기

	@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";
	}

📎 BoardController.java

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";
	}
	
}
profile
자바 백엔드 개발자 개인 위키

0개의 댓글