본문 바로가기
Spring

세션 저장소를 사용하는 3가지 방법

by 에드박 2020. 7. 25.

보통 애플리케이션을 만들면 서버를 재시작 했을 때 세션도 초기화 됩니다.

 

이것은 세션이 내장 톰캣의 메모리에 저장되기 때문에 서버가 재시작될때 초기화가 되는것입니다.

 

즉, 배포할 때마다 톰캣이 재시작되어 세션이 초기화 되어버리는것입니다.

 

그리고 만약 2대 이상의 서버를 사용한다면 톰캣마다 세션동기화를 시켜줘야만 합니다.

 

그래서 실제 협업에서는 다음 3가지중 한가지를 선택합니다.

 

1. 톰캣 세션을 사용한다.

- 일반적으로 별다른 설정을 하지 않을 때 기본적으로 선택되는 방식입니다.

- 이렇게 될 경우 톰캣(WAS) 에 세션이 저장되기 때문에 2대 이상의 WAS가 구동되는 환경에서는 톰캣들 간에 세션 공유를 위한 추가 설정이 필요합니다.

 

2. MySQL 과 같은 데이터베이스를 세션 저장소로 사용한다.

- 여러 WAS 간의 공용 세션을 사용할 수 있는 가장 쉬운 방법입니다.

- 많은 설정이 필요 없지만, 결국 로그인 요청마다 DB IO 가 발생하여 성능상 이슈가 발생할 수 있습니다.

- 보통 로그인 요청이 많이 없는 백오피스, 사내 시스템 용도에서 사용합니다.

 

3. Redis, Memcached와 같은 메모리 DB를 세션 저장소로 사용한다.

- B2C 서비스에서 가장 많이 사용하는 방식입니다.

- 실제 서비스로 사용하기 위해서는 Embedded Redis와 같은 방식이 아닌 외부 메모리 서버가 필요합니다.

 

AWS에서 서비스를 운영하고 배포할 때 레디스와 같은 메모리 DB는 별도로 사용료를 지불해야 합니다.

 

저는 데이터베이스를 세션 저장소로 사용했습니다. 지금 적용하는 서비스는 사용자가 두명이기 때문에(저를 포함) 레디스와 같은 서비스(엘라스틱 캐시)에 별도로 사용료를 지불해야 한다면 슬플거같습니다. 

 

데이터 베이스를 세션 저장소로 사용하면 설정이 간단하고 사용자가 적을 때 비용을 절감할 수 있습니다.

 

Spring Session JDBC

 

Spring에는 간단하게 세션 저장소를 만들 수 있는 spring-session-jdbc 라는 의존성이 있습니다.

 

spring.io 에 있는 spring-session-jdbc 의 설명을 보면 다음과 같습니다.

 

Spring Session JDBC는 관계형 데이터베이스 및 구성 지원에 의해 지원되는 SessionRepository 구현을 제공합니다.

 

Spring Session은 애플리케이션 컨테이너 특정 솔루션에 묶이지 않고  클러스터 된 세션을 지원하는 것을 간단하게 만듭니다. 또한 다음과의 투명한 통합을 제공합니다.

 

  • HttpSession - RESTful API와 함께 작동하도록 헤더에 세션 ID 제공을 지원하여 애플리케이션 컨테이너                                      (예: Tomcat) 중립적인 방식으로 HttpSession을 대체 할 수 있습니다.
  • WebSocket - WebSocket 메시지를 수신 할 때 HttpSession을 활성 상태로 유지하는 기능을 제공합니다.
  • WebSession - 애플리케이션 컨테이너 중립적인 방식으로 Spring WebFlux의 WebSession을 대체할 수 있습니다.

Spring WebFlux 가 뭔지 모르겠습니다. Spring WebFlux도 한번 찾아보겠습니다.

 

Spring WebFlux - 스프링 5에서 새로 등장한 웹 애플리케이션에서 리액티브 프로그래밍을 제공하는 프레임워크입니다.

 

WebFlux - 웹 요청을 완전히 Reactive 하게 처리하는 것을 가능하게 해줍니다.

 

리액티브 프로그래밍(Reactive Programming) - 비동기 프로세스로 동작하는 이벤트 기반의 non-blocking 애플리케이션을 구현하는 프로그래밍 입니다.

용도는 다음과 같습니다.

  • 비동기 - 논블로킹 리액티스 개발에 사용합니다.
  • 효율적으로 동작하는 고성능 웹 애플리케이션 개발
  • 서비스간 호출이 많은 마이크로서비스 아키텍쳐에 적합
Spring WebFlux에 대해 아직 이해하기 좀 어렵습니다. 공부하여 따로 글을 올리도록 하겠습니다! ㅠㅠ

spring-session-jdbc 등록하기

 

build.gradle 에 다음과 같은 의존성을 추가합니다.

compile 'org.springframework.session:spring-session-jdbc'

 

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

spring.session.store-type=jdbc

설정은 이걸로 끝입니다.

 

애플리케이션을 실행하면 SPRING_SESSION, SPRING_SESSION_ATTRIBUTES 라는 2개의 테이블이 생성된 걸 볼 수 있습니다.

spring-session-jdbc 로 인해 SessionRepository 가 생성되고 JPA로 인해 세션 테이블이 자동 생성 됩니다. 따라서 별도로 해야할 일은 없습니다.

댓글