개발 공부 기록

[SpringBoot] Argument Resolver을 통해 로그인한 유저 정보 가져오기 본문

Spring/Development Log

[SpringBoot] Argument Resolver을 통해 로그인한 유저 정보 가져오기

나만없서고냥이 2023. 12. 18. 01:25

컨트롤러에서 어노테이션이 달린 파라미터를 통해 로그인한 사용자의 정보를 쉽게 가져오려고 합니다. 이때 어노테이션을 직접 만들어, 컨트롤러의 메서드 파리미터에서 로그인한(인증된) 유저의 정보를 가져오도록 하겠습니다. 

 

✔️ Annotation 만들기

@Target(value = ElementType.PARAMETER)
@Retention(value = RetentionPolicy.RUNTIME)
public @interface LoginUser {
}
  • @Target : 어노테이션이 적용될 수 있는 대상을 지정합니다. 여기서는 우리가 만든 어노테이션이 메서드의 파라미터에 적용될 수 있음을 의미합니다.
  • @Retention : 어노테이션의 유지 기간을 나타냅니다. 'RetentionPolicy.RUNTIME'을 사용하면 런타임 시에도 어노테이션 정보가 유지됨을 의미합니다.

✔️ UserEmailDto.java

@Data
@NoArgsConstructor
@AllArgsConstructor
public class UserEmailDto {
    private String email;
}

로그인한 사용자의 이메일 정보를 가져오는 것이 목적이기에, 위와 같은 DTO를 만들었습니다.


✔️ LoginUserArgumentResolver.java

@Component
@RequiredArgsConstructor
public class LoginUserArgumentResolver implements HandlerMethodArgumentResolver {
    public static final String PREFIX = "Bearer ";
    private final JwtTokenizer jwtTokenizer;

    @Override
    public boolean supportsParameter(MethodParameter parameter) {
        return parameter.hasParameterAnnotation(LoginUser.class) &&
                parameter.getParameterType() == UserEmailDto.class;
    }

    @Override
    public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer,
                                  NativeWebRequest webRequest, WebDataBinderFactory binderFactory) {
        String authentication = webRequest.getHeader(HttpHeaders.AUTHORIZATION);
        String token = authentication.substring(PREFIX.length());

        String email = jwtTokenizer.extractEmailFromToken(token);

        return new UserEmailDto(email);
    }
}

위 클래스는 Controller 메서드의 파라미터를 해결하는 데 사용됩니다.

 

  • supportsParameter() : 파라미터가 위에서 만든 @LoginUser 어노테이션을 가지고 있는지 확인합니다. @LoginUser가 사용되었다면 true를 반환하여 위 resolver가 파라미터를 해결하는데 사용될 수 있습니다.
  • resolveArgument() : Http 요청의 header에서 토큰을 추출하고, 해당 토큰으로부터 email을 추출하여 위에서 만든 UserEmailDto 객체로 만들어 반환합니다.

✔️ WebMvcConfiguration.java

@Configuration
@RequiredArgsConstructor
public class WebMvcConfig implements WebMvcConfigurer {
    private final JwtTokenizer jwtTokenizer;

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

WebMvcConfigurer를 구현한 클래스에서 위에서 만든 LoginUserArgumentResolver를 Argument Resolver로 등록합니다.


✔️ 컨트롤러에 적용

@PostMapping("/upload")
public void createItem(@LoginUser UserEamilDto userEmailDto) {
    fileService.uploadFiles(file, userEmailDto);
}

위와 같이 인증한 사용자의 정보가 담긴 DTO를 활용할 수 있습니다.