최근 MSA서비스를 지원하는 서비스를 제작과 함께, 기존 RESTFUL한 백엔드 서버가 아닌 MVC 패턴의 구조의 프로젝트를 진행하게 되었다.
프로젝트의 구조에 대해 회의를 진행하면서 사용자의 정보는 세션에 저장하기로 하였는데 MSA 환경에서 세션의 관리는 어떻게 해야할지 고민하던 중, MSA 구조에서는 redis 같이 빠른 속도의 key-value 형식의 저장소를 쓴다는 글을 보았다.
오늘은 srping boot에서 redis를 session storage로 사용하기 위한 설정 방법에 대해 정리하고자 한다.
Rdis(레디스)는 키-값 구조의 비정형 데이터를 저장하고 관리하기 위한 비 관계형 데이터베이스 관리 시스템으로, String
, Set
, Sorted Set
, Hash
, List
자료구조를 지원한다.
또한, 데이터의 저장을 메모리에 하는 In-Memory기반의 DB이기 때문에 속도가 매우 빠르다는 장점이 있어, 캐시 및 세션 저장소로 많이 사용한다.
// spring에서 redis에 대한 의존성
implementation 'org.springframework.boot:spring-boot-starter-data-redis'
// spring에서 redis를 session storage로 사용하기 위한 의존성
implementation 'org.springframework.session:spring-session-data-redis'
spring-boot-starter-data-redis
는 spring에서 redis를 사용하기 위한 의존성의 추가이며
spring-session-data-redis
는 spring의 session storage로써 기존의 메모리가 아닌 redis를 이용해 세션 값들을 저장 하기 위한 의존성이다.
설정파일은 간단하다
spring.
spring :
session :
storage-type : redis
redis :
host : localhost
port : 6379
spring.session
의 하위는 spring의 session storage 타입을 redis로 바꾸어 준 것이며,
spring.redis
의 하위는 어딘가에서 실행되고 있는 redis와 연결하기 위한 설정이다.
@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);
}
}
@EnableRedisHttpSession
설정어플리케이션의 main메서드가 위치하는 클래스의 위에 @EnableRedisHttpSession
을 추가한다
@EnableRedisHttpSession
@SpringBootApplication
public class RedisSessionStorageTest {
public static void main(String[] args) {
//...
}
}
여기까지 진행했다면 기본적인 설정은 끝났다.
앱을 실행하였을 때, 에러가 발생하지 않고 제대로 실행이 된다면 설정에는 문제가 없는것이다.
실제로 세션이 생성될때 redis에 저장이 되는지 확인을 해보자
redis는 도커를 사용하여 띄워놓은 상태이므로 터미널을 통해 접속하고 redis-cli
명령어를 통해 redis와 상호작용하는 쉘을 띄울 수 있다.
keys *
명령어를 통해 저장된 모든 키를 검색하면, 아직 앱이 실행되지 않았기 때문에 아래 그림과 같이 키가 존재하지 않는것을 볼 수 있다.
그럼 앱 실행 후 다시 확인을 하면 어떻게 될까?
그림과 같이, 3가지의 값이 저장되어 있는 것을 확인할 수 있다.
그럼 각 데이터들이 의미하는것은 무엇일까?
저장 형식 | 자료형 | 역할 |
---|---|---|
spring:session:sessions:expires:(session id) | string | 해당 세션의 만료 키로 사용 |
spring:session:expirations:(expire time) | set | expire time에 삭제될 세션 정보들을 담고 있음. 해당 time이 되면 저장된 데이터를 조회하여 해당 세션을 모두 삭제 |
spring:session:sessions:(session id) | hash | 세션의 생성 시간, 마지막 세션 조회 시간, 최대 타임아웃 허용 시간과 해당 세션에 저장한 데이터를 저장 |
오늘은 MSA환경의 spring프로젝트에서 redis를 이용해 session 관리 하는것을 배워보았다.
처음 spring을 배울 때는 RDB 만 배워서 이외의 것은 있는지 조차 몰랐지만, 이렇게 배우고, 적용해나가면서 고도화 되는 앱을 보니 힘들지만 한편으론 뿌듯한 느낌이 든다.