MongoDB, 몽고디비
몽고디비(MongoDB)는 문서 지향(Document-Oriented) NoSQL 데이터베이스입니다. 이것은 데이터를 JSON과 비슷한 BSON(Binary JSON) 형식으로 저장합니다. 몽고디비는 대규모, 복잡한 애플리케이션에서 많은 양의 데이터를 저장하고 처리하는 데 유용합니다. 또한 몽고디비는 수평적 확장이 가능하며, 높은 가용성과 성능을 제공합니다.
몽고디비는 현재 많은 양의 애플리케이션에서 사용되고 있습니다. 이는 데이터를 JSON과 비슷한 BSON 형식으로 저장하여 개발자가 쉽게 다룰 수 있기 때문이며, 높은 가용성과 확장성을 제공하여 대규모 애플리케이션에서도 사용할 수 있습니다. 몽고디비는 페이스북, 구글, 아마존, 셀프리지 등의 대규모 기업에서 사용되고 있으며, 다양한 분야의 애플리케이션에서도 널리 사용되고 있습니다. 예를 들어, 온라인 게임, 소셜 미디어, 전자 상거래, 로그 수집 및 분석, IoT 등의 분야에서 사용되고 있습니다.
특징
몽고디비의 주요 특징 5가지입니다.
1. 문서 지향(Document-Oriented)
몽고디비는 데이터를 문서(Document) 형태로 저장합니다. 이는 관계형 데이터베이스에서의 테이블과 로우에 해당합니다. 문서는 JSON과 비슷한 BSON(Binary JSON) 형식으로 저장되며, 다양한 형태의 데이터 타입을 지원합니다.
2. 스키마 자유성(Schema-Free)
몽고디비는 스키마 자유성을 제공합니다. 이는 데이터 모델을 미리 정의하지 않아도 되며, 필드 추가 및 삭제가 자유롭다는 것을 의미합니다.
3. 수평적 확장(Scalability)
몽고디비는 수평적 확장을 지원합니다. 이는 여러 대의 서버를 추가함으로써 데이터베이스를 확장할 수 있다는 것을 의미합니다.
4. 인덱싱(Indexing)
몽고디비는 다양한 인덱싱 기능을 제공합니다. 이를 통해 데이터에 대한 빠른 검색이 가능해집니다.
5. 고 가용성(High Availability)
몽고디비는 고 가용성을 제공합니다. 이는 여러 대의 서버를 사용하여 데이터베이스 시스템에 장애가 발생해도 계속해서 서비스를 제공할 수 있다는 것을 의미합니다.
장단점
위 작성된 몽고디비의 특징들이 장점이 녹아져 있습니다. 최대한 특징에서 다루지 않은 내용을 추가합니다.
장점
1. 확장성
몽고디비는 수평적 확장을 지원하여 대규모 애플리케이션에서도 높은 가용성과 성능을 제공합니다. 또한, 샤딩(Sharding)을 통해 데이터를 분산 저장하므로 전체적인 처리량을 늘릴 수 있습니다.
2. 빠른 속도
몽고디비는 인덱싱과 쿼리 최적화를 통해 빠른 검색과 조회를 지원합니다.
3. 유연성
몽고디비는 다양한 형태의 데이터를 저장하고 다양한 쿼리를 실행할 수 있습니다. 또한, 스키마 자유성을 제공하여 데이터 모델을 미리 정의하지 않아도 되므로 개발자가 빠르게 개발할 수 있습니다.
4. 집계 프레임워크
몽고디비는 집계 프레임워크를 제공하여 데이터를 집계하고 분석하는 기능을 제공합니다. 이를 통해 다양한 통계 및 분석 작업을 수행할 수 있습니다.
5. 유명한 고객사
몽고디비는 기업에서 많이 사용되며, 대표적으로는 eBay, Cisco, SAP 등이 사용하고 있습니다. 이는 몽고디비가 안정성과 신뢰성이 높은 데이터베이스라는 것을 보여줍니다.
단점
1. 트랜잭션(Transaction) 지원의 한계
이전에는 트랜잭션 지원이 부족하였으나, 최근 버전에서는 ACID 트랜잭션을 지원하고 있습니다.
2. 복잡한 쿼리 작성
몽고디비는 SQL이 아닌 쿼리 언어를 사용하며, 복잡한 쿼리 작성이 어려울 수 있습니다.
3. 메모리 사용량
몽고디비는 인덱스를 자주 사용하므로 메모리 사용량이 높을 수 있습니다.
4. 데이터 일관성
분산 환경에서 몽고디비의 데이터 일관성을 유지하는 것은 어려울 수 있습니다.
5. 초기 설정이 복잡
몽고디비의 초기 설정이 복잡하다는 것이 단점 중 하나입니다.
설치 방법
Mac과 Window 각각 몽고디비를 설치하는 방법에 대해서 알아보겠습니다.
Mac에서 설치
1. Homebrew를 설치합니다.
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
2. 몽고디비를 설치합니다.
brew install mongodb-community
3. 데이터 디렉터리를 만듭니다.
sudo mkdir -p /data/db
4. 데이터 디렉터리에 쓰기 권한을 부여합니다.
sudo chown -R `id -un` /data/db
5. 몽고디비를 실행합니다.
mongod
6. 몽고디비 쉘을 실행합니다.
mongo
Window에서 설치
1. 몽고디비 MSI 파일을 다운로드합니다. 다음 URL에서 최신 버전의 MSI 파일을 다운로드할 수 있습니다
2. MSI 파일을 실행합니다. 몽고디비 설치 마법사가 실행됩니다.
3. "Complete" 또는 "Custom" 설치 옵션을 선택합니다. "Custom" 옵션을 선택하면 설치 디렉터리를 변경할 수 있습니다.
4. "Install MongoDB Compass" 옵션을 선택하면 MongoDB Compass도 함께 설치됩니다.
5. "Install as a service" 옵션을 선택하면 몽고디비를 서비스로 등록할 수 있습니다.
6. 설치를 완료하면 몽고디비 서비스가 자동으로 시작됩니다. MongoDB Compass를 실행하여 데이터베이스에 연결할 수 있습니다.
7. 몽고디비 서비스를 시작하거나 중지하려면 "services.msc"를 실행하고 "MongoDB Server" 서비스를 선택합니다.
명령어와 문법
명령어는 데이터 베이스(database)와 컬렉션(collection) 그리고 문서(document)를 다루는 명령어가 있습니다. 하나씩 예제 코드와 함께 소개해봅니다.
- 데이터베이스 생성
- 데이터베이스 조회
- 데이터베이스 수정
- 데이터베이스 삭제
- 컬렉션 생성
- 컬렉션 조회
- 컬렉션 수정
- 컬렉션 삭제
- 문서 삽입 ( 생성 )
- 문서 조회
- 문서 수정
- 문서 삭제
데이터베이스 생성
새로운 데이터베이스 생성을 하기 위해 'use'명령어를 사용합니다.
use example_db
위 명령어를 실행하면 'example_db'라는 이름의 데이터베이스가 생성됩니다. 다만, 이때는 아직 해당 데이터베이스에 컬렉션이 없기 때문에 이후에 컬렉션을 생성하고 문서를 추가해야 합니다.
데이터베이스 조회
데이터베이스를 조회할 수 있는 2가지 명령어를 소개합니다.
show dbs
위 명령어는 데이터베이스 목록을 출력하는 예제입니다. 출력된 데이터베이스 목록에는 각 데이터베이스의 이름과 크기 등이 포함됩니다. 하지만 현재 사용자가 접근 가능한 모든 데이터베이스를 보여주는 것이 아니라 데이터가 존재하는 데이터베이스만 보여주므로 주의해야 합니다.
db
위 명령어는 현재 사용 중인 데이터베이스를 출력합니다.
데이터베이스 수정
몽고디비에서는 데이터베이스 자체를 직접 수정하는 명령어는 제공되지 않습니다. 대신, 데이터베이스 설정이나 권한과 같은 속성들은 'db_runCommand()' 명령어를 사용하여 수정할 수 있습니다.
db.runCommand({
grantRolesToUser: "example_user",
roles: [
{role: "readWrite", db: "example_db"}
]
})
생성해 둔 'example_db'에 사용자 계정에 대한 권한을 수정하는 예제입니다. 위 명령어를 실행하면 'example_user'라는 사용자 계정에 'example_db'에 대한 읽기와 쓰기가 가능한 'readWrite' 권한이 추가됩니다.
데이터베이스 삭제
데이터베이스를 삭제하기 위해 'dropDatabase()' 명령어를 사용합니다.
use example_db
db.dropDatabase()
위 명령어를 실행하면 'example_db'가 삭제되며 데이터베이스에 속한 모든 컬렉션이 함께 삭제되므로 주의해야 합니다.
컬렉션 생성
새로운 컬렉션을 생성하기 위해 'db.createCollection()' 명령어를 사용합니다.
/* 기본 설정, 컬렉션 생성 */
db.createCollection("example_collection")
/* 옵션 지정, 컬렉션 생성 */
db.createCollection(
"example_collection",
{
capped:true,
size:6142800,
max:10000
}
)
첫 번째 명령어를 실행하면 'example_collection'이라는 이름의 컬렉션이 생성됩니다. 이때, 기본 설정을 사용하여 생성하므로 컬렉션의 옵션을 지정하지 않아도 됩니다. 지정이 필요하다면 두 번째 명령어처럼 필요에 따라 지정해 줄 수 있습니다.
컬렉션 조회
컬렉션 목록을 조회하기 위해 'show collections' 명령어를 사용합니다. 이때 먼저 조회할 데이터베이스를 선택한 후 해당 데이터베이스에서 명령어를 실행해야 합니다.
use example_db
show collections
위 명령어를 실행하면 'example_db'에 속한 모든 컬렉션의 목록이 출력됩니다.
컬렉션 수정
몽고디비에서는 컬렉션 자체를 수정하는 명령어는 제공되지 않습니다. 컬렉션은 데이터베이스 내의 논리적인 그룹화를 위한 개념으로, 컬렉션 자체를 수정하는 것은 논리적인 데이터의 일관성을 깨뜨리는 결과를 가져올 수 있기 때문입니다. 컬렉션을 꼭 수정해야 하는 경우 다음과 같은 방법을 고려할 수 있습니다.
1. 'renameCollection()' 명령어를 사용하여 컬렉션의 이름을 변경합니다.
db.old_collection.renameCollection("new_collection")
2. 'aggregate()' 명령어를 사용하여 컬렉션의 내용을 변환하고 새로운 컬렉션에 삽입합니다.
db.old_collection.aggregate([ { $match: { age: { $gt: 30 } } }, { $out: "new_collection" } ])
3. 'mongodump' 명령어를 사용하여 컬렉션의 백업을 생성하고, 'mongorestore' 명령어를 사용하여 백업된 데이터를 새로운 컬렉션에 삽입합니다.
mongodump --db mydb --collection old_collection
mongorestore --db mydb --collection new_collection dump/mydb/old_collection.bson
💡 컬렉션의 이름 변경이나 데이터의 변환 등이 불가피한 경우에 신중하게 수행해야 하며, 관련 작업을 수행하기 전에 백업을 만들어 두는 것이 좋습니다.
컬렉션 삭제
아래 명령어는 'example_collection' 컬렉션을 삭제하는 예제입니다.
db.example_collection.drop()
문서 삽입 ( 생성 )
문서를 삽입하기 위한 2가지 종류의 메서드를 알아봅니다.
1. 'insertOne()' 메서드는 하나의 문서를 컬렉션에 삽입합니다.
db.example_collection.insertOne(
{ name: "John", age: 30, email: "john@example.com" }
)
2. 'insertMany()' 메서드는 여러 개의 문서를 컬렉션에 삽입합니다.
db.example_collection.insertMany([
{ name: "Sam", age: 32, email: "sam@example.com" },
{ name: "Peter", age: 27, email: "peter@example.com" }
])
문서 조회
문서를 조회하기 위한 3가지 종류의 메서드를 알아봅니다.
1. 'findOne()' 메서드는 첫 번째에 위치한 하나의 문서를 반환합니다.
db.example_collection.findOne({ name: "John" })
// print
{ name: "John", age: 24, email: "john3@example.com" }
2. 'find()' 메서드는 작성한 조건에 부합하는 모든 문서가 반환됩니다.
db.example_collection.find({ name: "John" })
// print
{ name: "John", age: 24, email: "john3@example.com" }
{ name: "John", age: 39, email: "john2@example.com" }
{ name: "John", age: 30, email: "john1@example.com" }
3. 'pretty()' 메서드를 사용하면 문서를 깔끔하게 보여줍니다.
// 전체 데이터 조회
db.example_collection.find().pretty()
// 조건에 맞는 데이터 조회
db.example_collection.find({ name: "John" }).pretty()
문서 수정
문서를 수정하기 위한 7가지 종류의 메서드를 알아봅니다.
1. 'updateOne()' 메서드는 쿼리와 일치하는 단일 문서를 업데이트합니다.
// 'users' 컬렉션에서 username이 'johndoe'인 문서의 'email' 값을 업데이트합니다.
db.users.updateOne({ username: 'johndoe' }, { $set: { email: 'johndoe@example.com' } });
2. 'updateMany()' 메서드는 쿼리와 일치하는 모든 문서를 업데이트합니다.
// 'orders' 컬렉션에서 status가 'pending'인 모든 문서의 'status' 값을 'processing'으로 변경합니다.
db.orders.updateMany({ status: 'pending' }, { $set: { status: 'processing' } });
3. 'update()' 메서드로 aggregation pipeline을 적용할 수도 있습니다. 이는 더 복잡한 업데이트 작업을 수행할 수 있게 해 줍니다.
// 'orders' 컬렉션에서 status가 'pending'인 문서 중, amount가 1000 이상인 모든 문서의 'status' 값을 'processing'으로 변경합니다.
db.orders.update(
{ status: 'pending', amount: { $gte: 1000 } },
[{ $set: { status: 'processing' } }]
);
💡 update문에 $set을 넣지 않고 그냥 조건만 넣으면 문서의 내용이 다 지워지고 조건만 담긴 객체로 바뀌어버린다(통째로 수정)
4. 'replaceOne()' 메서드는 쿼리와 일치하는 단일 문서를 다른 문서로 교체합니다. update문에서 $set에 조건을 넣지 않고 사용했을 때와 결과가 유사합니다.
// 'products' 컬렉션에서 _id가 '123'인 문서를 { name: 'New Product', price: 9.99 }로 교체합니다.
db.products.replaceOne({_id: '123'}, {name: 'New Product', price: 9.99});
5. 'findOneAndUpdate()' 메서드는 쿼리와 일치하는 단일 문서를 업데이트하고 결과를 반환합니다.
// 'users' 컬렉션에서 username이 'johndoe'인 문서의 'lastLogin' 값을 현재 날짜로 업데이트하고, 이전 값을 반환합니다.
db.users.findOneAndUpdate({ username: 'johndoe' }, { $set: { lastLogin: new Date() } }, { returnOriginal: false });
6. 'findOneAndReplace()' 메서드는 쿼리와 일치하는 단일 문서를 다른 문서로 교체하고 결과를 반환합니다.
// 'products' 컬렉션에서 _id가 '123'인 문서를 { name: 'New Product', price: 9.99 }로 교체하고, 이전 값을 반환합니다.
db.products.findOneAndReplace({ _id: '123' }, { name: 'New Product', price: 9.99 }, { returnOriginal: true });
7. 'findOneAndModify()' 메서드는 쿼리와 일치하는 단일 문서를 업데이트하거나 교체하고 결과를 반환합니다.
// 'orders' 컬렉션에서 status가 'pending'인 문서 중 첫 번째 문서의 'status' 값을 'processing'으로 변경하고, 이전 값을 반환합니다.
db.orders.findOneAndModify({ status: 'pending' }, {$set: { status: 'processing' }}, { returnOriginal: true });
문서 삭제
문서를 삭제하기 위한 2가지 종류의 메서드를 알아봅니다.
1. 'deleteOne()' 메서드는 조건에 부합하는 하나의 문서만 삭제합니다.
db.users.deleteOne({ name: "Alice" })
2. 'deleteMany()' 메서드는 조건에 부합하는 여러 개의 문서를 한 번에 삭제합니다.
db.users.deleteMany({ name: "Alice" })
삭제된 문서 수와 성공 여부를 확인하려면 반환된 'DeleteResult' 객체를 살펴볼 수 있습니다. 예를 들어 'deleteMany()' 명령어가 반환하는 객체의 'deleteCount' 필드는 삭제된 문서의 수를 나타냅니다.
마치며
오늘은 MongoDB에 대한 소개와 특징, 장단점 그리고 데이터베이스, 컬렉션, 문서를 다루는 주요 명령어에 대해서 알아보았습니다. 다음 포스팅에서는 좀 더 원하는 코드를 쉽게 가져올 수 있도록 돕는 논리 연산자, 조건, 정규식과 정렬 등에 대해서 작성해 보겠습니다.
Reference
ChatGPT, Inpa Dev님의 블로그
'PROGRAMMING > Database' 카테고리의 다른 글
[PostgreSQL] 특징과 비교 그리고 기본 명령어 (feat. MySQL) (0) | 2023.10.01 |
---|---|
[postgres] Table 조회 오류시 해결 방법(relation "table" does not exist) (20) | 2023.05.21 |
[Database] 파티셔닝과 샤딩 그리고 레플리케이션(feat.분산 저장 기법, 수평, 수직, 튜닝) (50) | 2023.03.27 |
[Database] 관계형 데이터베이스 RDB, 키 | 인덱스 | 무결성 | 조인 | 정규화 | 트랜잭션 (44) | 2023.03.23 |
[Database] SQL과 NoSQL, 정의 | 비교 | 특징 | 장단점 | 종류 (feat. MongoDB, Oracle, MySql) (27) | 2023.02.17 |