<๊ฐ์>
์ ๋ฒ ์๊ฐ๊น์ง ์ ๋ฆฌํ ๋ด์ฉ์ผ๋ก ์๋ฒ ์ฒ๋ฆฌํ๋ค๊ฐ ์์ธ๊ฐ ๋ฐ์ํ์ ์ ์ด๋ฅผ ๋์ฒํ๋ ๋ฐฉ๋ฒ์ด 3๊ฐ์ง๊ฐ ์์๋ค.
(1) ์์ธ๊ฐ ๋ฐ์ํ ์ ์๋ ๊ตฌ๋ฌธ์ try - catch๋ก ๋ฌถ๋๋ค.
์ด๋ ์์ธ๊ฐ ๋ฐ์ํ ์ ์๋ ๊ตฌ๋ฌธ๋ง๋ค try-catch ๊ตฌ๋ฌธ์ผ๋ก ๋ฌถ์ด์ผ ํด์ ์์ฃผ ๋นํจ์จ์ ์ด์๋ค.
(2) ์ปจํธ๋กค๋ฌ ๋ด๋ถ์ ์์ธ์ฒ๋ฆฌ๋ง ๋ด๋นํ๋ ๋งค์๋ ๋ง๋ค๊ธฐ.
์์ธ์ฒ๋ฆฌ ๋งค์๋์ ์ด๋ ธํ ์ด์ ์ @ExceptionHandler ์ด๋ค.
์๋์๋ฆฌ๋ ๋ค์๊ณผ ๊ฐ๋ค.
a. ํด๋น ์ปจํธ๋กค๋ฌ ๋ด๋ถ์ ์ด๋ค ๋งค์๋์์ ์์ธ๊ฐ ๋ฐ์ํ๊ณ , ๊ทธ ๋งค์๋๋ ์์ธ๋ฅผ ๋ฐ์ผ๋ก ๋์ง๋ค. (throws)
b. @ExceptionHandler ์ด๋ ธํ ์ด์ ์ด ๋ถ์ ๋งค์๋ ์ค ํด๋น ์์ธ๋ฅผ ์ฒ๋ฆฌํ ์ ์๋ ๋งค์๋๊ฐ ์๋ค๋ฉด catch ๊ตฌ๋ฌธ์ฒ๋ผ
ํด๋น ์์ธ๋ฅผ ๊ฐ์ฒด๋ก ๋ฐ์์ ์ฒ๋ฆฌํ๋ค.
**@ExceptionHandler() ์ด ()์์ ์ ํ ์์ธ๊ฐ ํด๋น ์์ธ์ฒ๋ฆฌ ๋งค์๋๊ฐ ์ฒ๋ฆฌํ ๋ถ์ผ์ด๋ค.
(3) ๋ฒํด๋์ค ์์ธ์ฒ๋ฆฌ ์ด๋ ธํ ์ด์ @ControllerAdvice ์ฌ์ฉ
์ด๋ค ํด๋์ค์ @ControllerAdvice๋ฅผ ๋ฌ์๋์ผ๋ฉด, ํด๋น ์ด๋ ธํ ์ด์ ์ ๋ชจ๋ ํจํค์ง์ ์์ธ ์ฒ๋ฆฌ๋ฅผ ๋ด๋นํ ์ ์๋ค.
๋ง์ฝ ํน์ ํจํค์ง์๋ง ์ ์ฉํ๊ณ ์ถ๋ค๋ฉด, @ControllerAdivce()์ ํด๋น ()์์ ํจํค์ง์ ๊ฒฝ๋ก๋ฅผ ์ฐ๋ฉด ๋๋ค.
@ControllerAdivce์ ์์ธ ๋ฐ์ํ ์ปจํธ๋กค๋ฌ ๋ด๋ถ์ @ExceptionHandler ์ค ์ฐ์ ์์๋ ํ์๊ฐ ๋๋ค.
(์์ธ ๋ฐ์ ์ง์ญ์์ ๊ฐ๊น์ธ์๋ก ์ฐ์ ์์๊ฐ ๋๋ค.)
๋ฐ๋ผ์ ์ปจํธ๋กค๋ฌ ๋ด๋ถ @ExceptionHandler์๋ ํน์ ๋งค์๋๋ฅผ ์ํ ๋ง์ถค ์ฒ๋ฆฌ๋ฅผ, @ControllerAdvice์๋ ๊ด๋ฒ์ํ๊ฒ ์ ์ฉ๋ ์ผ๋ฐ์ ์ธ ์ฒ๋ฆฌ๋ฅผ ์ ์ด๋๋ ๊ฒ์ด ์ข๋ค.
์ด๋ฒ์๋ ์ด์ธ์๋ ์์ธ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ, ์์ธ์ฒ๋ฆฌ์ ์ฐ์ ์์, ์์ธ์ฒ๋ฆฌํ๋ ๊ณผ์ , ์ํ์ฝ๋ ๋ฐ๊พธ๋ ๋ฐฉ๋ฒ์ ๋ฐฐ์๋ณด๊ฒ ๋ค.
1. ์ํ์ฝ๋ ๋ฐ๊พธ๋ ๋ฒ
@ResponseStatus(HttpStatus.๋ฐ๊ฟ_์ํ์ฝ๋์_์ด๋ฆ)
์ด ์ด๋ ธํ ์ด์ ์ ์ฐ๋ฉด ์์ฒญ์ ๋ํ ์๋ต ๋ฉ์ธ์ง์ ์ํ์ฝ๋๋ฅผ ๋ฐ๊ฟ ์ ์๋ค.
ํด๋น ์ด๋ ธํ ์ด์ ์ด ์ฐ์ด๋ ๊ฒฝ์ฐ๋ ํฌ๊ฒ 2๊ฐ์ง๊ฐ ์๋ค.
(1) ์์ธ์ฒ๋ฆฌ ๋งค์๋์๊ฒ ์ฐ์.
a. ์ฐ์ฌ์ผ ํ๋ ์ด์
์์ 3๊ฐ์ง ๊ฒฝ์ฐ (try-catch, @ExceptionHandler, @ControllerAdvice) ๋ชจ๋ ์์ธ๋ฅผ ๊ฐ์ฒด๋ก ๋ฐ์ ์ด๋ค ์ฒ๋ฆฌ๋ฅผ ํ๊ณ , ์๋ฌ๋ฅผ ์ฒ๋ฆฌํ view๋ฅผ ๋ฐํ ํ๋ค. ์๋ฌ๊ฐ ๋ฐ์ํ์์๋, ์์ ๊ณผ์ ๋ค์ ์๋ฒ๊ฐ ์งํํด์ผํ๋ ์ ์ฐจ๋ค์ ์ฑ๊ณต์ ์ผ๋ก ๋ชจ๋ ์งํํ ๊ฒ์ด๋ค. ๊ทธ๋์ ๋ค๋ฅธ ์ค์ ์ ํ์ง ์๋ ๊ฒฝ์ฐ, ์๋ต ๋ฉ์ธ์ง์๋ ์ํ์ฝ๋ 200(์ ์)์ด ์ฐํ๋ค.
์ด ๊ฒฝ์ฐ ์๋ฌ๊ฐ ๋ฐ์ํ์์๋ ์ํ์ฝ๋๋ง ๋ด์๋ ์๋ฌ๊ฐ ์์๋์ง ์์๋์ง ํ์ธ์ ๋ชปํ๋ค.
๋ ์ ์์ ์ธ ์๋ฒ ๊ธฐ๋ฅ์ ํ์ง ๋ชปํ๊ณ ์์ธ์ฒ๋ฆฌ๋ง ํ์ ๋ฟ์ธ๋ฐ, ์ํ์ฝ๋๊ฐ 200์ด ์ฐํ๋ ๊ฒ์ ์ฌ๋ฐ๋ฅด์ง ์๋ค.
๊ทธ๋์ ์์ธ์ฒ๋ฆฌ ๋งค์๋๋ก ์์ธ์ฒ๋ฆฌ ์ ์ํ์ฝ๋๋ฅผ ์์ ์ด ์ํ๋ ์๋ฌ์ฝ๋๊ฐ ๋์ค๋๋ก ์ค์ ํด์ผํ๋ค.. (400๋ฒ๋ - ํด๋ผ์ด์ธํธ ์๋ชป, 500๋ฒ๋ - ์๋ฒ ์๋ชป)
b. ์์
// ๋ชจ๋ ์์ธ ์ฒ๋ฆฌ
@ExceptionHandler(Exception.class)
// ์ํ์ฝ๋ ๋ณ๊ฒฝ
@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) // 200 -> 500
public String catcher(Exception ex) {
return "error";
}
(2) ์ฌ์ฉ์ ์ ์ ์์ธ ํด๋์ค์๊ฒ ์ฐ์.
a. ์จ์ผํ๋ ์ด์
์์ธ๋ง๋ค ๋จ๋ ์ํ์ฝ๋๋ ๊ฐ๊ฐ ๋ค๋ฅด๋ค. ํ์ง๋ง ์ฌ์ฉ์ ์ ์ ์์ธ์ผ ๊ฒฝ์ฐ ํ๋ก๊ทธ๋๋จธ๊ฐ ๋ฐ๋ก ์ค์ ํ์ง ์๋ ๊ฒฝ์ฐ default๋ก ์ํ์ฝ๋500(์๋ฒ-์๋ชป)์ ๋ด๋ฑ๋๋ค. ์ด๋ ํด๋ผ์ด์ธํธ์๊ฒ ๋ฌธ์ ๊ฐ ๋ฌด์์ธ์ง์ ๋ํด ์๋ชป๋ ์ ๋ณด๋ฅผ ์ค ์ ์์ผ๋ฏ๋ก ๊ณ ์ณ์ผ ํ๋ค.
๋ํ ๋ฐ์ ๋ค๋ฅธ ์์ธ ์ฒ๋ฆฌ ๋ฐฉ๋ฒ์ ์ธ ์์ ์ํ์ฝ๋๊ฐ ๋ฌด์์ธ์ง๊ฐ ์ค์ํด์ง๋ฏ๋ก, ์ํ์ฝ๋๊ฐ ์ ํํ๊ฒ ์ฐํ๋๋ก @ResponseStatus๋ก ๋ฏธ๋ฆฌ ์ค์ ํด ๋๋ ๊ฒ์ด ์ค์ํ๋ค.
b.์์
@ResponseStatus(HttpStatus.BAD_REQUEST) // ์๋ฌ์ฝ๋๋ฅผ 500(default) -> 400
class MyException extends RuntimeException {
MyException(String msg){
super(msg);
}
MyException() { this("");}
}
2. ์์ธ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ 2๊ฐ์ง ์ถ๊ฐ
์ฒซ ๋ฒ์งธ ๋ฐฉ๋ฒ์ ์์ธ ์ข ๋ฅ ๋ณ๋ก Error view๋ฅผ Mappingํ๋ ๋ฐฉ๋ฒ์ด๋ค. ํด๋น ๋ฐฉ๋ฒ์ Servlet-context.xml์์ ์์ ํ๋ค.
์์ ์ ๋ฐฐ์ด ๋ด์ฉ ์ค์, ํด๋ผ์ด์ธํธ์ ์์ฒญ ๋ณ๋ก view Mapping ํ๋ ๊ฒ๋ Servlet-context.xml์์ ๊ฐ๋ฅํ์๋ค.
์ฝ๋๋ ๋ค์๊ณผ ๊ฐ๋ค.
<view-controller path="/register/add" view-name="registerForm"/>
์ด๋ "/register/add"๋ก Get Mapping์ด ์ค๋ฉด, registerForm.jsp๋ฅผ ๋งคํํ๋ผ๋ ๋ป์ด๋ค. ์ด๋ ์์ฒญ์ ๋ฐ์์ ๋ญ๊ฐ ์ฒ๋ฆฌํด์ค ํ์๊ฐ ์๋ ๊ฒฝ์ฐ, ๊ทธ์ ์ปจํธ๋กค๋ฌ๊ฐ view ํ๋ฉด๋ง ๋์๋ ๋๋ ๊ฒฝ์ฐ์ ์ฐ์ธ๋ค.
๋ง์ฐฌ๊ฐ์ง๋ก, ์์ธ ๋ฐ์ ์ ๋ณ ๋ค๋ฅธ ์ฒ๋ฆฌ ์์ด Error view๋ง ๋์ฐ๋ ๊ฒฝ์ฐ์๋ Servlet-context๋ฅผ ์ด์ฉํ ๋ฐฉ๋ฒ์ ์ธ ์ ์๋ค.
๋ ๋ฒ์งธ ๋ฐฉ๋ฒ์ ์ํ ์ฝ๋ ๋ณ๋ก Error View๋ฅผ Mapping ํ๋ ๋ฐฉ๋ฒ์ด๋ค. ํด๋น ๋ฐฉ๋ฒ์ web.xml์์ ์์ ํ๋ค.
์ด๋ ์์ธ๋ฅผ ์ฒ๋ฆฌํ๋ 3๊ฐ์ง ๋ฐฉ๋ฒ(try-catch๋ก ์์ธ์ฝ๋ ๋ฌถ๊ธฐ, @ExceptionHandler, @ControllerAdivce)์ผ๋ก ์ฒ๋ฆฌ๊ฐ ์๋ ์์ธ๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํ ๋ง์ง๋ง ๊ทธ๋ฌผ๋ง์ด๋ค. ์๋ฅผ ๋ค์ด A ์์ธ๋ฅผ ์ฒ๋ฆฌํ๋ ์์ธ์ฒ๋ฆฌ ๋งค์๋๋ฅผ ๋ง๋ค์ง ์์ A ์์ธ๊ฐ ๋ฐ์ํด๋ ์ฒ๋ฆฌ๊ฐ ์๋ ์ ์๋ค. ์ด ๊ฒฝ์ฐ์ ์ํ์ฝ๋๋ง ๋ณด๊ณ ํด๋น ์ํ์ฝ๋์ผ ๋ ๋จ๋ view๋ฅผ ๋ณด์ฌ์ค์ ์์ธ ๋ฐ์์ ๋์ํ๋ ๊ฒ์ด๋ค.
(1) ์์ธ ์ข ๋ฅ ๋ณ๋ก Error view(jsp) Mapping ํ๊ธฐ
Spring์ Web ์ค์ ์ ๋ด๋นํ๋ Servlet-context.xml์์ ์์ ํด์ผํ๋ค.
<!-- ์์ธ ์ข
๋ฅ ๋ณ๋ก Error view mapping ํ๋ ์ฝ๋๋ค
์ฌ๊ธฐ์๋ MyException ์ด๋ผ๋ ์์ธ๋ฅผ ์ฒ๋ฆฌํ ์ error400์ด๋ผ๋ view๋ฅผ ์ฐพ์ ์ด๋๋ก ์ค์ ํด๋์๋ค. -->
<beans:bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<beans:property name="defaultErrorView" value="error"/>
<beans:property name="exceptionMappings">
<beans:props>
<beans:prop key="com.fastcampus.ch2.MyException">error400</beans:prop>
</beans:props>
</beans:property>
<beans:property name="statusCodes">
<beans:props>
<beans:prop key="error400">400</beans:prop>
</beans:props>
</beans:property>
</beans:bean>
์ด ์ฝ๋๋ฅผ ์ถ๊ฐํ๋ฉด ๋๋ค. ์ฌ๊ธฐ์
<beans:props>
<beans:prop key="com.fastcampus.ch2.MyException">error400</beans:prop>
</beans:props>
์ด ๋ถ๋ถ์ ์์ธ์ ์ข ๋ฅ์ ํด๋น ์์ธ ๋ฐ์ ์ ์ด์ด์ผํ Error View๋ฅผ ์ฐ๊ฒฐํด์ค๋ค.
์ฌ๊ธฐ์๋ MyException ์์ธ ๋ฐ์ ์ error400.jsp๋ฅผ ์ด๋ผ๊ณ ์ง์ํ๋ค.
<beans:props>
<beans:prop key="error400">400</beans:prop>
</beans:props>
์ด๊ฑด error400.jsp view ๋์ธ ๋ ์ํ ์ฝ๋๋ฅผ 400์ผ๋ก ํ๋ผ๋ ๋ป์ด๋ค.
**์ฐธ๊ณ **
ใฑ.
์ฐ๋ฆฌ๊ฐ Error View์ ์ํ ์ฝ๋๋ฅผ 400์ผ๋ก ํด๋จ๋๋ฐ๋ ์์ธ ๋ฐ์ page ๊น๋ณด๋ 500์ผ๋ก ๋์ด์๋ ๊ฒฝ์ฐ๊ฐ ์๋ค!
์ด๋ Error View jsp ๋ด๋ถ์ isErrorPage๊ฐ true๋ก ๋์ด์๊ธฐ ๋๋ฌธ์ด๋ค.
<%@ page contentType="text/html;charset=utf-8" isErrorPage="true"%>
ํด๋น ๋ช ๋ น์ด๋ ์์ธ ๊ฐ์ฒด๊ฐ null์ด ์๋๋ฉด ์ํ์ฝ๋๋ฅผ 500์ผ๋ก ๋ฐ๊พธ๋ผ๋ ๋ป์ด๋ค.
๊ทธ๋์ 400์ผ๋ก ๋ฐ๊พธ๊ณ page๋ฅผ ์ด์ด๋ ๋ค์ ์ํ์ฝ๋๊ฐ 500์ด ๋๋ ๊ฒ์ด๋ค.
์ด๋ฅผ ์์ ๋ ค๋ฉด ํด๋น isErrorPage = "false"๋ก ๋ฐ๊พธ์.
ใด.
์ฌ๊ธฐ์ ์ฌ๋ view๋ webapp์ views ํ์ผ์ ์๋ ๋ ์๋ค์ด๋ค. ์๋ ์ฐ๋ฆฌ๊ฐ ์ฐ๋ ํ์ผ์ด๋ค.
์์ธ ์ข ๋ฅ ๋ณ view mapping๊ณผ ์ํ ์ฝ๋ ๋ณ view mapping์ด ์๋ก ๋ค๋ฅธ ์์ญ์ ์ ์ฅ๋ view๋ฅผ ์์ผ๋ก ์ฃผ์ํ์.
์ํ ์ฝ๋ ๋ณ view mapping์ WEB-INF๋ผ๋ ์์ ํ์ผ์ ์กด์ฌํ๋ view๋ฅผ ์ด๋ค.
(2) ์ํ ์ฝ๋ ๋ณ๋ก Error view(jsp) Mapping ํ๊ธฐ
์ด๊ฑฐ๋ web.xml ํ์ผ์ ์ด์ฉํ๋ค.
<error-page>
<error-code>400</error-code>
<location>/error400.jsp</location>
</error-page>
์ด๊ฑธ ์ถ๊ฐํด์ฃผ๋ฉด ๋๋ค. ๊ทธ๋ฌ๋ฉด ์ด๋ค ์ปจํธ๋กค๋ฌ์ ์ฒ๋ฆฌ ๊ฒฐ๊ณผ๋ก 400์ด๋ผ๋ ์ํ์ฝ๋๊ฐ ๋์์ ๊ฒฝ์ฐ error400.jsp๋ผ๋ view๋ฅผ ๋์ด๋ค.
web.xml์ WEB-INF ํด๋์์ view๋ฅผ ์ฐพ๊ธฐ ๋๋ฌธ์ ๊ฑฐ๊ธฐ์ ๋ง๋ค์ด์ค์ผํ๋ค.
3. Spring์์ ์์ธ์ฒ๋ฆฌํ๋ ๊ณผ์
(1) Controller์์ ์ฒ๋ฆฌ ์ค์ ์์ธ๊ฐ ๋ฐ์.
(2) ๋ง์ฝ try -catch ๊ตฌ๋ฌธ์ผ๋ก ์์ธ ์ฒ๋ฆฌ ํ์ผ๋ฉด ์ปจํธ๋กค๋ฌ ๋ด๋ถ์์ ์์ธ์ฒ๋ฆฌ๊ฐ ์ ๋ถ ๋๋๋ค.
(3) ๊ทธ๊ฒ ์๋๋ผ๋ฉด ์ปจํธ๋กค๋ฌ๊ฐ ์์ธ ๋ด์ฉ์ ๋ค์ DispatcherServlet์๊ฒ ๋ณด๋ธ๋ค.
(4) DispatcherServlet์ ์์ธ๋ฅผ ๋ฐ๊ณ Spring์์ ์ ๊ณตํ๋ ์์ธ์ฒ๋ฆฌ ๊ธฐ๋ณธ์ ๋ต์ ๋ฐ๋ผ ์ฐ์ ์์๋๋ก ์ผ์ ์ฒ๋ฆฌ ํ๋ค.
(4-1) ๋ง์ฝ ExceptionHandler๋ก ์ด๋ ธํ ์ด์ ๋ ์์ธ์ฒ๋ฆฌ ๋งค์๋ ์ค์ ํด๋น ์์ธ๋ฅผ ์ฒ๋ฆฌํ ์ ์๋ ๋ ์์ด ์์ผ๋ฉด, ๊ทธ ๋ ์์๊ฒ ์์ธ๋ฅผ ๋ณด๋ด์ ์์ธ์ฒ๋ฆฌ ์ํด. (๋์ผ ์ปจํธ๋กค๋ฌ ๋ด๋ถ์ ์๋ ๊ฒ, @ControllerAdvice์ ์๋ ๊ฒ ์น๋ค ๋ค์ง)
(4-2) @ExceptionHandler ์ ํ ๋งค์๋ ์ค ์๋ฌด๋ ๋ชปํ๋ฉด, ๋ค์๊ณผ ๊ฐ์ด ํ๋ค. ๋ง์ฝ ์์ธ ๋ฐ์ ์ํจ ํด๋์ค์ @ResponseStatus๋ก ์ํ ์ฝ๋๋ฅผ ์ค์ ํด๋์๋ค๋ฉด, ์ํ์ฝ๋๊ฐ ๋ญ์ง ๋ณธ๋ค. ๊ทธ๋ฆฌ๊ณ Web.xml์ ์ํ์ฝ๋์ ๋ง๊ฒ ๋์ธ Error view๊ฐ ๋งตํ๋์ด ์๋ค๋ฉด ๊ทธ View๋ฅผ ๋์ด๋ค.
(4-3) ๋ง์ฝ @ResponseStaus ์ ํด๋์ ์์ธ๋ฐ์ ์ Spring์ default์ธ ์ํ์ฝ๋ 500์ด ๋จ๋ ๊ฒฝ์ฐ, DispatcherServlet์ DefaultHandlerExceptionResolver๋ฅผ ์ฐพ์๊ฐ๋ค. ์ด ๋ ์์ ๋ณธ์ธ๋ง์ ์ํ์ฝ๋๋ฅผ 500์์ ๋ค๋ฅธ ์ฝ๋๋ก ๋ฐ๊พธ๋ ๋ฉ๋ด์ผ์ ๊ฐ์ง๊ณ ์๋ค. ๊ทธ๋์ DispatcherServlet์ด ์์ธ๋ฅผ ๋ค๊ณ ์ฐพ์์ค๋ฉด, ๊ทธ ์์ธ์ ๋ง๊ฒ ์ํ์ฝ๋๋ฅผ 400๋ฒ๋, 500๋ฒ๋ ์ค ํ๋๋ก ๋ฐ๊ฟ์ค๋ค.
<์ฐธ๊ณ > ์์ธ์ฒ๋ฆฌ view์ ์์ธ์ฒ๋ฆฌ ๋งค์๋ ์ฌ์ด์ model ์์ด ์์ธ ๊ฐ์ฒด๋ฅผ ์ฃผ๊ณ ๋ฐ๋ ๋ฒ
<%@ page contentType="text/html;charset=utf-8" isErrorPage="true"%>
์ฌ๊ธฐ์ isErrorPage๋ฅผ true๋ก ํด๋ฒ๋ฆฌ๋ฉด, ์์ธ์ฒ๋ฆฌ view์ ์์ธ์ฒ๋ฆฌ ๋งค์๋ ์ฌ์ด์ model ์์ด๋ ์์ธ ๊ฐ์ฒด๋ฅผ ์ฃผ๊ณ ๋ฐ์ ์ ์๋ค.
๋ง์ฝ ๋ชจ๋ธ ์์ด ์งํต์ผ๋ก ์์ธ ๊ฐ์ฒด๋ฅผ ๋ฐ๋๋ค๋ฉด ๋น์ฐํ JSP ๋ด์ EL ๋ด์ฉ๋ ๋ฌ๋ผ์ง๋ค.
<!-- ๋ชจ๋ธ์ ์ฌ์ฉํ์ฌ ์์ธ ๊ฐ์ฒด๋ฅผ ๋ฐ์์ฌ ๋ EL ๋ฌธ๋ฒ -->
๋ฐ์ํ ์์ธ : ${ex}<br>
์์ธ ๋ฉ์์ง : ${ex.message}<br>
<!-- ์์ isErrorPage = "true" ์ฝ์
ํ ๋ชจ๋ธ ์์ด ์๋ฌ ๊ฐ์ฒด๋ฅผ ๋ฐ์ ๊ฒฝ์ฐ EL ๋ฌธ๋ฒ -->
๋ฐ์ํ ์์ธ : ${pageContext.exception}<br>
์์ธ ๋ฉ์์ง : ${pageContext.exception.message}<br>
Model์ ์ ์ฐ๋ ๊ฒฝ์ฐ JSP์ ๋ด๋ถ ์ ์ฅ์์ธ pageContext๋ฅผ ์ด๋ค๋ ๊ฒ์ ์ ์ ์๋ค. ์ฌ๊ธฐ์ ์์ธ ๊ฐ์ฒด๋ฅผ ๊บผ๋ด ์ฐ๋ ๊ฒ์ด๋ค.
5. ์ค์ค๋ก ํด๋ณด๊ธฐ
(1) @ResponseStatus ์ ์ผ์ ๋ ์ํ ์ฝ๋, ์ผ์ ๋ ์ํ์ฝ๋ ๋ฐ๊ฟ๊ฐ๋ฉฐ ํ์ธ
-1 ์์ธ์ฒ๋ฆฌ ๋ฉ์๋ ์์ ์ฐ๊ธฐ
๋ง์ฝ @ResponseStatus๋ฅผ ํ์ง ์์ผ๋ฉด 200์ด ๋์์ผ ํ๋ค. ์๋ฒ๊ฐ ์์ธ๋ฅผ ์ ์ฒ๋ฆฌ ํ๊ธฐ ๋๋ฌธ์ด๋ค.
๊ทธ๋ฐ๋ฐ ๋ด๊บผ๋ 500์ด ๋์๋ค.
๊ทธ ์ด์ ๋ isErrorPage๊ฐ true๋ก ๋์ด์์ด์์ด๋ค. ์ํ์ฝ๋๊ฐ ๋ญ๋ก ๋ณํ๋์ด ์ค๋ , view์์ ํด๋น ์์๊ฐ true์ด๋ฉด, ์ํ์ฝ๋๋ ํญ์ 500์ผ๋ก ๋ค์ ๋ฐ๋๋ค. ํด๋น ๋ถ๋ถ์ false๋ก ํด๋๊ณ , ๋ค์ ํด๋ณด์.
---------------------------
jsp ํด๋น ๋ถ๋ถ์ false๋ก ๋๋ฆฌ๊ณ ์ฃผ์ ์ฒ๋ฆฌํ ์ํ์์ ๋๋ ค๋ณด์๋ค.
default ์ํ์ธ 200 ์ ๋ด๋ค. ๋ค์ @ResponseStatus ๋ถ๋ถ ์ฃผ์์ ๋นผ๋
500 ๋์๋ค.
-2 ์ฌ์ฉ์ ์ ์ ์์ธ ํด๋์ค ์์ ์ฐ๊ธฐ
@ResponseStatus(HttpStatus.BAD_REQUEST) // ์๋ฌ์ฝ๋๋ฅผ 500(default) -> 400
class MyException extends RuntimeException {
MyException(String msg){
super(msg);
}
MyException() { this("");}
}
๋ด๊ฐ ๋ง๋ MyException์ Default๊ฐ 500์ด์ง๋ง, @ResponseStatus๋ฅผ ํตํด ์ํ์ฝ๋๋ฅผ 400์ผ๋ก ๋ฐ๊ฟจ๋ค.
ํด๋น ์ปจํธ๋กค๋ฌ ๋ด๋ถ์๋ ์์ธ์ฒ๋ฆฌ ๋งค์๋๊ฐ ์์ผ๋ฏ๋ก @ControllerAdvice ๊ฑธ๋ฆฐ ๋์ด ํด๊ฒฐํ ๊ฒ์ด๋ค.
๊ทธ๋ ๋ค๋ฉด ๋ง์ฝ @ControllerAdvice ๊ฑธ๋ฆฐ ๋๋ @ResponseStatus ๊ฑธ๋ ค ์์ผ๋ฉด ์ํ์ฝ๋๋ ์ด๋ป๊ฒ ๋ฐ๊น?
๋ @ControllerAdivce๋ฅผ ๋ง๋๋ฉด ์ํ์ฝ๋๊ฐ ๋ค์ 500์ด ๋๊ฒ๋ ์ค์ ํด๋ณด๊ฒ ๋ค.
์์์ 500 -> 400 -> 500์ผ๋ก ๋ณ๊ฒฝ๋๋ ๊ฒ์ด๋ค.
@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
@ExceptionHandler(Exception.class)
public String catcher2(Exception ex, Model m) {
m.addAttribute("ex", ex);
return "error";
}
๋ฐ๋์๋ค.
(2) servlet-context.xml๊ณผ web.xml ์คํํด๋ณด๊ธฐ
servlet-context.xml์ spring > appservlet > servlet-context.xml ๊ฒฝ๋ก๋ก ๊ฐ๋ฉด ์ฐพ์ ์ ์๋ค.
MyException์ ๋ํด์ ์์ธ์ฒ๋ฆฌ๋ฅผ ํ ๊ฒ์ธ๋ฐ, ๋ค๋ฅธ ์์ธ์ฒ๋ฆฌ ๋งค์๋๋ค์ด ์ผํ์ง ๋ชปํ๋๋ก ๋ชจ๋ ์ฃผ์์ฒ๋ฆฌ ํด์ฃผ์๋ค.
๊ทธ๋ฆฌ๊ณ web.xml๋ ์ฃผ์์ฒ๋ฆฌ ํ๋ค.
์ด์ MyException ์์ธ ๋ฐ์ ์ servlet-context๊ฐ ๋ฐ๋ํ์ฌ 400Error๋ผ๋ ํ๋ฉด์ด ๋ฐ ๊ฒ์ด๋ค.
web.xml๋ง ์ด๋ฆฌ๊ณ ๋๋ ธ์ ๋๋ ๊ฐ์ ๊ฒฐ๊ณผ๊ฐ ๋์๋ค.