[SpringBoot] (6) Spring Security OAuth 2.0 (+ 어노테이션 생성, DB사용)

윤경·2022년 1월 29일
0

Spring Boot

목록 보기
74/79
post-custom-banner

모든 코드는 🔗깃허브를 참고


저번 포스트까지는 구글 소셜 로그인을 구현하였고 이번에는 반복되는 코드를 줄일 수 있는 어노테이션 기반으로 개선해본다.

✔️ 어노테이션 기반으로 개선

반복되는 코드는 IndexController에서 세션 값을 가져오는 부분이다.

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

이렇게 세션값이 필요할 때마다 계속 직접 세션에서 값을 가져와야 한다.
이 부분을 메소드 인자로 세션값을 바로 받을 수 있도록 바꾸는 것이 목표이다.

LoginUser.java

@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

✔️ 세션 저장소로 DB 사용하기

지금은 배포할 때마다 톰캣이 재시작되어 메모리가 늘 초기화 되어있었다.

(1) 톰캣 세션 이용 (2) DB를 세션 저장소로 사용(ex. MySQL) (3) Redis와 같은 메모리 DB를 세선 저장소로 사용

이러한 방법들 중 지금은 두번째 방법인 DB를 세션 저장소로 사용을 이용하도록 한다.

Spring-session-jdbc 등록

먼저 build.gradle에 아래 코드를 추가해 의존성을 등록한다.

implementation('org.springframework.session:spring-session-jdbc')

그리고 세션 저장소를 jdbc로 선택하도록 application.properties에 아래 코드를 추가한다.

spring.session.store-type=jdbc

이제 어플리케이션을 재실행시켜 H2-console을 확인해보면 세션을 위한 테이블 두 개가 생성된 것을 확인할 수 있다.

이때, JPA로 인해 세션 테이블이 자동 생성되었기 때문에 별도로 다른 처리가 필요 없다.

그런데 지금은 스프링을 재시작하면 세션이 풀려 H2가 재시작되어 재자리로 돌아오긴 한다.


이 글은 이동욱님의 <스프링 부트와 AWS로 혼자 구현하는  서비스> 를 보고 작성한 글입니다.
profile
개발 바보 이사 중
post-custom-banner

0개의 댓글