πŸ“š λͺ©μ°¨

🧩 @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