๐ย ๋ชฉ์ฐจ
@Controller
, @RestController
๊ฐ ์ ์ฉ๋ Bean์์ ๋ฐ์๋ ์์ธ๋ฅผ ์ก์์ ํ๋์ ๋ฉ์๋์์ ์ฒ๋ฆฌํด์ฃผ๋ ๊ธฐ๋ฅ์
๋๋ค.
(@Service๋ @Repository ๋ฑ ๋ค๋ฅธ Bean์์๋ ์ฌ์ฉํ ์ ์์ต๋๋ค.)
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface ExceptionHandler {
Class<? extends Throwable>[] value() default {};
}
value ์ค์ ์ ํตํด์ ์ด๋ค ์์ธ๋ฅผ ์ฒ๋ฆฌํ ์ง ์ค์ ํ ์ ์์ต๋๋ค. (์ฃผ์์ฌํญ์ value๋ฅผ ์ง์ ํ์ง ์์ผ๋ฉด ๋ชจ๋ ์์ธ๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ๋๋ฌธ์ ์ค์ ์ ํด์ฃผ์ด์ผ ํฉ๋๋ค!)
@ExceptionHandler({Exception.class, RuntimeException.class})
์ ๊ฐ์ด 2๊ฐ ์ด์๋ ๋ฑ๋ก ๊ฐ๋ฅํฉ๋๋ค.
ํ์ง๋ง ์ด๋ฅผ @Controller
๋จ์ ์ ์ํ๊ฒ ๋๋ค๋ฉด, ๋ค๋ฅธ Controller์ ์์ธ๋ ์ฒ๋ฆฌํ ์ ์์ผ๋ฏ๋ก ๊ฐ๊ฐ์ Controller์ ์ ์ํด์ค์ผ ํฉ๋๋ค.
๊ทธ๋ ๊ฒ ๋๋ฉด ๊ฐ์ ์์ธ์ฒ๋ฆฌ์์๋ ๋ถ๊ตฌํ๊ณ ๊ฐ๊ฐ์ Controller์ ์ ์ํด์ค์ผ ํ๋ ์ฝ๋์ ์ค๋ณต์ด ๋ฐ์ํ๊ฒ ๋ฉ๋๋ค.
์ด๋ฅผ ํ๋ฒ์ ์ฒ๋ฆฌํ ์ ์๊ฒ ํด์ฃผ๋ ๊ฒ์ด @ControllerAdvice
์
๋๋ค.
@Controller
์ ๋
ธํ
์ด์
์ด ์๋ ๋ชจ๋ ๊ณณ์์์ ์์ธ๋ฅผ ์ก์ ์ ์๋๋ก ํด์ค๋๋ค.
@ControllerAdvice
์์ ์๋ @ExceptionHandler
๋ ๋ชจ๋ ์ปจํธ๋กค๋ฌ์์ ๋ฐ์ํ๋ ์์ธ์ํฉ์ ์ก์ ์ ์์ต๋๋ค.
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface ControllerAdvice {
@AliasFor("basePackages")
String[] value() default {};
@AliasFor("value")
String[] basePackages() default {};
Class<?>[] basePackageClasses() default {};
Class<?>[] assignableTypes() default {};
Class<? extends Annotation>[] annotations() default {};
}
์์ฑ ์ค์ ์ ํตํด์ ์ํ๋ ์ปจํธ๋กค๋ฌ๋ ํจํค์ง๋ง ์ ํ ํ ์ ์๊ณ , ์ ํํ์ง ์๋๋ค๋ฉด ๋ชจ๋ ํจํค์ง์ ์๋ ์ปจํธ๋กค๋ฌ๋ฅผ ๋ด๋นํ๊ฒ ๋ฉ๋๋ค.