본문 바로가기

Programing/Framework

[Spring] 특정 타입의 객체를 Request 스코프로 받기

방법1.

빈에 @Scope 어노테이션을 이용한다.

예) 로그인 정보를 어디선가(예. 인터셉터)에서 넣어준다고 할 때 아래와 같이 로그인 정보를 담는 요청 스코프의 빈을 만들 수 있다.

@Component
@Scope(value = "request", proxyMode = ScopedProxyMode.TARGET_CLASS)
public class LoginHolder {
private Login login;

protected void setLogin(Login login) {
this.login = login;
}

public Login getLogin() {
return login;
}
}

실제로 스프링에서는 해당 구현을 ThreadLocal등에 map의 형태로 관리한다.

자세한 것은 아래 소스코드 참고.

https://github.com/spring-projects/spring-framework/blob/4.3.x/spring-web/src/main/java/org/springframework/web/context/request/RequestContextHolder.java


방법2.

여러 컨트롤러에서 공통된 객체 (예. 로그인 정보)를 받는다면 org.springframework.web.method.support.HandlerMethodArgumentResolver 인터페이스를 구현하는 것도 좋다.

supportsParameter가 true가 되면 resolveArgument에 해당 객체를 넣어주는 것을 구현하면 된다.


예)

public class LoginArgumentResolver implements HandlerMethodArgumentResolver {

@Autowired
private LoginHolder loginHolder;

@Override
public boolean supportsParameter(MethodParameter parameter) {
return Login.class.isAssignableFrom(parameter.getParameterType());
}

@Override
public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest,
WebDataBinderFactory binderFactory) throws Exception {
return loginHolder.getUser();
}
}

supportsParameter에서 특정 어노테이션이 붙어 있는지에 따라 판단하게 하려면 getParameterAnnotation으로 가져온 레퍼런스가 null인지 비교하면 된다.