지난 시간에는 MongoDB에서 데이터를 어떻게 구조화할지 고민하는 데이터 모델링(내장 방식 vs 참조 방식)에 대해 배웠습니다. 좋은 데이터 설계가 중요하다는 것을 알게 되었죠.
이제 잘 설계된 구조에 맞춰 실제로 데이터를
넣고, 보고, 고치고, 지우는
방법을 배울 시간입니다.
이 네 가지 기본 작업을 우리는
CRUD
라고 부릅니다.
CRUD는 데이터베이스를 다루는 가장 기본적이면서도 핵심적인 기능입니다. 마치 우리가 글을 쓸 때 글자를 쓰고, 읽고, 수정하고, 지우는 것과 같습니다.
이번 시간에는 MongoDB Shell(mongosh)을 이용해서 이 CRUD 작업을 어떻게 수행하는지 하나하나 실습해보겠습니다.
CRUD는 데이터베이스에서 수행하는 네 가지 기본 작업을 나타내는 약자입니다.
Create
: 새로운 데이터를 만드는 작업입니다. (예: 새로운 사용자 정보 추가)
Read
: 저장된 데이터를 읽어오는(조회하는) 작업입니다. (예: 특정 사용자의 정보 보기)
Update
: 이미 저장된 데이터를 수정하는 작업입니다. (예: 사용자의 이메일 주소 변경)
Delete
: 저장된 데이터를 삭제하는 작업입니다. (예: 탈퇴한 사용자 정보 삭제)
CRUD
이 네 가지 작업만 잘 이해하고 사용할 수 있어도 MongoDB를 활용하여 기본적인 데이터 관리는 충분히 할 수 있습니다.
본격적인 CRUD 실습을 위해 먼저 데이터를 저장할 공간을 준비합시다.
MongoDB Shell(mongosh)을 실행하고, 연습용 데이터베이스 (예: 'myPracticeDB')를 사용하도록 전환한 뒤, 사용자 정보를 저장할 'users' 컬렉션을 사용한다고 가정하겠습니다.
# MongoDB Shell 실행
mongosh
# myPracticeDB 데이터베이스 사용 (없으면 새로 생성됨)
use myPracticeDB
# 이제 'users' 컬렉션에 대한 작업을 수행합니다.
# (컬렉션은 첫 데이터 삽입 시 자동으로 생성됩니다.)
이제 'users' 컬렉션에 데이터를 만들고, 읽고, 수정하고, 삭제하는 방법을 차례대로 알아보겠습니다.
새로운 데이터를 MongoDB에 저장하는 방법입니다. 문서(Document) 형태로 데이터를 준비하여 컬렉션에 삽입합니다.
👨💻
Shell 명령어의 줄바꿈은 Shift + Enter 로 가능합니다.
✅
한 개의 문서 삽입: insertOne() 🔗
하나의 사용자 정보를 담은 문서를 'users' 컬렉션에 추가해 보겠습니다.
insertOne 명령어를 사용합니다.
db.users. insertOne ({
name: "김민준" ,
age: 25 ,
status: "active" ,
hobbies: [ "독서" , "영화 감상" ]
})
명령이 성공하면, MongoDB는 삽입된 문서의 고유 ID(ObjectId)를 포함한 결과를 반환합니다.
{
acknowledged : true ,
insertedId : ObjectId( "..." ) // 고유한 ID가 생성되어 반환됨
}
문서 삽입 성공
✅
여러 개의 문서 동시 삽입: insertMany() 🔗
여러 명의 사용자 정보를 한 번에 추가하고 싶을 때는
insertMany 명령어를 사용합니다.
배열 안에 삽입할 문서들을 넣어줍니다.
db.users. insertMany ([
{ name: "이수현" , age: 30 , status: "active" , hobbies: [ "요가" , "음악 감상" ] },
{ name: "박지훈" , age: 22 , status: "inactive" , hobbies: [ "게임" , "축구" ] },
{ name: "최유나" , age: 28 , status: "active" , hobbies: [ "사진 찍기" ] }
])
성공하면 삽입된 각 문서의 ID 목록을 포함한 결과가 반환됩니다.
{
acknowledged : true ,
insertedIds : [
ObjectId( "..." ) ,
ObjectId( "..." ) ,
ObjectId( "..." )
]
}
insertMany
이제 컬렉션에 저장된 데이터를 조회하는 방법을 알아봅시다.
find 명령어는 조건에 맞는 여러 개의 문서를 찾아옵니다.
모든 문서 조회
: 컬렉션의 모든 문서를 보려면 빈 객체
{} 를 조건으로 주거나 아무 조건도 주지 않습니다.
db.users. find ({})
// 또는
db.users. find ()
조건으로 조회 (필터링)
: 특정 조건을 만족하는 문서만 찾을 수 있습니다. 예를 들어, 상태(status)가 'active'인 사용자만 찾아봅시다.
db.users. find ({ status: "active" })
status가 active인 사용자
특정 필드만 선택해서 보기 (프로젝션)
: 문서 전체가 아닌 필요한 필드만 가져올 수 있습니다. 이름(name)과 나이(age) 필드만 보고 싶고, 고유 ID(_id)는 제외하고 싶다면 다음과 같이 합니다. (1: 포함, 0: 제외)
db.users. find ({ status: "active" }, { name: 1 , age: 1 , _id: 0 })
특정 필드만 선택택
✅
한 개의 문서만 조회: findOne() 🔗
조건에 맞는 문서 중
가장 첫 번째 문서 하나만
가져오고 싶을 때는
findOne 명령어를 사용합니다.
결과는 문서 객체 하나로 반환됩니다. (찾는 문서가 없으면 null 반환)
// 이름이 "김민준"인 사용자 한 명 찾기
db.users. findOne ({ name: "김민준" })
find 명령어에 조건을 줄 때,
$gt(보다 큼),
$lt(보다 작음),
$in(배열 내 값 포함) 등 다양한
쿼리 연산자
를 사용하여 더 복잡한 조건 검색이 가능합니다. 이 부분은 다음
쿼리 및 집계 시간에 더 자세히 다루겠습니다.
이미 저장된 문서의 내용을 변경하는 방법입니다.
✅
조건에 맞는 첫 문서 수정: updateOne() 🔗
updateOne 명령어는 주어진 조건에 맞는
첫 번째 문서 하나만
수정합니다.
어떤 필드를 어떻게 수정할지는
업데이트 연산자
(예: $set)를 사용하여 지정합니다.
예를 들어, 이름이 '김민준'인 사용자의 나이(age)를 26으로 변경해 보겠습니다.
db.users. updateOne (
{ name: "김민준" }, // 조건: 이름이 "김민준"인 문서
{ $set: { age: 26 } } // 변경 내용: age 필드를 26으로 설정($set)
)
$set 연산자는 지정된 필드의 값을 주어진 값으로 바꾸거나, 필드가 없으면 새로 추가합니다.
성공하면 몇 개의 문서가 조건에 맞았는지(matchedCount), 실제로 수정되었는지(modifiedCount) 등의 정보가 반환됩니다.
{
acknowledged : true ,
matchedCount : 1 ,
modifiedCount : 1 ,
// ... (upsertedId는 해당 없을 경우 생략됨)
}
김민준 age 25 -> 26
✅
조건에 맞는 모든 문서 수정: updateMany() 🔗
updateMany 명령어는 주어진 조건에 맞는
모든 문서
를 수정합니다.
예를 들어, 상태(status)가 'active'인 모든 사용자의 상태를 'verified'로 변경해 봅시다.
db.users. updateMany (
{ status: "active" }, // 조건: status가 "active"인 모든 문서
{ $set: { status: "verified" } } // 변경 내용: status 필드를 "verified"로 설정
)
$set: 필드 값을 지정된 값으로 설정하거나 추가합니다.
$inc: 숫자 필드 값을 주어진 만큼 증가(또는 음수면 감소)시킵니다. (예: $inc: { age: 1 } => 나이 1 증가)
$push: 배열 필드에 요소를 추가합니다.
$pull: 배열 필드에서 조건에 맞는 요소를 제거합니다.
$unset: 특정 필드를 문서에서 제거합니다.
업데이트 명령어에는
upsert: true 라는 옵션을 줄 수 있습니다. 이 옵션을 사용하면 조건에 맞는 문서가 없을 경우, 주어진 조건과 업데이트 내용을 합쳐서
새로운 문서를 삽입
합니다. (Update + Insert = Upsert)
더 이상 필요 없는 문서를 컬렉션에서 삭제하는 방법입니다.
🖐️
삭제된 데이터는 복구하기 어렵습니다! 신중하게 사용해야 합니다.
✅
조건에 맞는 첫 문서 삭제: deleteOne() 🔗
deleteOne 명령어는 주어진 조건에 맞는
첫 번째 문서 하나만
삭제합니다.
// 이름이 "박지훈"인 사용자 문서 하나 삭제
db.users. deleteOne ({ name: "박지훈" })
성공하면 몇 개의 문서가 삭제되었는지(deletedCount) 정보가 반환됩니다.
{ acknowledged : true , deletedCount : 1 }
user 박지훈 삭제제
✅
조건에 맞는 모든 문서 삭제: deleteMany() 🔗
deleteMany 명령어는 주어진 조건에 맞는
모든 문서
를 삭제합니다.
예를 들어, 상태(status)가 'inactive'인 모든 사용자를 삭제해 봅시다.
// status가 "inactive"인 모든 사용자 문서 삭제
db.users. deleteMany ({ status: "inactive" })
만약 컬렉션의
모든
문서를 삭제하고 싶다면, 빈 객체
{}를 조건으로 주면 됩니다.
db.users. deleteMany ({}) // users 컬렉션의 모든 문서를 삭제 (매우 주의!)
오늘은 MongoDB의 가장 기본적인 데이터 조작 방법인 CRUD(Create, Read, Update, Delete)에 대해 배웠습니다.
insertOne,
insertMany로 데이터를 만들고,
find,
findOne으로 데이터를 읽고,
updateOne,
updateMany로 데이터를 수정하고,
deleteOne,
deleteMany로 데이터를 삭제하는 방법을 MongoDB Shell 명령어를 통해 직접 실습해 보았습니다.
이 CRUD 작업은 앞으로 MongoDB를 사용하면서 가장 많이 하게 될 작업들입니다. 각 명령어의 사용법과 특징을 잘 익혀두시면 MongoDB를 훨씬 효과적으로 활용하실 수 있을 것입니다.
다음 시간에는 데이터를 읽는 작업(Read)을 좀 더 깊이 있게 다루어 보겠습니다. 다양한
쿼리 연산자를 활용한 고급 검색 방법
과 여러 데이터를 가공하고 요약하는 강력한 기능인
집계 프레임워크(Aggregation Framework)
에 대해 알아볼 예정입니다.