티스토리 뷰

지난번에는 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 를 만들어보았다. 

 

끝!

댓글
최근에 올라온 글
최근에 달린 댓글
«   2024/11   »
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