[Spring] Controller에서 발생하는 Exception의 처리

username-bb·2021년 11월 25일
0

목차

  1. 방법이야 여러가지가 있겠지만...
  2. 이렇게 작성해보았다...
  3. 도움을 주신 훌륭한 블로그...


OJT 프로젝트를 진행하는데...Controller에서 발생하는 Exception 처리에 대해 피드백을 받았다.
Error Page를 설정해둬서 어차피 Exception이 발생해도 클라이언트에겐 제대로 안내되겠지만... 그것과는 별개로 Exception 자체를 핸들링 할 필요가 있다! 라는 내용이었다.
@ModelAttribute와 @RequestParam의 차이와도 관련이 있는 피드백이었는데... 이것에 대해선 다른 포스팅으로 정리해보도록 하고 이번에는 Controller에서 발생하는 Exception처리를 해보자

1. 방법이야 여러가지가 있겠지만...


나는 Exception을 처리해주는 Controller같은 친구를 이용해보기로 했다. 이 친구는 @ControllerAdvice로 구현할 수가 있는데 정확하게 어떤 친구인지는 별도로 공부해보아야할 거 같다.

@ExceptionHandler가 아니라 굳이 이 친구를 사용한 이유는 (1) 모든 Controller에 일괄 적용할 수 있어서 (2) 유지보수가 편리 하기 때문이었다.


2. 이렇게 작성해보았다...


  • 게시판 Controller.java
//	커뮤니티 리스트 페이지 요청
	@RequestMapping("list.cm")
	public String getCommuList(Model model, @ModelAttribute("currentPage") int currentPage) throws Exception {
		
		// int currentPage = 현재 페이지 위치
		// main page에서 넘어왔을 경우 1임.
		
		//전체 데이터 갯수 확인
		int total = communityService.countTotal();
		
		//한 페이지에 게시글 10개씩, 하단의 페이징은 5개까지 한다.
		PageInfo pageInfo = Pagination.getPageInfo(total, currentPage, 5, 10);
		
		//페이징에 맞춰서 게시글 리스트를 가져온다
		List<Community> list = communityService.getCommunityList(pageInfo);

		//게시글 리스트와 페이지 관련 정보 전달
		model.addAttribute("commuList", list);
		model.addAttribute("pageInfo", pageInfo);
		
		throw new Exception();
		
		//return "/community/commuList";
	}

  • ExceptionController.java
package com.XXX.YYY.common.controller;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;

@ControllerAdvice
public class ExceptionController {
	
	//@ControllerAdvice
	//모든 controller에서 발생하는 exception을 이 친구가 처리함
	
	//개별 Controller에서 @ExceptionHandler 를 이용할 수도 있지만
	//(1)일괄 적용 (2)유지보수의 용이성을 위해 Exception Controller를 사용했다.

	
	private static final Logger logger = LoggerFactory.getLogger(ExceptionController.class);

	
	//{}안의 Exception을 처리하는 method(단일/다수 모두 가능)
	//원래는 400, 500 등등 에러 코드 별로, Exception을 나눠서 선언해주는 것 같다.(SQLException.class, NullPointerException.class 등등...)
	//각 코드 마다 return 할 HttpStatus를 다르게 해서 return할 수도 있지만
	//예) return new ResponseEntity<>("ExceptionController: "+e.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR);
	//여기서는 그냥 error page로 return 한다.(redirect XXX)
	//에러가 발생하면 이 코드에서 catch하기 때문에 web.xml에 설정해놓은 error page Mapping이 적용 안되는 듯??
	//(이 친구가 우선 순위를 가진 듯????)
	//그래서 mapping에 주의를 기울여야함
	@ExceptionHandler({Exception.class})
	public String exceptionAll(Exception e) {
		
		logger.error("ExceptionController: "+e.getMessage());
		e.printStackTrace();
		
		return "/common/errorPage";
	}
	
}

3. 도움을 주신 훌륭한 블로그...


  1. https://jaehun2841.github.io/2018/08/30/2018-08-25-spring-mvc-handle-exception/
  2. https://velog.io/@aidenshin/Spring-Boot-Exception-Controller
  3. https://jeong-pro.tistory.com/195
profile
공부하는 주니어

0개의 댓글