@ExceptionHandler
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface ExceptionHandler { ... }
@ExceptionHandler은 던져진 예외를 잡아서(catch) 처리해주는 메서드에 붙는 애너테이션이다.
@ControllerAdvice
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface ControllerAdvice { ... }
@ExceptionHandler, @ModelAttribute, @InitBinder 가 적용된 메서드들에 AOP(@Component 사용)를 적용해 Controller 단에 적용하기 위해 고안된 어노테이션.
클래스 단위에 붙는 애너테이션으로, @ExceptionHandler가 붙은 메서드를 모아놓은 클래스에 @ControllerAdvice를 붙여서 사용. ( @ModelAttribute, @InitBinder 는 SSR 방식에서 사용되는 애너테이션이다. 나중에 필요할 때 추가 공부하자.)
예외(Exception)를 던지면(throw) 예외는 호출된 지점으로 던져진다.
사방팔방으로 던져지는 예외를 한 곳에서 모으기기 위해서 사용하는 것이 @ControllerAdvice이다.
@ResponseBody
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface ResponseBody { ... }
반환값을 Json 형식의 응답 메세지로 변환시켜주는 애너테이션이다.
@RestControllerAdvice
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@ControllerAdvice
@ResponseBody
public @interface RestControllerAdvice { ... }
@ControllerAdvice와 @ResponseBody가 합쳐진 것이다.
예외를 한곳으로 모으면서 해당 클래스의 메서드들의 반환값은 JSON 형식의 응답 메세지로 클라이언트에 전달된다.
//이 글을 쓴 이유
@RestControllerAdvice가 붙은 클래스의 메서드(보통은 @ExceptionHandler가 붙은 메서드일 것이다.)의 반환값이 다른 클래스의 객체(인스턴스)일 때, 해당 클래스의 변수의 값이 지정되지 않아도 default 값으로 초기화되어 모두 응답메세지로 나간다.
글로 쓰니 좀 와닿지 않는데, 막상 출력된 메세지를 보면 생각보다 이상한 출력이라고 느껴진다.
하지만 활용하기 나름이라 생각되니 기억해두자.
>예시
public class Person {
private String name;
private String email;
private int age;
...
}
위와 같은 클래스를 new Person(); 으로 반환하는 메서드가 @RestControllerAdvice이 붙은 클래스내에 존재한다면, Person의 생성자 인자로 아무것도 제공이 되지 않아도 아래 내용이 출력된다.
//JSON
{
"name" : null,
"email" : null,
"age" : 0
}
'Memo > 짧은 메모' 카테고리의 다른 글
[JAVA] Enum (0) | 2022.10.30 |
---|---|
[Spring]예외 전환 (0) | 2022.10.27 |
[JAVA] Final keyword (0) | 2022.10.24 |
[Algorithm] 효율적인 피보나치 수열 구하기(DP) (0) | 2022.10.23 |
[HTTP] HttpStatus Code (0) | 2022.10.23 |