μμΈλ₯Ό λ°μμν€λ λ κ°μ§ λ°©λ²μ λλ€.
throw
λ₯Ό μ΄μ©ν΄ μ§μ μμΈ ν΄λμ€λ₯Ό λμμν€λ λ°©λ²μ
λλ€.throw new RuntimeException("μλ¬ μλ¬");
HttpServletResponse
μ sendError
λ©μλλ₯Ό μ΄μ©ν΄ μμΈλ₯Ό λ°μμν€λ κ² λ°©λ²μ
λλ€.response.sendError(404, "404μλ¬ λ°μ λ©μμ§");
ν
μ€νΈλ₯Ό μν΄ μ λ κ°μ§ λ°©λ²μ μ΄μ©ν΄ μ¬λ¬ μμΈλ₯Ό λ°μμμΌ°μ΅λλ€.
λ§μ½ μλ¬΄λ° μ²λ¦¬λ₯Ό νμ§ μλλ€λ©΄ Springμμ κΈ°λ³ΈμΌλ‘ μ 곡νλ White Lable
μλ¬κ° λ°μν κ² μ
λλ€.
@Slf4j
@Controller(value = "/error-page")
public class ExceptionController {
@RequestMapping("/error-boom")
public String errorRuntime() {
throw new RuntimeException("μλ¬ μλ¬");
}
@RequestMapping("/error-404")
public void error404(HttpServletResponse response) throws IOException {
response.sendError(404, "404 μλ¬ λ°μ λ©μμ§");
}
@RequestMapping("/error-400")
public void error400(HttpServletResponse response) throws IOException {
response.sendError(400, "400 μλ¬ λ°μ λ©μμ§");
}
@RequestMapping("/error-403")
public void error403(HttpServletResponse response) throws IOException {
response.sendError(403, "403 μλ¬ λ°μ λ©μμ§");
}
@RequestMapping("/error-500")
public void error500(HttpServletResponse response) throws IOException {
response.sendError(500, "500 μλ¬ λ°μ λ©μμ§");
}
}
μμΈκ° λ°μνμ λ μμΈκ° λ°μν λ©μλ νΉμ ν΄λμ€μμ try-catch
λ±μΌλ‘ μμΈλ₯Ό μ‘μμ£Όμ§ μλλ€λ©΄ μμ μ νΈμΆν λ©μλ νΉμ ν΄λμ€λ‘ μμΈλ₯Ό λμ§κ² λ©λλ€.
μμΈλ₯Ό μ ν μ‘μ§ μμ μλ리μ€λ₯Ό ν λ² μ΄ν΄λ³Όκ»μ.
1. 컨νΈλ‘€λ¬μμ RuntimeException
λ°μ
2. 컨νΈλ‘€λ¬λ μμ μ νΈμΆν μΈν°μ
ν°λ‘ μμΈλ₯Ό λμ§
3. μΈν°μ
ν°λ μμ μ νΈμΆν μλΈλ¦Ώ 컨ν
μ΄λμ μμΈλ₯Ό λμ§(Dispatcher servlet)
4. μλΈλ¦Ώ 컨ν
μ΄λλ νν°λ‘ μμΈλ₯Ό λμ§
5. νν°λ WASλ‘ μμΈλ₯Ό λμ§
μ¬κΈ°μ μ€μν κ²μ μμΈκ° WASκΉμ§ μ νλλ€λ κ² μ
λλ€.
WASλ μ νλ°μ μμΈλ₯Ό λ μ΄μ λμ§μ§ μκ³ μκΈ°κ° μ²λ¦¬ν©λλ€.
μ²λ¦¬ λ°©μμ΄ μ€μνλ° μ νλ WASλ μλ¬μ½λλ₯Ό λ³΄κ³ μ€λ₯ νμ΄μ§ μΆλ ₯μ μν΄ μ΄λ€ URLμ λ§λ€μ΄μ λ€μ νΉμ 컨νΈλ‘€λ¬μ μμ²ν©λλ€.
μ΄λ€ URLμΌκΉμ?
SpringBootλ₯Ό μ¬μ©νλ κ²½μ° WASκΉμ§ λλ¬νλ μμΈμ λν΄μ WASλ /error
μ μμΈμ 보λ₯Ό λ΄μ μμ²ν©λλ€. SpringBootλ κΈ°λ³Έμ μΌλ‘ BasicErrorController
μμ /error
μ λν μ²λ¦¬λ₯Ό ν©λλ€.
BasicErrorController
λ μμ μκ² μ¨ μμ²μ μ²λ¦¬ν©λλ€.
νΉν μλ¬ νμ΄μ§λ₯Ό λλλ§ν΄μ£Όλ κΈ°λ₯μ μνν©λλ€.
500μλ¬κ° λ°μνλ€κ³ ν΄λ³Όκ»μ.
BasicErrorController
κ° μλ¬νμ΄μ§λ₯Ό λλλ§νλ μ μ±
μ΄ μ ν΄μ Έμμ΅λλ€.
templates/error/500.html
μ μ°Ύμ λλλ§templates/error/5xx.html
μ μ°Ύμ λλλ§static/error/500.html
μ μ°Ύμ λλλ§static/error/5xx.html
μ μ°Ύμ λλλ§μ€νλ§μ μΈμ λ ꡬ체μ μΈ κ²μ΄ μ°μ μμλ₯Ό κ°μ΅λλ€. 5xx
보λ€λ 500
μ΄ κ΅¬μ²΄μ μ΄κΈ° λλ¬Έμ μ°μ μμλ₯Ό κ°λ κ² μ
λλ€.
μ°λ¦¬λ μ΄λ κ² κ°λ¨νκ² νΉμ κ²½λ‘μ μ μ± μ λ§λ htmlμ λ§λ€μ΄μ£ΌκΈ°λ§ νλ©΄ μλΈλ¦Ώ λ°μΌλ‘ λ λΌκ°λ μλ¬μ λν΄ μ ν©ν μλ¬ νμ΄μ§λ₯Ό 보μ¬μ€ μ μμ΅λλ€.
μ κ·Έλ¦Όμ λ€μ λ³Όκ»μ.
λ°μν μμΈλ₯Ό μλΈλ¦Ώ μ΄μ μμ μ²λ¦¬νμ§ λͺ»νκ³ WASκΉμ§ λμ΄κ° κ²½μ° WASλ λ€μ μ€λ₯ νμ΄μ§λ₯Ό μμ²νλ ꡬ쑰μ
λλ€.
λ€μ μ€λ₯ νμ΄μ§λ₯Ό μμ²νλ ꡬ쑰μμ μλ―Έμλ νν°, μΈν°μ ν° λ±μ΄ νΈμΆλ μ μμ΅λλ€. μ¬κΈ°μ μλ―Έκ° μλ€λ κ²μ λ‘κ·ΈμΈ κ²μ¦ νν° λ±μ΄ ν΄λΉν©λλ€. μ΄λ―Έ κ²μ¦μ λ§μΉ μ¬μ©μμ μμ²μ μννκ³ μλλ° λ°μν μμΈμ΄κ³ μλ² λ΄λΆμ μΌλ‘ μ²λ¦¬νλ κ² λΏμΈλ° λ€μ κ²μ¦ νν° νΉμ μΈν°μ ν°μ κ²μ¦μ λ°μ νμκ° μμκΉμ?
λ°λμ μν©λ μμ μ μμ΅λλ€.
WASμμ μ€λ₯ μ²λ¦¬μ μν νΈμΆμΈ κ²½μ°μλ§ λμμν¬ νν°, μΈν°μ
ν° λ±μ΄ μμ μλ μλ κ²μ΄μ£ .
μ΄λ»κ² μμΈμ²λ¦¬λ‘ μΈν μλ¬ νμ΄μ§ μμ²μΈμ§, μ μμ μΈ μ¬μ©μμ μμ²μΈμ§ ꡬλΆν μ μμκΉμ ?
WASμ μμ²μλ DispatcherType
μ΄λΌλ μΆκ°μ λ³΄κ° μ 곡λ©λλ€.
DispatcherType νμ μ’ λ₯
1. REQUEST: ν΄λΌμ΄μΈνΈμ μμ²
2. ERROR: μλ¬ νμ΄μ§ μμ²
INCLUDE, FORWARD λ±μ΄ λ μμ§λ§ μ¬μ©νκ³ μ νλ κ²λ§ μμλκ»μ.
Filter
λ λ±λ‘μ Dispatcher Type
μ ꡬλΆν μ μμ΅λλ€.
μ 곡λλ setDispatcherTypes
λ©μλλ‘ νν°λ₯Ό μ μ©μν¬ Dispatcher Type
μ μ μν©λλ€.
μλ μ½λλ μ μν Filter
λ₯Ό λΉμΌλ‘ λ±λ‘νλ μμ
μ ν©λλ€.
setDispatcherTypes
λΆλΆμ 보면 DispatcherType.REQUEST, DispatcherType.ERROR
μ μ€μ ν΄μ£Όμμ΅λλ€.
μ¬μ©μμ μμ², μλ¬νμ΄μ§ μμ²μ λͺ¨λμ λ±λ‘νλ νν°λ₯Ό μ μ©μν€κ² λ€λ κ²μ΄μ§μ.
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Bean
FilterRegistrationBean<Filter> getLogFilter() {
FilterRegistrationBean<Filter> filterRegistrationBean = new FilterRegistrationBean<>();
filterRegistrationBean.setFilter(new LogFilter());
filterRegistrationBean.setOrder(1);
filterRegistrationBean.addUrlPatterns("/*");
filterRegistrationBean.setDispatcherTypes(DispatcherType.REQUEST, DispatcherType.ERROR);
return filterRegistrationBean;
}
}
λ§μ½ μ¬μ©μμ μμ²μ λν΄μλ§ νν°λ₯Ό μ μ©μν€κ³ μΆλ€λ©΄ μλμ κ°μ΄ DispatcherType.ERROR
λ₯Ό λΉΌμ£Όλ©΄ λ©λλ€.
filterRegistrationBean.setDispatcherTypes(DispatcherType.REQUEST);
μ΄μ μΈν°μ
ν°λ₯Ό λ€λ£¬ ν¬μ€νΈμμ μ¬μ©νλ excludePathPatterns
λ₯Ό μ¬μ©ν©λλ€.
WASλ μμΈ νμ΄μ§ μμ²μ μν΄ BasicErrorController
μ 맀νλμ΄ μλ /error
λ‘ μμ²μ 보λΈλ€κ³ νμ΅λλ€.
/error
μμ² μ체λ₯Ό excludePathPatterns
λ‘ μ€μ νκ³ μ νμ§ μλλ€λ©΄ WASμ μλ¬ νμ΄μ§ μμ²μ μΈν°μ
ν°λ₯Ό λμμν€κ±°λ λμμν€μ§ μκ±°λ ν μ μμ΅λλ€.
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new LogInterceptor())
.order(1)
.addPathPatterns("/**")
.excludePathPatterns("/css/**", "/error");
}
μΈνλ° κΉμνλμ μ€νλ§ MVC 2νΈ μ μκ°νκ³ μ 리ν λ΄μ©μ λλ€.
μλ‘μ΄ μ§μμ μκ² λμλ€μ!!