Node.js가 설치되어 있지 않다면, 공식 웹사이트에서 LTS(Long Term Support) 버전을 다운로드하여 설치합니다. Node.js를 설치하면 패키지 매니저인 npm(Node Package Manager)도 함께 설치됩니다.
Mac OS에서 Node.js를 설치하는 방법은 MacOS에서 Node.js 설치하기(homebrew, nvm, npm)를 참고하세요.
11일차 'MongoDB Atlas 시작하기' 편에서 Atlas 클러스터를 생성하고 데이터베이스 사용자를 만들었으며, 네트워크 접근 설정을 완료했습니다.
이제 해당 클러스터에 접속하기 위한
연결 문자열(Connection String URI)
이 필요합니다.
Atlas 대시보드에서 클러스터의 'Connect' 버튼을 누르고, 'Drivers' (또는 'Connect your application') 섹션에서 Node.js를 선택하면 연결 문자열을 얻을 수 있습니다.
연결 문자열은 보통 다음과 같은 형식을 가집니다.
mongodb+srv://<username>:<password>@<cluster-url>/<dbname>?retryWrites=true&w=majority
🖐️
이 연결 문자열을 코드에 직접 사용하기 전에 다음 사항을 반드시 확인하고 수정해야 합니다.
<username>: Atlas에서 생성한 데이터베이스 사용자 이름으로 변경합니다.
<password>: 해당 사용자의 비밀번호로 변경합니다.
<dbname>: 연결 시 기본으로 사용할 데이터베이스 이름입니다. (예: myAppDB) 애플리케이션 코드에서 나중에 지정할 수도 있으며, 생략 시 test 데이터베이스를 사용합니다.
👨💻
실제 애플리케이션에서는 연결 문자열(특히 비밀번호)을 소스 코드에 직접 하드코딩하는 것보다, 환경 변수(.env 파일 등)를 사용하여 안전하게 관리하는 것이 좋습니다.
MongoDB Node.js 드라이버의 핵심은 MongoClient 객체입니다. 이 객체를 사용하여 MongoDB 서버에 연결하고 다양한 작업을 수행할 수 있습니다.
다음은 기본적인 연결 및 해제 코드 구조입니다. 비동기 처리를 위해 async/await를 사용합니다.
index.js
const { MongoClient } = require('mongodb'); // mongodb 드라이버에서 MongoClient 가져오기// 1. Atlas 연결 문자열 준비 (실제 값으로 대체해야 함)const uri = "mongodb+srv://myAppUser:yourStrongPassword@myfirstatlascluster.xxxxx.mongodb.net/myAppDB?retryWrites=true&w=majority";// 2. MongoClient 인스턴스 생성const client = new MongoClient(uri);async function run() { try { // 3. MongoDB 서버에 연결 await client.connect(); console.log("MongoDB Atlas에 성공적으로 연결되었습니다!"); // 4. 데이터베이스 및 컬렉션 작업 수행 (이후 CRUD 예제에서 다룰 예정) // 예: const database = client.db("myAppDB"); // const usersCollection = database.collection("users"); } catch (error) { console.error("MongoDB 연결 중 오류 발생:", error); } finally { // 5. 모든 작업이 끝나면 클라이언트 연결 해제 // 실제 애플리케이션에서는 서버가 종료될 때 한 번만 호출하는 것이 일반적입니다. await client.close(); console.log("MongoDB 연결이 해제되었습니다."); }}// 스크립트 실행run().catch(console.dir);
이 코드를 index.js와 같은 파일로 저장하고 터미널에서 node index.js 명령으로 실행하면, Atlas 클러스터에 성공적으로 연결되고 해제되는 메시지를 볼 수 있습니다.
이제 Atlas에 연결했으니, MongoClient를 통해 데이터베이스 및 컬렉션 객체를 얻어 CRUD 작업을 수행해 보겠습니다.
앞선 run 함수 내의 // 4. 데이터베이스 및 컬렉션 작업 수행 주석 부분에 아래 코드들을 추가하여 테스트할 수 있습니다.
먼저, 데이터베이스와 컬렉션 객체를 가져옵니다.
// run 함수 내부 ... await client.connect(); console.log("MongoDB Atlas에 성공적으로 연결되었습니다!"); const database = client.db("myAppDB"); // 기본 DB 외 다른 DB 사용 시 명시 const usersCollection = database.collection("users"); // 'users' 컬렉션 사용// ... 이후 CRUD 코드
// run 함수 내부, usersCollection 선언 후 // 새로운 사용자 문서 생성 const newUser = { name: "홍길동", age: 30, email: "gildong@example.com", hobbies: ["독서", "등산"], createdAt: new Date() }; const insertResult = await usersCollection.insertOne(newUser); console.log(`새로운 사용자가 추가되었습니다. ID: ${insertResult.insertedId}`);
insertOne 메서드는 삽입된 문서의 고유 ID(_id)를 포함하는 객체를 반환합니다.
// run 함수 내부 // 이름이 "홍길동"인 사용자 찾기 const foundUser = await usersCollection.findOne({ name: "홍길동" }); if (foundUser) { console.log("사용자 찾음:", foundUser); } else { console.log("해당 사용자를 찾을 수 없습니다."); }
// run 함수 내부 // 이름이 "홍길동"인 사용자의 나이를 31세로 수정 const updateResult = await usersCollection.updateOne( { name: "홍길동" }, // 필터 조건 { $set: { age: 31, status: "active" } } // 업데이트할 내용 ($set 연산자 사용) ); console.log(`${updateResult.modifiedCount}개의 문서가 수정되었습니다.`);
updateOne은 matchedCount(조건에 맞는 문서 수)와 modifiedCount(실제로 수정된 문서 수)를 포함한 객체를 반환합니다.
// run 함수 내부 // 이메일이 "gildong@example.com"인 사용자 삭제 const deleteResult = await usersCollection.deleteOne({ email: "gildong@example.com" }); console.log(`${deleteResult.deletedCount}개의 문서가 삭제되었습니다.`);
const { MongoClient } = require('mongodb');const uri = "mongodb+srv://myAppUser:yourStrongPassword@myfirstatlascluster.xxxxx.mongodb.net/myAppDB?retryWrites=true&w=majority";async function run() { try { await client.connect(); console.log("MongoDB Atlas에 성공적으로 연결되었습니다!"); const database = client.db("myAppDB"); const usersCollection = database.collection("users"); // Create const newUser = { name: "이순신", age: 45, email: "sunsin@example.com", createdAt: new Date() }; const insertResult = await usersCollection.insertOne(newUser); console.log(`새로운 사용자 추가: ID ${insertResult.insertedId}`); // Read One const foundUser = await usersCollection.findOne({ name: "이순신" }); console.log("사용자 조회 (findOne):", foundUser); // Read Many const allUsers = await usersCollection.find({ age: { $gte: 40 } }).toArray(); console.log("40세 이상 사용자 (find):", allUsers); // Update One const updateResult = await usersCollection.updateOne( { name: "이순신" }, { $set: { status: "general" } } ); console.log(`${updateResult.modifiedCount}개 문서 수정됨.`); // Delete One const deleteResult = await usersCollection.deleteOne({ name: "이순신" }); console.log(`${deleteResult.deletedCount}개 문서 삭제됨.`); } catch (error) { console.error("오류 발생:", error); } finally { await client.close(); console.log("MongoDB 연결 해제됨."); }}run().catch(console.dir);
실행 결과
MongoDB Atlas에 성공적으로 연결되었습니다!새로운 사용자 추가: ID 681c1bd18bd0002f597d521c사용자 조회 (findOne): { _id: new ObjectId('681c1bd18bd0002f597d521c'), name: '이순신', age: 45, email: 'sunsin@example.com', createdAt: 2025-05-08T02:49:53.643Z}40세 이상 사용자 (find): [ { _id: new ObjectId('681c1bd18bd0002f597d521c'), name: '이순신', age: 45, email: 'sunsin@example.com', createdAt: 2025-05-08T02:49:53.643Z }]1개 문서 수정됨.1개 문서 삭제됨.MongoDB 연결 해제됨.
위 코드를 실행하면, 각 CRUD 작업의 결과를 콘솔에서 확인할 수 있습니다.
오늘은 Node.js 환경에서 공식 MongoDB 드라이버를 사용하여 MongoDB Atlas 클러스터에 연결하고, 기본적인 CRUD(Create, Read, Update, Delete) 작업을 수행하는 실질적인 방법을 배웠습니다.
개발 환경 준비부터 연결 문자열 설정, MongoClient를 활용한 연결 및 해제, 그리고 각 CRUD 작업에 해당하는 메서드(insertOne, findOne, find, updateOne, deleteOne) 사용법까지 예제 코드를 통해 자세히 살펴보았습니다.
앞으로 더 복잡한 쿼리, 집계 연산, 트랜잭션 처리 등 다양한 고급 기능들을 Node.js 환경에서 활용해 보시길 바랍니다.