저번 포스트까지는 구글 소셜 로그인을 구현하였고 이번에는 반복되는 코드를 줄일 수 있는 어노테이션 기반으로 개선해본다.
반복되는 코드는 IndexController
에서 세션 값을 가져오는 부분이다.
SessionUser user = (SessionUser) httpSession.getAttribute("user");
이렇게 세션값이 필요할 때마다 계속 직접 세션에서 값을 가져와야 한다.
이 부분을 메소드 인자로 세션값을 바로 받을 수 있도록 바꾸는 것이 목표이다.
@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
public @interface LoginUser {
}
@Target(Element.Type.PARAMETER)
: 이 어노테이션이 생성될 수 있는 위치 지정
PARAMETER - 메소드의 파라미터로 선언된 객체에서만 사용@interface
: 이 파일을 어노테이션 클래스로 저장
(이제 LoginUser라는 어노테이션이 생긴거임)
LoginUserArgumentResolver.java
: Login-UserArgumentResolver라는 HandlerMethodArgumentResolver 인터페이스를 구현한 클래스
supportsParameter()
: 컨트롤러 메소드의 특정 파라미터를 지원하는지 판단
(이 경우 파라미터에 @LoginUser 어노테이션이 붙어있고, 파라미터 클래스 타입이 SessionUser.class 인 경우 true 반환)resolveArgument()
: 파라미터에 전달할 객체를 생성
(여기서는 세션에서 객체를 가져옴)
이제 어노테이션을 사용하기 위한 환경은 마련하였고 스프링에서 인식될 수 있도록 WebMvcConfigurer에 추가해주면 된다. ➡️ WebConfig
HandlerMethodArgumentResolver는 항상 WebMvcConfigurer의
addArgumentResolvers()
를 통해 추가해주어야 한다.다른 Handler-MethodArgumentResolver가 필요하다면 같은 방식으로 추가해주기
이제 IndexController.java
에서 만든 어노테이션으로 코드를 축약시켜주면 된다.
LoginUser.java
LoginUserArgumentResolver.java
WebConfig.java
IndexController.java
지금은 배포할 때마다 톰캣이 재시작되어 메모리가 늘 초기화 되어있었다.
(1) 톰캣 세션 이용 (2) DB를 세션 저장소로 사용(ex. MySQL) (3) Redis와 같은 메모리 DB를 세선 저장소로 사용
이러한 방법들 중 지금은 두번째 방법인 DB를 세션 저장소로 사용을 이용하도록 한다.
먼저 build.gradle에 아래 코드를 추가해 의존성을 등록한다.
implementation('org.springframework.session:spring-session-jdbc')
그리고 세션 저장소를 jdbc로 선택하도록 application.properties에 아래 코드를 추가한다.
spring.session.store-type=jdbc
이제 어플리케이션을 재실행시켜 H2-console을 확인해보면 세션을 위한 테이블 두 개가 생성된 것을 확인할 수 있다.
이때, JPA로 인해 세션 테이블이 자동 생성되었기 때문에 별도로 다른 처리가 필요 없다.
그런데 지금은 스프링을 재시작하면 세션이 풀려 H2가 재시작되어 재자리로 돌아오긴 한다.
이 글은 이동욱님의 <스프링 부트와 AWS로 혼자 구현하는 웹 서비스> 를 보고 작성한 글입니다.