java spring redis 세션 공유 : Spring Session을 이용한 세션 클러스터링

Spring Session을 이용한 세션 클러스터링

 
Skip to end of metadata
 
Go to start of metadata
 

Introduction

Icon

브라우저에서 HTTP 요청을 하고, 응답을 받은 뒤에는 TCP 연결이 해제됩니다. 즉 매 요청마다 새롭게 3way handshaking, 4way handshaking을 할 것입니다.

그렇다면 로그인을 한 후에 새로운 요청을 보낼 때에는 당연히 로그인 정보가 사라지게 됩니다. 그렇지만 우리가 평상시에 쓰는 웹사이트는 로그인 정보를 서버(WAS)의 세션에 저장해놓기 때문에 로그인 정보가 유지됩니다.

이 장에서는 지금까지 WAS의 세션을 잘 이용해 왔는데, 왜 요즘 Spring Session의 사용이 증가했는지에 대해 알아보도록 하겠습니다.

 

 


 

1. 배경지식

Icon

WAS의 세션을 이용했을 때, 어떤 구조로 이루어져 있었는지 살펴보도록 하겠습니다.

서버가 한 대일 때에는 WAS의 세션을 사용하는데에 문제가 없었을 것입니다.

그러나 사용자가 증가해 서버에 과부하가 걸려 서버를 한 대 증설했어요.

Icon

서버 이중화는 단순히 부하 분산만을 위한 것이 아닙니다.

장애 발생시 정지되지 않는 시스템을 위해서 당연히 이중화를 해야 합니다.

 

이 경우, 세션은 두 군데에서 관리됩니다. 예를 들어 로그인 요청은 93번 서버로 들어와 93번 서버의 세션에 담았는데, 그 다음 요청을 94번에 하게 된다면 로그인이 되어있지 않다고 할 것입니다. 로그인 정보는 93번 세션에 담겨있기 때문입니다.

이 문제는 두 서버간의 세션이 공유되어야 해결됩니다. 이를 세션 클러스터링이라고 합니다.

그리고 공유되어야 할 Ip,port를 WAS 설정 파일에 등록해 주면 됩니다.

Icon

Tomcat 클러스터링 설정 방법은 http://tomcat.apache.org/tomcat-8.5-doc/cluster-howto.html을 참고하시면 됩니다.

그런데 왜 WAS의 Session 대신 Spring Session을 사용해야 하는 것일까요?

MSA(Micro Service Architecture) 의 유행과 그에 따른 Scale out 이 더 요구되었기 때문입니다.

 

한 서버에 여러 개의 WAS가 떠 있을 수도 있고, 여러 대의 서버에 여러 개의 WAS가 떠 있을 수도 있습니다.

서비스를 담당하는 WAS를 늘려야 할 때, 세션 클러스터링을 위해 이미 떠 있는 WAS에 새로운 WAS의 Ip/port 정보를 일일이 입력해주어야 합니다. 

상당히 번거러운 작업입니다.

따라서 WAS가 제공하는 세션 클러스터링 기능에 의존하지 말고, 새로운 저장소를 두어 세션을 공유하자는 의견이 나오게 되었습니다.

그러면 새로운 Service 를 늘려도 이미 떠 있는 Service는 변경할 필요가 없게 됩니다. 새로 추가되는 WAS는 외부 Storage 정보만 알고 있으면 됩니다.

 

자, 그럼 Spring Session은 무엇일까요? Spring Session은 HttpSession의 구현 클래스입니다. (지금까지는 WAS의 HttpSession 구현체를 사용했을 것입니다.)

따라서 우리는 HttpSession의 구현체로 Spring Session을 사용하겠다고 어플리케이션에 알려주기만 하면 개발 코드의 변경 없이 Spring Session을 사용하게 되는 것입니다.

경축! 아무것도 안하여 에스천사게임즈가 새로운 모습으로 재오픈 하였습니다.
어린이용이며, 설치가 필요없는 브라우저 게임입니다.
https://s1004games.com

