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")에 해당하는 값이 들어있음을 확인할 수 있다.
'공부 > 스프링 부트와 AWS로 혼자 구현하는 웹 서비스' 카테고리의 다른 글
[스프링 부트] 3. JPA / H2 DB 설정 및 예제, Junit 테스트 (0) | 2021.04.19 |
---|---|
[스프링 부트] 2. Lombok 설치 및 STS 연동, Controller & Dto 클래스 생성 및 Junit 테스트 (0) | 2021.04.15 |
[스프링 부트] 1. Gradle 프로젝트 생성 및 build.gradle 작성 (2) | 2021.04.14 |