1 ๋ถ„ ์†Œ์š”

๐Ÿ“š SPRING


๐Ÿ“š EXCEPTION

Spring Exception ์ฒ˜๋ฆฌ

๊ธฐ์กด Web MVC ์—์„œ๋Š” Exception ์ฒ˜๋ฆฌ๋Š” try ~ catch๋ฌธ์„ ์‚ฌ์šฉํ•˜๊ณ 
์—๋Ÿฌ์ฒ˜๋ฆฌ๋Š” web.xml์— error-code ๊ตฌ๋ฌธ์„ ์ด์šฉํ•ด์„œ error๊ฐ€ ๋‚ฌ์„ ๋•Œ jsp๋กœ ๋ณด๋‚ด์„œ ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์ฃผ์—ˆ๋‹ค.

Spring์—์„œ์˜ Exception ์ฒ˜๋ฆฌ๋Š” ํฌ๊ฒŒ 3๊ฐ€์ง€๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๋‹ค.
Spring์—์„œ๋Š” DispatcherServlet์—์„œ ๊ฑฐ์˜ 99% ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜๊ธฐ ๋•Œ๋ฌธ์— DispatcherServlet ์—์„œ HandlerExceptionResolver๊ฐ€ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•๋“ค์ด๋ผ ํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ทธ์ „์— Exception ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•œ ์„ค์ •์„ ๋ณด์—ฌ์ฃผ๊ฒ ๋‹ค.
Web.xml ์— ์ž‘์„ฑ

<servlet>
	<init-param>
			<param-name>throwExceptionIfNoHandlerFound</param-name>
			<param-value>true</param-value>
	</init-param>
</servlet>


์œ„ ๊ตฌ๋ฌธ์€ error ( NoHandlerFound - 404 error )๋ฅผ exception์œผ๋กœ ๋ฐ”๊ฟ”์ค„๊ฒŒ ๋ผ๋Š” ์˜๋ฏธ๋กœ ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค.

  • Controller ๋‹จ์—์„œ์˜ ์ฒ˜๋ฆฌ
    Controller Level = @ExceptionHandler
  • ์ „์—ญ ์ฒ˜๋ฆฌ
    Global Level = @ControllerAdvice
  • method ๋‹จ์œ„ ์ฒ˜๋ฆฌ
    Method Level = try ~ catch



Controller ๋‹จ์—์„œ์˜ ์ฒ˜๋ฆฌ

@ExceptionHandler annotation์„ ํ†ตํ•ด ์ฒ˜๋ฆฌ

@Controller
public class TestController{

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

    @ExceptionHandler(Exception.class)
	public String handleException(Exception ex, Model model) {
		logger.error("Exception ๋ฐœ์ƒ : {}", ex.getMessage());
		model.addAttribute("msg", "์ฒ˜๋ฆฌ์ค‘ ์—๋Ÿฌ ๋ฐœ์ƒ!!!");
		return "error/error";
	}
}


TestController ๋‚ด์—์„œ ๋ฐœ์ƒํ•˜๋Š” Exception์— ๋Œ€ํ•œ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด handleException ๋ฉ”์„œ๋“œ๊ฐ€ ๋ชจ๋‘ ์ฒ˜๋ฆฌํ•ด์ค€๋‹ค.
๊ทธ๋Ÿฌ๋‚˜ ์ด ์˜ˆ์™ธ์ฒ˜๋ฆฌ๋Š” ์„ ์–ธ๋œ Controller์—์„œ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
๊ทธ๋ž˜์„œ ๋‹ค๋ฅธ Controller์—์„œ ๊ฐ™์€ ์ž‘์—…์„ ๋ฐ˜๋ณตํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

์ „์—ญ ์ฒ˜๋ฆฌ

์™ธ๋ถ€ class๋กœ ๋นผ์„œ @ControllerAdvice annotation์„ ํ†ตํ•ด ์ฒ˜๋ฆฌ
๋ชจ๋“  Controller์—์„œ ๋ฐœ์ƒํ•˜๋Š” ์˜ˆ์™ธ๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

