[데이터베이스] NoSQL - Why NoSQL
cs-study에서 스터디를 진행하고 있습니다.
NoSQL 특징
- 확장성
- 비용
- 유연성
- 가용성
확장성
변화무쌍한 작업 부하에 대한 요구 사항을 효율적으로 충족하는 능력이다.
필요에 따라 서버를 추가하는 scale-out 작업이 이루어지는데, RDBMS에서는 단일 데이터베이스 시스템을 구동하는 여러 서버를 관리하기 위해 데이터베이스 소프트웨어가 필요하며 복잡성과 운영 비용이 증가할 수 있다. 반면, NoSQL은 클러스터 하나에서 서버 여러 개를 이용하도록 설계되었다. 즉, 새로운 서버를 추가/제거할 때 NoSQL DBMS는 사용 가능한 새 서버를 사용하도록 조정한다.
비용
주로 NoSQL 데이터베이스들은 오픈 소스 형태로 제공되며, 대부분의 오픈 소스 개발자는 자신의 소프트웨어를 사용하는 데 비용을 매기지 않는다.
유연성
RDBMS는 관계형 데이터 모델을 사용해 해결 가능한 문제의 범위 내에서는 유연한 편이다. 하지만 데이터베이스 설계자는 프로젝트를 시작할 때 애플리케이션 지원에 필요한 모든 테이블과 컬럼을 파악해야 할 뿐만 아니라 대부분의 테이블에 값이 채워져 있어야 한다.
NoSQL 데이터베이스는 고정된 테이블 구조가 필요하지 않다. 즉, 데이터베이스 설계를 변경하지 않고도 필요한 새로운 속성을 동적으로 추가할 수 있다.
가용성
NoSQL 데이터베이스는 저렴한 비용으로 서버를 여러 개 이용할 수 있도록 설계되었다. 서버 하나가 중지되거나 서비스를 일시 중지해야 할 경우 클러스터 내 다른 서버가 작업량 전체를 떠맡을 수 있다.
NoSQL vs RDBMS
NoSQL
- 장점
- 스키마가 없어서 유연하기 때문에 언제든지 저장된 데이터를 조정하고 새로운 필드 추가 가능
- 데이터는 애플리케이션이 필요로 하는 형식으로 저장되므로 데이터 읽기 속도 상승
- 수직 및 수평 확장이 가능하여 애플리케이션이 발생시키는 모든 읽기/쓰기 요청 처리 가능
- 단점
- 유연성으로 인해 데이터 구조 결정을 미루게 될 수 있음
- 데이터 중복을 계속 업데이트 해야 함
- 데이터가 여러 컬렉션에 중복되어 있기 때문에 수정 시 모든 컬렉션에서 수행해야 함 (SQL에서는 중복 데이터가 없으므로 한 번만 수행이 가능)
RDBMS
- 장점
- 하나의 테이블에서 중복 없이 하나의 데이터만을 관리하므로 다른 테이블에서 부정확한 데이터를 다룰 위험이 없어짐
- 명확하게 정의된 스키마가 있으므로 데이터 무결성을 보장
- 관계는 각 데이터를 중복 없이 한 번만 저장
- 단점
- 덜 유연하므로 데이터 스키마를 사전에 계획하고 알려야 함 (나중에 수정하기 어려움)
- 관계를 맺고 있어서 조인문이 많은 복잡한 쿼리가 만들어질 수 있음
- 대체로 수직적 확장만 가능함
어떤 DBMS를 선택할까
RDBMS
- 데이터 구조가 명확하며 변경될 여지가 없으며 명확한 스키마가 필요한 경우
- 중복된 데이터가 없어서 변경이 용이하므로 관계를 맺고 있는 데이터가 자주 변경될 경우
NoSQL
- 정확한 데이터 구조를 알 수 없고 데이터가 변경/확장이 될 수 있는 경우
- 막대한 데이터를 저장해야 해서 데이터베이스를 Scale-Out를 해야하는 경우
- 조인을 잘 사용하지 않고 자주 변경되지 않는 데이터
- 읽기를 자주 하지만 데이터 변경은 자주 없는 경우
예시
영화 추천 서비스 개발
영화 시상식에서 노미네이트 된 영화를 기반으로 영화 추천 서비스를 만들고 있으며 API를 통해 TMDB ID, 제목, 년도, 포스터와 같은 기본적인 영화 정보를 검색해야 하기 때문에 해당 정보를 저장할 영화 DB가 필요합니다. 또한 카테고리, 노미네이트, 수상작들과 같은 정보가 담긴 시상 DB가 필요할 것 같습니다. 지금까지는 간단하게 SQLite를 사용하고 있었으나 본 영화 목록, 보고 싶은 목록들의 기능을 넣어서 버전 2.0 개발할 예정인데 과연 NoSQL이 적합할지 궁금합니다!
위와 같은 서비스를 개발하고자 한다면 SQLite와 NoSQL DBMS 중 어떤 것을 선택해야할까?
만약 서비스 구성하는데 비관계형 데이터베이스를 써야 하는 이유를 정확하게 알지 못하면 관계형 데이터베이스를 사용하는 것을 일단 추천합니다. 그리고 기존에 하나인 데이터베이스에서 영화 데이터와 시상 데이터를 찢어서 사용한다는 것은 이미 두 테이블 간 관계가 있는 것으로 보입니다. 만약에 관계형 데이터 형태인데 무리하게 NoSQL를 사용하려고 하면 분명히 나중에 후회를 할 것입니다.
만약에 특정 데이터, 예를 들어 보고 싶은 목록 리스트를 문서 형태로 만든다면 PostgreSQL의 JSON형태로 저장하는 기능 활용하여 관계형과 비 관계형을 함께 효율적으로 사용할 수 있을 것 같네요.
결론적으로, 굳이 NoSQL을 사용해야 할 이유가 명확하지 않다면, 관계형 데이터베이스를 사용하는 것이 더 안전하다. 특히, 데이터 간 관계가 확실한 경우에는 오히려 더 비효율적인 결과를 일으킬 수도 있다.
개발하고자 하는 서비스의 데이터 모델을 선택할 때 생각해야 할 질문은 아래와 같이 정리해볼 수 있다.
- 어떤 데이터를 다루는가?
- 서비스에서 주로 사용하는 데이터의 구조, 관계, 그리고 사용 방법에 대해서 정확하게 정의해야 한다.
- 주요 서비스가 무엇인가?
- 같은 도메인 내에서도 어떤 서비스를 제공하는 지에 따라 DB 관리 방향이 완전히 달라질 수 있다.
- 주요 기능을 정리하고, 해당 기능을 구조적으로 가장 잘 지원하는 모델을 선택해야 한다.
출처
- https://velog.io/@hanblueblue/NoSQL과-역사
- https://khj93.tistory.com/entry/Database-RDBMS와-NOSQL-차이점
- https://mustread.tistory.com/5
- https://dev.to/danroc/should-i-go-nosql-or-sql-for-my-specific-app-case-or-both-38ca
예상 면접 질문 및 답변
NoSQL은 언제 사용하는가?
- 정확한 데이터 구조를 알 수 없고 데이터가 변경/확장이 될 수 있는 경우
- 막대한 데이터를 저장해야 해서 데이터베이스를 Scale-Out를 해야하는 경우
- 조인을 잘 사용하지 않고 자주 변경되지 않는 데이터
- 읽기를 자주 하지만 데이터 변경은 자주 없는 경우
'스터디 > CS 스터디' 카테고리의 다른 글
[데이터베이스] 클러스터링 인덱스, 유니크 인덱스, 외래 키 (0) | 2022.01.04 |
---|---|
[데이터베이스] Connection Pool이란? (2) | 2022.01.04 |
[데이터베이스] MySQL 트랜잭션 격리 수준 (2) | 2022.01.02 |
[데이터베이스] B-Tree 인덱스를 보편적으로 사용하는 이유 (0) | 2021.12.29 |
[데이터베이스] MySQL 스토리지 엔진의 잠금 (0) | 2021.12.27 |
댓글