반응형

1. 개요

 - Argument Resolver 란?

 - 예제

 

2. Argument Resolver 란?

 - Controller로 들어온 파라미터를 가공하거나 수정 기능을 제공하는 객체이다. 교재에서는 이를 사용해 Controller로 들어온 특정 파라미터에 세션 정보를 가공하여 넣어주었다.

 - Argument Resolver를 Controller 단에서 사용하면 중복 코드(HttpSession에서 세션 로드, HttpServletRequest에서 요청 url 및 ip 정보 로드 등)를 깔끔하게 처리할 수 있다. > 예제를 보면 이 말의 의미를 알 수 있다.

 - 예제에서는 LoginUser 어노테이션이 붙은 SessionUser 객체에 대해 Argument Resolver를 설정해주었다.

 

3. 예제

 3.1. @LoginUser.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
package com.ssk.springboot.config.auth;
 
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
 
import java.lang.annotation.RetentionPolicy;
 
/*
 * Target : 어노테이션이 생성될 수 있는 위치 지정. PARAMETER면 메소드의 파라미터로 선언된 객체에서만 사용 가능
 * Retention : 어노테이션의 메모리 생명 주기 지정. 런타임에도 해당 어노테이션 객체는 메모리에 올라가있음
 */
@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
public @interface LoginUser {
 
}
cs

 - 파라미터 단위에서 사용 가능하며, 런타임 시 메모리에 적재되는 LoginUser 어노테이션을 생성한다.

 - 어노테이션을 만들어 주는 이유는 이 어노테이션이 붙은 파라미터에 대해 Argument Resolver 를 설정하기 위함이다.

 

 3.2. LoginUserArgumentResolver.java

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
30
31
32
33
34
35
package com.ssk.springboot.config.auth;
 
import javax.servlet.http.HttpSession;
 
import org.springframework.core.MethodParameter;
import org.springframework.stereotype.Component;
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 com.ssk.springboot.config.auth.dto.SessionUser;
 
import lombok.RequiredArgsConstructor;
 
@RequiredArgsConstructor
@Component
public class LoginUserArgumentResolver implements HandlerMethodArgumentResolver{
 
    private final HttpSession httpSession;
    
    @Override
    public boolean supportsParameter(MethodParameter parameter) {
        boolean isLoginUserAnnotation = parameter.getParameterAnnotation(LoginUser.class!= null;
        boolean isUserClass = SessionUser.class.equals(parameter.getParameterType());
        return isLoginUserAnnotation && isUserClass;
    }
 
    @Override
    public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer,
            NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {
        // TODO Auto-generated method stub
        return httpSession.getAttribute("user");
    }
}
cs

 - HandlerMethodArgumentResolver 인터페이스를 상속받는 구현체 클래스를 생성한다.

 - 이 인터페이스는 개발자가 커스텀하는 Argument Resolver에 대한 여러 메서드를 지원한다.

 - supportsParameter 메서드는 들어온 파라미터에 대해 resolveArgument 메서드를 실행할지 말지 판단한다. 리턴 값이 true면 결과적으로 resolveArgument 메서드를 실행하게 되는데, 이 메서드는 파라미터를 가공하는 역할을 한다.

 

 - parameter.getParameterAnnotation(LoginUser.class) != null, 즉, 해당 파라미터의 어노테이션이 LoginUser이고,

   parameter.getParameterType이 SessionUser일 경우 true를 반환하고, resolveArgument 메서드는 HttpSession. getAttribute("user") 를 반환한다.

 

 - 정리하면, 컨트롤러의 파라미터 중 @LoginUser 어노테이션이 붙어있는 SessionUser 객체가 있을 경우 해당 파라미터에 user 세션 정보를 리턴한다.

 

 3.3. Controller.java

1
2
3
4
5
6
7
8
9
10
    @GetMapping("/")
    public String index(Model model, @LoginUser SessionUser user) {
        
        model.addAttribute("posts",postsService.findAllDesc());
        if(user != null) {
            System.out.println(user.getName());
            model.addAttribute("userName", user.getName());
        }
        return "index";
    }
cs

 - 파라미터로 들어온 user 객체에 HttpSession.getAttributes("user")에 해당하는 값이 들어있음을 확인할 수 있다.

반응형

+ Recent posts