MongoDB는 고가용성과 확장성을 자랑하는 NoSQL 데이터베이스입니다. 하지만 분산 시스템인 만큼, "언제 어디서 데이터를 읽느냐" 에 따라 결과가 달라질 수 있습니다.
바로 이때 중요한 설정이 readConcern과 readPreference입니다.
이 포스트에서는 MongoDB의 읽기 일관성(readConcern)과 읽기 우선순위(readPreference)를 정리하고, 조합 시의 특징까지 알아봅니다. 실무에서 어떻게 적용하면 좋을지도 함께 살펴보세요.
✅ readConcern이란?
readConcern은 읽은 데이터의 일관성 수준을 지정합니다.
다르게 말하면, "이 데이터가 얼마나 확실하게 저장된 건지"를 결정하죠.
readConcern 수준 | 설명 |
local | (기본값) primary 노드의 메모리 상 데이터. 빠르지만 아직 복제되지 않았을 수도 있음. |
available | 어떤 노드든 응답 가능하면 데이터를 반환. 일관성 거의 없음. |
majority | 다수 노드에 커밋된 데이터만 읽음. 일관성과 안정성 우수. |
linearizable | 가장 강력한 일관성. 단일 쓰기/읽기 작업의 순서 보장. 느리고, 반드시 primary에서만 동작. |
snapshot | 트랜잭션에서 사용되는 일관된 데이터 스냅샷. 복잡한 트랜잭션 처리 시 유용. |
💡 실무 팁: 일반적인 애플리케이션에서는 majority가 안정성과 성능의 균형이 좋습니다.
✅ readPreference란?
readPreference는 클라이언트가 어떤 노드에서 데이터를 읽을지를 지정합니다.
분산 환경에서의 부하 분산, 지연 시간 최적화 등에 중요합니다.
readPreference | 설명 |
primary | (기본값) 항상 primary 노드에서만 읽음. 가장 일관성 있음. |
primaryPreferred | 가능하면 primary, 안 되면 secondary. 장애 대응에 유연. |
secondary | 항상 secondary에서 읽음. primary 부하 분산. 하지만 최신 데이터 아닐 수 있음. |
secondaryPreferred | secondary 우선, 없으면 primary. 읽기 가용성 우선. |
nearest | 가장 응답이 빠른 노드에서 읽음 (네트워크 latency 기반). 빠르지만 일관성은 낮음. |
💡 실무 팁: 읽기 지연(latency)이 중요한 경우에는 nearest가, 데이터 일관성이 중요한 경우에는 primary 또는 majority 조합이 적합합니다.
🔀 조합 시 특징
readPreference | readConcern | 특징 |
primary | majority | 안정적이고 일관성 높은 읽기. 일반 서비스에 적합. |
secondary | local | 빠르지만 데이터 지연 가능성 있음. 캐시 성격의 읽기 요청에 적합. |
nearest | majority | 빠르면서도 어느 정도 일관성 확보. 네트워크 최적화용. |
primary | linearizable | 가장 높은 일관성. 단일 키 일관성이 중요한 시스템(예: 은행). 느릴 수 있음. |
primary | snapshot | 트랜잭션 내 일관된 데이터 처리. 여러 문서를 묶어 처리할 때 적합. |
📌 정리
- readConcern은 읽을 때 데이터가 얼마나 안전하게 커밋되었는가를 의미
- readPreference는 어느 노드에서 데이터를 읽을지를 설정
- 실무에서는 majority + primary 조합이 가장 안전한 기본값
- 트랜잭션이 필요한 경우 snapshot 사용
- 데이터 지연을 감수해도 성능이 중요할 땐 secondary 또는 nearest 고려
📚 마무리
MongoDB는 읽기 설정만으로도 다양한 일관성과 가용성 전략을 선택할 수 있는 유연한 데이터베이스입니다.
readConcern과 readPreference는 단순한 설정값이 아니라, 비즈니스의 요구사항에 따라 데이터의 안전성과 성능을 맞출 수 있는 중요한 도구입니다.