아규먼트 리졸버를 이용해서 HTTP Header 정보를 Map 객체에 담아서 Controller에게 전달하기 - accidentlywoo/legacyVue GitHub Wiki
- 들어가기 전에 이번 시간엔 웹 어플리케이션에 아규먼트 리졸버를 적용해 HTTP요청 헤더 정보를 저장하고 있는 HeaderInfo 인자타입이 메소드에 있을 경우 자동으로 넘겨주는 예제를 작성해 보도록 하겠습니다.
- Spring MVC 웹 어플리케이션에 아규먼트 리졸버를 적용할 수 있다.
- HandlerMethodArgumentResolver
- WebMvcContextConfiguration의 addArgumentResolvers() 메소드
HeaderInfo.java `package kr.or.connect.guestbook.argumentresolver;
import java.util.HashMap; import java.util.Map;
public class HeaderInfo { private Map<String, String> map;
public HeaderInfo() {
map = new HashMap<>();
}
public void put(String name, String value) {
map.put(name, value);
}
public String get(String name) {
return map.get(name);
}
}`
HeaderMapArgumentResolver.java `package kr.or.connect.guestbook.argumentresolver;
import java.util.Iterator;
import org.springframework.core.MethodParameter; import org.springframework.web.bind.support.WebDataBinderFactory; import org.springframework.web.context.request.NativeWebRequest; import org.springframework.web.method.support.HandlerMethodArgumentResolver; import org.springframework.web.method.support.ModelAndViewContainer;
public class HeaderMapArgumentResolver implements HandlerMethodArgumentResolver {
@Override
public boolean supportsParameter(MethodParameter parameter) {
return parameter.getParameterType() == HeaderInfo.class;
}
@Override
public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer,
NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {
HeaderInfo headerInfo = new HeaderInfo();
Iterator<String> headerNames = webRequest.getHeaderNames();
while(headerNames.hasNext()) {
String headerName = headerNames.next();
String headerValue = webRequest.getHeader(headerName);
// System.out.println(headerName + " , " + headerValue); headerInfo.put(headerName, headerValue); }
return headerInfo;
}
}`
아규먼트 리졸버를 적용하려면 WebMvcContextConfiguration 클래스에 addArgumentResolvers메소드를 오버라이딩하고, 인자로 넘어온 argumentResolvers에 앞에서 생성한 아규먼트 리졸버를 넘겨줘야 합니다.
@Override public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) { System.out.println("아규먼트 리졸버 등록.."); argumentResolvers.add(new HeaderMapArgumentResolver()); }
GuestbookController의 메소드인 list메소드의 인자로 HeaderInfo headerInfo를 추가합니다. 콘솔에 headerInfo의 get메소드에 user-agent를 넘겨서 값이 잘 출력되는지 확인할 수 있도록 코드를 추가합니다.
@GetMapping(path="/list") public String list(@RequestParam(name="start", required=false, defaultValue="0") int start, ModelMap model, @CookieValue(value="count", defaultValue="1", required=true) String value, HttpServletResponse response, HeaderInfo headerInfo) { System.out.println("-----------------------------------------------------"); System.out.println(headerInfo.get("user-agent")); System.out.println("-----------------------------------------------------");
- 컨트롤러 메소드에서 자주 사용되는 값이 있을 경우 아규먼트 리졸버를 만들어서 넘겨주도록 하면 편리하게 사용할 수 있습니다. 아규먼트 리졸버에 대한 예를 인터넷에서 찾아보시고 어떤 값을 넘기면 유용할지 고민해 보세요.