데이터를 저장해야하는 웹 애플리케이션을 개발할 경우 개발자들은 다음과 같은 문제에 직면하게 됩니다.
SQL을 사용해야 할까? 아니면 NoSQL을 사용해야 할까?
저 또한 웹 애플리케이션을 개발 할 때마다 고민을 하곤 했습니다. 정해진 답은 없습니다. 경우에 따라 효율적인 데이터베이스를 사용하면 됩니다.
이 글에서 SQL과 NoSQL을 간략하게 설명하고 둘의 차이점과 어떤 경우에 어떤 데이터베이스를 사용하면 좋은지에 대해 다뤄보도록 하겠습니다.
SQL
보통 SQL이라고 하면 데이터베이스가 아닌 Structured query language 한국말로 하면 구조화된 쿼리 언어를 말합니다.
SQL를 사용하여 관계형 데이터베이스 시스템에서 데이터를 삽입, 수정, 조회, 삭제를 할 수 있습니다. 위 글에서는 SQL를 SQL 데이터베이스 즉 관계형 데이터 베이스 의미로 사용하겠습니다.
SQL은 관계형 데이터 베이스라는 이름에서도 알 수 있듯이 데이터가 관계를 통해서 연결된 여러 테이블에 분산되어 있습니다. 이렇게 여러 테이블에 분산되어 있으면 데이터를 중복 없이 한 번만 저장을 할 수 있다는 장점이 있습니다. SQL의 또 다른 특징으로는 엄격한 데이터 스키마가 있습니다. 데이터를 엄격한 데이터 스키마에 따라서 데이터베이스 테이블에 저장합니다. 이렇게 저장을 하면 데이터의 무결성을 보장할 수 있습니다.
하지만, 위에서 설명한 장점이 곧 단점이 될 수도 있습니다. 엄격한 데이터 스키마를 사용하기에 유연성이 Nosql에 비해 상대적으로 낮고 데이터를 넣기 전에 스키마를 미리 알아야 합니다. 또한 원하는 데이터를 찾기 위해 관계되어 있는 테이블끼리 join을 많이 하는 경우, 데이터를 찾는 속도가 느립니다.
NoSQL
Nosql 의미를 찾아 보면 'No SQL', 'Not Only SQL', 'non relational sql' 등을 찾을 수 있습니다. 이런 의미적 해석보다는 NoSQL은 Non-Relational Database SQL 즉 관계를 형성하지 않는 database를 뜻합니다.
Non-relational에서도 알 수 있듯이 SQL과 달리 데이터들이 관계가 없습니다. 데이터들이 관계가 없기에 데이터를 원하는 형식으로 저장할 수 있습니다. 웹 애플리케이션이 원하는 형식으로 저장을 하면 읽어오는 속도가 SQL에 비해 빠릅니다. 또한 스키마가 엄격하지 않아 유연성이 높습니다. column-oriented, document-oriented, graph, key-value 등 여러 다이나믹 스키마를 사용해서 저장을 할 수 있습니다. SQL의 경우 정해진 스키마에 따르지 않으면 데이터를 추가할 수 없지만, NoSQL은 다양한 구조의 데이터를 같은 컬렉션에 추가할 수 있습니다.
SQL과 마찬가지로 위의 장점이 곧 단점이기도 합니다. NoSQL은 관계가 없어 join이라는 개념이 없습니다. 따라서 데이턱 여러 컬렉션에 중복되어 저장되어 있는 경우가 있습니다. 어느 한 쪽에서 데이터를 수정할 때 그 데이터가 들어가 있는 모든 컬렉션에서 데이터 수정을 수행해야 합니다.
위에서 SQL과 NoSQL의 특징과 차이점에 대해서 알아보았습니다. 또 한가지 큰 차이점이 있습니다.
바로 Database Scaling 관점에서의 차이입니다. 그 전에 Database Scaling에 대해서 간략하게 알아보겠습니다.
수직적 확장(vertical Scaling)
- 단순히 데이터베이스 서버의 성능을 향상 시키는 것
- 데이터베이스 서버의 CPU, Memory, RAM등을 업그레이드하여 향상시킴
수평적 확장(Horizontal Scaling)
- 더 많은 서버가 추가됨
- 데이터베이스가 전체적으로 분산됨을 의미
SQL은 수직적 확장만 가능합니다. 샤딩의 개념이 있지만 특정 제한이 있으며 일반적으로 구현하기 어렸습니다.
NoSQL의 경우 수평적 확장도 가능합니다. 높은 트래픽에 대하여 샤딩을 통해 처리할 수 있습니다.
샤딩에 관해서는 추후에 다뤄보도록 하겠습니다.
그럼 어떤 경우에 사용해야 할까요?
SQL의 경우 관계를 맺고 있는 데이터가 자주 변경되는 경우 주로 사용합니다. NoSQL은 데이터가 변경되면 모든 컬렉션에 있는 데이터를 변경해줘야 하기에 효율적이지 못합니다. 또한 SQL은 명확한 스키마가 중요하며, 데이터 구조가 극적으로 변경되지 않는 경우 주로 사용합니다.
NoSQL의 경우 정확한 데이터 요구사항을 알 수 없거나 데이터 구조가 변경/확장 될 수 있는 경우 사용합니다. 또한 수평적 확장이 가능하여 방대한 데이터 저장소가 필요한 분산 데이터 저장소로 사용됩니다. 빅 데이터 및 실시간 웹, 앱에 사용되고 있습니다.
정리
NoSQL
- 스키마가 없다 →유연성이 높음
- 데이터를 원하는 형식으로 저장 가능 → 읽어 오는 속도가 빠르다
- 관계가 없어 join이라는 개념이 없다
- 데이터가 여러 컬렉션에 중복되어 있기에, 수정을 해야 하는 경우 모든 컬렉션에서 수행해야함
- 수평확장이 가능한다.
- 정확한 데이터 요구사항을 알 수 없거나 데이터 구조가 변경/확장 될 수 있는 경우 사용
- 방대한 데이터 저장소가 필요한 분산 데이터 저장소에 사용
- 빅 데이터 및 실시간 웹 앱에 사용
- ex) MongoDB, Redis, Apache Cassandra, HBase
SQL
- RDBMS(관계형 데이터베이스 관리 시스템)의 데이터를 관리하기 위해 설계된 프로그래밍 언어
- 데이터는 엄격한 데이터 스키마에 따라서 데이터베이스 테이블에 저장 → 데이터 무결성 보장
- 데이터는 관계를 통해서 연결된 여러 데이블에 분산 → 중복없이 한 번만 저장
- 수직 확장만 가능 → 단순히 데이터베이스 서버의 성능을 향상
- 샤딩의 개념이 있지만 특정 제한이 있으며 일반적으로 구현하기 어려움
- 상대적으로 덜 유연하며 데이터 스키마를 미리 알고 계획
- 관계를 맺고 있는 데이터가 자주 변경 되는 경우 주로 사용
- 명확한 스키마가 중요하며, 데이터 구조가 극적으로 변경되지 않는 경우 주로 사용
- ex) Mysql, PostgreSQL, Oracle
이처럼 SQL과 NoSQL 중 뭐가 절대적으로 좋은 경우는 없습니다. 자신이 만들고자 하는 애플리케이션의 특성에 따라서 알맞은 데이터 베이스를 사용하면 됩니다.
※잘못된 내용이 있거나 궁금한 내용이 있으면 언제든 댓글 달아주세요!!
참고자료
https://www.xplenty.com/blog/the-sql-vs-nosql-difference/
https://academind.com/tutorials/sql-vs-nosql
'CS' 카테고리의 다른 글
[NETWORK] ARP란? (0) | 2023.05.13 |
---|---|
[Database] Indexing이란? (0) | 2021.12.07 |
[Linux] Linux File Hierarchy Structure (0) | 2021.09.08 |