[SpringBoot] Resolver를 통한 유저 정보 사용하기

해니·2024년 10월 28일
0

SpringBoot

목록 보기
21/24
post-thumbnail

토이 프로젝트에서 HttpServletRequest에서 유저 정보를 추출하는 로직이 공통으로 필요한데,
어떻게 처리하면 좋을지 찾아보다가 회사에선 HandlerMethodArgumentResolver를 사용하길래 관련된 내용들을 기록해 두고자 한다. 🤍 🫧



HandlerMethodArgumentResolver란?

  • 요청 데이터를 메서드의 매개변수로 변환할 때 사용하는 전략 인터페이스
  • 공통으로 처리되는 데이터를 Annotation을 통해 메소드 파라미터로 호출하면 자동으로 바인딩 되는 기술

HandlerMethodArgumentResolver 메서드

  • supportsParameter()
    • 파라미터의 지원 여부를 결정한다.
    • true를 리턴하는 경우, argument resolve가 시작된다.
  • resolveArgument()
    • 실제로 해당 인자를 풀어주는 역할을 한다.



HandlerMethodArgumentResolver 사용 예시



1. CustomAnnotation 생성

@Target(AnnotationTarget.VALUE_PARAMETER)
@Retention(AnnotationRetention.RUNTIME)
annotation class MemberDetails()
  • @Target(AnnotationTarget.VALUE_PARAMETER)
    • @Target 어노테이션은 Java Compiler가 어노테이션이 어디에 적용될지 결정하기 위해 사용한다.
  • AnnotationTarget.VALUE_PARAMETER
    • 메소드나 생성자의 파라미터에 사용됨을 의미한다.
  • @Retention(AnnotationRetention.RUNTIME)
    • @Retention 어노테이션은 어노테이션이 남아있는 단계를 선정한다.
    • RUNTIME으로 선언하면 런타임 중에 어노테이션 정보가 남아있다.



2. HandlerMethodArgumentResolver 구현체 생성

@Component
class MemberDetailsArgumentResolver : HandlerMethodArgumentResolver {
    override fun supportsParameter(parameter: MethodParameter): Boolean {
        return parameter.hasParameterAnnotation(MemberDetails::class.java)
    }

    override fun resolveArgument(parameter: MethodParameter, mavContainer: ModelAndViewContainer?, webRequest: NativeWebRequest, binderFactory: WebDataBinderFactory?): Any? {
        val request = webRequest.nativeRequest as HttpServletRequest
        val memberDetails = request.getAttribute("_memberDetails") as CustomUserDetails
        return MemberDetailsVO(userName = memberDetails.userName)
    }
}

supportsParameter()

  • 주어진 메소드 매개변수가 해당 리졸버에서 지원되는지의 여부를 반환한다.
parameter.hasParameterAnnotation(MemberDetails::class.java)
  • 해당 파라미터가 MemberDetails 어노테이션을 사용했는지 여부를 판단한다.

resolveArgument()

	@Nullable
	Object resolveArgument(MethodParameter parameter, @Nullable ModelAndViewContainer mavContainer,
			NativeWebRequest webRequest, @Nullable WebDataBinderFactory binderFactory) throws Exception;
  • 주어진 요청 데이터로부터 메서드 매개변수를 해석한다.



3. WebMvcConfigurer에 ArgumentResolver 등록


@Configuration
class WebMvcConfig @Autowired constructor(
        private val authInterceptor: AuthInterceptor,
        private val memberDetailsArgumentResolver: MemberDetailsArgumentResolver
) : WebMvcConfigurer {

	/* .. 생략 .. */

    override fun addArgumentResolvers(resolvers: MutableList<HandlerMethodArgumentResolver>) {
        resolvers.add(memberDetailsArgumentResolver)
    }

}



4. Controller에서 사용

    @PostMapping
    fun saveAccountLog(httpServletRequest: HttpServletRequest, @MemberDetails member: Member, @RequestBody accountLogSaveRequest: AccountLogSaveRequest): ResponseEntity<ResponseDto<AccountLogSaveResponse>> {
        return accountLogService.saveAccountLog(httpServletRequest, member, accountLogSaveRequest)
    }
  • @MemberDetails 커스텀 어노테이션을 사용하면 member 정보를 사용할 수 있다.






출처

[Spring/Springboot]HandlerMethodArgumentResolver를 통해 Controller의 파라미터 자동처리하기
HandlerMethodArgumentResolver 란
[Spring Boot] Meta Annotation (@Target, @Retention)
[kotlin] 코틀린 차곡차곡 - 11. Annotation ( 어노테이션 )
[Spring] ArgumentResolver 추가 방법 (kotlin ver.)

profile
💻 ⚾️ 🐻

0개의 댓글