Spring Session

2024. 5. 13. 22:33·Spring/대용량 트래픽

2024.05.13 - [Spring/대용량 트래픽] - Spring cache abstraction, Vegeta 오픈소스 사용해보기

 

Spring cache abstraction, Vegeta 오픈소스 사용해보기

2024.05.08 - [Spring/대용량 트래픽] - Spring Boot Cache Spring Boot Cache2024.05.08 - [Spring/대용량 트래픽] - Redis Cache로 실습하기 Redis Cache로 실습하기2024.05.07 - [Spring/대용량 트래픽] - Redis Cache 이론 Redis Cache

lsdiary.tistory.com

 

이전글에서는 Redis를 Cache로써 활용해, 트래픽이 클 경우 대폭 성능향상과, Vegeta 오픈소스를 이용해서 트래픽이 많은 상황에서의 실험까지 해봤다. 이번글은 캐시가아닌 세션으로써의 활용을 살펴본다.

 

 

Spring FrameWork에서는 HTTP 세션정보를 저장하고,  관련기능을 제공하는 Spring Session이있다.

 

Session

 

클라이언트 <-> 서버 간의 상호작용을 하기위한 유지되는 상태 데이터이다.(이전요청에서 생성된 데이터 활용가능)

Session은 포괄적인 의미로 다양하게 분류하고 식별할 수 있다.

  • HTTP Session
  • TCP Session
  • Socket Session

등이있다.


Spring Session

 

웹 어플리케이션에서 세션관리를 위한 인터페이스와, 세션 저장소를 제공

  1. HTTP Session
  2. WebSocket
  3. WebSession(Spring WebFlux)

스프링에서 사용하기 위해서는 gradle.build 파일에 의존성을 추가해줘야한다.

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

이렇게 선언해주면 되긴 한다만, 나는 레디스에 세션정보를 저장하고 활용할 것이기 때문에 위 의존성을 추가하고 있는 spring-session-data-redis를 의존성 추가한다.

implementation 'org.springframework.boot:spring-boot-starter-data-redis'
implementation 'org.springframework.session:spring-session-data-redis'

 

 ** Redis 뿐만아니라 JDBC, Hazelcast, Mongodb와도 연동이 가능하다.

 

.yml 파일설정
spring:
  session:
    store-type: redis
  data:
    redis:
      host: 127.0.0.1
      port: 6379

 

Session store를 Redis로 사용하겠다는 것과, Redis 접속정보를 설정해줘야한다.

그리고 Redis의 변화를 살펴보기 위해 redis-cli monitor로 모니터링 해준다.

 

public Map<String, String> home(HttpSession session){
    Integer visitCount = (Integer) session.getAttribute("visits");
    if(visitCount == null){
       visitCount = 0;
    }
    session.setAttribute("visits", ++visitCount);
    return Map.of("session id", session.getId(), "visits", visitCount.toString());
}

 

이렇게 HttpSession을 인자로 받게끔 컨트롤러를 작성해준뒤, 내 로컬 PC 주소로 들어가보면

JSON 형식으로, 방문횟수와 session id를 응답하는 걸 확인할수있다. 재방문하면 "visits"은 계속 증가한다.

 

그렇다면 로컬말고, 여러개의 서버에서 해당 Redis의 세션정보를 저장하는 흐름을 살펴보자.


먼저 터미널에 명령어를 입력해서 jar파일을 하나 만든다.

./gradlew build

 

명령어를 입력하고 8080포트로 WAS를  실행시킨다.

java -jar build/libs-0.0.1-SNAPSHOT.jar

그리고 이미 8080포트는 작동하고 있기때문에 임의로 8090포트를 써서 WAS를 실행시켰다.

터미널에서 다음과 같이 입력하면 된다.

./gradlew bootRun --args='--serverport=포트번호'

나는 18080포트로 했다. 

https://shanepark.tistory.com/433

 

스프링 부트 java -jar 혹은 bootrun시 port 변경하기

Intro 이번글은 매우 간단한 글인데, 자꾸 까먹어서 블로그 글로 정리해두고 필요할 때 찾아보려고 작성 해 두려고 합니다. 스프링 부트 프로젝트를 IDE로 손쉽게 실행 할 수 있지만, Scale out 이나

shanepark.tistory.com

여러 포트로 실행하는걸 잘 정리해놓은 블로그가 있어서 첨부한다. 도움이 많이되었다!

Redis에 들어있는 세션정보를 서로 다른서버에서 공유하며 Consistency하게 "visits"값이 증가하는 걸 볼수있다.

 

켜놨던 redis-cli에서 monitor를 관찰해보자

  1. HGETALL : 세션정보를 확인한다.
  2. HMSET : 설정한 값들 저장/갱신
  3. PEXPIREAT : TTL값 갱신

Redis-cli로 직접 Key가 어떻게 저장되어있는지 확인해보면 아까 localhost:8080으로 접속했던 session id와 동일하다.

당연하지만 Value의 타입은 hash로 되어있다.

저장된 값들도 확인할 수 있다.

확인할수 있는 정보
  1. 방문횟수
  2. 관리되는 멤버들
  3. 생성시간
  4. 마지막 접속시간

이렇게 세션으로 활용되는 Spring Data Redis에 대해 알아봤다.

다음은 Spring에서의 Pub/Sub에 대한 활용을 알아보자!

 

2024.05.14 - [Spring/대용량 트래픽] - Spring Boot Pub/Sub

 

Spring Boot Pub/Sub

2024.05.13 - [Spring/대용량 트래픽] - Spring Session Spring Session2024.05.13 - [Spring/대용량 트래픽] - Spring cache abstraction, Vegeta 오픈소스 사용해보기 Spring cache abstraction, Vegeta 오픈소스 사용해보기2024.05.08 - [

lsdiary.tistory.com

 

'Spring > 대용량 트래픽' 카테고리의 다른 글

Prometheus, Grafana 오픈소스로 Redis 모니터링하기  (0) 2024.05.21
Spring Boot Pub/Sub  (0) 2024.05.14
Spring cache abstraction, Vegeta 오픈소스 사용해보기  (0) 2024.05.13
Spring Boot Cache  (0) 2024.05.08
Redis Cache로 실습하기  (0) 2024.05.08
'Spring/대용량 트래픽' 카테고리의 다른 글
  • Prometheus, Grafana 오픈소스로 Redis 모니터링하기
  • Spring Boot Pub/Sub
  • Spring cache abstraction, Vegeta 오픈소스 사용해보기
  • Spring Boot Cache
Ls._.Rain
Ls._.Rain
안되면 될때까지 삽질했던 기록
  • Ls._.Rain
    Ls{Diary}
    Ls._.Rain
  • 전체
    오늘
    어제
    • 분류 전체보기 (136)
      • Github (2)
      • Spring (51)
        • Batch Programming (13)
        • 결제 (4)
        • 대용량 트래픽 (32)
        • OpenAI (0)
        • Security (0)
        • WebSocket (0)
        • JPA (1)
      • Algorithm (67)
        • DFS (6)
        • BFS (6)
        • Dynamic Programming (10)
        • Brute Force (4)
        • Binary Search (6)
        • 구현, 시뮬레이션 (15)
        • Stack (1)
        • Greedy (4)
        • Priority_Queue (2)
        • Back Tracking (3)
        • Geometry (2)
        • SCC (1)
        • 투포인터 (4)
        • 최대유량 (1)
        • 정렬 (1)
      • OS (0)
      • DevOps (15)
        • AWS (11)
        • Docker (4)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • hELLO· Designed By정상우.v4.10.0
Ls._.Rain
Spring Session
상단으로

티스토리툴바