🌱 이번 장의 스터디 범위
- 세션 저장소로 톰캣 / 데이터베이스 / 메모리 DB가 있으며 이 중 데이터베이스를 사용하는 이유
🌱 세션 저장소로 데이터베이스 사용하는 이유
- 지금 우리가 만든 서비스는 애플리케이션을 재실행하면 로그인이 풀리는 문제가 발생
- 이는 세션이 내장 톰캣의 메모리에 저장되기 때문임
- 기본적으로 세션은 실행되는 WAS (Web Application Server) 의 메모리에 저장되고 호출됨
- 메모리에 저장되다 보니 내장 톰캣처럼 애플리케이션 실행 시 실행되는 구조에선 항상 초기화가 됨
- 즉, 배포할 때마다 톰캣이 재시작되는 것
- 또 다른 문제로는 2대 이상의 서버에서 서비스하고 있다면 톰캣마다 세션 동기화 설정을 해야함
- 그래서 실제 현업에서는 3가지 (톰캣 세션, MySQL과 같은 데이터베이스, Redis, Memcached와 같은 메모리 DB) 중 하나를 세션 저장소로 선택
- 여기서는 설정이 간단하고 비용 절감을 위해 데이터베이스를 세션 저장소로 사용하는 방식을 선택하여 진행
🌱 세션 저장소로 데이터베이스 사용하기
- spring-session-jdbc 등록을 위헤 build.gradle 의존성 등록
// build.gradle
compile('org.springframework.session:spring-session-jdbc')
- application.properties에 세션 저장소를 jdbc로 선택하도록 코드 추가
// resources/application.properties
spring.session.store-type=jdbc
- 모두 변경하였으니 다시 애플리케이션을 실행해서 로그인을 테스트한 뒤, h2-console로 접속
- h2-console을 보면 세션을 위한 테이블 2개 (SPRING_SESSION, SPRING_SESSION_ATTRIBUTES)가 생성된 것 확인
- JPA로 인해 세션 테이블이 자동 생성되었기 때문에 별도로 해야할 일은 없음
- 방금 로그인했기 때문에 한 개의 세션이 등록되있는 것을 볼 수 있음
- 세션 저장소를 데이터베이스로 교체했으나 비록 스프링을 재시작하면 세션이 풀리게 됨
- 그 이유는 H2 기반으로 스프링이 재실행될 때 H2도 재시작되기 때문임
- 이후 AWS로 배포하게 되면 AWS의 데이터베이스 서비스인 RDS (Relational Database Service)를 사용하게 됨
- 이 때부터는 세션이 풀리지 않음