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();
}
}