
이번 초급 프로젝트에서는 PostgreSQL 을 채택해서 진행했다.
그런데 프로젝트와 별개로 진행하던 스프린트 미션에서는 MongoDB 를 사용하고 있었다.
멘토님은 스프린트 미션 코드리뷰도 함께 진행해주시고, 초급 프로젝트 방향까지 같이 봐주시는데,
그러다 보니 자연스럽게 “초급 프로젝트도 MongoDB를 쓰고 있겠구나” 하고 잠깐 오해하신 상황이 있었다.
그 작은 해프닝을 계기로 이런 궁금증이 생겼다.
팀원분도 비슷한 질문을 멘토님께 드렸고, 돌아온 답변은 꽤 인상적이었다.
현업에서는 하나만 정답처럼 쓰이지 않는다.
서비스 성격과 상황에 따라 정말 다양한 DB가 사용된다.
그 말을 듣고 나니 단순히 “MongoDB vs PostgreSQL” 비교를 넘어서,
세상에는 어떤 종류의 데이터베이스가 있고, 각각 어디에 쓰이는지 정리해보고 싶어졌다.
그래서 이번 글에서는 다양한 데이터베이스의 종류와 특징, 그리고 어떤 상황에서 선택되는지를 중심으로 정리해보려고 한다.
처음 데이터베이스를 접했을 때는
그냥 “데이터를 저장하는 공간” 정도로만 생각했었다.
그래서 왜 스프린트 미션에서는 MongoDB 를 사용하고,
초급 프로젝트에서는 PostgreSQL 를 사용하는지 크게 의문을 가지지도 않았다.
그런데 이번 기회에 조금 더 찾아보면서
데이터베이스는 생각보다 훨씬 다양한 종류가 존재한다는 걸 알게 됐다.
아니다.
이게 어쩌면 이번 섹션에 핵심으로 작용된다.
예를 들어 데이터를 보면
등이 존재한다.
즉, 데이터마다 다루는 방식과 성격 자체가 다르다는 뜻이다.
이런 데이터를 모두 하나의 방식으로 처리하려고 하면 분명 문제가 생긴다.
어떤 경우에는 구조가 지나치게 엄격해지고,
어떤 경우에는 성능이 떨어지며,
어떤 경우에는 데이터 관리 자체가 복잡해진다.
결국 데이터의 성격에 따라
더 적합한 저장 방식이 필요해지기 시작한 것이다.
그래서 등장한 것이 바로
각각 다른 방식으로 데이터를 저장하는 다양한 데이터베이스들이다.
정답은 바로 위에서 다뤘다.
데이터를 어떤 형태로 저장하느냐
이 기준에 따라 데이터베이스는
등으로 나뉘게 된다.
그리고 이 저장 방식의 차이가
각 데이터베이스의 특징과 사용 목적을 결정하게 된다.
앞에서 말했듯이
데이터베이스를 이해하는 가장 큰 기준 중 하나는
데이터를 어떤 방식으로 저장하느냐
이다.
이 기준으로 보면
데이터베이스 종류들이 왜 나뉘는지 조금 더 명확하게 보이기 시작한다.
가장 익숙한 방식은
데이터를 정해진 구조 안에서 관리하는 방식이다.
데이터를 정해진 구조 안에 넣어서 관리하는 방식이다.
이 방식이 바로 관계형 데이터베이스(RDBMS)이며,
대표적으로 이번 초급 프로젝트에서 채택했던 PostgreSQL, MySQL이 있다.
관계형 데이터베이스는 흐름이 비교적 명확하다.
예를 들어
처럼 데이터를 역할별로 나누고,
각 테이블을 관계로 연결해서 관리한다.
관계형 데이터베이스의 가장 큰 특징은
데이터의 정확성과 일관성을 유지하기 쉽다는 점이다.
예를 들어
같은 문제들을 데이터베이스 단계에서 방지할 수 있다.
즉, 데이터 구조를 엄격하게 관리하는 대신
안정성을 높이는 방식이라고 볼 수 있다.
다만 구조를 엄격하게 관리하는 만큼
설계와 관리가 상대적으로 복잡해진다.
테이블을 나누고,
관계를 연결하고,
여러 데이터를 함께 고려해야 하기 때문이다.
그래서 데이터를 저장하거나 수정하는 과정이
비교적 무겁게 느껴질 수 있다.
반대로 데이터를 하나의 문서처럼 저장하는 방식도 존재한다.
이 방식이 바로 문서형 데이터베이스이며,
대표적으로 MongoDB 가 있다.
문서형 데이터베이스는 관계형 데이터베이스보다 훨씬 유연하다.
예를 들면 아래처럼 JSON 형태에 가까운 구조 자체를 그대로 저장할 수 있다.
{
"user": "명곤",
"habits": [{ "name": "공부", "done": false }]
}
하나의 문서 안에 필요한 데이터를 함께 넣어서 관리하는 방식이다.
문서형 데이터베이스는
구조를 엄격하게 미리 정의하지 않아도 된다는 특징이 있다.
그래서
같은 장점을 가진다.
특히 데이터 구조가 자주 바뀌거나
빠른 개발 속도가 중요한 서비스에서 자주 사용된다.
다만 유연한 만큼
데이터 관리 책임이 개발자 쪽으로 많이 넘어온다.
관계형 데이터베이스처럼
강하게 관계를 검증하지 않기 때문에
같은 문제가 발생하기 쉽다.
특히 규모가 커질수록
같은 데이터가 여러 곳에 퍼지면서
어떤 값이 실제 기준 데이터인지 헷갈리는 상황도 생길 수 있다.
MongoDB와 SQL 계열 데이터베이스를 비교할 때 자주 나오는 말이 있다.
MongoDB는 쓰기가 빠르고, SQL은 느리다.
하지만 이 표현은 조금 단순화된 이야기라고 한다.
관계형 데이터베이스는 데이터를 저장할 때
등을 함께 수행한다.
반면 문서형 데이터베이스는
상대적으로 자유로운 구조 안에서 데이터를 저장한다.
그래서 체감상 문서형 데이터베이스가 더 가볍고 빠르게 느껴질 수 있는 것이다.
MongoDB가 무조건 더 뛰어난 성능을 가진다기보다는
저장 방식 자체가 다르기 때문에 체감 차이가 발생하는 것에 가깝다.
결국 중요한 건
어떤 데이터와 어떤 서비스 구조에 더 잘 맞느냐이다.
앞에서 본 관계형 데이터베이스와 문서형 데이터베이스는
결국 데이터를 저장하고 관리하는 것이 핵심 목적이었다.
그런데 서비스 규모가 커지면
단순히 “저장”만 잘한다고 끝나지 않는다.
예를 들어 서비스에서는 아래 같은 요청이 정말 자주 발생한다.
이런 요청마다 매번 메인 데이터베이스에 접근하게 되면
점점 성능 부담이 커지기 시작한다.
그래서 등장한 방식이 바로
데이터를 엄청 빠르게 꺼내는 데 집중한 데이터베이스
로, 대표적으로 Redis가 있다.
이 방식은 구조 자체가 굉장히 단순하다.
key → value
예를 들면
처럼 key 하나에 value 하나를 연결해서 저장한다.
구조가 극단적으로 단순한 이유는 하나다.
오직 속도를 위해서다.
핵심은 크게 두 가지다.
일반적인 관계형 데이터베이스는
주로 디스크 기반으로 데이터를 저장한다.
반면 Redis는 데이터를 메모리(RAM)에 저장한다.
즉, 물리적인 접근 속도 자체에서 차이가 발생한다.
Redis는 복잡한 관계를 거의 고려하지 않는다.
그냥 key 하나로 바로 데이터를 찾는다.
“빠르게 찾기”에만 집중한 구조인 것인데, 어떻게 느릴 수 있겠는가 ...
중요한 건 Redis가 보통 메인 데이터베이스 역할을 하지는 않는다는 점이다.
대신 아래 같은 곳에서 많이 사용된다.
예를 들어 오늘의 습관 조회 결과를 Redis에 저장해두면,
처럼 동작할 수 있다.
즉, 매번 데이터베이스를 조회하지 않아도 되기 때문에
서비스 속도가 훨씬 빨라질 수 있다.
실제로 서비스 고도화 과정에서
캐시 전략으로 자주 고려되는 방식이라고 한다.
물론 빠르다고 해서 모든 상황에 적합한 건 아니다.
Redis 같은 Key-Value 방식은
같은 단점이 존재한다.
그래서 보통은
메인 데이터베이스를 보조하는 역할
로 많이 사용된다.
앞에서 다룬 관계형 데이터베이스는
테이블을 나누고, 관계를 연결한 뒤 필요한 순간에 JOIN으로 데이터를 가져오는 방식으로,
관계를 간접적으로 표현하는 구조에 가깝다.
그런데 세상에는 관계 자체가 핵심인 데이터들도 존재한다.
예를 들면
같은 경우들이다.
이런 데이터들은 연결이 계속 늘어나고,
관계 구조도 점점 복잡해진다.
관계형 데이터베이스에서도 이런 구조를 구현할 수는 있다.
다만 관계가 많아질수록
같은 문제가 발생하기 시작한다.
특히 “연결을 따라가며 탐색”하는 작업이 많아질수록
성능과 관리 복잡도가 함께 커질 수 있다.
그래서 등장한 방식이 바로
관계 자체를 중심으로 저장하는 데이터베이스
이다.
대표적으로 Neo4j 가 있다.
그래프 데이터베이스는 데이터를 아래처럼 표현한다.
여기서 중요한 건
관계 자체가 하나의 핵심 데이터로 다뤄진다는 점
이다.
예를 들어 관계형 데이터베이스에서는
처럼 관계를 별도 테이블로 관리한다.
반면 그래프 데이터베이스는 연결 자체가 구조가 된다.
A --- 친구 --- B
|
팔로우
|
C
“누가 누구와 연결되어 있는가”
를 굉장히 자연스럽게 표현하는 방식으로 볼 수 있다.
그래프 데이터베이스의 가장 큰 장점은
관계 탐색에 특화되어 있다는 점이다.
예를 들어
“A의 친구의 친구 찾기”
같은 작업을 수행한다고 하면,
관계형 데이터베이스에서는
같은 문제가 생길 수 있다.
반면 그래프 데이터베이스는
방식으로 탐색이 가능하다.
관계를 따라 이동하는 작업 자체에 최적화된 구조인 것이다.
그래프 데이터베이스는 보통
처럼 “연결 관계”가 핵심인 서비스에서 많이 사용된다.
다만 모든 상황에서 좋은 건 아니다.
그래프 데이터베이스는
이라는 특징도 존재한다.
그래서 보통은
관계 탐색이 핵심인 특정 문제를 해결하기 위해 사용하는 데이터베이스
라고 볼 수 있다.
앞에서 살펴본 데이터베이스들은 공통적으로
서비스를 운영하기 위한 데이터 저장
에 초점이 맞춰져 있었다.
예를 들면
같은 작업들이다.
그런데 서비스 규모가 커지면
단순히 데이터를 저장하는 것을 넘어
데이터를 분석하려는 요구가 생기기 시작한다.
예를 들어
같은 질문들이다.
데이터를 저장하는 것을 넘어
데이터를 통해 흐름과 패턴을 분석하려는 단계로 넘어가는 것이다.
물론 기존의 PostgreSQL 같은 관계형 데이터베이스에서도 분석 자체는 가능하다.
하지만 데이터 규모가 커질수록
같은 문제가 생기기 쉽다.
그리고 운영 중인 데이터베이스에서
무거운 분석 작업까지 함께 수행하면
실제 서비스 성능에도 영향을 줄 수 있다.
그래서 대규모 서비스에서는 종종
운영용 데이터베이스와 분석용 데이터베이스를 분리
해서 사용하기도 한다.
이런 분석 작업에 특화된 방식 중 하나가 바로
컬럼형(Column-oriented) 데이터베이스
이다.
대표적으로 Apache Cassandra 같은 계열이 자주 언급된다.
기존 관계형 데이터베이스는 보통 행(Row) 단위로 저장된다.
id | name | age | habit
즉, 한 줄 안에 하나의 데이터 정보가 모두 들어간다.
반면 컬럼형 데이터베이스는
같은 컬럼끼리 묶어서 저장한다.
id → [1, 2, 3]
name → [A, B, C]
age → [20, 25, 30]
같은 종류의 데이터들을 연속적으로 저장하는 구조인 것이다.
이 방식은 특정 데이터만 대량으로 분석할 때 굉장히 강력하다.
예를 들어
“전체 유저 평균 나이 계산” 같은 작업을 수행한다고 하면,
행 기반 저장에서는
모든 row를 읽으면서 필요한 데이터를 꺼내야 한다.
반면 컬럼형 데이터베이스는
age 컬럼만 읽기만 하면 된다.
분석에 필요한 데이터만 빠르게 가져올 수 있기 때문에
대규모 집계와 통계 작업에 정말 유리하다.
이런 데이터베이스는 보통
같은 분야에서 사용된다.
서비스 기능 자체보다는
데이터를 기반으로 의사결정을 내리기 위한 영역에서 많이 활용된다.
물론 일반 서비스 운영에는 잘 맞지 않는 부분도 존재한다.
그래서 운영 DB랑 분리해서 사용해야 한다.