이 부분은 세 번째 파트인 Spring Java Configuration에서 자세히 살펴보겠습니다.


 

2. Session Stroage - redis

Icon

세션을 공유하기 위한 저장소로 Redis를 많이 이용합니다. Redis는 데이터 저장소로 가장 I/O 속도가 빠른 장치인 메모리를 사용하고 있고, 구조적으로 key, value 형식의 데이터 처리에 특화되어 있습니다.

Redis container 를 docker를 이용해서 띄우도록 하겠습니다. 

linux에서 docker 를 설치하고 실행하는 명령어는 다음과 같습니다.

yum install -y docker-ce
systemctl docker start

먼저 docker hub에서 redis 이미지를 다운로드 받습니다.

docker pull redis

그리고 컨테이너를 띄웁니다.(redis는 기본적으로 6379 port를 사용합니다.)

docker run -it  --name redis -p 6379:6379 -d redis

"docker ps" 명령어로 redis 컨테이너가 잘 떴는지 확인합니다. 

 

이제 이 컨테이너로 접속한 뒤, redis-cli를 이용하여 Redis에 저장된 Key, Value값들을 확인해 보겠습니다.

docker exec -it redis bash
 
redis-cli
KEYS *
 
#output
(empty list or set)

지금은 아무것도 없겠죠? 값을 넣을 때에는 SET "KEY" "VALUE" 명령어를 입력해주면 됩니다.

SET FOO 1234
#output
OK
 
GET FOO
#output
1234

 

이렇게 Key, Value를 저장할 수 있는 Redis 컨테이너를 하나 만들었습니다. 

우리가 이제 해야할 일은 이 Redis 컨테이너에 세션 정보들을 담을 수 있도록 Spring에서 어떤 설정을 해주는 것입니다. 

Icon

지금은 Redis 컨테이너를 하나만 띄웠습니다. 하지만 Redis 컨테이너가 하나라면, 컨테이너가 다운되었을 때 심각한 문제를 야기할 것입니다.

즉 Redis도 클러스터링 되어야 한다는 것입니다.

docker swarm을 이용한 Redis 클러스터링 방법은 다른 글에서 다루도록 하겠습니다.


 

3. Spring Java Configuration

Icon

그동안 WAS의 HttpSession 구현체를 사용했지만, 이제 Spring Session 을 사용하려고 합니다.

우선 Spring Session 모듈을 dependency에 추가합니다.

<dependencies>
        <!-- ... -->
 
        <dependency>
                <groupId>org.springframework.session</groupId>
                <artifactId>spring-session-data-redis</artifactId>
                <version>1.3.1.RELEASE</version>
                <type>pom</type>
        </dependency>
        <dependency>
                <groupId>biz.paluch.redis</groupId>
                <artifactId>lettuce</artifactId>
                <version>3.5.0.Final</version>
        </dependency>
        <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-web</artifactId>
                <version>4.3.4.RELEASE</version>
        </dependency>
</dependencies>

 

그리고 스프링 설정 파일 하나를 추가합니다. 이 설정파일은 HttpSession 구현체를 대체하는 서블릿 필터를 생성하는 역할을 합니다. 

1
2
3
4
5
6
7
8
9
10
@EnableRedisHttpSession
public class Config {
        @Bean
        public LettuceConnectionFactory connectionFactory() {
                LettuceConnectionFactory connectionFactory = new LettuceConnectionFactory();
                connectionFactory.setHostName("x.x.x.93");
                connectionFactory.setPort(6379);
                return connectionFactory;
        }
}

1라인의 @EnableRedisHttpSession 어노테이션이 SpringSessionRepositoryFilter(Filter의 구현체) 라는 빈을 생성합니다. 이 필터는 HttpSession의 구현체를 바꾸는 역할을 합니다.  

5~7라인에서는 Spring Session과 Redis Server를 연결하는 RedisConnectionFactory를 생성합니다. 기본 포트는 6379로 구성되어 있습니다. 

 

