Spring
[ Spring Boot ] 데이터베이스를 Session 저장소로 사용하기
자바니또
2021. 3. 18. 12:05
이번 포스팅은 '스프링 부트와 AWS로 혼자 구현하는 웹 서비스'라는 책을 읽고 책의 내용을 정리한 것입니다.
책의 장점은 저자가 경험한 것과 생각을 글로 나마 빠르게 경험할 수 있다는 것입니다.
깊이 이해 하지 못하더라도 그러한 것이 있다라는 것을 안다는 것만으로도 충분히 가치있다고 생각합니다.
더 나아가서 직접 해본다면 더더욱 이득이겠지요.
세션저장소를 선택하자
스프링 부트 프로젝트는 기본적으로 세션이 내장 톰캣의 메모리에 저장된다. 애플리케이션을 재실행하거나 배포할 때마다 내장 톰캣의 경우 재시작이되는데 이로인한 문제점은 두 가지가 있다.
1. 배포를 하거나 재실행을 하면 로그인이 풀린다.
2. 2대 이상의 서버에서 서비스하고있다면 톰캣마다 세션 동기화 설정을 해야한다.
그래서 실제 현업에서는 세션 저장소에 대해 다음의 3가지 방법 중 하나를 선택한다.
- 톰캣 세션을 사용한다.(기본)
: 일반적으로 별다른 설정을 하지 않을 때 기본적으로 선택되는 방식이다. 2대 이상의 WAS가 구동되는 환경에서는 톰캣들 간의 세션 공유를 위한 추가 설정이 필요하다. - MySql과 같은 데이터베이스를 세션 저장소로 사용한다.
: 여러 WAS 간의 공용 세션을 사용할 수 있는 가장 쉬운 방법이다. 많은 설정이 필요 없지만, 결국 로그인 요청마다 DB IO가 발생하여 성능상 이슈가 발생할 수 있다. - Redis, Memcached와 같은 메모리 DB를 세션 저장소로 사용한다.
: B2C 서비스에서 가장 많이 사용하는 방식이다. 실제 서비스로 사용하기 위해서는 Embedded Redis와 같은 방식이 아닌 외부 메모리 서버가 필요하다.
메모리 DB
의 특성은 다음과 같다.
- Key와 Value로 이루어진 구조이다.
- Memory의 가격이 용량대비 낮아지면서 수요가 증가했다.
- 빠른 데이터베이스의 성능을 갖고있다.
- 디스크 대신 메모리를 사용하여 I/O의 성능을 향상시켰다.
- 이번 포스팅에서는 두 번째 방식인 데이터베이스를 세션 저장소로 사용하는 방식을 선택하여 진행하겠다. 그 이유는 설정이 간단하고 사용자가 많은 서비스가 아니며 비용 절감을 위해서이다.
설정은 매우 간단하다. 스프링에서는 spring-session-jdbc
만 의존성을 추가하고 설정파일에 설정만 해주면 JPA로 인해 세션 테이블이 자동 생성된다.
의존성 추가 (build.gradle)
implementation 'org.springframework.session:spring-session-jdbc'
설정 추가 (src/main/resources/application.properties)
spring.session.store-type=jdbc # Session store type.
세션 저장 객체 Serialized 하기
DB에 세션을 저장하기 위해서는 세션에 들어가는 객체가 Serializeable
해야 한다.
이때 세션에 저장될 객체는 Entity를 그대로 사용하기 보다는 일종의 DTO를 따로 만들어 변환하여 저장하는 것이 유지보수적으로 좋다.
최대한 Entity는 순수하게 남긴다.
public class SessionAccount implements Serializable {
}