Memo/짧은 메모

[Spring] @RestControllerAdvice

생각없이 해도 생각보다 좋다. 2022. 10. 26. 22:31

@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