티스토리 뷰

Project

레디스 활용기 - 2

Nickolodeon 2024. 7. 8. 22:50

새로운 프로세스 구현하기

앞서 레디스 활용기 - 1 는 어떻게 레디스를 활용하기로 결정하게 되었는지에 대한 내용이었다면, 이번에는 그 구체적인 구현 방식을 소개해 보고자 한다.

레디스의 특징

구현을 하기 위해 학습해야 했던 레디스 (Redis) 의 몇몇 특징은 다음과 같다:

 

  1. 레디스는 key-value 형태로 데이터를 저장한다.
  2. value 는 hkey-value 형태 또는 그냥 문자열이다.
  3. key 가 문자열인 데에 반해, hkey 는 해시 값으로 인식된다.
  4. 여러 명령어를 통해 key / hkey / value 를 다룰 수 있다. 몇 가지 자주 사용되는 명령어들은 아래와 같다:
    • get {key 이름} : key-value(문자열) 인 경우에 {key 이름} 에 해당하는 value 를 반환한다.
    • hget {key 이름} {field(hkey) 이름} : key-value(해시) 인 경우에 {key 이름} 과 {field(hkey) 이름} 에 해당하는 value 를 반환한다.
    • keys {key 이름} : 이름에 {key 이름} 을 포함하는 key 들을 모두 반환한다. {key 이름} 이 asterisk (*) 인 경우에는 모든 key 들을 반환한다.
    • hgetall {key 이름} : {key 이름} key 에 row 로 등록된 field(hkey) 들과 valule 들을 모두 반환한다.
    • set {key 이름} {value 이름} : {key 이름} key 에 {value 이름} value 를 저장한다.

레디스가 적합했던 이유

레디스 활용기 - 1 에서도 확인했던 것처럼, 현재 방문자 출입기록 테이블에 들어가야 할 데이터는 로그 테이블에서 재조합이 필요했다. 이는 소스 상에서 로그 테이블 엔티티의 도메인 클래스 객체 A를 우선 조회한 후, A가 갖고 있는 데이터로  방문자 출입기록 테이블 엔티티의 도메인 클래스 객체 B를 생성하여 테이블에 추가함으로써 가능했다.

 

이러한 방식은 불필요하게 많고 복잡한 RDB 조회가 발생하고, 주기적으로 도는 스케줄러에 대한 의존성이 크다는 점에서 프로그램 성능을 떨어트린다. 레디스 (Redis) 를 사용하면 빠른 읽기/쓰기가 가능하므로,

  1. IoT 기기에서 수신된 데이터로 위 설명에서의 B 객체를 생성한 후,
  2. 실시간으로 레디스에 쓸 수 있게 된다.

변경된 방식

스프링에서는 RedisTemplate 를 사용하면 쉽게 레디스를 다룰 수 있다.

구현 동안에는 Redis Desktop Manager 를 사용하여 로컬 레디스의 상태를 확인하며 진행할 수 있었다.

Redis Desktop Manager 설치 방법

 

레디스가 활용될 프로세스는 아래와 같다:

  1. IoT 기기에서 데이터가 수신될 때마다, 아래 중 한 가지를 수행한다:
    1. 하루를 기준으로 방문자 출입기록 관련 데이터 수신이 최초인 경우, 레디스에 새로운 key 를 생성한다.
    2. 이미 하루 중에 방문자 출입기록 관련 데이터 수신을 했던 경우, 생성되어 있을 key 의 value 를 수정한다.
      • 이 때 이미 하루 중에 데이터 수신이 되었는지의 여부는 TTL 이 당일이 끝나는 시간까지로 설정되어 있는 다른 key 를 조회하여 확인한다.
  2. 하루가 끝나는 자정에 방문자 출입기록 관련 데이터 value 를 추출하여 RDB 에 저장한다.
    • 스케줄러로 구현한다.

방문자 출입기록 관련 key - value 쌍에서 value 에 해당하는 데이터는 다음과 같다:

  • 각 방문자 타입 별 방문 횟수
    • 방문자 타입은 소스 상 로직에서 판단한 후 프로세스 1-2 에서 타입에 맞는 데이터 값 + 1 을 해주었다.
  • 전체 방문자 방문 횟수 총계
    • 프로세스 1-2 에서 value 수정 시 총계에 해당하는 데이터는 단순 + 1 을 해주었다.

배운 점

  1. 레디스에서 hkey 로 등록된 데이터는 key-hkey-value 형태로 이뤄져 있으며, hkey-value 가 비어 있을 시 TTL 설정이 불가능하다. 그래서 구현 당시에 hkey-value 를 임의로 설정해준 뒤에, TTL 을 설정하고, 이후 다른 hkey-value 쌍이 추가로 저장된 이후에 임의 hkey-value 쌍을 삭제하는 방식으로 진행해야 했다.
  2. 짧은 시간 안에 많은 데이터를 다루어야 하는 상황에선, 레디스가 매우 유용하다. 그러나 소스 상 로직에서도 분명 데이터 누락을 잘 확인해주어야 한다. 구현 당시에는 방문자 10명 정도가 약 1~2초 이내에 방문하는 상황에서는 1명이나 2명에 대한 카운트가 누락되는 경우가 있었다. 그래서 for 문 내에서 방문자 데이터를 레디스에 쓰는 로직이 정상적으로 수행되기 전까지 다른 로직이 수행되지 못하게 반복하도록 구현하여 해결해야 했다.

결론

RDB 만 쓰다가 처음으로 NoSQL 기반의 데이터베이스를 사용했는데, 확실히 단순한 질의 방식이나 빠른 읽기/쓰기가 쉬운 사용성을 보장한다는 점에서 큰 강점을 가졌다는 것을 느낄 수 있는 경험이었다.

 

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
글 보관함