Session
방문자가 웹서버에 접속해 있는 상태를 하나의 단위로 보고 그것을 session이라고 한다. 웹서버는 이러한 각 단위에 세션 Id를 부여하고 같은 브라우저인지 구별한다.
Redis
Redis는 키-값 구조의 비정형 데이터를 저장하고 관리하기 위한 비 관계형 데이터베이스 관리 시스템으로, String, Set, Sorted Set, Hash, List 자료구조를 지원한다.
또한, 데이터의 저장을 메모리에 하는 In-Memory기반의 DB이기 때문에 속도가 매우 빠르다는 장점이 있어, 캐시 및 세션 저장소로 많이 사용한다.
서버가 여러대 있는 분산환경일 때 Session Clustering(군집화)을 하지 않으면 각각의 서버에서 session id를 생성하기 때문에 같은 브라우저라는 것을 인식하지 못하여 매 호출마다 로그인을 다시 해야하는 상황이 일어날 수 있다.
이러한 분산환경에서 요청을 장애없이 처리하기 위해 Load Balancing을 이용해 여러대의 서버에 요청을 적절히 분배해주는 분산환경에서 Spring과 Redis를 이용하여 간단하게 Session Clustering을 하는 방법을 알아보자

Load Balancing
대규모의 트래픽을 감당하기 위하여 미리 트래픽을 예측하고 서버와 네트워크를 증설해두게 된다. 특히 한 서버의 성능을 높이는 Scale-up 작업은 그 한계가 있으므로 분산처리를 위해 여러 대의 서버를 놓게 되는 Scale-out 작업을 하게 되는데 이 때 여러 서버들로 대규모의 네트워크 트래픽을 분산처리하는 기술을 Load Balancing이라고 한다.
1. build.gradle에 redis와 spring session data redis를 추가한다.


2. Redis를 Spring session 저장소로 설정하기
application.yaml파일에 아래와 같이 설정한다.

3. session 저장소에 name을 저장한다

전체 테스트 코드
@GetMapping("/login")
public String login(HttpSession session, @RequestParam String name) {
session.setAttribute("name", name);
return "Login Success";
}
@GetMapping("/myName")
public String myName(HttpSession session) {
String myName = (String)session.getAttribute("name");
return myName;
}

user가 로그인을 했을때 여러 server 중에 하나의 server에 접속 하더라도 위 그림과 같이 외부 저장소인 Redis에 Session Id를 저장 했으므로 어떤 서버를 api를 호출 하더라고 Redis 저장소에 있는 Session Id를 사용할 수 있다 따라서 Session Clustering이 가능해진다.

'데이터베이스' 카테고리의 다른 글
| [SQL] UNION과 UNION ALL 비교 : 사용시 주의할점 & Mysql 예시 (0) | 2023.11.17 |
|---|---|
| [SQL] WITH절 사용하기(재귀쿼리, 중복쿼리) & mysql 예제 (1) | 2023.11.14 |