카테고리 없음

비관계형 데이터베이스란?

땍땍 2025. 10. 26. 17:32

정의

테이블, 행, 열의 정보를 구조화하는 관계형 데이터베이스와 다른 별도의 구조가 존재하지 않아 Key-Value 로 데이터를 저장하는 데이터베이스 유형

왜 사용하는 걸까?

RDB를 활용해 주문 시스템을 개발한다고 가정해보자.

이를 위해서는 우선적으로 ERD 설계가 필요하다.

  1. 매장 정보
  2. 회원 정보
  3. 주문 정보
  4. 결제 정보

등 요구 사항에 어떤 값이 필요한지 사전에 파악해 맞춰 테이블을 설계해야만 한다.

그리고 이러한 테이블에 데이터를 저장하기 위해서는 하나의 요청을 각 테이블의 형식에 맞춰 쪼개는 과정이 필요하고, 최종적으로 주문을 완료해 영수증을 발급해야 할 때는 이러한 관련 테이블에 모두 접근해 데이터를 가져오는 과정이 필요하다.

위와 같은 과정은 RDB 를 사용해 개발하기 위해서는 필수적인 과정이기에 불편함을 느낀적은 없을 것이다. 하지만 만약, 갑작스럽게 요구사항이 변경되어 테이블 구조나 컬럼 등이 변경된다면 어떨까?

단순하게 테이블이나 컬럼이 한 두개 추가되는 정도라면 문제가 되지 않겠지만 PK 값을 삭제하거나 변경해야 하는 경우에는 ERD 뿐만 아닌 코드나 쿼리에도 많은 수정이 필요할 것이다.

어떻게 어떻게 수정이 끝나고, 이를 실제 서비스를 진행한다 가정해보자.

처음에는 사용자도 요청도 적었기에 서비스는 정상 동작 하였지만 사용자가 점점 증가해 RDB 의 저장공간과 처리량이 요청을 따라가지 못 한다면 어떻게 해야할까?

이러한 문제를 해결하기 위해 파티셔닝이나 MSA 와 같이 DB 를 나누어 관리하는 방법도 존재하지만, 운영 중인 서비스에서 이러한 구조를 변경하는 것은 많은 시간과 문제가 발생하기 때문에 즉각적으로 처리할 수가 없어 RDB 를 구동하고 있는 서버의 스펙업을 하는, 수직적 확장을 할 수 밖에 없을 것이다.

위와 같은 예시에서 몇 가지의 에러 사항들이 있었다.

  1. ERD 설계 및 관리
  2. 유연하지 못 한 데이터 구조
  3. 수직적 확장

이러한 문제점을 해결할 수 있는 것이 바로 NoSQL 이다.

NoSQL은 Key-Value 형식으로 값이 저장되기에 기본적으로 ERD 설계가 필요하지 않으며, 덕분에 데이터 구조를 언제든 자유롭게 변경할 수 있고 데이터를 반환하는데 상당히 빠른 속도를 유지할 수 있다.

또한, 일반적으로는 데이터 간 관계를 맺지 않기에 다중 서버에서 여러 NoSQL 을 구동할 수 있어 수평적 확장이 가능하다.

최근들어 AI 등을 활용하기 위해 많은 데이터를 저장하고 관리하는 경우가 많은데, 이러한 대용량 데이터를 처리해야 하는 경우 RDB 보다 NoSQL 을 활용하는 것이 속도나 활용도 측면에서 유리할 것으로 예상이 된다.

( 대용량 데이터는 Hadoop 과 같은 분산 시스템을 활용하는 경우가 많은 것으로 알고 있다 )

다만, 이러한 NoSQL 은 인덱스를 메모리에 저장하기에 RDB 와 비교했을 때 비교적 많은 메모리가 요구되고, 데이터의 일관성이 보장되지 않는다는 치명적인 문제가 존재한다.

( 주문 정보의 주문자 이름은 “A” 이지만, 실제 주문한 회원 정보의 이름은 “B” 로 저장 되어있는 경우 )

RDB 도 NoSQL 도 장점이 있는 반면 단점도 존재하고, 이러한 단점들을 보완하기 위해 여러 방법을 지원하기 때문에 어떤 상황에서는 꼭 NoSQL 을 상용해라! 와 같이 정확한 예시는 들기는 어렵겠지만,

  1. 요구사항이 확정되지 않거나, 빠른 개발을 위한 상황
  2. 사용자 개개인 맞춤 알고리즘 ( 정보 저장 )
  3. 로그 저장
  4. 채팅 기록 저장

과 같은 상황에서 NoSQL 을 고려해볼 수 있지 않을까 싶다.


RDB ( mysql ) , NoSQL ( mongoDB ) 성능 비교

테스트 환경

  1. Docker19,
  2. Compose
  3. 우분투20
  4. Apache Jmeter 5.3
  5. 테스트 데이터 생성/정리 오버헤드 X