본문 바로가기
📕 Spring Framework/Spring Project

2022.05.18 「Redis DB 적용」

by GroovyArea 2022. 5. 18.
스프링 부트 프로젝트를 하며 로그인 API까지는 jwt 토큰을 전달하는 방식으로 구현을 잘했다.
하지만 문제는 로그아웃이다. jwt 토큰 자체는 클라이언트에서 보관하기 때문에 서버가 자체적으로 삭제시킬 수 없다. 세션을 사용 시 서버가 세션 DB에 저장하고 있기 때문에 세션을 삭제하면 그만이지만 토큰은 그렇게 못 한다. 그래서 Redis DB라는 인메모리 DB를 이용해 보기로 했다. 
처음 들어보는데 DB도 여러 가지 종류가 있는데 이 인메모리 DB는 다른 DBMS와 비교하여 어떤 성격을 가지는지 그걸 정리하고 적용해보는 하루를 보내게 될 것 같다.

Redis DB

Key & Value 구조의 비정형 데이터를 저장하고 관리하기 위한 오픈 소스 기반의 비 관계형 DBMS

캐시, DB 등으로 사용하며 인메모리 데이터 구조를 가진 저장소이다.

 

인메모리 데이터베이스

디스크가 아닌 주 메모리에 모든 데이터를 보유하고 있는 데이터베이스

 

장점 : 디스크 검색보다 자료 접근이 훨씬 빠름

단점 : 휘발성을 띔 

=> 지속성을 보장하기 위해 로그 파일로 DBMS 구조를 모두 재구축하기도 함

 

참조 : https://velog.io/@rudwnd33/TIL-10%EC%9B%94-27%EC%9D%BC

 

[TIL] 10월 27일: 인메모리 DB(In-memory DB)

인메모리 DB

velog.io

 

데이터베이스가 있는데 Redis 같은 인메모리 데이터 구조 저장소를 사용하는 이유?

DataBase 자체는 데이터를 물리적인 공간인 디스크에 직접 쓰므로 데이터의 손실이 없다. 하지만 매번 디스크에 접근하므로 유저가 많아질수록 부하가 발생해 느려짐.

서비스 운영 초반이거나, 유저가 적고, 규모가 작은 서비스 같은 경우는 DB로도 무리가 가지 않지만, 사용자가 많아질 경우 과부하의 가능성이 커지므로 캐시 서버를 도입한다. 이 캐시 서버로 사용 가능한 것이 Redis DB!

 

Redis 특징

  • Key, Value 구조로 쿼리가 필요 없다.
  • 메모리에서 데이터를 처리하기 때문에 속도가 빠름
  • 자료구조 지원
    • String : ket - value 구조
    • Sets : String의 집합, 여러 개의 값을 하나의 value에 저장 가능
    • Sorted Sets : 중복 값이 들어가지 않는 Set에 정렬을 적용한 구조
    • Lists : Array 형식의 데이터 구조 List와 마찬가지임
  • 싱글 스레드 형식 : 한 번에 하나의 명령만 처리 가능, 하지만 속도가 엄청 빠르다.

 

이제 직접 적용시켜 보자

일단 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 실행 확인

=> 기본 실행 테스트 응답이 아주 잘된다

 

=> set, get을 이용해 아이스크림이라는 데이터를 저장하고 가져왔다. 신기하구먼.

 

이제 Redis가 잘 실행되니 Springboot와 연동해보자.

 

=> 의존성 추가

=> 프로퍼티 추가

 

@Configuration
public class RedisConfig {

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

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

    @Bean
    public RedisConnectionFactory redisConnectionFactory() {
        RedisStandaloneConfiguration redisStandaloneConfiguration =
                new RedisStandaloneConfiguration();
        redisStandaloneConfiguration.setHostName(host);
        redisStandaloneConfiguration.setPort(port);

        return new LettuceConnectionFactory(redisStandaloneConfiguration);
    }

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

Configuration 추가

 

로그인 처리 시

먼저 토큰을 발급하고,

토큰을 RedisDB에 아이디 이름으로 저장한다.

로그아웃 처리 시

=> 키를 삭제하면 된다.

 

권한 설정은 빠른 시일 내에 필터 인터셉터로 구현해봐야겠다.

반응형