🔷 in-memory 방식의 No-SQL 기반 DBMS
Key-Value(키-값) 구조의 데이터를 저장하고 관리한다.
싱글 스레드 기반으로 동작한다.
💡
In-memory Database
기존의 DB가 Disk(HDD, SSD)에 데이터를 저장했다면,In-memory Database
는 주 메모리에 데이터를 저장한다. Disk에서 꺼내 읽고 쓰는 속도보다 RAM에서의 응답 속도가 월등히 빠르다는 점에서In-memory Database
가 설계되고 사용되었다.
하지만 메모리에 저장되기 때문에 데이터가 휘발성이다. 그래서 서버가 다운되거나 동작 과정 중에 데이터가 삭제되어버리는 경우가 발생하는데, Redis의 경우 이럴 때를 대비하여 동작 중에 로그나 스냅샷(snapshots)를 이용하여 디스크에 데이터를 저장한다.
💡
NoSQL
비관계형 데이터베이스 유형을 가리키며, 관계형 테이블과는 다른 형식으로 데이터를 저장한다. NoSQL 데이터베이스는 언어마다 관습화된 API, 선언적 구조의 쿼리 언어, 쿼리별 언어를 사용하여 질의할 수 있다. NoSQL 데이터베이스에서 데이터는 사전에 스키마를 정의하지 않아도 저장될 수 있다. 작업을 진행하는 동시에 데이터를 정의하는 방식으로 빠르게 데이터를 작성하고 반복할 수 있는 능력을 얻게된다는 것. 이 데이터베이스는 그래프 기반, 열 지향, 문서 지향 또는 키-값 저장소 등 특정 비즈니스 요구 사항 수행에 적합하다.NoSQL DB
의 발전으로 오늘날 사용되는 데이터의 다양성, 속도, 양은 물론 신속한 수평적 확장 능력 덕분에 높은 트래픽까지 처리할 수 있다.
💡
싱글 스레드
스레드는 프로세스가 할당받은 자원을 이용하는 실행의 단위인데, 하나의 프로세스에서 오직 하나의 스레드로만 실행하는 것이 싱글 스레드이다. 그렇기 때문에, 하나의 레지스터와 스택으로 표현이 가능하다.
문맥 교환(context switch) 작업을 요구하지 않고, 자원 접근에 대한 동기화를 신경쓰지 않아도 된다. 단순히 CPU만을 사용하는 작업은 싱글 스레드가 멀티 스레드보다 빠르다. 다만 여러 개의 CPU를 활용할 수 없다는 치명적인 단점이 존재하는데, 이를 Redis에서는 어느정도 해결할 수 있다.
🔷 위에서 저 키워드들을 하나하나 설명한 이유가 있다. 우리 프로젝트인 '아이디어 회의 툴'은 Web Socket과 Web RTC 기술을 이용하는데, 일단 아이디어 회의에 들어가면 모든 참여자가 실시간으로 동시에 피그마처럼 자유롭게 무언가를 그리거나 도형을 붙이는 등의 작업을 하게 된다. 그런 점을 고려한다면...
1. Key-Value 형태로 저장되기 때문에 같은 Key-Value 로 저장되는 세션 데이터를 다루는데 적합하다.
NoSQL DB
인 redis
는 이 것을 저장하기에 매우 적합하다.redis
에는 작업 내역(복사본)만이 들어갈 뿐, 실제 프로젝트 전체는 작업 내역과 병합된 채로 Mongo DB
에 저장될 것이기 때문에 괜찮다.💡
Mongo DB
도NoSQL DB
이다.
2. 응답 속도가 매우 빠르다.
NoSQL
은 다양한 데이터를 매우 신속하게 전달한다는 이점이 있다.In-memory Database
는 주 메모리에 데이터를 저장하여 쓰는 만큼 그 어떤 DB보다 빠르다.redis
는 최고의 신속함을 자랑하는데, 아이디어 협업 프로젝트는 많은 유저들이 실시간으로 작업하며 모든 작업 사항이 빠르게 반영되고 데이터베이스에 저장되어야 한다. 속도가 생명인 프로젝트인 만큼 redis
보다 적합한 것이 없다.3. 동시 작업에 대한 스트레스가 덜하다.
redis
의 싱글 스레드 방식은 매우 적합하다 볼 수 있다.4. 비용이 저렴하다.
redis
는 무료 오픈소스 데이터베이스로, 라이센스 비용 절감에 탁월하다.5. Spring이 redis에 대한 다양한 Dependency를 제공한다.
🔷 위에서도 언급했지만, 사용자들의 작업 내역과 채팅 기록을 큐의 형식으로 담아놓을 뿐, 프로젝트나 유저의 모든 정보를 저장할 순 없다. 데이터 저장이 주목적인 DB에서 휘발성은 굉장한 리스크이기 때문이다.
redis
에서 사용자들의 작업 내역들을 꺼내서 기존의 프로젝트와 하나로 병합하여 어딘가에 완전한 프로젝트로 저장해야한다. 프로젝트 내용은 비정형화된 것들이기 때문에 비정형 데이터를 Key-value 형태로 저장할 수 있는 Mongo DB
를 추가로 사용한다.
또 다른 중요 요소인 User는 OAuth를 이용해 로그인시, 정형화된 데이터로 받고 저장해야한다. 프로젝트 요약정보(이름, 프로필 이미지 등), 참여자들과 같은 정형화시킬 수 있는 데이터들과 함께 5개의 테이블을 구축하여 NoSQL
인 Mongo DB
와도 원할한 교환이 이어지게 하는 것이 관건인데, 이를 위해 MySQL
을 이용한다.
프로젝트 안에서 쓰인 image를 모두 DB에 넣는건 메모리 상으로 효율적이지 못하거나 이미지 확장자와 형태에 따라 redis
와 Mongo DB
에 들어가지 못할 수도 있다. image는 AWS S3 Storage
에 따로 저장하여 관리한다.
JPA는 NoSQL의 비정형 데이터를 매핑시킬 수가 없다. Java 코드로 쿼리를 제공하여 비정형 데이터와 RDB의 정형 데이터를 모두 다룰 수 있는 querydsl
을 이용한다.
Mongo DB, querydsl은 추후에 추가로 다루도록 합니다.
redis에 대해 잘 알고 넘어가는 기분입니다.