커스텀 어노테이션을 정의하려면 @interface 키워드를 사용하여 새로운 어노테이션 타입을 생성한다. 어노테이션에는 주로 @Target과 @Retenttion 어노테이션을 사용하여 적용 대상과 유지 정책을 설정한다.
커스텀 어노테이션 정의하는 예로 @LoginUser라는 어노테이션을 예로 들겠다.
@LoginUser 어노테이션은 메소드 파라미터에 적용되어 로그인된 사용자 정보를 주입하는 데 사용된다. 이 어노테이션은 런타임 동안 유지되며, 메소드 파라미터에만 적용될 수 있도록 설정한다.
package com.sparta.newsfeed19.global.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(ElementType.PARAMETER) // 메소드 파라미터에만 적용됨
@Retention(RetentionPolicy.RUNTIME) // 런타임 동안 유지됨
public @interface LoginUser {
// 기본적으로 추가적인 속성은 필요하지 않으므로 비어 둡니다.
}
어노테이션 처리기 (LoginUserArgumentResolver) 구현
LoginUser 어노테이션이 붙은 메소드 파라미터를 처리하기 위해 HandlerMethodArgumentResolver를 구현한다. 이 구현체는 HTTP 요청에서 로그인된 사용자 정보를 추출하고, 이를 메소드 파라미터에 주입한다.
package com.sparta.newsfeed19.global.config;
import com.sparta.newsfeed19.global.annotation.LoginUser;
import jakarta.annotation.Nullable;
import jakarta.servlet.http.HttpServletRequest;
import lombok.extern.slf4j.Slf4j;
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 static com.sparta.newsfeed19.global.constant.Const.USER_EMAIL;
@Slf4j
public class LoginUserArgumentResolver implements HandlerMethodArgumentResolver {
@Override
public boolean supportsParameter(MethodParameter parameter) {
// @LoginUser 어노테이션이 붙어 있고, 파라미터 타입이 String인 경우에만 처리
return parameter.getParameterAnnotation(LoginUser.class) != null
&& parameter.getParameterType().equals(String.class);
}
@Override
public Object resolveArgument(
@Nullable MethodParameter parameter,
@Nullable ModelAndViewContainer mavContainer,
NativeWebRequest webRequest,
@Nullable WebDataBinderFactory binderFactory
) {
HttpServletRequest request = (HttpServletRequest) webRequest.getNativeRequest();
log.info("User email from request attribute: {}", request.getAttribute(USER_EMAIL));
return String.valueOf(request.getAttribute(USER_EMAIL)); // USER_EMAIL 속성을 String으로 변환하여 반환
}
}
WebMvcConfig 클래스에 LoginUserArgumentResolver 등록
LoginUserArgumentResolver를 스프링 MVC 설정에 추가하여 어노테이션 기반의 파라미터 처리를 활성화한다.
package com.sparta.newsfeed19.global.config;
import lombok.RequiredArgsConstructor;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import java.util.List;
@Configuration
@RequiredArgsConstructor
public class WebMvcConfig implements WebMvcConfigurer {
@Override
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
// LoginUserArgumentResolver를 추가하여 @LoginUser 어노테이션 처리 활성화
argumentResolvers.add(new LoginUserArgumentResolver());
}
}
3 줄로 요약하자면
1. 어노테이션 정의 : @LoginUser 어노테이션을 정의하여 메소드 파라미터에 적용한다.
2. Argument Resolver 구현: LoginUserArgumentResolver를 구현하여 @LoginUser 어노테이션이 붙은 파라미터를 처리한다.
3. 스프링 MVC 설정 : WebMvcConfig에서 LoginUserArgumentResolver를 등록하여 어노테이션 기반의 파라미터 처리를 활성화한다.
그리고 이제 @LoginUser 어노테이션을 메소드의 파라미터에 사용하면, 해당 파라미터에 로그인된 사용자 이메일이 자동으로 주입된다.
'Spring' 카테고리의 다른 글
AOP(Aspect-Oriented Programming) (0) | 2024.09.12 |
---|---|
단위 테스트(Unit Testing), JUnit5 (0) | 2024.09.10 |
Edit Configuration을 통해 SQL DB로그인하기 (0) | 2024.09.03 |
N:M(다대다 관계) (0) | 2024.08.30 |
1:N(일대다), N:1(다대일) (1) | 2024.08.28 |