05.Exception
Exception
์์ธ ์ฒ๋ฆฌ์ ์ค๋ฅ ํ์ด์ง
์๋ธ๋ฆฟ ์์ธ ์ฒ๋ฆฌ
์์ ์๋ธ๋ฆฟ ์ปจํ ์ด๋์ ์์ธ ์ฒ๋ฆฌ ์ง์ ๋ฐฉ์
.
Exception
์๋ฐ ์ง์ ์คํ ์ ์์ธ ๋ฐ์
์๋ฐ ๋ฉ์ธ ๋ฉ์๋๋ฅผ ์ง์ ์คํํ ๊ฒฝ์ฐ main ์ฐ๋ ๋ ์คํ
main ์ฐ๋ ๋ ์คํ ๋์ค์ ์์ธ๋ฅผ ์ก์ง ๋ชปํ๊ณ ์์ธ๊ฐ ๋์ ธ์ง๋ฉด,
์์ธ ์ ๋ณด๋ฅผ ๋จ๊ธฐ๊ณ ํด๋น ์ฐ๋ ๋ ์ข ๋ฃ
์น ์ ํ๋ฆฌ์ผ์ด์ ์์ ์์ธ ๋ฐ์
@GetMapping("/error-ex")
public void errorEx() {
throw new RuntimeException("์์ธ ๋ฐ์!");
}์ฌ์ฉ์ ์์ฒญ๋ณ๋ก ๋ณ๋์ ์ฐ๋ ๋๊ฐ ํ ๋น๋๊ณ , ์๋ธ๋ฆฟ ์ปจํ ์ด๋ ์์์ ์คํ
์ ํ๋ฆฌ์ผ์ด์ ์์ ์์ธ ๋ฐ์ ์, try~catch ๋ก ์์ธ๋ฅผ ์ก์์ ์ฒ๋ฆฌํ๋ฉด ๋ฌธ์ ๊ฐ ์์.
ํ์ง๋ง, ์์ธ๋ฅผ ์ก์ง ๋ชปํ๊ณ ,
์๋ธ๋ฆฟ ๋ฐ์ผ๋ก ์์ธ๊ฐ ์ ๋ฌ๋ ๊ฒฝ์ฐ WAS(tomcat)๊น์ง ์์ธ ์ ๋ฌWAS <- ํํฐ <- ์๋ธ๋ฆฟ <- ์ธํฐ์ ํฐ <- ์ปจํธ๋กค๋ฌ(์์ธ๋ฐ์)WAS ๋ Exception ์์ธ๊ฐ ์ฌ๋ผ์ค๋ฉด ์๋ฒ ๋ด๋ถ์์ ์ฒ๋ฆฌํ ์ ์๋ ์ค๋ฅ๊ฐ ๋ฐ์ํ ๊ฒ์ผ๋ก ์ธ์งํ๊ณ
HTTP Status 500 โ Internal Server Error ๋ฐํ# ์คํ๋ง ๋ถํธ๊ฐ ์ ๊ณตํ๋ ๊ธฐ๋ณธ ์์ธ ํ์ด์ง OFF server.error.whitelabel.enabled=false
.
response.sendError(HTTP ์ํ ์ฝ๋, ์ค๋ฅ ๋ฉ์์ง)
์ค๋ฅ ๋ฐ์ ์
HttpServletResponse.sendError๋ฉ์๋ ์ฌ์ฉ ๊ฐ๋ฅsendError ํธ์ถ ์ ๋ฐ๋ก ์์ธ๊ฐ ๋ฐ์ํ๋ ๊ฒ์ ์๋์ง๋ง,
response ๋ด๋ถ์ ์ค๋ฅ ๋ฐ์ ์ํ๋ฅผ ์ ์ฅํ์ฌ WAS(Servlet container) ์๊ฒ ์ ๋ฌWAS(Servlet container) ๋ ํด๋ผ์ด์ธํธ์๊ฒ ์๋ต ์ ์ response ์
sendError() ํธ์ถ ๊ธฐ๋ก ํ์ธํ, ํธ์ถ๋์๋ค๋ฉด์ค์ ํ ์ค๋ฅ ์ฝ๋์ ๋ง๋ ๊ธฐ๋ณธ ์ค๋ฅ ํ์ด์ง ์ถ๋ ฅ
sendError ํ๋ฆ
์๋ธ๋ฆฟ ์ค๋ฅ ํ์ด์ง
์๋ธ๋ฆฟ์ Exception ์ด ์๋ธ๋ฆฟ ๋ฐ์ผ๋ก ์ ๋ฌ๋๊ฑฐ๋ response.sendError() ํธ์ถ ์ ๊ฐ ์ํฉ์ ๋ง์ถ ์ค๋ฅ ์ฒ๋ฆฌ ๊ธฐ๋ฅ ์ ๊ณต
์๋ธ๋ฆฟ ์ค๋ฅ ํ์ด์ง ๋ฑ๋ก
์ค๋ฅ ํ์ด์ง๋ ์์ธ๋ฅผ ๋ค๋ฃฐ ๋ ํด๋น ์์ธ์ ๊ทธ ์์ ํ์ ์ ์ค๋ฅ๋ฅผ ํจ๊ป ์ฒ๋ฆฌ
์ค๋ฅ ์ฒ๋ฆฌ ์ปจํธ๋กค๋ฌ
์ค๋ฅ ํ์ด์ง ์์ฒญ ํ๋ฆ
WAS ๊น์ง ์์ธ๊ฐ ์ ํ๋ ๊ฒฝ์ฐ, WAS ๋ ํด๋น ์์ธ๋ฅผ ์ฒ๋ฆฌํ๋
์ค๋ฅ ํ์ด์ง ์ ๋ณดํ์ธ ํ ์ค๋ฅ ํ์ด์ง๋ฅผ ๋ค์ ์์ฒญWAS ๋ ์ค๋ฅ ํ์ด์ง ์์ฒญ ์ ์ค๋ฅ ์ ๋ณด๋ฅผ request.attribute ์ ์ถ๊ฐํด์ ์ ๋ฌ
DispatcherType ๐
ํด๋ผ์ด์ธํธ๋ก ๋ถํฐ ๋ฐ์ํ ์ ์ ์์ฒญ์ธ์ง, ์ค๋ฅ ํ์ด์ง๋ฅผ ์ถ๋ ฅํ๊ธฐ ์ํ ๋ด๋ถ ์์ฒญ์ธ์ง ๊ตฌ๋ถํ๊ธฐ ์ํด ์๋ธ๋ฆฟ์ DispatcherType ์ ๋ณด ์ ๊ณต
์ค๋ฅ ๋ฐ์ ์ ์ค๋ฅ ํ์ด์ง ์ถ๋ ฅ์ ์ํด WAS ๋ด๋ถ์์ ํํฐ, ์๋ธ๋ฆฟ, ์ธํฐ์ ํฐ๋ฅผ ๋ค์ ํธ์ถ
์ด๋ฏธ ์ด๊ธฐ ์์ฒญ์์ ๊ฒ์ฆ์ด ์๋ฃ๋ ๋ถ๋ถ์ ์ฌํธ์ถ ๋ ๊ฒฝ์ฐ ๋นํจ์จ์
.
DispatcherType
์๋ธ๋ฆฟ ์คํ์ ์ค์ ๊ณ ๊ฐ์ด ์์ฒญํ ๊ฒ์ธ์ง, ์๋ฒ๊ฐ ๋ด๋ถ์์ ์ค๋ฅ ํ์ด์ง๋ฅผ ์์ฒญํ๋ ๊ฒ์ธ์ง
DispatcherType์ผ๋ก ๊ตฌ๋ถํ ์ ์๋ ๋ฐฉ๋ฒ์ ์ ๊ณต
.
ํํฐ์ DispatcherType
DispatcherType ๋ก๊ทธ ํํฐ
๋ก๊ทธ ํํฐ ๋ฑ๋ก
.
ํํฐ์ Interceptor
DispatcherType ๋ก๊ทธ ์ธํฐ์ ํฐ
๋ก๊ทธ ์ธํฐ์ ํฐ ๋ฑ๋ก
.
DispatcherType ํ๋ฆ
์คํ๋ง ๋ถํธ ์ค๋ฅ ํ์ด์ง ๐
์คํ๋ง ๋ถํธ๋ ์๋ธ๋ฆฟ ์ค๋ฅ ํ์ด์ง ํธ์ถ์ ํ์ํ๋ ์๋ ๋ณต์กํ ๊ณผ์ ์ ๊ธฐ๋ณธ์ผ๋ก ์ ๊ณต
WebServerCustomizer ๋ง๋ค๊ธฐ
์์ธ ์ข ๋ฅ์ ๋ฐ๋ผ ErrorPage ์ถ๊ฐ โ ErrorPage ์๋ ๋ฑ๋ก
/error๊ฒฝ๋ก๋ฅผ ๊ธฐ๋ณธ ์ค๋ฅ ํ์ด์ง๋ก ์ค์ ์๋ธ๋ฆฟ ๋ฐ์ผ๋ก ์์ธ๊ฐ ๋์ ธ์ง๊ฑฐ๋,
response.sendError(...)ํธ์ถ ์ ๋ชจ๋ ์ค๋ฅ๋/errorํธ์ถErrorMvcAutoConfigurationํด๋์ค๊ฐ ์ค๋ฅ ํ์ด์ง๋ฅผ ์๋์ผ๋ก ๋ฑ๋กํ๋ ์ญํ
์์ธ ์ฒ๋ฆฌ์ฉ ์ปจํธ๋กค๋ฌ(ErrorPageController) ์์ฑ โ ์๋ ๋ฑ๋ก(
BasicErrorController)ErrorPage ์์ ๋ฑ๋กํ /error ๋ฅผ ๋งคํํด์ ์ฒ๋ฆฌํ๋ ์ปจํธ๋กค๋ฌ
.
BasicErrorController
๊ธฐ๋ณธ์ ์ธ ์ค๋ฅ ํ์ด์ง ๋ก์ง์ด ๋ชจ๋ ๊ตฌํ
๊ฐ๋ฐ์๋ ์ค๋ฅ ํ์ด์ง ํ๋ฉด๋ง BasicErrorController ๊ฐ ์ ๊ณตํ๋ ๋ฃฐ๊ณผ ์ฐ์ ์์์ ๋ฐ๋ผ์ ๋ฑ๋ก
์ ์ HTML ์ผ ๊ฒฝ์ฐ ์ ์ ๋ฆฌ์์ค, ๋ทฐ ํ ํ๋ฆฟ์ ์ฌ์ฉํ ๋์ ์ค๋ฅ ํ๋ฉด์ผ ๊ฒฝ์ฐ ๋ทฐ ํ ํ๋ฆฟ ๊ฒฝ๋ก์ ์ค๋ฅ ํ์ด์ง ํ์ผ ์์ฑ
.
BasicErrorController View ์ ํ ์ฐ์ ์์
.1. ๋ทฐ ํ ํ๋ฆฟ
resources/templates/error/500.html
resources/templates/error/5xx.html
.2. ์ ์ ๋ฆฌ์์ค(static, public)
resources/static/error/400.html
resources/static/error/404.html
resources/static/error/4xx.html
.3. ์ ์ฉ ๋์์ด ์์ ๋ ๋ทฐ ์ด๋ฆ(error)
resources/templates/error.html
ํด๋น ๊ฒฝ๋ก ์์น์ HTTP ์ํ ์ฝ๋ ์ด๋ฆ์ ๋ทฐ ํ์ผ์ ๋ฃ์ด๋์.
๋ทฐ ํ ํ๋ฆฟ์ด ์ ์ ๋ฆฌ์์ค๋ณด๋ค ์ฐ์ ์์๊ฐ ๋๊ณ ,
404, 500 ์ฒ๋ผ ๊ตฌ์ฒด์ ์ธ ๊ฒ์ด 5xx์ฒ๋ผ ๋ ๊ตฌ์ฒด์ ์ธ ๊ฒ ๋ณด๋ค ์ฐ์ ์์๊ฐ ๋๋ค.
.
BasicErrorController ์ ๊ณต ๊ธฐ๋ณธ ์ ๋ณด
๊ธฐ๋ณธ ์ ๋ณด๋ฅผ model ์ ๋ด์ View ์ ์ ๋ฌ
message,exception,errors,trace์ ๋ณด๋ ๋ณด์์ default ๋ก ํฌํจ์ด ๋์ด์์ง ์์properties ์ค์ ์ ํตํด ์ค๋ฅ ์ ๋ณด๋ฅผ model ์ ํฌํจํ ์ง ์ฌ๋ถ ์ ํ
never: ์ฌ์ฉํ์ง ์์always: ํญ์ ์ฌ์ฉon_param: ํ๋ผ๋ฏธํฐ๊ฐ ์์ ๋ ํด๋น ์ ๋ณด ๋ ธ์ถHTTP ์์ฒญ์ ํ๋ผ๋ฏธํฐ(?message=&errorsa=&trace=)๋ฅผ ์ ๋ฌํ๋ฉด ํด๋น ์ ๋ณด๋ค์ด model ์ ๋ด๊ฒจ ๋ทฐ ํ ํ๋ฆฟ์ ์ถ๋ ฅ
์ด์ ์๋ฒ์์๋ ๋น๊ถ์ฅ
์ค๋ฌด์์๋ ์ด ์ ๋ณด๋ค์ ๋ ธ์ถํ๋ฉด ์๋๋ค.
์ฌ์ฉ์์๊ฒ๋ ๊น๋ํ ์ค๋ฅ ํ์ด์ง์ ๊ณ ๊ฐ์ด ์ดํดํ ์ ์๋ ๊ฐ๋จํ ์ค๋ฅ ๋ฉ์์ง๋ฅผ ๋ณด์ฌ์ฃผ๊ณ ,
์ค๋ฅ๋ ์๋ฒ์ ๋ก๊ทธ๋ก ๋จ๊ฒจ์ ๋ก๊ทธ๋ก ํ์ธํ์.
.
์คํ๋ง ๋ถํธ ์ค๋ฅ ๊ด๋ จ ์ต์
ํ์ฅ ํฌ์ธํธ
์๋ฌ ๊ณตํต ์ฒ๋ฆฌ ์ปจํธ๋กค๋ฌ์ ๊ธฐ๋ฅ์ ๋ณ๊ฒฝํ๊ณ ์ถ์ ๊ฒฝ์ฐ ErrorController ์ธํฐํ์ด์ค๋ฅผ ์์ ๋ฐ์์ ๊ตฌํํ๊ฑฐ๋, BasicErrorController ๋ฅผ ์์ ๋ฐ์์ ๊ธฐ๋ฅ์ ์ถ๊ฐํด๋ณด์.
์คํ๋ง ๋ถํธ ๊ธฐ๋ณธ ์ ๊ณต ์ค๋ฅ ํ์ด์ง๋ฅผ ํ์ฉํ๋ฉด ์ค๋ฅ ํ์ด์ง ๊ด๋ จ ๋๋ถ๋ถ์ ๋ฌธ์ ๋ ์์ฝ๊ฒ ํด๊ฒฐ ๊ฐ๋ฅํ๋ค.
API ์์ธ ์ฒ๋ฆฌ
์ค๋ฅ ํ์ด์ง๋ ๋จ์ํ ๊ณ ๊ฐ์๊ฒ ์ค๋ฅ ํ๋ฉด์ ๋ณด์ฌ์ฃผ๋ฉด ๋์ง๋ง, API ๋ ๊ฐ ์ค๋ฅ ์ํฉ์ ๋ง๋ ์ค๋ฅ ์๋ต ์คํ์ ์ ํ๊ณ , JSON์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์๋ตํด ์ฃผ์ด์ผ ํ๋ค.
produces ์ค์
produces = MediaType.APPLICATION_JSON_VALUEํด๋ผ์ด์ธํธ๊ฐ ์์ฒญํ๋ HTTP Header Accept ๊ฐ์ด application/json ์ผ ๋ ํด๋น ๋ฉ์๋ ํธ์ถ
ResponseEntity ๋ ๋ฉ์์ง ์ปจ๋ฒํฐ๊ฐ ๋์ํ๋ฉด์ ํด๋ผ์ด์ธํธ์๊ฒ JSON ๊ตฌ์กฐ๋ก ๋ณํํ์ฌ ๋ฐํ
Spring Boot ๊ธฐ๋ณธ ์ค๋ฅ ์ฒ๋ฆฌ
API ์์ธ ์ฒ๋ฆฌ๋ ์คํ๋ง ๋ถํธ๊ฐ ์ ๊ณตํ๋ ๊ธฐ๋ณธ ์ค๋ฅ ๋ฐฉ์์ ์ฌ์ฉ
BasicErrorController ์ฝ๋ ์ผ๋ถ
์คํ๋ง ๋ถํธ์ ๊ธฐ๋ณธ ์ค์ ์ ์ค๋ฅ ๋ฐ์์
/error๋ฅผ ์ค๋ฅ ํ์ด์ง๋ก ์์ฒญBasicErrorController๋/error๊ฒฝ๋ก๋ฅผ ๊ธฐ๋ณธ์ผ๋ก ๋ฐ์.(server.error.path๋ก ์์ ๊ฐ๋ฅ
BasicErrorController๋ HTML ์ค๋ฅ ํ์ด์ง๋ฅผ ์ ๊ณตํ๋ ๊ฒฝ์ฐ ๋งค์ฐ ํธ๋ฆฌ๋จ, API ๋ ๊ฐ ์ปจํธ๋กค๋ฌ๋ ์์ธ๋ง๋ค ์๋ก ๋ค๋ฅธ ์๋ต ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅํด์ผ ํ๋ฏ๋ก
@ExceptionHandler์ฌ์ฉ ๊ถ์ฅ
ExceptionResolver
HandlerExceptionResolver
์คํ๋ง MVC ๋ ์ปจํธ๋กค๋ฌ(ํธ๋ค๋ฌ) ๋ฐ์ผ๋ก ์์ธ๊ฐ ๋์ ธ์ง ๊ฒฝ์ฐ ์์ธ๋ฅผ ํด๊ฒฐํ๊ณ , ๋์์ ์๋ก ์ ์ํ ์ ์๋
HandlerExceptionResolver์ ๊ณตExceptionResolver ์ ์ฉ ์ ์์ธ์ฒ๋ฆฌ

Result ExceptionResolver ์ ์ฉ ํ ์์ธ์ฒ๋ฆฌ

Result
์ฐธ๊ณ . ExceptionResolver ๋ก ์์ธ๋ฅผ ํด๊ฒฐํด๋ postHandle() ํธ์ถ X
HandlerExceptionResolver Interface ๊ตฌํ
.
HandlerExceptionResolver ๋ฐํ ๊ฐ์ ๋ฐ๋ฅธ DispatcherServlet ๋์ ๋ฐฉ์
๋น ModelAndViewnew ModelAndView() ์ฒ๋ผ ๋น ModelAndView ๋ฅผ ๋ฐํํ๋ฉด ๋ทฐ๋ฅผ ๋ ๋๋ง ํ์ง์๊ณ , ์ ์ ํ๋ฆ์ผ๋ก ์๋ธ๋ฆฟ์ด ๋ฆฌํด
ModelAndView ์ง์ ModelAndView ์ View, Model ๋ฑ์ ์ ๋ณด๋ฅผ ์ง์ ํด์ ๋ฐํํ๋ฉด ๋ทฐ๋ฅผ ๋ ๋๋ง
nulnull ์ ๋ฐํํ๋ฉด, ๋ค์ ExceptionResolver ๋ฅผ ์ฐพ์์ ์คํ
๋ง์ฝ ์ฒ๋ฆฌํ ์ ์๋ ExceptionResolver ๊ฐ ์์ผ๋ฉด ์์ธ ์ฒ๋ฆฌ๊ฐ ์๋๊ณ , ๊ธฐ์กด์ ๋ฐ์ํ ์์ธ๋ฅผ ์๋ธ๋ฆฟ ๋ฐ์ผ๋ก ๋์ง
.
ExceptionResolver ํ์ฉ
์์ธ ์ํ ์ฝ๋ ๋ณํ์์ธ๋ฅผ response.sendError(..) ํธ์ถ๋ก ๋ณ๊ฒฝํด์ ์๋ธ๋ฆฟ์์ ์ํ ์ฝ๋์ ๋ฐ๋ฅธ ์ค๋ฅ๋ฅผ ์ฒ๋ฆฌํ๋๋ก ์์
์ดํ WAS ๋ ์๋ธ๋ฆฟ ์ค๋ฅ ํ์ด์ง๋ฅผ ์ฐพ์์ ๋ด๋ถ ํธ์ถ(default. /error)
ex. ์ค์ ์๋ฒ์์๋ 500 ์๋ฌ๊ฐ ๋ฐ์ํ์์ง๋ง Client ์๊ฒ๋ 4xx ์ฝ๋ ์ ๋ฌ
๋ทฐ ํ ํ๋ฆฟ ์ฒ๋ฆฌModelAndView ์ ๊ฐ์ ์ฑ์์ ์์ธ์ ๋ฐ๋ฅธ ์๋ก์ด ์ค๋ฅ ํ๋ฉด์ ๋ทฐ ๋ ๋๋ง์ ํตํด ๊ณ ๊ฐ์๊ฒ ์ ๊ณต
return new ModelAndView("error/400");
API ์๋ต ์ฒ๋ฆฌresponse.getWriter().println("hello"); ์ฒ๋ผ HTTP ์๋ต ๋ฐ๋์ ์ง์ ๋ฐ์ดํฐ๋ฅผ ๋ฃ์ด์ ์ ๋ฌ
์ฌ๊ธฐ์ JSON ์ผ๋ก ์๋ตํ๋ฉด API ์๋ต ์ฒ๋ฆฌ
.
WebMvcConfigurer ์ ๋ฑ๋ก
configureHandlerExceptionResolvers์ฌ์ฉ ์ ์คํ๋ง์ด ๊ธฐ๋ณธ์ผ๋ก ๋ฑ๋กํ๋ExceptionResolver๊ฐ ์ ๊ฑฐ๋๋ฏ๋กextendHandlerExceptionResolvers๋ฅผ ์ฌ์ฉ
ExceptionResolver ์ ์ฉ
Exception
HandlerExceptionResolver ๊ตฌํ
WebConfig ์ HandlerExceptionResolver ๋ฑ๋ก
์ ๋ฆฌ.
์ปจํธ๋กค๋ฌ์์ ์์ธ๊ฐ ๋ฐ์ํด๋ ExceptionResolver ์์ ์์ธ๋ฅผ ์ฒ๋ฆฌ
์์ธ๊ฐ ๋ฐ์ํด๋ ์๋ธ๋ฆฟ ์ปจํ ์ด๋๊น์ง ์์ธ๊ฐ ์ ๋ฌ๋์ง ์๊ณ (๊ฒฐ๊ณผ์ ์ผ๋ก WAS ์ ์ฅ์์๋ ์ ์ ์ฒ๋ฆฌ)
์คํ๋ง MVC ์์ ์์ธ ์ฒ๋ฆฌ๋ ์ข ๋ฃ
Spring ExceptionResolver
Spring Boot ๊ธฐ๋ณธ์ ์ผ๋ก ์ ๊ณตํ๋ ExceptionResolver
HandlerExceptionResolverComposite ์ ์๋ ์์๋ก ๋ฑ๋ก
ExceptionHandlerExceptionResolver@ExceptionHandler์ฒ๋ฆฌAPI ์์ธ ์ฒ๋ฆฌ๋ ๋๋ถ๋ถ ์ด ๊ธฐ๋ฅ์ผ๋ก ํด๊ฒฐ
ResponseStatusExceptionResolverHTTP ์ํ ์ฝ๋ ๋ณ๊ฒฝ
DefaultHandlerExceptionResolver์คํ๋ง ๋ด๋ถ ๊ธฐ๋ณธ ์์ธ ์ฒ๋ฆฌ
ExceptionHandler ๐
ExceptionHandlerExceptionResolver
์คํ๋ง์ API ์์ธ ์ฒ๋ฆฌ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด @ExceptionHandler ๋ฅผ ์ฌ์ฉํ ํธ๋ฆฌํ ์์ธ ์ฒ๋ฆฌ ๊ธฐ๋ฅ ์ ๊ณต
๊ฐ ์์คํ ๋ง๋ค ๋ค๋ฅธ ์๋ต ๋ชจ์๊ณผ ์คํ
์์ธ์ ๋ฐ๋ฅธ ๊ฐ๊ธฐ ๋ค๋ฅธ ๋ฐ์ดํฐ ์๋ต
์ปจํธ๋กค๋ฌ์ ๋ฐ๋ผ ๋ค๋ฅธ ์์ธ ์๋ต
ModelAndView ๊ฐ ์๋ Json ํํ๋ก ๋ฐํ
๋ฑ.. ์ธ๋ฐํ ์ ์ด ํ์
.
@ExceptionHandler ์์ธ ์ฒ๋ฆฌ ๋ฐฉ๋ฒ
@ExceptionHandler ์ ์ธ ํ ํด๋น ์ปจํธ๋กค๋ฌ์์ ์ฒ๋ฆฌํ๊ณ ์ถ์ ์์ธ ์ง์
ํด๋น ์ปจํธ๋กค๋ฌ์์ ์์ธ ๋ฐ์ ์ ํด๋น ๋ฉ์๋๊ฐ ํธ์ถ
์ง์ ํ ์์ธ ๋๋ ํ์ ์์ ํด๋์ค ๋ชจ๋ ์ฒ๋ฆฌ
๋ค์ํ ์์ธ๋ฅผ ํ ๋ฒ์ ์ฒ๋ฆฌ ๊ฐ๋ฅ
์์ธ ์๋ต
ํ๋ผ๋ฏธํฐ์ ์๋ต
๋ค์ํ ํ๋ผ๋ฏธํฐ์ ์๋ต ์ง์ ๊ฐ๋ฅ
.
@ExceptionHandler ์คํ ํ๋ฆ
์ปจํธ๋กค๋ฌ ํธ์ถ ๊ฒฐ๊ณผ๋ก ์์ธ(IllegalArgumentException)๊ฐ ์ปจํธ๋กค๋ฌ ๋ฐ์ผ๋ก ๋์ ธ์ง
DispatcherServlet ์ ๊ฑฐ์ณ ์์ธ ๋ฐ์์ผ๋ก
ExceptionResolver์๋๊ฐ์ฅ ์ฐ์ ์์๊ฐ ๋์
ExceptionHandlerExceptionResolver์คํ
ExceptionHandlerExceptionResolver๋ ํด๋น ์ปจํธ๋กค๋ฌ์IllegalArgumentException์ ์ฒ๋ฆฌํ ์ ์๋@ExceptionHandler๊ฐ ์๋์ง ํ์ธ@ExceptionHandler์ ์ธ ๋ฉ์๋ ์คํ@RestController ์ด๋ฏ๋ก @ResponseBody ์ ์ฉ โ HTTP ์ปจ๋ฒํฐ๊ฐ ์ฌ์ฉ๋๊ณ JSON ์๋ต
@ResponseStatus(HttpStatus.BAD_REQUEST) ๋ฅผ ์ง์ ํ์ผ๋ฏ๋ก HTTP ์ํ ์ฝ๋ 400 ์๋ต
์๋ธ๋ฆฟ ์ปจํ ์ด๋๊น์ง ๋ด๋ ค๊ฐ์ง ์๊ณ ์ ์ ํ๋ฆ์ผ๋ก ๋ฐํ
.
์ํฉ์ ๋ฐ๋ฅธ @ExceptionHandler ํ์ฉ
@ControllerAdvice ๐
์ฌ๋ฌ ์ปจํธ๋กค๋ฌ์์ ๋ฐ์ํ๋ ์ค๋ฅ๋ฅผ ๋ชจ์์ ์ฒ๋ฆฌ
@ExceptionHandler๋ฅผ ์ฌ์ฉํด์ ์์ธ๋ฅผ ๊น๋ํ๊ฒ ์ฒ๋ฆฌ๊ฐ ๊ฐ๋ฅํ์ง๋ง, ์ ์ ์ฝ๋์ ์์ธ ์ฒ๋ฆฌ ์ฝ๋๊ฐ ํ๋์ ์ปจํธ๋กค๋ฌ์ ์์ฌ ์๋ ๋จ์ ์ด ์กด์ฌ@ControllerAdvice๋๋@RestControllerAdvice๋ฅผ ์ฌ์ฉํด์ ๋ถ๋ฆฌํด ๋ณด์.
@ControllerAdvice
๋์์ผ๋ก ์ง์ ํ ์ฌ๋ฌ ์ปจํธ๋กค๋ฌ์
@ExceptionHandler,@InitBinder๊ธฐ๋ฅ์ ๋ถ์ฌ๋์ ์ปจํธ๋กค๋ฌ ์ง์ โ ๋ณดํต ํจํค์ง๋ช ์ ๋ ์ง์
@ControllerAdvice ์ ๋์์ ์ง์ ํ์ง ์์ผ๋ฉด ๋ชจ๋ ์ปจํธ๋กค๋ฌ์ ์ ์ฉ(๊ธ๋ก๋ฒ ์ ์ฉ)
@RestControllerAdvice๋ @ControllerAdvice ์ ๋์ผํ๊ณ , @ResponseBody ๊ฐ ์ถ๊ฐ@Controller, @RestController ์ฐจ์ด์ ๋์ผ
@ExceptionHandler ์ @ControllerAdvice ๋ฅผ ์กฐํฉํ๋ฉด ์์ธ๋ฅผ ๊น๋ํ๊ฒ ํด๊ฒฐ ๊ฐ๋ฅ
ResponseStatusExceptionResolver
์์ธ์ ๋ฐ๋ผ HTTP ์ํ ์ฝ๋ ์ง์
@ResponseStatus๊ฐ ๋ฌ๋ ค์๋ ์์ธResponseStatusException์์ธ
.
@ResponseStatus ์์ธ
ํด๋น ์์ธ๊ฐ ์ปจํธ๋กค๋ฌ ๋ฐ์ผ๋ก ๋์ด๊ฐ๋ฉด ResponseStatusExceptionResolver ์์ธ๊ฐ ํด๋น ์ ๋ ธํ ์ด์ ์ ํ์ธํด์
HTTP ์ํ ์ฝ๋๋ฅผ ๋ณ๊ฒฝ(HttpStatus.BAD_REQUEST(400))ํ๊ณ , ๋ฉ์์ง ํฌํจResponseStatusExceptionResolver ์์ response.sendError(statusCode, resolvedReason) ํธ์ถ
sendError(400) ํธ์ถ๋ก WAS ์์ ๋ค์
์ค๋ฅ ํ์ด์ง(/error)๋ด๋ถ ์์ฒญreason ์ MessageSource ์์ ์ฐพ๋
๋ฉ์ธ์ง ๊ธฐ๋ฅ์ ๊ณต โreason = "error.bad"
`
ResponseStatusException ์์ธ
์ง์ ๋ณ๊ฒฝํ ์ ์๋ ์์ธ์
ResponseStatusException์ ์ฉ@ResponseStatus ๋ ์ ๋ ธํ ์ด์ ์ ์ฌ์ฉํ๋ฏ๋ก ์ง์ (์กฐ๊ฑด์ ๋ฐ๋ผ ๋์ ์ผ๋ก)๋ณ๊ฒฝํ ์ ์๋ ์์ธ์๋ ์ ์ฉ ๋ถ๊ฐ
DefaultHandlerExceptionResolver
์คํ๋ง ๋ด๋ถ์์ ๋ฐ์ํ๋ ์คํ๋ง ์์ธ ์ฒ๋ฆฌ
์คํ๋ง ๋ด๋ถ ์ค๋ฅ๋ฅผ ์ด๋ป๊ฒ ์ฒ๋ฆฌํ ์ง์ ๋ํ ๋ง์ ๋ด์ฉ์ด ์ ์
TypeMismatchException์ผ๋ก ๋ฐ์ํ๋ 500 ์ค๋ฅ๋ฅผDefaultHandlerExceptionResolver๊ฐ 400 ์ค๋ฅ๋ก ๋ณ๊ฒฝ
DefaultHandlerExceptionResolver.handleTypeMismatch
Last updated