Ls._.Rain 2024. 5. 13. 22:33

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