SPRING_EXCEPTION
๐ 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 ์ด๋ค.