-
[Back End] Argument ResolverWeb Development/부스트코스 - Back-End(Java) 2020. 5. 28. 16:15
✔️ Argument Resolver (아규먼트 리졸버)
◾ 컨트롤러의 메소드 인자로 사용자가 임의의 값을 전달하는 방법을 제공하고자 할 때 사용된다.
◾ 예를 들어, 세션에 저장되어 있는 값 중 특정 이름의 값을 메소드 인자로 전달한다.
✔️Argument Resolver 실습
💾 HeaderInfo.java
◾ map이나 map을 상속받고 있는 객체는 스프링 내부적으로 사용하는 아규먼트 리졸버가 선처리하고 있기 때문에 직접사용할 수 없다. 따라서 map을 필드로 가지는 HeaderInfo 클래스를 작성한다.
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); } }
💾 HeaderInfoHeaderMapArgumentResolver.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 { // controller 메서드의 인자 개수만큼 호출된다. // 인자의 정보를 파라메터로 전달받는다. // 해당 파라메터 정보에 원하는 정보가 있다면 true를 반환한다. @Override public boolean supportsParameter(MethodParameter parameter) { return parameter.getParameterType() == HeaderInfo.class; } // supportsParameter가 true를 반환하면, 호출된다. @Override public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception { HeaderInfo headerInfo = new HeaderInfo(); // 헤더정보를 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.java
◾ 아규먼트 리졸버 등록을 위해 아래와 같은 코드를 추가한다.
@Override public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) { System.out.println("아규먼트 리졸버 등록.."); argumentResolvers.add(new HeaderMapArgumentResolver()); }
👀 동작 확인해보기
1. controller에서 headerInfo 인자가 넘어오면 아규먼트 리졸버가 사용된다.
'Web Development > 부스트코스 - Back-End(Java)' 카테고리의 다른 글
[Back End] Interceptor (0) 2020.05.28 [Back End] 상태유지기술 - Session (1) 2020.05.18 [Back End] 상태유지기술 - Cookie (0) 2020.05.11 [Back End] Layered Architecture and Rest Controller (0) 2020.04.06 [Back End] Spring MVC (0) 2020.04.03