티스토리 뷰
지난번에는 Custom ArgumentResolver를 만드는 예제를 해봤다. 이전에 다뤘던 ArgumentResolver가 Controller에 들어오는 파라미터를 가공 및 추가를 하는데 사용되었다면, RetunValueHandler는 리턴 타입으로 판단하여 처리하는 역할을 한다. 기본적인 동작방식은 ArgumentResolver와 매우 흡사하다. 어떻게 처리하는지 살펴보자.
Custom ReturnValueHandler
@Component
public class ResultReturnValueHandler implements HandlerMethodReturnValueHandler {
@Override
public boolean supportsReturnType(MethodParameter returnType) {
return ResultParams.class.isAssignableFrom(returnType.getParameterType());
}
@Override
public void handleReturnValue(Object returnValue, MethodParameter returnType, ModelAndViewContainer mavContainer, NativeWebRequest webRequest) throws Exception {
ResultParams params = (ResultParams)returnValue;
mavContainer.setRequestHandled(true);
if(params.containsKey(CommonConstants.STATUS_CODE)) {
webRequest.setAttribute(CommonConstants.STATUS_CODE, params.getVariable(CommonConstants.STATUS_CODE), 0);
webRequest.setAttribute(CommonConstants.STATUS_TEXT, params.getVariable(CommonConstants.STATUS_TEXT), 0);
}
}
}
Custom ReturnValueHandler는 HandlerMethodReturnValueHandler를 implements하여 만든다. 그럼 supportsReturnType과 handleReturnValue를 구현해야 한다. supportsReturnType가 먼저 호출이 되는데 MethodParameter 타입이 ResultParams 타입인 경우에 handleReturnValue를 호출해준다. 그럼 handleReturnValue 에서는 ResultParams 에 대해 필요한 정보를 가공할 수 있다. ArgumentResolver 관련 내용을 가지고 와서 그대로 단어만 바꾼것이다. 그만큼 구조가 동일하다고 보면 된다.
필자는 필자의 DataSet을 ResultParams로 정의를 해 놓은 상태인것이고 이안에 STATUS_CODE를 정의해 놓았고 이를 화면으로 돌려줄때 다시 재정의를 해주는 작업을 예로 만들어 놓은 것이다.
Web Config
@EnableWebMvc
@Configuration
public class WebConfig implements WebMvcConfigurer{
@Autowired
private UserArgumentResolver userArgumentResolver;
@Autowired
private ResultReturnValueHandler resultReturnValueHandler;
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
argumentResolvers.add(userArgumentResolver);
}
public void addReturnValueHandlers(List<HandlerMethodReturnValueHandler> handlers) {
handlers.add(resultReturnValueHandler);
}
}
이렇게 만든 ReturnValueHandler 를 사용하기 위해 등록해주는 과정이 필요하다. WebMvcConfigure를 implements하여 addReturnValueHandlers 를 통해 추가해주면 된다. 이해를 돕기 위해 ArgumentResolve를 등록하는것도 넣었는데 ArgumentResolve를 등록해주는 과정과 거의 동일하다고 보면 된다.
Controller
@Controller
public class BoardController {
@RequestMapping(value = "/search")
public ResultParams getBoardList(ResultParams params) {
return (ResultParams)service.getBoardList(params);
}
}
일반적인 Controller의 모습 그대로 사용하면 된다. 단 ReturnValueHandler를 태우기 위해서는 supportsReturnType 에서 검사하는 type인 ResultParams와 Return Type을 맞춰주면 된다. 이 Return Type에 대해서만 ReturnValueHandler가동작한다. 단, @ResponseBody 어노테이션이 사용된 Controller라면 MessageConverter를 사용해 리턴 값을 Json 포맷으로 변환하여 Response Body부에 넣어주므로 ReturnValueHandler가 동작하지 않는다. 물론 @Controller + @ResponseBody 인 @RestController에서도 동작하지 않는다.
이상 간단하게 Custom ReturnValueHandler 를 만들어보았다.
끝!
'Framework > Spring' 카테고리의 다른 글
415 unsupported media type 오류 조치 (1) | 2021.03.18 |
---|---|
Springboot에서 MyBatis 설정을 application.yml 으로 하기 (0) | 2021.03.10 |
Spring Custom ArgumentResolver 만들기 초간단 예제 (0) | 2021.03.05 |
RestTemplate에서 OpenFeign으로의 전환 및 사용법 (0) | 2021.03.04 |
Spring cloud 사용시 ClassNotFoundException: org.springframework.boot.context.properties.ConfigurationBeanFactoryMetadata 오류 조치 (0) | 2021.03.02 |