본문 바로가기
킷도우의 IT/스프링(Spring)

[실무 경험담] Spring boot에서 Redis 연동하여 세션 클러스터링 구현하는 방법(레디스 윈도우 로컬 PC에 설치하는 방법까지)

by 킷도우 2023. 2. 7.
반응형

안녕하세요. IT 윈도우 킷도우 입니다.

오늘은 오랜만에 Spring 관련 글을 포스팅하게 됐는데요.

 

on-premise 시스템을 퍼블릭 클라우드로 전환하는 과정 중 한 가지 난관에 봉착한 사항이 있습니다. 바로 세션 클러스터링인데요. 특히나 미들웨어로 JEUS 제품을 사용할 경우 오토스케일 아웃 상황에서 클라우드 환경에는 세션 클러스터링이 자동으로 안돼서 엔지니어가 직접 JEUS 관리자 화면에서 수동으로 세션 클러스터링 설정을 해야하는데요.

 

JEUS 클라우드용 라이센스 비용도 비싼 상황에서 미들웨어를 오픈 소스(TOMCAT)으로 전환하게 됐는데 이 톰캣 역시 오토스케일 아웃 진행시 세션 클러스터링이 되지 않는 것은 피차일반이었습니다. 따라서 다른 방안이 필요했는데요.

 

바로 레디스(Redis) 리포지토리를 사용하여 미들웨어가 세션 정보를 이 레디스를 통해 공유함으로 세션 클러스터링을 완성하는 것입니다. 레디스??? 라는 이름에서 겁먹으셨을 수 있지만 레디스를 설치하고 또 스프링과 연동하는 방법은 정말 간단합니다. (15분 이내 끝낼 수 있음)

 

그럼 바로 시작하겠습니다.

 

1. 레디스(redis)를 로컬 PC에 설치하기

아래 URL에 접속하시어 redis 설치 파일을 다운 받아 줍니다.

https://github.com/microsoftarchive/redis/releases

 

Releases · microsoftarchive/redis

Redis is an in-memory database that persists on disk. The data model is key-value, but many different kind of values are supported: Strings, Lists, Sets, Sorted Sets, Hashes - microsoftarchive/redis

github.com

 

아래 이미지처럼 여러 이미지가 나올텐데 Redis-x64-3.0.504.msl 파일을 다운 받아 설치 진행해 줍니다.

설치가 완료되면 C드라이브 밑에 아래 이미지와 같이 접근하여 redis-cli.exe를 실행시킵니다.

 

2. 레디스(redis) 동작 여부 확인

redis-cli.exe를 실행시키면 터미널이 열릴텐데 여기에 "ping"이라고 입력했을 때 "pong"으로 대답하면 정상적으로 설치가 된 것입니다.

스프링(Spring) 레디스(redis) 연동 방법

네 이렇게 금방 레디스 설치를 마무리했습니다. 이제 우리는 로그인, 결제 기능 활용 시 우리가 만든 이 redis repository에 정상적으로 잘 저장이되는지 확인해 보겠습니다.

반응형

3. Spring에서 Redis 연동하는 방법

(1) pom.xml에 dependency 추가하기

redis연동을 위한 라이브러리를 다운받아야겠죠? 아래와 같이 pom.xml에 dependency를 추가합니다.

<dependency>
        <groupId>org.springframework.session</groupId>
        <artifactId>spring-session-data-redis</artifactId>
        <version>2.7.0</version>
</dependency>
<dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-data-redis</artifactId>
      <version>2.7.0</version>
</dependency>

 

(2) application.yml 파일에 redis 연동 정보 추가

DB에 접근할때도 IP와 PORT정보가 필요하듯 redis repository에 접근할 때도 마찬가지입니다. 레드스를 로컬에 설치할 경우 자동으로 포트 번호는 6379입니다. yml 파일에 아래와 같이 내용을 추가합니다.

spring :
  session:
      storage-type : redis
  redis:
      host: localhost
      port: 6379

 

(3) RedisConfig.java 파일 추가

마지막으로 RedisConfig.java 파일을 추가합니다. 위치는 어디든 적당한 곳에 추가하시면 됩니다. 전 공통 Util이 모인 패키지에 넣었습니다. redis에 Connection 하기 위한 메서드로 이해해 주시면 됩니다.

여기서 한가지 주목할 점은 아래 최하단에 보이는 configureRedisAction() 메서드 정의 부분인데요. 이건 사실 localhost 환경에서 테스트할 떈 상관없으나, 간혹 퍼블릭 클라우드 환경에서 테스트할 시 보안 등의 이슈로 문제가 되는데 해당 메서드를 추가하면 해결이되니 참고해 주세요.
     

package 경로지정~;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.connection.RedisStandaloneConfiguration;
import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
import org.springframework.session.data.redis.config.ConfigureRedisAction;

@Configuration
public class RedisConfig {
    @Value("${spring.redis.host}")
    public String host;

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


    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory connectionFactory) {
        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
        redisTemplate.setConnectionFactory(connectionFactory);
        return redisTemplate;
        }

    @Bean
    public RedisConnectionFactory redisConnectionFactory() {
        RedisStandaloneConfiguration configuration = new RedisStandaloneConfiguration();
        configuration.setHostName(host);
        configuration.setPort(port);
        return new LettuceConnectionFactory(configuration);
    }
    
    @Bean
    ConfigureRedisAction configureRedisAction() {
        return ConfigureRedisAction.NO_OP;
    }
}

네 놀랍게도 이렇게까지하고 서버를 기동하면 로그인, 결제 진행시 저장되는 세션 정보가 redis에 저장됩니다. 그럼 한 번 실제로 그렇게 저장이 되는지 확인해 보겠습니다.

 

4. 세션 정보가 redis 에 잘 저장됐는지 확인하기

(1) 개인 프로젝트를 기동하여 로그인 또는 결제 시도 진행(세션 정보를 저장하는 아무런 기능을 테스트하면 됩니다)

(2) 레디스 key* 명령어로 session정보 조회하기

스프링(Spring) 레디스(redis) 연동 방법

 

네 이상으로 의외로 간단한 스프링(Spring) 레디스(redis) 연동 방법에 대해서 알아봤습니다.

다음 시간에 더 유용한 정보로 찾아뵙겠습니다. 감사합니다!

반응형

댓글