소개
이 랩에서는 MongoDB 에서 사용자 프로필을 생성하고 관리하는 방법을 배웁니다. 기본적인 스키마를 설계하는 것부터 시작하여 문서를 업데이트하고, 사용자 관심사를 위한 배열을 사용하며, 복잡한 중첩 설정을 관리하는 방법을 배우게 됩니다. 이 랩이 끝나면 애플리케이션에서 유연하고 확장 가능한 사용자 프로필을 구축하기 위한 기본적인 MongoDB 데이터 모델링 개념에 대한 확실한 이해를 갖게 될 것입니다.
이 랩에서는 MongoDB 에서 사용자 프로필을 생성하고 관리하는 방법을 배웁니다. 기본적인 스키마를 설계하는 것부터 시작하여 문서를 업데이트하고, 사용자 관심사를 위한 배열을 사용하며, 복잡한 중첩 설정을 관리하는 방법을 배우게 됩니다. 이 랩이 끝나면 애플리케이션에서 유연하고 확장 가능한 사용자 프로필을 구축하기 위한 기본적인 MongoDB 데이터 모델링 개념에 대한 확실한 이해를 갖게 될 것입니다.
첫 번째 단계에서는 새 데이터베이스를 생성하고 첫 번째 사용자 프로필 문서를 삽입합니다. 이를 통해 사용자 정보를 저장하기 위한 기본 구조를 설정합니다.
먼저 터미널에서 MongoDB 대화형 셸을 엽니다. 이것은 MongoDB 데이터베이스와 상호 작용하는 기본 도구입니다.
mongosh
셸에 들어가면 test> 프롬프트가 표시됩니다. 이제 userprofiles_db라는 새 데이터베이스로 전환합니다. 데이터베이스가 존재하지 않으면 MongoDB 는 데이터를 처음 저장할 때 자동으로 생성합니다.
use userprofiles_db
이제 profiles라는 컬렉션에 문서를 삽입합니다. MongoDB 의 문서는 BSON(binary JSON-like) 구조이며, 컬렉션은 관련 문서들의 그룹입니다.
johndoe라는 사용자의 프로필을 삽입하려면 다음 명령을 실행합니다.
db.profiles.insertOne({
username: "johndoe",
personal_info: {
first_name: "John",
last_name: "Doe",
email: "john.doe@example.com"
},
metadata: {
created_at: new Date(),
account_status: "active"
}
});
이 명령은 insertOne() 메서드를 사용하여 단일 문서를 추가합니다. 이 문서는 username, 중첩된 personal_info 객체, 그리고 생성 시간과 계정 상태를 추적하기 위한 metadata 객체를 포함합니다.
문서가 성공적으로 생성되었는지 확인하려면 find() 메서드를 사용하여 검색할 수 있습니다.
db.profiles.find({ username: "johndoe" });
방금 삽입한 문서와 함께 MongoDB 가 자동으로 추가한 고유한 _id 필드가 표시됩니다. 출력에서 날짜와 ObjectId는 다를 수 있습니다.
[
{
_id: ObjectId('656f1a7b2e3a4c5d6e7f8b9a'),
username: 'johndoe',
personal_info: {
first_name: 'John',
last_name: 'Doe',
email: 'john.doe@example.com'
},
metadata: {
created_at: ISODate('2023-12-05T10:30:51.123Z'),
account_status: 'active'
}
}
]
이번 단계에서는 기존 문서를 수정하는 방법을 배웁니다. 이전 단계에서 생성한 사용자 프로필에 더 자세한 연락처 정보를 추가할 것입니다.
johndoe 프로필을 업데이트하기 위해 updateOne() 메서드를 사용합니다. 이 메서드는 업데이트할 문서를 찾는 필터와 변경 사항을 지정하는 업데이트 문서의 두 가지 인수를 받습니다.
contact_details 객체를 추가해 보겠습니다. $set 연산자를 사용할 것입니다. 이 연산자는 지정된 값으로 필드의 값을 대체합니다. 필드가 존재하지 않으면 $set은 새 필드를 추가합니다.
db.profiles.updateOne(
{ username: "johndoe" },
{
$set: {
contact_details: {
phone: "+1-555-1234",
address: {
street: "123 Main St",
city: "San Francisco",
country: "USA"
}
},
"metadata.last_updated": new Date()
}
}
);
이 명령에서 새 contact_details 객체를 추가했습니다. 또한 점 표기법 ("metadata.last_updated") 을 사용하여 기존 metadata 객체를 덮어쓰지 않고 last_updated 필드를 추가했습니다. 이는 중첩된 필드를 업데이트하는 강력한 기능입니다.
변경 사항을 확인하기 위해 문서를 다시 검색해 보겠습니다.
db.profiles.find({ username: "johndoe" });
출력에는 새로 추가된 contact_details와 metadata의 last_updated 타임스탬프가 표시됩니다.
[
{
_id: ObjectId('656f1a7b2e3a4c5d6e7f8b9a'),
username: 'johndoe',
personal_info: {
first_name: 'John',
last_name: 'Doe',
email: 'john.doe@example.com'
},
metadata: {
created_at: ISODate('2023-12-05T10:30:51.123Z'),
account_status: 'active',
last_updated: ISODate('2023-12-05T10:35:22.456Z')
},
contact_details: {
phone: '+1-555-1234',
address: {
street: '123 Main St',
city: 'San Francisco',
country: 'USA'
}
}
}
]
사용자 프로필에는 종종 관심사, 기술 또는 태그와 같은 항목 목록이 포함됩니다. MongoDB 는 배열을 사용하여 이를 효율적으로 처리합니다. 이번 단계에서는 사용자 프로필에 관심사 배열을 추가하고 수정합니다.
먼저 $set 연산자를 사용하여 johndoe 프로필에 interests 배열을 추가합니다.
db.profiles.updateOne(
{ username: "johndoe" },
{ $set: { interests: ["technology", "travel"] } }
);
이제 사용자가 새로운 관심사를 갖게 되었다고 가정해 보겠습니다. 전체 배열을 교체하는 대신 $push 연산자를 사용하여 새 요소를 추가할 수 있습니다. 이 연산자는 지정된 값을 배열에 추가하며 추가 작업에 더 효율적입니다.
db.profiles.updateOne(
{ username: "johndoe" },
{ $push: { interests: "photography" } }
);
업데이트된 프로필을 보고 새 관심사를 확인해 보겠습니다. find 메서드에서 프로젝션 (projection) 을 사용하여 username 및 interests 필드만 표시할 수 있습니다. 필드를 1로 설정하면 포함되고, _id를 0으로 설정하면 제외되어 출력을 깔끔하게 유지할 수 있습니다.
db.profiles.find(
{ username: "johndoe" },
{ username: 1, interests: 1, _id: 0 }
);
출력에는 새로 추가된 요소가 포함된 interests 배열이 표시됩니다.
[
{
"username": "johndoe",
"interests": ["technology", "travel", "photography"]
}
]
배열의 요소를 기반으로 사용자를 쿼리할 수도 있습니다. 예를 들어 "technology"에 관심 있는 모든 사용자를 찾으려면 다음을 사용합니다.
db.profiles.find({ interests: "technology" });
실제 애플리케이션에서는 사용자 설정과 같은 복잡한 구성을 저장해야 하는 경우가 많습니다. MongoDB 의 중첩 문서 지원은 이를 위해 이상적입니다. 이번 단계에서는 프로필에 상세한 settings 객체를 추가하고 업데이트합니다.
먼저 theme, language, notifications에 대한 중첩 필드를 가진 settings 객체를 추가합니다.
db.profiles.updateOne(
{ username: "johndoe" },
{
$set: {
settings: {
theme: "dark",
language: "en",
notifications: {
email: true,
sms: false
}
}
}
}
);
이제 전체 settings 객체를 다시 작성하지 않고 단일 중첩 필드를 업데이트해 보겠습니다. 점 표기법을 다시 사용하여 이를 수행할 수 있습니다. 사용자에 대해 SMS 알림을 활성화해 보겠습니다.
db.profiles.updateOne(
{ username: "johndoe" },
{ $set: { "settings.notifications.sms": true } }
);
이 명령은 중첩된 notifications 객체 내의 sms 필드를 정확하게 대상으로 하고 값을 true로 변경하며, settings 객체의 나머지 부분은 그대로 둡니다.
변경 사항을 확인하기 위해 프로젝션을 사용하여 사용자에게 해당하는 settings 객체만 검색해 보겠습니다.
db.profiles.find({ username: "johndoe" }, { settings: 1, _id: 0 });
출력에는 sms가 이제 true로 설정된 업데이트된 settings 객체가 표시됩니다.
[
{
"settings": {
"theme": "dark",
"language": "en",
"notifications": { "email": true, "sms": true }
}
}
]
이제 이 실습의 실제 단계를 완료했습니다. MongoDB 셸을 종료하려면 exit를 입력하거나 Ctrl+D를 누르면 됩니다.
exit;
이 실습에서는 MongoDB 에서 사용자 프로필을 구축하는 기본 사항을 배웠습니다. 기본적인 사용자 문서를 생성하는 것으로 시작하여 $set 연산자를 사용하여 새 정보로 업데이트하는 과정을 진행했습니다. 또한 배열과 $push 연산자를 사용하여 데이터 목록을 관리하는 방법, 점 표기법을 사용하여 중첩 문서로 복잡한 구성을 구조화하고 수정하는 방법을 배웠습니다. 이러한 기술은 MongoDB 에서 사용자 데이터를 관리하는 모든 애플리케이션에 대해 유연하고 확장 가능한 스키마를 설계하는 데 필수적입니다.