@RestControllerAdvice 어노테이션을 사용해서 이전에 포스팅했던 [SpringBoot] 공통 응답 DTO를 더 편리하게 사용할 수 있게 업그레이드하려고 한다.
@RestControllerAdvice
AOP를 적용하여 Controller 동작 이후에 공통된 처리를 적용할 수 있다.
기존의 공통 응답 처리 방식은 Controller단에서 Service 반환 데이터를 SuccessResponse DTO data필드에 넣어주는 방식이었다.
@PostMapping
public ResponseEntity<Object> joinMember(@RequestBody MemberJoinDto memberJoinDto) {
return ResponseEntity.ok(
SuccessResponse.builder()
.result(true)
.code(String.valueOf(HttpServletResponse.SC_OK))
.data(memberService.joinMember(memberJoinDto))
.message("Success")
.build());
}
Controller의 모든 메소드에 ResponseEntity.ok(SuccessResponse... 와 같은 긴 코드가 공통적으로 들어가게 되는 것을 @RestControllerAdvice를 사용하여 줄여보려고 한다.
CustomResponseAdvice 구현
@RestControllerAdvice("mswoo.toyproject.my_service.controller")
public class CustomResponseAdvice implements ResponseBodyAdvice {
@Override
public boolean supports(MethodParameter returnType, Class converterType) {
return true;
}
@Override
public Object beforeBodyWrite(Object body, MethodParameter returnType,
MediaType selectedContentType, Class selectedConverterType, ServerHttpRequest request,
ServerHttpResponse response) {
return new SuccessResponse(body);
}
}
@RestControllerAdvice 어노테이션에 진행 중인 프로젝트의 컨트롤러의 패키지 정보를 basePackage로 설정하고,
supports() 메소드의 반환 값을 true로 변경하여 Controller 동작 이후 beforeBodyWrite() 메소드를 호출하게 한다.
beforeBodyWrite() 메소드에서는 Controller의 body를 공통 응답인 SuccessResponse에 생성자를 통해 반환하게 된다.
CustomResponseAdvice를 구현하고나면 ResponseEntity 객체에 Service 반환 데이터만 넣어주면 된다.
@PostMapping
public ResponseEntity<Object> joinMember(@RequestBody MemberJoinDto memberJoinDto) {
return ResponseEntity.ok(memberService.joinMember(memberJoinDto));
}
훨씬 간결해지고 좋은 것 같다.
'Spring Boot' 카테고리의 다른 글
| [Spring Boot] 공통 에러 처리 (0) | 2023.11.26 |
|---|---|
| [SpringBoot] 공통 응답 DTO (0) | 2023.11.10 |
| [Spring Boot] Spring Security JWT 토큰 로그인 구현 - 2 (0) | 2023.11.10 |