0

[Spring MVC] 게시판 Controller #8

Last Updated: 2022년 12월 14일

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

}