포스트

Spring Boot - Attribute Resolver

HTTP 요청을 처리할 때 컨트롤러(핸들러) 메서드에 값을 바인딩 할 때 사용되는 기능이다.

@RequestParam, @PathVariable, @RequestBody, @RequestHeader, @ModelAttribute 어노테이션도 argument resolver이다. 어노테이션을 사용해서 api 사용자의 요청 값을 바인딩 하는 방법 외에 HandlerMethodArgumentResolver 인터페이스를 구현하여 서버의 데이터를 바인딩하는 방법에 대해 정리!


HandlerMethodArgumentResolver 인터페이스 구현하기

HandlerMethodArgumentResolver 인터페이스를 구현하여 핸들러 메서드 파라미터에 데이터 바인딩 할 수 있다.


예를 들면, 핸들러 메서드가 다음과 같을 때

1
2
3
4
5
6
7
@PostMapping("/login")  
public ResponseEntity<UserResponse> me(  
          @UserSession User user  
) {  
    var response = userBusiness.userValidation(user.getId());  
    return ResponseEntity.ok(response);  
}


@UserSession 어노테이션이 붙은 user 파라미터에 값을 바인딩하는 resolver는 다음과 같이 구현할 수 있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
@Component  
@RequiredArgsConstructor  
public class UserSessionResolver implements HandlerMethodArgumentResolver {  
    private final UserService userService;  
      
    @Override  
    public boolean supportsParameter(MethodParameter parameter) {  
        // 파라미터, 어노테이션 체크  
        
        var annotation = parameter.hasParameterAnnotation(UserSession.class);
        var parameterType = parameter.getParameterType().equals(User.class);
          
        return annotation && parameterType;  
    }  
    
    @Override  
    public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWe<br>equest we<br>equest, WebDataBinderFactory binderFactory) throws Exception {  
        // supportsParameter 메서드의 반환값이 true면 실행 
        // 파라미터 데이터 생성 & 반환
        ...	    
        return User.builder()  
                .id(userEntity.getId())  
                .name(userEntity.getName())  
                .email(userEntity.getEmail())  
                .registeredAt(userEntity.getRegisteredAt())  
                .unregisteredAt(userEntity.getUnregisteredAt())  
                .build();  
    }  
}


그리고 구현한 resolver는 WebConfigureraddArgumentResolvers()를 통해 등록해야 동작한다.

1
2
3
4
5
6
7
8
9
10
@RequiredArgsConstructor  
@Configuration  
public class WebConfig implements WebMvcConfigurer {  
    private final UserSessionResolver userSessionResolver;  
      
    @Override  
    public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {  
        resolvers.add(userSessionResolver);  
    }  
}


이러한 구현을 이용하면 코드를 간결하게 유지하고 중복을 줄일 수 있다.




참고한 사이트

  1. 패스트캠퍼스 예상국 강사님 강의
  2. ChatGPT
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.