ArgumentResolver 활용
ArgumentResolver 를 활용하면, 컨트롤러의 파라미터에서 공통적인 작업을 자동으로 처리할 수 있다.
예시로 @Login
애노테이션을 만들어 로그인된 회원 정보를 세션에서 가져오는 작업을 자동화해보겠다.
1. 커스텀 애노테이션 @Login 생성
@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
public @interface Login {
}
@Target(ElementType.PARAMETER)
: 파라미터에만 사용
@Retention(RetentionPolicy.RUNTIME)
: 리플렉션 등 활용할 수 있도록 런타임에도 애노테이션 유지
2. LoginMemberArgumentResolver 구현
public class LoginMemberArgumentResolver implements
HandlerMethodArgumentResolver {
@Override
public boolean supportsParameter(MethodParameter parameter) {
boolean hasLoginAnnotation = parameter.hasParameterAnnotation(Login.class);
boolean hasMemberType = Member.class.isAssignableFrom(parameter.getParameterType());
return hasLoginAnnotation && hasMemberType;
}
@Override
public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer,
NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {
HttpServletRequest request = (HttpServletRequest) webRequest.getNativeRequest();
HttpSession session = request.getSession(false);
if (session == null) {
return null;
}
return session.getAttribute(SessionConst.LOGIN_MEMBER);
}
}
supportsParameter()
: @Login 애노테이션이 있고, Member 타입이면 해당 ArgumentResolver 가 사용
resolveArgument()
: 컨트롤러 호출 직전에 호출되어, 세션에서 로그인된 Member 객체를 찾아 컨트롤러의 파라미터로 주입
3. 스프링 설정에 ArgumentResolver 등록
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {
resolvers.add(new LoginMemberArgumentResolver());
}
}
addArgumentResolvers()
를 사용하여 LoginMemberArgumentResolver 를 등록한다.
4. 컨트롤러에서 @Login 활용
@GetMapping("/")
public String homeLoginV3ArgumentResolver(@Login Member loginMember, Model model) {
if (loginMember == null) {
return "home";
}
model.addAttribute("member", loginMember);
return "loginHome";
}
@Login Member loginMember
: 파라미터를 선언하면 자동으로 로그인된 Member 객체가 들어온다.
동작 흐름
1. 사용자가 /
로 Get 요청
2. 스프링 MVC 가 컨트롤러 호출하기 전 LoginMemberArgumentResolver
실행
3. supportsParameter()
가 true >
resolveArgument()` 에서 로그인한 회원 정보를 찾아서 반환
4. 컨트롤러의 @Login Member loginMember
파라미터에 자동으로 로그인 정보 주입
5. 로그인 상태에 따라 home
또는 loginHome
반환
출처 | 스프링 MVC 2(김영한) - 인프런
'💠프로그래밍 언어 > Java' 카테고리의 다른 글
[Spring] API 에러 처리하는 방법, ExceptionResolver 와 @ControllerAdvice (0) | 2025.04.06 |
---|---|
[Spring] 서블릿 예외 처리와 스프링 부트 예외 처리 (0) | 2025.04.04 |
[Spring] 인터셉터란? + 요청 로그 인터셉터, 인증 체크 인터셉터 예시 (0) | 2025.04.04 |
[Spring] 필터란 ? + 요청 로그 필터, 인증 체크 필터 예시 (0) | 2025.04.04 |
[Spring] 쿠키/세션으로 로그인 처리하기 (세션 저장소 만들기, HttpSession) (0) | 2025.04.03 |