Developer Sang Guy

RequestHeader를 Handler 매개 변수로 바인딩(HandlerMethodArgumentResolver) 본문

Spring

RequestHeader를 Handler 매개 변수로 바인딩(HandlerMethodArgumentResolver)

은크 2024. 5. 28. 12:37

요새 RequestHeader에 로직 처리시 필요한 정보를 전달해주는 케이스가 자주 보여 HandlerMethodArgumentResolver를 활용하여 Header를 Dto로 바인딩하여 처리하는 코드를 사용하게 되었다.

 

헤더 정보를 바인딩할 Request Header Dto 객체

import lombok.Builder;
import lombok.Getter;
import lombok.ToString;

@Builder
@Getter
@ToString
public class RequestHeader {

	private String id;
	private boolean isMobile;
}

 

 

Handler에 매개 변수로 Request Header Dto를 사용하기 위해 Resolver 구현

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;

import com.inicis.loan.dto.RequestHeader;

public class RequestHeaderResolver implements HandlerMethodArgumentResolver {

	/* Controller에서 매개 변수로 사용할 타입 체크  */
	@Override
	public boolean supportsParameter(MethodParameter parameter) {
		return parameter.getParameterType().equals(RequestHeader.class);
	}

	/* 매개 변수 객체 바인딩 */
	@Override
	public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer,
			NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {
		return RequestHeader.builder()
				.id(webRequest.getHeader("X-Request-Id"))
				.isMobile(checkMobile(webRequest.getHeader("User-Agent")))
				.build();
	}
	
	private boolean checkMobile(String userAgent) {
		String[] mobiles = {"iphone", "ipad", "ipod", "android"};
		for (String mobile : mobiles) {
			if (userAgent.toLowerCase().contains(mobile)) {
				return true;
			}
		}
		
		return false;
	}
}

 

 

Web Mvc 구성에 추가

import java.util.List;

import org.springframework.context.annotation.Configuration;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

import com.inicis.loan.dto.resolver.RequestHeaderResolver;

@Configuration
public class WebConfigure implements WebMvcConfigurer {

	@Override
	public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {
		resolvers.add(new RequestHeaderResolver());
	}
}

 

 

테스트 Controller

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import com.inicis.loan.dto.RequestHeader;

@RestController
public class TestController {

	@GetMapping("/header")
	public String resolverTest(RequestHeader header) {
		return header.toString();
	}
}

 

'Spring' 카테고리의 다른 글

HttpServletRequest Body 여러 번 읽기  (0) 2022.12.28
[Spring] RequestMapping 기능 (produces, consumes )  (0) 2022.10.07
[Spring Boot] DB 연결  (0) 2022.09.28
[Spring] Aop, Logback 활용  (0) 2022.04.28
스프링 WebMvcConfigurer  (0) 2021.08.08
Comments