[Spring MVC] 게시판 Controller #8
Last Updated: 2025년 07월 18일
url 주소에 따른 기능 구현 및 페이지 설정을 한다.
출처: 내 컴퓨터
BoardController.java
package kr.co.narrator.board.controller;
import java.util.List;
import javax.inject.Inject;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import javax.validation.Valid;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import kr.co.narrator.board.common.PageMaker;
import kr.co.narrator.board.common.SearchCriteria;
import kr.co.narrator.board.dto.BoardDTO;
import kr.co.narrator.board.service.BoardService;
@Controller
@RequestMapping("/board/*")
public class BoardController {
private static final Logger logger = LoggerFactory.getLogger(BoardController.class);
// 의존관계 주입 -> BoardServiceImpl 생성
@Inject
BoardService boardService;
// 예외처리, DB에서 발생하는 에러처리
@ExceptionHandler(RuntimeException.class)
public String exceptionHandler(Model model, Exception e) {
logger.info("exception : " + e.getMessage());
model.addAttribute("exception", e);
return "error/exception";
}
/** 게시판 리스트 페이징+검색 */
@RequestMapping(value = "/boardList", method = RequestMethod.GET)
public String boardList(SearchCriteria cri, Model model) throws Exception {
int count = boardService.boardListCnt(cri);
// 페이지 생성
PageMaker pageMaker = new PageMaker();
pageMaker.setCri(cri);
pageMaker.setTotalCount(count);
// 검색 조건과 페이지에 대한 정보를 리스트로 가져온다.
List<BoardDTO> boardList = boardService.boardList(cri);
model.addAttribute("boardList", boardList);
model.addAttribute("count", count);
model.addAttribute("searchType", cri.getSearchType());
model.addAttribute("keyword", cri.getKeyword());
model.addAttribute("pageMaker", pageMaker);
model.addAttribute("page", cri.getPage());
return "board/boardList";
}
// 게시판 조회
@RequestMapping(value = "/boardContent/{seq}", method = RequestMethod.GET)
public String boardContent(@ModelAttribute SearchCriteria cri, Model model, @PathVariable int seq)
throws Exception {
BoardDTO boardDTO = boardService.boardContent(seq);
//List<UploadFileVO> filesList = filesService.filesList(seq);
model.addAttribute("boardContent", boardDTO);
//model.addAttribute("filesList", filesList);
return "board/boardContent";
}
/** form 커스텀 태그 사용 : 바인딩을 위해 boardDTO 객체를 Model로 담아서 넘겨줌 */
@RequestMapping(value = "/boardForm", method = RequestMethod.GET)
public String boardForm(Model model) {
model.addAttribute("boardDTO", new BoardDTO());
return "/board/boardForm";
}
/**
* 게시글 작성 : 다중 업로드 버전 Hibernate-validator까지 처리한 코드
*/
@RequestMapping(value = "/boardForm", method = RequestMethod.POST)
// public String boardForm(@Valid BoardVO boardVO, BindingResult
// bindingResult, HttpSession session, MultipartHttpServletRequest
// mtfRequest, Model model) throws Exception {
public String boardForm(@Valid BoardDTO boardDTO, BindingResult bindingResult, HttpSession session,
HttpServletRequest request, Model model) throws Exception {
if (bindingResult.hasErrors()) {
return "/board/boardForm";
} else {
boardService.boardInsert(boardDTO, request);
logger.info("boardForm, POST : " + boardDTO);
return "redirect:/board/boardList";
}
}
}