ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Back End] Argument Resolver
    Web 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 인자가 넘어오면 아규먼트 리졸버가 사용된다. 

     

    GuestbookController.java
    아규먼트 리졸버 동작결과 

    댓글

Designed by Tistory.