Web/Spring 2019. 10. 18. 00:33

 

오늘 다루어볼 포스팅은 ResponseBodyAdvice를 이용하여 컨트롤러 응답값을 가공해보는 예제이다. 사실 HandlerInterceptor의 postHandler 같은 곳에서 응답값을 가공할 수 있을 듯하지만, 사실 인터셉터 단에서 응답 가공은 불가능하다. 하지만 우리는 적절한 값으로 응답을 가공하고 싶을 때가 있는데, 그럴때 사용하는 것이 ResponseBodyAdvice이다.

 

예제 상황은 다음과 같다.

 

"Controller에서 응답값을 Enum class로 둔다. 하지만 실제 클라이언트에는 특정 응답용 객체로 컨버팅 후 내려준다."

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
@RestControllerAdvice
public class EnumResponseCtrlAdvice implements ResponseBodyAdvice<Object> {
 
    @Override
    public boolean supports(MethodParameter returnType, Class<extends HttpMessageConverter<?>> converterType) {
        return true;
    }
 
    @Override
    public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType, Class<extends HttpMessageConverter<?>> selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) {
        return body instanceof EnumController.ResponseEnum ? new Response((EnumController.ResponseEnum) body) : body;
    }
 
    @Data
    @AllArgsConstructor
    class Response{
        EnumController.ResponseEnum status;
    }
}
 
@RestController
@RequestMapping
public class EnumController {
 
    @GetMapping
    public ResponseEnum enumResponse(){
        return ResponseEnum.SUCCESS;
    }
 
    @Getter
    enum ResponseEnum{
        SUCCESS("success"),FAIL("fail");
 
        String value;
        ResponseEnum(String value){this.value=value;}
 
    }
 
}
 
=>최종응답
{
"learnableStatus""LEARNABLE"
}
cs

 

어렵지 않다. 응답값은 분명 Enum class 인데, 클라이언트에 반환된 응답값은 ResponseEnum 타입의 오브젝트로 리턴되었다. 공통적인 응답 가공이 필요할때 사용하면 좋을 듯하다. 

posted by 여성게
: