[spring] 세션 저장소로 데이터베이스 사용하기

Kaite.Kang·2023년 1월 22일
0
post-thumbnail

* 목표

세션저장소로 데이터베이스를 사용하여 애플리케이션 재시작시 로그인 데이터가 유지되도록 한다.

1. 세션 저장소

1) 필요성

세션은 WAS의 메모리에 저장된다. 현재 프로젝트도 내장 톰켓의 메모리에 저장되는데 메모리에 저장되는 구조는 아래와 같은 문제점이 있다.

  • 메모리에 저장되기 때문에 애플리케이션 재실행시 항상 초기화된다.
    즉, 배포할 때마다 톰켓이 재시작되는 것이다.
  • 2대 이상의 서버에서 서비스를 하고 있다면 한 서버에서만 세션정보를 가지고 있게 된다. 따라서 톰켓마다 세션 동기화 설정을 해야만 한다.

이와 같은 이유로 세션 저장소를 따로 사용하는 것이 좋다.

2) 세션 저장 방식

A. 톰켓 세션 사용

  • 일반적으로 별다른 설정을 하지 않을 때 기본적으로 선택되는 방식이다.
  • (단점) 톰캣(WAS)에 세션이 저장면 2대 이상의 WAS가 구동되는 환경에서는 톰캣들 간의 세션 공유를 위한 추가 설정이 필요하다.

B. 데이터베이스를 세션 저장소로 사용

  • (장점) 여러 WAS 간의 공용 세션을 사용할 수 있는 가장 쉬운 방법이다.
  • (단점) 로그인 요청마다 DB IO가 발생하여 성능상 이슈가 발생할 수 있다.
  • (사용 사례) 보통 로그인 요청이 적은 백오피스, 사내 시스템 용도에서 사용한다.

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

  • B2C 서비스에서 가장 많이 사용하는 방식이다.
  • (주의 사항) 실제 서비스로 사용하기 위해서는 Embedded Redis와 같은 방식이 아닌 외부 메모리 서버가 필요하다.

2. 데이터베이스를 세션 저장소로 사용하기

데이터베이스를 세션 저장소로 사용하면 설정이 간단하고, 비용 절감을 할 수 있다. 이 프로젝트는 특히 사용자가 많은 서비스가 아니기 때문에 이 방법이 더 적합할 수 있겠다.

1) spring-session-jdbc 의존성 등록

spring web, spring jpa를 사용했던 것과 마찬가지로 build.gradle에 의존성을 등록해야 한다.

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

2) 세션 저장소를 jdbc로 설정

application.properties에 세션 저장소를 jdbc로 선택하도록 추가한다.

spring.session.store-type=jdbc

3) 테스트

설정을 완료한 후, 다시 애플리케이션을 실행해서 로그인을 테스트한 뒤, h2-console에 접속한다.

h2-console에서 세션을 위한 테이블인 SPRING_SESSION과 SPRING_SESSION_ATTRIBUTES 가 생성되었다. JPA가 세션테이블을 자동으로 생성한 것이다.

로그인한 상태이기 때문에 한개의 세션이 등록되어 있는 것을 확인 할 수 있다.

지금 상태에서는 스프링을 재시작하면 H2도 재시작되기 때문에 세션이 풀린다. (H2는 스프링 부트가 지원하는 인메모리 데이터베이스이다.)

이 문제는 데이터베이스를 따로 사용하면 해결된다. 예를 들어 AWS 환경에서 배포한다면 AWS 데이터베이스인 RDS를 사용하면 이때는 세션이 풀리지 않는다.

* 정리

  • 기본적으로 세션은 WAS의 메모리에 저장되므로 애플리케이션을 재기동하면 세션 데이터가 초기화된다.
  • 데이터베이스를 세션 저장소로 사용할 수 있으며, 단점은 로그인 요청때마다 DB IO가 발생하여 성능상 이슈가 발생할 수 있으므로 로그인 요청이 적은 환경에 적합하다.
  • Redis, Memcached와 같은 메모리 DB를 세션 저장소로 사용하면 DB IO 발생으로 인한 성능 이슈를 해소할 수 있다.

참고

도서 - 스프링 부트와 AWS로 혼자 구현하는 웹 서비스

0개의 댓글