์คํ๋ง MVC 2ํธ์ ๊ฐ์ ๋ด์ฉ์ ์ ๋ฆฌํ ํฌ์คํ ์ ๋๋ค.
API ์์ธ ์ฒ๋ฆฌ
HTML ํ์ด์ง์ ๊ฒฝ์ฐ ๊ทธ์ ๋ง๋ ์ค๋ฅ ํ์ด์ง๋ง ์์ผ๋ฉด ๋๋ถ๋ถ์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์์ง๋ง, API์ ๊ฒฝ์ฐ ๊ณ ๋ คํด์ผ ํ ์ ์ด ๋ ๋ง๋ค. ์ค๋ฅ ํ์ด์ง๋ ๋จ์ํ ํด๋ผ์ด์ธํธ์๊ฒ ์ค๋ฅ ํ๋ฉด์ ๋ณด์ฌ์ฃผ๊ณ ๋์ด์ง๋ง, API๋ ๊ฐ ์ค๋ฅ ์ํฉ์ ๋ง๋ ์ค๋ฅ ์๋ต ์คํ์ ์ ํ๊ณ JSON์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ด๋ณด๋ด์ผ ํ๋ค.
@RequestMapping ์ ๋
ธํ
์ด์
์ produces
์ต์
์ MediaType.APPLICATION_JSON_VALUE
์ผ๋ก ์ค์ ํ๋ฉด, HTTP ํค๋์ Accept
๊ฐ์ด application/json
์ผ ๋๋ง ํด๋น ๋ฉ์๋๋ฅผ ํธ์ถํ๊ฒ ๋๋ค.
์คํ๋ง ๋ถํธ ๊ธฐ๋ณธ ์ค๋ฅ ์ฒ๋ฆฌ
์คํ๋ง ๋ถํธ๊ฐ ์ ๊ณตํ๋ ๊ธฐ๋ณธ ์ค๋ฅ ๋ฐฉ์(BasicErrorController)์ ์ด์ฉํ ์๋ ์๋๋ฐ, ์ฝ๋๋ฅผ ๋ณด๋ฉด ์๋์ ๊ฐ๋ค.
@RequestMapping(produces = MediaType.TEXT_HTML_VALUE)
public ModelAndView errorHtml(HttpServletRequest request, HttpServletResponse response) {}
@RequestMapping
public ResponseEntity<Map<String, Object>> error(HttpServletRequest request) {}
๋ ๋ฉ์๋๋ ๋์ผํ ๊ฒฝ๋ก๋ฅผ ์ฒ๋ฆฌํ๋๋ฐ, HTTP ํค๋์ Accept
๊ฐ์ด text/html
์ธ ๊ฒฝ์ฐ์๋ง errorHtml()
๋ฉ์๋๋ฅผ ์ ์ฉํ๊ณ ๊ทธ ์ธ์ ๊ฒฝ์ฐ์๋ error()
๋ฉ์๋๋ฅผ ์ ์ฉํ๋ค.
HandlerExceptionResolver
์คํ๋ง ๋ถํธ๊ฐ ์ ๊ณตํ๋ BasicErrorController๋ HTML ํ์ด์ง๋ฅผ ์ ๊ณตํ๋ ๊ฒฝ์ฐ ํธ๋ฆฌํ๊ฒ ์ด์ฉํ ์ ์์ง๋ง, API ์ค๋ฅ ์ฒ๋ฆฌ๋ API๋ง๋ค ํน์ ๊ฐ๊ฐ์ ์ปจํธ๋กค๋ฌ๋ ์์ธ๋ง๋ค ์๋ก ๋ค๋ฅธ ์๋ต ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅํด์ผ ํ ์๋ ์๋ค. ๋ฐ๋ผ์ API ์ค๋ฅ๋ BasicErrorController๊ฐ ์๋ @ExceptionHandler๋ฅผ ์ด์ฉํ๋ ๊ฒ์ด ๋์ฑ ํธ๋ฆฌํ๋ค.
์๊ตฌ์ฌํญ
์๋ธ๋ฆฟ์ ๋์ด WAS๊น์ง ์์ธ๊ฐ ์ ๋ฌ๋๋ฉด HTTP ์ํ์ฝ๋๊ฐ 500์ผ๋ก ์ฒ๋ฆฌ๋์ง๋ง ๋ฐ์ํ๋ ์์ธ์ ๋ฐ๋ผ์ 400, 404 ๋ฑ ๋ค๋ฅธ ์ํ์ฝ๋๋ก ์ฒ๋ฆฌํ๊ฑฐ๋ ์ค๋ฅ ๋ฉ์์ง, ํ์ ๋ฑ์ API๋ง๋ค ๋ค๋ฅด๊ฒ ์ฒ๋ฆฌํ๋ ๊ฒ
์์ ์๊ตฌ์ฌํญ์ ์ถฉ์กฑ์ํค๊ธฐ ์ํด์๋ HandlerExceptionResolver, ์ค์ฌ์ ExceptionResolver๋ฅผ ์ด์ฉํ๋ฉด ๋๋ค.
ExceptionResolver๋ฅผ ์ ์ฉํ๊ณ ๋์ ์์ธ๊ฐ ๋ฐ์ํ๊ฒ ๋๋ฉด ์๋์ ๊ฐ์ ํ๋ฆ์ ๊ฐ์ง๋ค.
1. ํธ๋ค๋ฌ(์ปจํธ๋กค๋ฌ)์์ ์์ธ๊ฐ ๋ฐ์ํ๋ฉด ๋์คํจ์ฒ ์๋ธ๋ฆฟ์ผ๋ก ์์ธ ์ ๋ฌ
2. ExceptionResolver์์ ์์ธ ์ฒ๋ฆฌ๋ฅผ ์๋
3. ExceptionResolver์์๋ ModelAndView๋ฅผ ๋ฐํํ๋๋ฐ, ๋ฐํ ๊ฐ์ ๋ฐ๋ฅธ ๋์คํจ์ฒ ์๋ธ๋ฆฟ์ ๋์ ๋ฐฉ์์ ๋ค์๊ณผ ๊ฐ๋ค.
3-1 ๋น ModelAndView - ๋ทฐ๋ฅผ ๋ ๋๋ง ํ์ง ์๊ณ , ์ ์ ํ๋ฆ์ผ๋ก ์๋ธ๋ฆฟ์ด ๋ฆฌํด๋๋ค.
3-2 ModelAndView ์ง์ - ์ง์ ๋ ๋ทฐ๋ฅผ ๋ ๋๋ง ํ๋ค.
3-3 null - ๋ค์ ExceptionResolver๋ฅผ ์ฐพ์์ ์คํํ๋๋ฐ, ์์ ๊ฒฝ์ฐ ์์ธ ์ฒ๋ฆฌ๊ฐ ์ด๋ฃจ์ด์ง์ง ๋ชปํ ์ฑ ์๋ธ๋ฆฟ ๋ฐ์ผ๋ก ๊ธฐ์กด ์์ธ๋ฅผ ๋์ง๋ค.
HandlerExceptionResolver - ํ์ฉ
1. ์์ธ ์ํ ์ฝ๋ ๋ณํ
- ์์ธ๋ฅผ sendError()
ํธ์ถ๋ก ๋ณ๊ฒฝํด์ ์๋ธ๋ฆฟ์์ ์ํ ์ฝ๋์ ๋ฐ๋ฅธ ์ค๋ฅ๋ฅผ ์ฒ๋ฆฌํ๋๋ก ์์
2. ๋ทฐ ํ ํ๋ฆฟ ์ฒ๋ฆฌ
- ModelAndView์ ๊ฐ์ ์ฑ์์ ์์ธ์ ๋ฐ๋ฅธ ์๋ก์ด ์ค๋ฅ ํ๋ฉด ๋ทฐ๋ฅผ ๋ ๋๋ง ํด์ ์ ๊ณต
3. API ์๋ต ์ฒ๋ฆฌ
- getWriter().println()
์ฒ๋ผ HTTP ์๋ต ๋ฐ๋์ ์ง์ ๋ฐ์ดํฐ๋ฅผ ๋ฃ์ด์ค ์๋ ์๋ค. ์ฌ๊ธฐ์ JSON์ผ๋ก ์๋ตํ๋ฉด API ์๋ต ์ฒ๋ฆฌ๋ฅผ ํ ์ ์๋ค.
ExceptionResolver๋ฅผ ์ฌ์ฉํ๋ฉด ์ปจํธ๋กค๋ฌ์์ ์์ธ๊ฐ ๋ฐ์ํด๋ ExceptionResolver์์ ์์ธ๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ๋๋ฌธ์ ์์ธ๊ฐ ๋ฐ์ํด๋ ์๋ธ๋ฆฟ ์ปจํ ์ด๋๊น์ง ์์ธ๊ฐ ์ ๋ฌ๋์ง ์๊ณ , ์คํ๋ง MVC์์ ์์ธ ์ฒ๋ฆฌ๊ฐ ๋๋๊ฒ ๋๋ค. ๊ฒฐ๊ณผ์ ์ผ๋ก WAS ์ ์ฅ์์๋ ์ ์์ ์ผ๋ก ์ฒ๋ฆฌ๊ฐ ๋ ๊ฒ์ด๋ค. ์ด๋ ๊ฒ ์์ธ๋ฅผ ๋ชจ๋ ์ฒ๋ฆฌํ ์ ์๋ค.
์๋ธ๋ฆฟ ์ปจํ ์ด๋๊น์ง ์์ธ๊ฐ ์ฌ๋ผ๊ฐ๋ฉด ๋ณต์กํ๊ฒ ์ถ๊ฐ ๋จ๊ณ๊ฐ ์คํ๋์ง๋ง, ๊ทธ์ ๋นํด ExceptionResolver๋ฅผ ์ฌ์ฉํ๋ฉด ๊น๋ํ๊ฒ ์์ธ์ฒ๋ฆฌ๋ฅผ ํ ์ ์๋ค.
๊ทธ๋ฐ๋ฐ ExceptionResolver๋ฅผ ์ด์ฉํ๊ธฐ ์ํด์๋ ํด๋น ์ธํฐํ์ด์ค๋ฅผ ์ง์ ๊ตฌํํด์ผ ํ๊ธฐ ๋๋ฌธ์ ๋ค์ ๋ณต์กํ ๋ฉด์ด ์๋ค. ์ด๋ฌํ ๋ถ๋ถ์ ์คํ๋ง์ด ์ ๊ณตํ๋ ExceptionResolver๋ฅผ ์ด์ฉํด ํด๊ฒฐํ ์ ์๋ค.
์คํ๋ง์ด ์ ๊ณตํ๋ ExceptionResolver
์คํ๋ง ๋ถํธ๊ฐ ๊ธฐ๋ณธ์ผ๋ก ์ ๊ณตํ๋ ExceptionResolver๋ ๋ค์๊ณผ ๊ฐ๊ณ , HandlerExceptionResolverComposite์ ์์๋๋ก ๋ฑ๋ก๋๋ค.
1. ExceptionHandlerExceptionResolver - @ExceptionHandler๋ฅผ ์ฒ๋ฆฌํ๋ฉฐ, ๋๋ถ๋ถ์ API ์์ธ ์ฒ๋ฆฌ๋ ๋๋ถ๋ถ ์ด ๊ธฐ๋ฅ์ผ๋ก ํด๊ฒฐ
2. ResponseStatusExceptionResolver - HTTP ์ํ์ฝ๋ ์ง์
3. DefaultHandlerExceptionResolver - ์คํ๋ง ๋ด๋ถ ๊ธฐ๋ณธ ์์ธ ์ฒ๋ฆฌ
์คํ๋ง์ด ์ ๊ณตํ๋ ExceptionResolver - ResponseStatusExceptionResolver, DefaultHandlerExceptionResolver
ResponseStatusExceptionResolver
ResponseStatusExceptionResolver๋ ์์ธ์ ๋ฐ๋ผ์ HTTP ์ํ์ฝ๋๋ฅผ ์ง์ ํด ์ฃผ๋ ์ญํ ์ ํ๋๋ฐ, ๋ค์ ๋ ๊ฐ์ง ๊ฒฝ์ฐ๋ฅผ ์ฒ๋ฆฌํ๋ค.
1. @ResponseStatus๊ฐ ๋ฌ๋ ค์๋ ์์ธ
@ResponseStatus(code = HttpStatus.BAD_REQUEST, reason = "์๋ชป๋ ์์ฒญ ์ค๋ฅ")
public class BadRequestException extends RuntimeException {
}
@ResponseStatus ์ ๋ ธํ ์ด์ ์ ์ ์ฉํ๋ฉด HTTP ์ํ ์ฝ๋๋ฅผ ๋ณ๊ฒฝํด ์ค๋ค. BadRequestException ์์ธ๊ฐ ์ปจํธ๋กค๋ฌ ๋ฐ์ผ๋ก ๋์ด๊ฐ๋ฉด ResponseStatusExceptionResolver ์์ธ๊ฐ ํด๋น ์ ๋ ธํ ์ด์ ์ ํ์ธํด์ ์ค๋ฅ ์ฝ๋๋ฅผ ๋ณ๊ฒฝํ๊ณ , ๋ฉ์์ง๋ ๋ด๋๋ค.
+) reason
์ต์
์ ๋ฉ์์ง๋ MessageSource์์ ์ฐพ์ ์๋ ์๋ค.
2. ResponseStatusException ์์ธ
@ResponseStatus๋ ๊ฐ๋ฐ์๊ฐ ์ง์ ๋ณ๊ฒฝํ ์ ์๋ ์์ธ์๋ ์ ์ฉํ ์ ์๊ณ , ์ ๋ ธํ ์ด์ ์ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ์กฐ๊ฑด์ ๋ฐ๋ผ ๋์ ์ผ๋ก ๋ณ๊ฒฝํ๋ ๊ฒ์๋ ์ด๋ ค์์ด ์๋ค. ์ด๋ฌํ ๊ฒฝ์ฐ ResponseStatusException ์์ธ๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋ค.
@GetMapping("/api/response-status-ex")
public String responseStatus() {
throw new ResponseStatusException(HttpStatus.NOT_FOUND, "error.bad", new IllegalArgumentException());
}
{
"status": 404,
"error": "Not Found",
"exception": "org.springframework.web.server.ResponseStatusException",
"message": "์๋ชป๋ ์์ฒญ ์ค๋ฅ์
๋๋ค. ๋ฉ์์ง ์ฌ์ฉ",
"path": "/api/response-status-ex"
}
DefaultHandlerExceptionResolver
DefaultHandlerExceptionResolver๋ ์คํ๋ง ๋ด๋ถ์์ ๋ฐ์ํ๋ ์คํ๋ง ์์ธ๋ฅผ ํด๊ฒฐํ๋๋ฐ, ๋ํ์ ์ธ ์์๋ก TypeMismatchException
์ํฉ์ด ์๋ค.
ํ๋ผ๋ฏธํฐ ๋ฐ์ธ๋ฉ ์์ ์ ํ์ ์ด ๋ง์ง ์์ผ๋ฉด ์์ธ๊ฐ ๋ฐ์ํ๋๋ฐ, ๋ณ๋์ ์ฒ๋ฆฌ๋ฅผ ํด์ฃผ์ง ์์ผ๋ฉด ์๋ธ๋ฆฟ ์ปจํ ์ด๋๊น์ง ์ค๋ฅ๊ฐ ์ฌ๋ผ๊ฐ๊ณ ๊ฒฐ๊ณผ์ ์ผ๋ก 500 ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค. ๊ทธ๋ฐ๋ฐ ํ๋ผ๋ฏธํฐ ๋ฐ์ธ๋ฉ์ ๋๋ถ๋ถ ํด๋ผ์ด์ธํธ์๊ฒ ๋ฌธ์ ๊ฐ ์๋ ์ํฉ์ด๊ธฐ ๋๋ฌธ์ DefaultHandlerExceptionResolver๋ ์ด๋ฅผ 500 ์ค๋ฅ๊ฐ ์๋ 400 ์ค๋ฅ๋ก ๋ณ๊ฒฝํด ์ค๋ค.
@ExceptionHandler
API ์ค๋ฅ ์๋ต์ ๊ฒฝ์ฐ ์์ ๋ฐฉ์์ ์ด์ฉํ๊ธฐ์๋ response์ ์ง์ ๋ฐ์ดํฐ๋ฅผ ๋ฃ์ด์ผ ํด์ ๋ฒ๊ฑฐ๋กญ๊ธฐ๋ ํ๊ณ , ModelAndView๋ฅผ ๋ฐํํด์ผ ํ๋ ๊ฒ๋ API์๋ ์ ๋ง์ง ์๋๋ค. ๋ํ ๋์ผํ ์๋ฌ์ ๋ํด ํน์ ์ปจํธ๋กค๋ฌ์์๋ง ๋ฐ์ํ๋ ์์ธ๋ฅผ ๋ณ๋๋ก ์ฒ๋ฆฌํ๊ธฐ๊ฐ ์ด๋ ค์ ๋ค. ์คํ๋ง์ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด @ExceptionHandler๋ผ๋ ์์ธ ์ฒ๋ฆฌ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋๋ฐ, ์ด๊ฒ์ด ๋ฐ๋ก ExceptionHandlerExceptionResolver์ด๋ค.
@Data
@AllArgsConstructor
public class ErrorResult { //์์ธ๊ฐ ๋ฐ์ํ์ ๋ API ์๋ต์ผ๋ก ์ฌ์ฉํ ๊ฐ์ฒด
private String code;
private String message;
}
@RestController
public class ApiExceptionController {
@ResponseStatus(HttpStatus.BAD_REQUEST)
@ExceptionHandler(IllegalArgumentException.class)
public ErrorResult illegalExHandle(IllegalArgumentException e) { //IllegalArgumentException ๋ฐ ์์ ํด๋์ค๊น์ง ๋ชจ๋ ์ฒ๋ฆฌ(์์ ์์ธ๊ฐ ์ง์ ๋์ง ์์ ๊ฒฝ์ฐ)
return new ErrorResult("BAD", e.getMessage());
}
@ExceptionHandler
public ResponseEntity<ErrorResult> userExHandle(UserException e) { //์์ธ ์๋ต; ๋ฉ์๋ ํ๋ผ๋ฏธํฐ ์์ธ ์ง์
ErrorResult errorResult = new ErrorResult("USER-EX", e.getMessage());
return new ResponseEntity<>(errorResult, HttpStatus.BAD_REQUEST);
}
@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
@ExceptionHandler
public ErrorResult exHandle(Exception e) { //์์ ํด๋์ค๊น์ง ๋ชจ๋ ์ฒ๋ฆฌ(์์ ์์ธ๊ฐ ์ง์ ๋์ง ์์ ๊ฒฝ์ฐ)
return new ErrorResult("EX", "๋ด๋ถ ์ค๋ฅ");
}
@GetMapping("/api/members/{id}")
public MemberDto getMember(@PathVariable("id") String id) {
if (id.equals("ex")) {
throw new RuntimeException("์๋ชป๋ ์ฌ์ฉ์");
}
if (id.equals("bad")) {
throw new IllegalArgumentException("์๋ชป๋ ์
๋ ฅ ๊ฐ");
}
if (id.equals("user-ex")) {
throw new UserException("์ฌ์ฉ์ ์ค๋ฅ");
}
return new MemberDto(id, "hello " + id);
}
@Data
@AllArgsConstructor
static class MemberDto {
private String memberId;
private String name;
}
}
์คํ ํ๋ฆ
์ปจํธ๋กค๋ฌ๋ฅผ ํธ์ถํ๊ณ ์์ธ๊ฐ ๋ฐ์ํ์ ๋ ExceptionResolver๊ฐ ์๋๋๊ณ , ๊ฐ์ฅ ์ฐ์ ์์๊ฐ ๋์ ExceptionHandlerExceptionResolver๊ฐ ์คํ๋๋ค.
ExceptionHandlerExceptionResolver๋ ํด๋น ์ปจํธ๋กค๋ฌ์ ์ค๋ฅ๋ฅผ ์ฒ๋ฆฌํ ์ ์๋ @ExceptionHandler๊ฐ ์๋์ง ํ์ธํ๊ณ ์๋ ๊ฒฝ์ฐ์ ๊ทธ์ ํด๋นํ๋ ๋ฉ์๋๋ฅผ ์คํํ์ฌ ์๋ตํ๋ค. ๋ง์ฝ @ExceptionHandler์ ์ง์ ๋ ์์ธ๊ฐ ์์ ๊ฒฝ์ฐ ๋ฐ์ํ ์์ธ์ ๋ฉ์๋์ ํ๋ผ๋ฏธํฐ ๊ฐ ๋งค์นญ์ ํตํด ๋ฉ์๋๋ฅผ ์คํํ๋ค.
@ControllerAdvice
@ExceptionHandler๋ฅผ ํตํด ์์ธ๋ฅผ ๊น๋ํ๊ฒ ์ฒ๋ฆฌํ ์ ์์ง๋ง ์ ์ ์ฝ๋์ ์์ธ ์ฒ๋ฆฌ ์ฝ๋๊ฐ ํ๋์ ์ปจํธ๋กค๋ฌ์ ์์ฌ์๋ ์ํ์ด๋ค.
@ControllerAdvice ๋๋ @RestControllerAdvice๋ฅผ ์ฌ์ฉํ๋ฉด ๋ ์ฝ๋๋ฅผ ๋ถ๋ฆฌํ ์ ์๋ค.
@RestControllerAdvice
public class ExControllerAdvice {
@ResponseStatus(HttpStatus.BAD_REQUEST)
@ExceptionHandler(IllegalArgumentException.class)
public ErrorResult illegalExHandle(IllegalArgumentException e) {
return new ErrorResult("BAD", e.getMessage());
}
@ExceptionHandler
public ResponseEntity<ErrorResult> userExHandle(UserException e) {
ErrorResult errorResult = new ErrorResult("USER-EX", e.getMessage());
return new ResponseEntity<>(errorResult, HttpStatus.BAD_REQUEST);
}
@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
@ExceptionHandler
public ErrorResult exHandle(Exception e) {
return new ErrorResult("EX", "๋ด๋ถ ์ค๋ฅ");
}
}
@RestControllerAdvice๋ @ControllerAdvice์ @ResponseBody๊ฐ ์ถ๊ฐ๋์ด ์๋ค๋ ์ ์์ ์ฐจ์ด๊ฐ ์๋ค.
@RestController
public class ApiExceptionController {
@GetMapping("/api2/members/{id}")
public MemberDto getMember(@PathVariable("id") String id) {
if (id.equals("ex")) {
throw new RuntimeException("์๋ชป๋ ์ฌ์ฉ์");
}
if (id.equals("bad")) {
throw new IllegalArgumentException("์๋ชป๋ ์
๋ ฅ ๊ฐ");
}
if (id.equals("user-ex")) {
throw new UserException("์ฌ์ฉ์ ์ค๋ฅ");
}
return new MemberDto(id, "hello " + id);
}
@Data
@AllArgsConstructor
static class MemberDto {
private String memberId;
private String name;
}
}
@ControllerAdvice๋ ๋์์ผ๋ก ์ง์ ํ ์ฌ๋ฌ ์ปจํธ๋กค๋ฌ์ @ExceptionHandler, @InitBinder ๊ธฐ๋ฅ์ ๋ถ์ฌํด ์ฃผ๋ ์ญํ ์ ํ๋ค. ๋ง์ฝ ๋์์ ์ง์ ํ์ง ์์ผ๋ฉด ๊ทธ ๋ฒ์๊ฐ ๋ชจ๋ ์ปจํธ๋กค๋ฌ์ ๋ํด ์ ์ฉ๋๋ฉฐ, ์ง์ ํ ๋๋ ํน์ ์ ๋ ธํ ์ด์ ์ด ์๋ ์ปจํธ๋กค๋ฌ๋ฅผ ์ง์ ํ๊ฑฐ๋ ํน์ ํจํค์ง๋ฅผ ์ง์ ์ง์ ํ ์๋ ์๋ค.
// Target all Controllers annotated with @RestController
@ControllerAdvice(annotations = RestController.class) public class ExampleAdvice1 {}
// Target all Controllers within specific packages
@ControllerAdvice("org.example.controllers") public class ExampleAdvice2 {}
// Target all Controllers assignable to specific classes
@ControllerAdvice(assignableTypes = {ControllerInterface.class, AbstractController.class}) public class ExampleAdvice3 {}
'Language & Framework > Spring' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[์คํ๋ง MVC] ํ์ผ ์ ๋ก๋ (0) | 2023.03.06 |
---|---|
[์คํ๋ง MVC] ์คํ๋ง ํ์ ์ปจ๋ฒํฐ (0) | 2023.03.05 |
[์คํ๋ง MVC] ์์ธ ์ฒ๋ฆฌ์ ์ค๋ฅ ํ์ด์ง (0) | 2023.03.03 |
[์คํ๋ง MVC] ๋ก๊ทธ์ธ ์ฒ๋ฆฌ(2) - ํํฐ, ์ธํฐ์ ํฐ (0) | 2023.03.03 |
[์คํ๋ง MVC] ๋ก๊ทธ์ธ ์ฒ๋ฆฌ(1) - ์ฟ ํค, ์ธ์ (0) | 2023.03.02 |