백엔드 서비스는 데이터를 저장하고, 이를 기반으로 필요한 정보를 제공하는 역할을 담당합니다.
이때 가장 중요한 요소 중 하나는 데이터 저장소의 선택입니다.
데이터 저장소는 단순히 정보를 보관하는 장소를 넘어서
데이터의 형식, 처리 방식, 요구되는 성능, 데이터 접근 방식 등에 따라 적절한 유형을 선택해야 합니다.
관계형 데이터베이스(Relational DataBase) 는 데이터를 테이블 형식으로 저장하고 관계를 통해 여러 테이블 간의 연관성을 표현할 수 있는 데이터베이스 입니다.
이는 사전에 정의된 엄격한 구조(스키마) 에 따라 데이터를 관리하며 트랜젝션과 제약조건을 통해 데이터 무결성과 정합성 유지를 할 수 있도록 합니다.
RDB는 이미지, 로그, JSON과 같은 비정형 데이터를 처리하는 데 부적합하며
데이터를 쓰거나 수정할 때 스키마 정합성을 검증하는 데 따른 성능 비용이 발생합니다.
또한 트랜잭션 보장을 위한 처리 오버헤드로 인해 대용량 데이터를 처리하는 데 적합하지 않을 수 있습니다.
수평 확장이 어렵고 이를 구현하려면 설계가 복잡해지며 높은 비용이 발생한다는 단점도 있습니다.
대표적으로 MySQL, Oracle, PostgreSQL MS-SQL 이 있습니다.
NoSQL(Not Only SQL)은 관계형 데이터베이스 외에도 다양한 형태의 데이터를 저장하고 관리할 수 있는 데이터베이스입니다.
트랜잭션을 기본적으로 지원하지 않으며 스키마를 강제하지 않기 때문에 데이터의 무결성과 정합성을 완전히 보장하기는 어렵습니다.
하지만 구조가 유연하고 높은 가용성 및 빠른 쓰기 처리에 최적화되어 있어 대규모 데이터 처리에 적합합니다.
일부 NoSQL 데이터베이스는 트랜잭션 기능을 부분적으로 제공하기도 하지만,
NoSQL의 설계 철학이 빠른 처리와 확장성에 초점을 맞추고 있기 때문에 대부분의 경우 트랜잭션 기능은 사용되지 않습니다.
NoSQL 은 대표적으로 Key-Value 방식과 Document 방식으로 구분됩니다.
| 방식 | 특징 |
|---|---|
| Key-Value | 키와 값 쌍으로 데이터를 저장하며, 모든 타입의 데이터를 저장할 수 있습니다. 주로 성능 향상을 위한 캐시처리나 일시적인 데이터 저장에 사용됩니다. 대표 DB : Redis, Riak, Oracle Berkely, AWS DynamoDB |
| Document | JSON 이나 XML 처럼 표준 형식의 데이터를 저장합니다. 주로 대용량 데이터를 저장/조회할 때 사용됩니다. 대표 DB : MongoDB, Elasticsearch, Azure Cosmos DB |
NoSQL은 스키마 정합성 체크 비용과 트랜잭션 비용이 발생하지 않아 쓰기 작업에 최적화되어 있습니다. 대표적인 NoSQL인 Redis는 인메모리에 데이터를 저장하여 매우 빠른 속도를 제공합니다. MongoDB와 Elasticsearch는 메모리 기반 큐에 데이터를 쌓아두고 백그라운드 작업을 통해 비동기적으로 디스크에 저장합니다. 이러한 방식은 쓰기 처리 속도를 높이고 디스크 I/O 부하를 분산시켜 성능을 최적화합니다.
데이터 수정 시 Redis와 Elasticsearch는 기존 데이터를 삭제한 후 다시 등록하는 방식을 사용하며 MongoDB는 특정 필드만 선택적으로 수정하는 방식을 사용합니다. 특히 검색 엔진으로 활용되는 Elasticsearch는 문서 삭제 재등록 방식을 통해 RDB처럼 인덱스 재배열이 발생하지 않아 성능상 이점을 가질 수 있습니다.
벡터 데이터베이스는 텍스트 이미지 오디오와 같은 비정형 데이터에 대해 유사도 검색을 수행하는 데이터베이스입니다. RDB나 NoSQL은 WHERE 조건 등을 사용해 정형 데이터를 검색하지만 벡터 데이터베이스는 벡터 간의 유사도 코사인 유사도 L2 거리 등을 기반으로 비슷한 벡터를 찾아내는 방식을 사용합니다.
벡터 데이터베이스는 벡터와 벡터에 해당하는 원본 데이터의 식별자 타겟 그리고 메타 데이터를 함께 저장합니다. 벡터는 비정형 데이터로부터 주요 특징을 추출하여 고차원 벡터로 변환하기 위해 학습된 머신러닝 모델인 임베딩 모델을 사용하여 생성됩니다.
벡터 데이터베이스에 질의를 수행하려면 검색 대상이 되는 비정형 데이터를 임베딩 모델을 통해 벡터로 변환한 뒤 해당 값을 기반으로 검색을 수행합니다.
벡터 데이터베이스는 LLM (Large Language Model)의 데이터 저장소로 활용되면서 큰 주목을 받고 있습니다.