Redis를 사용하여 다중서버 환경에서 session 유지하기

무지성개발자·2024년 1월 8일

다중서버 환경에서 session 유지하기

서론

진행중인 개인 프로젝트를 다중서버 환경으로 구성하게 되어 기존 방식으론 session 유지를 할 수가 없어 다중 서버간 session을 유지할 수 있는 방법이 필요했다.

session 유지하는 방법

  • 스티키 세션
    스티키 세션은 유저가 처음 접근한 서버에만 계속 연결하여 세션을 사용하는 방식이다. 서버 하나가 내려가면 그 서버에 유지되고 있던 세션이 다 사라져 사용 중인 유저는 다른 서버와 다시 세션을 맺어야 하는 문제가 있다.

    이 방법은 라운드 로빈 로드벨런싱을 사용하는 나에게는 맞지 않는 방식이다.

  • 세션 클러스터링
    세션을 묶어서 관리하는 방식이다. 각 서버의 세션 정보를 모든 서버가 공유해서 관리하는 방식으로 서버가 늘어나면 모든 기존 서버에 새로운 서버의 정보를 알려줘야하는 문제가 있다.

    이 방법은 만약 스케일 아웃으로 서버구성을 늘린다면 기존 서버를 수정해야하는 문제가 있어 선택하지 않았다.

  • 세션 분리 - 선택한 방법
    세션 분리는 세션을 제 3의 장소에서 관리하고 모든 서버가 세션을 관리하는 곳을 바라보고 있는 방법이다. Sring 진영에선 보통 Redis를 사용한다.

    나 역시 Redis를 사용하는 방법을 선택했다. 이유는 Redis가 세션이 만료되면 알아서 지워주는 것도 있지만 무엇보다 기존의 코드를 하나도 손대지 않고 의존성만 추가해주는 것으로 작업이 끝나기 때문이 었다.

Redis Session

Redis Session을 선택한 이유

진행 중인 개인 프로젝트는 로그인 인증을 httpSession을 통해 하고있었는데 Redis Session은 Spring boot에서 간단히 추가하여 사용할 수 있고, 무엇보다 코드를 수정할 필요가 없다는 이점이 있어 선택하였다.

의존성 추가 및 설정

// Redis연결
implementation 'org.springframework.boot:spring-boot-starter-data-redis'
// Redis으로 Session관리를 HttpSession의 문법을 사용하게 해줌.
implementation 'org.springframework.session:spring-session-data-redis'
spring :
  redis:
    host: 127.0.0.1
    port: 6379
  session:
    store-type: redis

configuration

    @Value("${spring.redis.host}")
    private String host;

    @Value("${spring.redis.port}")
    private int port;

    @Bean
    public LettuceConnectionFactory lettuceConnectionFactory() {
        final RedisStandaloneConfiguration redisStandaloneConfiguration = new RedisStandaloneConfiguration(host, port);
        return new LettuceConnectionFactory(redisStandaloneConfiguration);
    }

기본 설정은 이게 끝이다.
이 정도 설정으로 기존에 사용하던 session.setAttribute(), session.getAttribute() 그대로 사용 할 수 있어 편하다.

동작 확인

레디스 무료 GUI툴인 Medis를 사용하면 확인하기 편하다.
기존 로그인 코드는 손도 안됐지만 세션이 레디스에 잘 들어온 것을 확인 할 수 있다.


profile
no-intelli 개발자 입니다. 그래도 intellij는 씁니다.

0개의 댓글