[HometownBoard] 어떤 세션저장소를 고를까?

junghan·2023년 5월 12일
0

SpringBootProject

목록 보기
34/35
post-thumbnail

현재 프로젝트에서 기본적으로 제공되는 Spring Boot는 내장 톰캣(Tomcat)을 세션 저장소로 사용하고 있습니다. 톰켓은 Spring Boot 애플리케이션을 실행할 때 데이터를 자동으로 톰캣 서버를 내장하여 사용할 수 있습니다.

즉, 톰캣은 웹 애플리케이션에서 발생하는 클라이언트의 세션을 관리하는 기능을 제공하는데, 내장 톰캣의 기본 세션 저장소는 애플리케이션의 실행 중에만 유효하여 애플리케이션을 재시작하거나 서버를 재시작하면 세션 데이터가 모두 손실되는 문제가 있습니다.

또한 2대 이상의 서버에서 서비스하고 있다면 톰캣마다 세션 동기화 설정을 해줘야만 원활한 사용이 가능합니다. ㅜ

세션은 클라이언트가 웹 애플리케이션에 접속한 후에도 클라이언트의 상태를 유지하기 위해 사용됩니다.


그럼 어떤 세션 저장소?

톰캣 세션을 사용하기 (현재 사용하는 방식)

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

장점:

빠른 응답 속도: 메모리에 직접 저장되므로 데이터 액세스가 빠릅니다.
간단한 설정: Spring Boot의 기본 세션 저장소이므로 별도의 설정이 필요하지 않습니다.

단점:

확장성과 내구성: 단일 서버 환경에서만 동작하며, 서버 재시작 시 세션 데이터가 손실됩니다.
세션 공유 문제: 여러 서버 인스턴스가 있는 클러스터 환경에서 세션 공유가 어렵습니다.


MySQL 과 같은 데이터베이스를 세션 저장소로 사용한다. (채택할 방식)

  • 여러 WAS 간의 공용 세션을 사용할 수 있는 가장 쉬운 방법입니다.
  • 많은 설정이 필요 없지만, 결국 로그인 요청마다 DB IO 가 발생하여 성능상 이슈가 발생할 수 있습니다.
  • 보통 로그인 요청이 많이 없는 백오피스, 사내 시스템 용도에서 사용합니다.

장점:

내구성과 일관성: 데이터베이스의 특성을 활용하여 세션 데이터의 보존과 복구가 가능합니다.
기존 데이터베이스 활용: 기존에 사용 중인 데이터베이스를 세션 저장소로 활용할 수 있습니다.

단점:

성능 저하 가능성: 데이터베이스 액세스로 인해 응답 시간이 늘어날 수 있습니다.
데이터베이스 부하: 세션 데이터 저장으로 인해 데이터베이스 부하가 증가할 수 있습니다.


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

  • B2C 서비스에서 가장 많이 사용하는 방식입니다.
  • 실제 서비스로 사용하기 위해서는 Embedded Redis 와 같은 방식이 아닌 외부 메모리 서버가 필요합니다.
  • AWS위에서 배포할 시 돈이 듦.. 💰

장점:

빠른 응답 속도: 메모리 기반으로 데이터 액세스가 빠릅니다.
세션 클러스터링 및 분산 캐싱: Redis의 기능을 활용하여 세션 관리와 검색 기능을 제공합니다.

단점:

Redis 서버 구축 및 관리: 별도의 Redis 서버를 구축하고 관리해야 합니다.
메모리 사용량: Redis는 메모리를 많이 사용하므로 대용량 데이터 세션에는 적합하지 않을 수 있습니다.


세션 저장소 변경하기

먼저 build.gradle 에 다음과 같이 의존성을 등록합니다.
build.gradle.kts 에 spring-session-jdbc를 추가

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

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

spring.session.store-type=jdbc

끝!

profile
42seoul, blockchain, web 3.0

0개의 댓글