목차
MongoDB 란
- MongoDB는 매우 인기 있는 NoSQL 데이터베이스 시스템입니다.
- NoSQL 데이터베이스 란 주로 비구조화된 데이터를 저장하고 관리하는데 효과적입니다.
- MongoDB는 데이터를 문서 형태로 저장합니다. 이 문서들은 JSON형태와 유사한 BSON(Binary JSON) 형식으로 사용합니다.
- 또한 NoSQL인 MongoDB는 고정된 스키마가 없어, 다양한 형태의 데이터를 같은 컬렉션에 저장할 수 있습니다.
- MongoDB에서 컬렉션(Collection)은 SQL 데이터베이스의 테이블과 유사한 개념입니다. 데이터는 문서의 형태로 컬렉션 내에 저장됩니다.
- 각 문서는 키-값 쌍으로 구성되어 있으며, 서로 다른 문서들은 서로 다른 구조를 가질 수 있습니다. 이는 같은 컬렉션 내에서도 서루 다른 형태의 데이터를 유연하게 저장할 수 있게 합니다.
- MongoDB는 수평적 확장이 가능합니다. 즉 더 많은 서버를 데이터베이스에 추가하여 처리 능력을 증가시킬 수 있습니다.
관계형 데이터베이스 vs NoSQL 데이터베이스
- 대표적인 예시
- 관계형 데이터베이스 : MySQL, PostgreSQL
- NoSQL 데이터베이스 : MongoDB
- 데이터 모델
- 관계형 데이터베이스 : 엄격한 스키마를 가지고, 데이터를 테이블로 구성합니다. 모든 데이터 레코드는 미리 정의된 스키마를 따라야 합니다.
- NoSQL 데이터베이스 : 유연한 스키마를 가지고, 데이터를 문서(JSON과 유사), 키-값 쌍, 그래프 등 다양한 형식으로 저장합니다.
- 확장성
- 관계형 데이터베이스 : 주로 수직적 확장(한 서버의 하드웨어 성능 향상)을 사용합니다.
- NoSQL 데이터베이스 : 주로 수평적 확장(추가 서버 노드를 네트워크에 추가)을 사용합니다.
- 적합한 사용 사례
- 관계형 데이터베이스: 복잡한 쿼리가 필요하고, 엄격한 데이터 무결성이 요구되는 금융 시스템, 인벤토리 관리 시스템 등에 적합합니다.
- NoSQL 데이터베이스: 빅 데이터 애플리케이션, 실시간 분석, 콘텐츠 관리 시스템, IoT 애플리케이션 등 다양하고 빠르게 변하는 데이터를 처리해야 하는 경우에 적합합니다.
관계형은 왜 수직적 확장을 사용하고, NoSQL은 왜 수평적 확장을 사용할까?
- 관계형 데이터베이스 (수직적 확장)
- 중앙 집중식 구조: 관계형 데이터베이스는 데이터를 엄격한 스키마에 따라 테이블 형태로 저장합니다. 이 구조는 데이터의 일관성과 무결성을 유지하는 데 유리하지만, 데이터를 여러 서버에 분산시키기 어렵습니다.
- 트랜잭션과 일관성: 관계형 데이터베이스는 ACID(Atomicity, Consistency, Isolation, Durability) 원칙을 엄격히 준수합니다. 이 원칙은 데이터의 정확성과 신뢰성을 보장하지만, 여러 노드 간의 데이터 동기화를 복잡하게 만듭니다.
- 수직적 확장의 선택: 이러한 제약들 때문에 관계형 데이터베이스는 주로 기존 서버의 성능을 향상시키는 방식으로 확장됩니다. 이는 서버의 CPU, 메모리, 저장 공간을 늘리는 것을 의미합니다.
- NoSQL 데이터베이스 (수평적 확장)
- 비중앙 집중식 구조: NoSQL 데이터베이스, 특히 MongoDB와 같은 문서 지향 데이터베이스는 데이터를 유연한 스키마를 가진 문서 형태로 저장합니다. 이 구조는 데이터를 여러 서버에 쉽게 분산시키기에 유리합니다.
- 유연한 데이터 모델: NoSQL 데이터베이스는 ACID 원칙을 완화하거나 다르게 적용하여, 여러 노드 간의 데이터 동기화를 덜 엄격하게 합니다. 이는 데이터의 일관성보다는 가용성과 분산 처리에 더 중점을 둡니다.
- 수평적 확장의 선택: 이러한 특성으로 인해 NoSQL 데이터베이스는 새로운 서버 노드를 추가하여 확장하는 '수평적 확장' 방식을 채택합니다. 이는 데이터베이스의 처리 능력과 저장 용량을 쉽게 확장할 수 있게 해 줍니다.
- 수평적 확장의 이점
- 확장성: 더 많은 사용자와 데이터를 처리할 수 있는 능력.
- 유연성: 다양한 데이터 유형과 큰 데이터 세트를 처리할 수 있는 능력.
- 비용 효율성: 저렴한 하드웨어를 사용하여 확장할 수 있으며, 필요에 따라 자원을 추가하거나 제거할 수 있습니다.
- 정리
- 관계형 데이터베이스는 데이터의 일관성과 무결성을 위해 수직적 확장 방식을 채택합니다.
- NoSQL 데이터베이스는 유연한 데이터 모델과 비중앙 집중식 구조로 인해 수평적 확장 방식을 선호합니다.
MongoDB 설정
- 우선 MongoDB 사이트에 회원 가입 후 로그인을 진행해 줍니다.
Organization 생성
- Organization 이란?
- MongoDB Atlas에서 사용자는 하나 이상의 '조직'을 만들 수 있습니다. 조직은 여러 프로젝트를 그룹화하고, 사용자들에게 다양한 프로젝트에 대한 접근을 관리하는 데 사용됩니다.
- 회원 가입 후 로그인을 완료하면 다음과 같이 Organizations를 생성하는 창이 나오게 됩니다. 아래 창에서 Create an Organization을 클릭해 줍니다.
- 원하는 이름과 MongoDB Atlas를 선택한 뒤 Next를 눌러줍니다.
- 다음 창에서 다른 설정은 일단 그대로 두고 Create Organization을 클릭해 줍니다.
- 이렇게 하면 Organization이 생성완료되게 됩니다.
Project 생성
- Project 란?
- 프로젝트는 MongoDB Atlas에서 리소스와 사용자를 관리하는 단위입니다. 하나의 프로젝트 안에 여러 클러스터를 포함시킬 수 있으며, 접근 권한 및 설정을 프로젝트 단위로 관리할 수 있습니다.
- Organization을 생성 완료하면 다음과 같은 창이 뜨게 됩니다. 우측 상단에 New Project를 클릭해 줍니다.
- 마찬가지로 원하는 프로젝트 이름을 작성해 주고 Next를 눌러줍니다.
- 다음 창에서도 다른 설정은 그대로 두고, Create Project를 클릭해 줍니다.
- Project 생성이 완료됐습니다.
Cluster 생성
- Cluster (클러스터)란?
- 클러스터는 MongoDB의 데이터 저장소입니다. 단일 노드 또는 여러 노드의 집합으로 구성될 수 있으며, 실제 데이터가 저장되고 처리되는 곳입니다. 클러스터는 일반적으로 복제 및 샤딩 구성으로 관리되어 데이터의 가용성과 확장성을 높입니다.
- 좌측에 Database를 클릭한 뒤, Build a Database를 진행합니다.
- M0 (Free 요금), AWS, Seoul, 원하는 클러스터이름 작성 후 Create클릭합니다.
- Create 클릭 후 1~3분 후 Cluster가 생성되게 됩니다.
- Cluster가 생성이 완료되면 설정 작업이 필요합니다.
- Network Access에 들어가서 Add IP 클릭
- 개발용으로 진행할 때는 ALLOW ACCESS FROM ANYWHERE을 클릭하고 Confirm 클릭하기 (실제 프로덕션에 배포할 때는 서버 IP를 적어주어야 합니다.)
- Database Access에 들어가서 Add New Database User 클릭
- 유저네임과 패스워드를 본인이 원하는 걸로 작성합니다.(절대 유출 금지)
- Built-in Role에서 Read and wirte to any databse 권한 부여하기
- Add User 클릭
- 다시 Database 탭을 클릭한 뒤 생성된 Cluster의 connect 버튼을 눌러줍니다.
- Compass 클릭
- 현재 운영체제에 맞는 파일 다운로드를 진행
- 다운로드 완료 후 MongoDB Compass 실행
- MongoDB Compass에서 다음 작업들을 수행합니다.
- New connection 클릭
- Cluster connect 창에서 2번에 있는 url을 복사해 옵니다.(Compass Download 밑에 있는 2번 URL)
- password 부분을 수정하고 붙여 넣어준 뒤 연결을 해줍니다.
- Cluster에 MongoDB Compass가 정상적으로 연결된 것을 확인할 수 있습니다.
- Network Access에 들어가서 Add IP 클릭
CRUD 테스트해보기
- 데이터베이스와 컬렉션 생성
- Cluster에 연결된 MongoDB Compass에서 Create database를 통해 데이터베이스를 생성해 줍니다.
- 데이터베이스 이름과 Collection 이름을 지정해 준 뒤 Create Database를 통해 생성해 줍니다.
- 해당 데이터베이스 이름으로 데이터베이스 생성되고 그 안에 지정한 Collection 이름으로 Collection이 생성된 것을 확인할 수 있습니다.
- Cluster에 연결된 MongoDB Compass에서 Create database를 통해 데이터베이스를 생성해 줍니다.
- CRUD 테스트하기
- 먼저 MongoDB Compass에서 가장 아래에 있는 _MONGOSH를 클릭합니다.
- CRUD 명령어
- db
- 이 명령어를 통해 현재 데이터베이스이름을 확인 가능합니다.
- use 데이터베이스이름
- 이 명령어를 통해 데이터베이스 이동이 가능합니다.
- [create] db.콜렉션이름.insertOne({name : 'John', email : "john@~~"})
- 이 명령어를 통해 원하는 데이터를 삽입 가능합니다.
- [read] db.콜렉션이름.find()
- 콜렉션에 있는 데이터를 출력합니다.
- 데이터를 보면 _id라고 해서 ObjectId로 지정이 되어 있는데 이는 데이터를 만들 때마다 부여되는 아이디입니다.
- [update] db.콜렉션이름.updateOne({_id : ObjectId("~~~")}, {$set : {name : "jo"}})
- 해당 콜렉션의 해당 id 데이터를 원하는 값으로 변경할 수 있습니다.
- [delete] db.콜렉션이름.deleteOne ({_id : ObjectId("~~~")})
- 해당 콜렉션의 해당 id 데이터를 삭제할 수 있습니다.
- db
- 하지만 보통 이런 식으로 진행하지 않고, 원하는 프로그래밍 언어에서 CRUD를 진행하는 경우가 대부분입니다.