@ControllerAdvice
public class ExceptionControllerAdvice {

	private Logger logger = LoggerFactory.getLogger(ExceptionControllerAdvice.class);
	
	@ExceptionHandler(Exception.class)
	public String handleException(Exception ex, Model model) {
		logger.error("Exception ๋ฐœ์ƒ : {}", ex.getMessage());
		model.addAttribute("msg", "์ฒ˜๋ฆฌ์ค‘ ์—๋Ÿฌ ๋ฐœ์ƒ!!!");
		return "error/error";
	}
	
	@ExceptionHandler(NoHandlerFoundException.class)
	@ResponseStatus(value = HttpStatus.NOT_FOUND)
	public String handle404(NoHandlerFoundException ex, Model model) {
		logger.error("404 ๋ฐœ์ƒ : {}", "404 page not found");
		model.addAttribute("msg", "ํ•ด๋‹น ํŽ˜์ด์ง€๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค!!!");
		return "error/error";
	}
}


์ผ๋ฐ˜์ ์ธ Controller ์—์„œ๋Š” @ControllerAdvice ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  Rest์—์„œ๋Š” @RestControllerAdvice ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
์œ„ ์ฝ”๋“œ์—์„œ๋Š” Exception ( ์ตœ์ƒ์œ„ ๊ฐ์ฒด )๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด handleException ๋ฉ”์„œ๋“œ๋ฅผ ์‹คํ–‰์‹œํ‚จ๋‹ค.

์—ฌ๊ธฐ์„œ ๋ฌธ์ œ๋Š” 404์ด๋‹ค. 404 ( ์ฃผ์†Œ ํ‹€๋ ธ์„ ๋•Œ ) ๋Š” exception์ด ์•„๋‹ˆ๋ผ error์ด๋‹ค.
@ResponseStatus(value = HttpStatus.NOT_FOUND) ์ด ๊ตฌ๋ฌธ์€ 404์—๋Ÿฌ ๋ผ๋Š” ๋œป์ด๊ณ 
์ด ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๊ฒŒ ๋˜๋ฉด web.xml์—์„œ ์„ค์ •ํ•ด์ค€ ๊ฒƒ ์ฒ˜๋Ÿผ ์—๋Ÿฌ๋ฅผ exception์œผ๋กœ ๋ฐ›์•„๋“ค์—ฌ์„œ
๊ทธ exception์ด ๋ฐœ์ƒ (@ExceptionHandler(NoHandlerFoundException.class) ์ด ๊ตฌ๋ฌธ ) ํ•˜๋ฉด handle404 ๋ฉ”์„œ๋“œ๋ฅผ ์‹คํ–‰์‹œํ‚จ๋‹ค.

๊ฐ„๋‹จํ•˜๊ฒŒ ๋งํ•˜๋ฉด handleException ๋ฉ”์„œ๋“œ๋Š” 400 error ์ œ์™ธ ( 500 error ๋Š” exception์ด ๋‚˜์„œ error๊ฐ€ ๋‚œ ๊ฒƒ์ด๋‹ค ) , handle404 ๋ฉ”์„œ๋“œ๋Š” 400 error๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ์‹คํ–‰๋œ๋‹ค.

Controller ์—์„œ์˜ @ExceptionHandler ์™€ ControllerAdvice ์—์„œ์˜ @ExceptionHandler ์ค‘ ๋†’์€ ์šฐ์„ ์ˆœ์œ„๋Š” controller ์—์„œ์˜ @ExceptionHandler ์ด๋‹ค.





๐Ÿ‘ ์ฐธ์กฐ
https://github.com/binghe819/TIL/blob/master/Spring/%EA%B8%B0%ED%83%80/%EC%8A%A4%ED%94%84%EB%A7%81%20%EC%98%88%EC%99%B8%EC%B2%98%EB%A6%AC%20%EA%B0%9C%EB%85%90%20%EB%B0%8F%20%EC%A0%84%EB%9E%B5.md