๐Ÿ“šย ๋ชฉ์ฐจ

๐Ÿงฉย @ExceptionHandler

@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 ์ž…๋‹ˆ๋‹ค.

๐Ÿ”–ย @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 {};
}

์†์„ฑ ์„ค์ •์„ ํ†ตํ•ด์„œ ์›ํ•˜๋Š” ์ปจํŠธ๋กค๋Ÿฌ๋‚˜ ํŒจํ‚ค์ง€๋งŒ ์„ ํƒ ํ•  ์ˆ˜ ์žˆ๊ณ , ์„ ํƒํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด ๋ชจ๋“  ํŒจํ‚ค์ง€์— ์žˆ๋Š” ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ๋‹ด๋‹นํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

๐Ÿ‘€ย @RestControllerAdvice