java spring redis 세션 공유 : Spring Session을 이용한 세션 클러스터링
2018.05.06 00:23
1. 배경지식
그런데 왜 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을 사용하게 되는 것입니다.
이 부분은 세 번째 파트인 Spring Java Configuration에서 자세히 살펴보겠습니다.
2. Session Stroage - redis
먼저 docker hub에서 redis 이미지를 다운로드 받습니다.
그리고 컨테이너를 띄웁니다.(redis는 기본적으로 6379 port를 사용합니다.)
"docker ps" 명령어로 redis 컨테이너가 잘 떴는지 확인합니다.
이제 이 컨테이너로 접속한 뒤, redis-cli를 이용하여 Redis에 저장된 Key, Value값들을 확인해 보겠습니다.
지금은 아무것도 없겠죠? 값을 넣을 때에는 SET "KEY" "VALUE" 명령어를 입력해주면 됩니다.
이렇게 Key, Value를 저장할 수 있는 Redis 컨테이너를 하나 만들었습니다.
우리가 이제 해야할 일은 이 Redis 컨테이너에 세션 정보들을 담을 수 있도록 Spring에서 어떤 설정을 해주는 것입니다.
3. Spring Java Configuration
우선 Spring Session 모듈을 dependency에 추가합니다.
그리고 스프링 설정 파일 하나를 추가합니다. 이 설정파일은 HttpSession 구현체를 대체하는 서블릿 필터를 생성하는 역할을 합니다.
1라인의 @EnableRedisHttpSession 어노테이션이 SpringSessionRepositoryFilter(Filter의 구현체) 라는 빈을 생성합니다. 이 필터는 HttpSession의 구현체를 바꾸는 역할을 합니다.
5~7라인에서는 Spring Session과 Redis Server를 연결하는 RedisConnectionFactory를 생성합니다. 기본 포트는 6379로 구성되어 있습니다.
우리가 만든 SpringSessionRepositoryFilter를 스프링이 로딩하게 해주어야 합니다. 그래서 우리의 서블릿 컨테이너가 매 요청마다 SpringSessionRepositoryFilter를 사용하도록 하는 작업이 필요하죠. 톰켓도 이런 작업을 하고 있었어요.
스프링이 로딩하게 할 수 있도록, Spring Session은 AbstractHttpSessionApplicationInitializer 이라는 클래스를 제공합니다.
3라인에서 보면 알 수 있듯이, 아까 만들어 놓은 Config.class 를 로드할 수 있도록 해줍니다.
[출처] http://wiki.sys4u.co.kr/pages/viewpage.action?pageId=8552454
광고 클릭에서 발생하는 수익금은 모두 웹사이트 서버의 유지 및 관리, 그리고 기술 콘텐츠 향상을 위해 쓰여집니다.

