지난 시간에는 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)
에 대해 알아볼 예정입니다.