아규먼트 리졸버를 이용해서 HTTP Header 정보를 Map 객체에 담아서 Controller에게 전달하기 - accidentlywoo/legacyVue GitHub Wiki

아규먼트 리졸버를 이용해서 HTTP Header 정보를 Map 객체에 담아서 Controller에게 전달하기

  • 들어가기 전에 이번 시간엔 웹 어플리케이션에 아규먼트 리졸버를 적용해 HTTP요청 헤더 정보를 저장하고 있는 HeaderInfo 인자타입이 메소드에 있을 경우 자동으로 넘겨주는 예제를 작성해 보도록 하겠습니다.

학습 목표

  1. 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("-----------------------------------------------------");

생각해보기

  1. 컨트롤러 메소드에서 자주 사용되는 값이 있을 경우 아규먼트 리졸버를 만들어서 넘겨주도록 하면 편리하게 사용할 수 있습니다. 아규먼트 리졸버에 대한 예를 인터넷에서 찾아보시고 어떤 값을 넘기면 유용할지 고민해 보세요.
⚠️ **GitHub.com Fallback** ⚠️