본문 바로가기
따라 공부하기/Spring boot 혼자 개발하는 웹 서비스

[Spring Boot]어노테이션 기반으로 개선 + 세션 저장소 변경

by DawIT 2020. 12. 30.
320x100

이 글은 이 책을 참고하여 쓰여졌습니다.

 

IndexController에서 세션 값을 불러오는 코드

SessionUser user = (SessionUser) httpSession.getAttribute("user");

이 코드는 다른 컨트롤러나 메소드에서 세션값이 필요하면 필요할 때마다 가져와야 한다.

 

그래서 어노테이션 기반으로 개선한뒤 인자로 넘기는 방식으로 바꾼다.

 

 

LoginUser 어노테이션을 생성해서 @Target을 통해 PARAMETER 에서만 쓰는 어노테이션으로 지정한다.

 

package com.david.book.springboot.config.auth;

import com.david.book.springboot.config.auth.dto.SessionUser;
import lombok.RequiredArgsConstructor;
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 javax.servlet.http.HttpSession;

@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 {
        return httpSession.getAttribute("user");
    }
}

 

그 뒤 LoginUserArgumentResolver.java에서 HandlerMethodArgumentResolver를 구현한다. supportsParameter에서

1. LoginUser 어노테이션이 붙어있고

2. 인자의 타입이 SessionUser와 같다면

 

true를 반환한다.

 

또한 resolveArgument에서는 user세션을 반환한다.

 

 

그러면 IndexController에서 인자로 세션을 넘길수 있게 된다.

 

또한 현재 어플리케이션을 재실행하면 로그인이 풀리는데, 세션이 톰캣의 메모리에 저장되기 떄문이다.

 

이를 DB로 변경한다.

 

 

먼저 의존성 추가. 아주 간단하다.

 

 

그리고 application.properties에서 옵션 한줄만 추가해주면 된다.

 

이후에 AWS에 배포하고 RDS를 사용하면 세션이 풀리지 않게 될 것이다.

댓글