우리가 만든 SpringSessionRepositoryFilter를 스프링이 로딩하게 해주어야 합니다. 그래서 우리의 서블릿 컨테이너가 매 요청마다 SpringSessionRepositoryFilter를 사용하도록 하는 작업이 필요하죠. 톰켓도 이런 작업을 하고 있었어요.

스프링이 로딩하게 할 수 있도록, Spring Session은 AbstractHttpSessionApplicationInitializer 이라는 클래스를 제공합니다. 

1
2
3
4
5
public class Initializer extends AbstractHttpSessionApplicationInitializer {
        public Initializer() {
                super(Config.class);
        }
}

3라인에서 보면 알 수 있듯이, 아까 만들어 놓은 Config.class 를 로드할 수 있도록 해줍니다. 


 

 [출처] http://wiki.sys4u.co.kr/pages/viewpage.action?pageId=8552454

본 웹사이트는 광고를 포함하고 있습니다.
광고 클릭에서 발생하는 수익금은 모두 웹사이트 서버의 유지 및 관리, 그리고 기술 콘텐츠 향상을 위해 쓰여집니다.
번호 제목 글쓴이 날짜 조회 수
126 Creating a CRUD REST API/Service with Spring Boot, JPA and Hibernate file 졸리운_곰 2018.08.17 147
125 Spring boot에서 REST API 개발 시작해보기 file 졸리운_곰 2018.08.17 350
124 [JSP] 네이버 스마트 에디터 연동 + 이미지파일 업로드 기능 추가 file 졸리운_곰 2018.07.28 1123
123 Use React and Spring Boot to Build a Simple CRUD App file 졸리운_곰 2018.07.28 385
122 JSP CRUD Example jsp 기본예제 file 졸리운_곰 2018.07.28 166
121 스웨거 2.0으로 스프링 부트 어플리케이션 API 문서화하기 file 졸리운_곰 2018.05.24 132
120 Spring REST API 문서를 Swagger로 만들자 file 졸리운_곰 2018.05.22 411
119 Spring REST API에 Swagger 2 설정하기 file 졸리운_곰 2018.05.22 335
118 Spring Boot와 AngualrJS를 조합한 코드 자동 생성 도구(scaffolding) file 졸리운_곰 2018.05.17 141
117 Spring java Code 기반 설정 Configuration 어노테이션과 Bean 어노테이션 졸리운_곰 2018.05.14 77
» java spring redis 세션 공유 : Spring Session을 이용한 세션 클러스터링 졸리운_곰 2018.05.06 1041
115 Spring MVC hello world example file 졸리운_곰 2018.05.04 223
114 Create a Web Application With Spring Boot file 졸리운_곰 2018.05.03 142
113 Spring Boot and JSP Tutorial file 졸리운_곰 2018.05.03 427
112 Spring Boot Hello World Example – JSP file 졸리운_곰 2018.05.03 109
111 Spring Boot – JSP View Example file 졸리운_곰 2018.05.03 137
110 SpringMVC-JSP 프로젝트를 Spring Boot로 옮기기 file 졸리운_곰 2018.05.03 319
109 SPRING BOOT에서 JSP 사용하기 졸리운_곰 2018.05.03 65
108 MYBATIS 기본 - SELECTLIST file 졸리운_곰 2018.03.26 79
107 Spring MVC 에 MyBatis 적용해 보기. file 졸리운_곰 2018.03.26 94
대표 김성준 주소 : 경기 용인 분당수지 U타워 등록번호 : 142-07-27414
통신판매업 신고 : 제2012-용인수지-0185호 출판업 신고 : 수지구청 제 123호 개인정보보호최고책임자 : 김성준 sjkim70@stechstar.com
대표전화 : 010-4589-2193 [fax] 02-6280-1294 COPYRIGHT(C) stechstar.com ALL RIGHTS RESERVED