PromleeBlog
sitemap
aboutMe

posting thumbnail
Node.js와 MongoDB 연동하기 - MongoDB 올인 13일차
Connecting Node.js with MongoDB - All-in Day 13

📅

🚀

들어가기 전에 🔗

지금까지 우리는 MongoDB의 기본 개념부터 고급 기능, 그리고 Atlas를 통한 클라우드 활용법과 다양한 관리 도구까지 폭넓게 살펴보았습니다.
이제 이 모든 지식을 바탕으로, 가장 인기 있는 서버사이드 JavaScript 환경인
Node.js
에서 MongoDB Atlas 클러스터에 접속하고, 데이터를 직접 생성, 조회, 수정, 삭제하는
CRUD 작업
을 수행하는 방법을 배워보겠습니다.

🚀

개발 환경 준비하기 🔗

Node.js에서 MongoDB를 사용하려면 몇 가지 준비가 필요합니다.

1. Node.js 및 npm 설치 🔗

Node.js가 설치되어 있지 않다면, 공식 웹사이트에서 LTS(Long Term Support) 버전을 다운로드하여 설치합니다. Node.js를 설치하면 패키지 매니저인 npm(Node Package Manager)도 함께 설치됩니다.
Mac OS에서 Node.js를 설치하는 방법은 MacOS에서 Node.js 설치하기(homebrew, nvm, npm)를 참고하세요.

2. 프로젝트 폴더 생성 및 초기화 🔗

작업할 프로젝트 폴더를 만들고, 해당 폴더로 이동한 뒤 npm을 사용하여 프로젝트를 초기화합니다.
터미널에서 실행
mkdir my-node-mongo-app
cd my-node-mongo-app
npm init -y 
npm init -y 명령어는 package.json 파일을 기본값으로 생성해 줍니다.
이 파일은 프로젝트 정보와 의존성(dependencies)을 관리합니다.
-y 플래그는 모든 질문에 기본값으로 응답하여 자동으로 생성합니다.

3. MongoDB Node.js 드라이버 설치 🔗

Node.js에서 MongoDB와 통신하기 위해서는 공식 MongoDB Node.js 드라이버를 설치해야 합니다.
프로젝트 폴더 내에서 다음 npm 명령어를 실행합니다.
터미널에서 실행
npm install mongodb
이 명령을 실행하면 mongodb 패키지가 다운로드되고, node_modules 폴더에 설치되며, package.json 파일의 dependencies 항목에도 추가됩니다.
이제 Node.js에서 MongoDB Atlas에 연결할 준비가 되었습니다!
준비 완료
준비 완료

🚀

MongoDB Atlas 연결 문자열(Connection String) 준비 🔗

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
🖐️
이 연결 문자열을 코드에 직접 사용하기 전에 다음 사항을 반드시 확인하고 수정해야 합니다.
👨‍💻
실제 애플리케이션에서는 연결 문자열(특히 비밀번호)을 소스 코드에 직접 하드코딩하는 것보다, 환경 변수(.env 파일 등)를 사용하여 안전하게 관리하는 것이 좋습니다.
연결 문자열
연결 문자열

🚀

Node.js에서 MongoDB Atlas에 연결하기 🔗

전체 코드는 CRUD 통합 코드에서 확인할 수 있습니다.
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 클러스터에 성공적으로 연결되고 해제되는 메시지를 볼 수 있습니다.
실행 결과
실행 결과

🚀

MongoDB 기본 CRUD 작업 수행하기 (Node.js) 🔗

이제 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 코드

1. 데이터 생성: Create - insertOne() 🔗

하나의 문서를 컬렉션에 삽입합니다.
// 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)를 포함하는 객체를 반환합니다.
Compass로 결과 확인
Compass로 결과 확인

2. 데이터 조회: Read - findOne(), find() 🔗

➡️

한 개의 문서 조회 🔗

조건에 맞는 첫 번째 문서를 찾습니다.
// run 함수 내부
 
    // 이름이 "홍길동"인 사용자 찾기
    const foundUser = await usersCollection.findOne({ name: "홍길동" });
    if (foundUser) {
      console.log("사용자 찾음:", foundUser);
    } else {
      console.log("해당 사용자를 찾을 수 없습니다.");
    }
findOne 결과 화면
findOne 결과 화면
➡️

여러 문서 조회 🔗

조건에 맞는 모든 문서를 찾습니다. find() 메서드는 커서(Cursor)를 반환하므로, toArray()를 사용하여 배열로 변환하거나 반복문을 통해 처리할 수 있습니다.
// run 함수 내부
 
    // 나이가 25세 이상인 모든 사용자 찾기
    const cursor = usersCollection.find({ age: { $gte: 25 } });
    const allUsersOver25 = await cursor.toArray();
    console.log("25세 이상 사용자 목록:", allUsersOver25);
 
    // 특정 필드만 선택하여 조회 (프로젝션)
    const projectionCursor = usersCollection.find(
      { age: { $gte: 25 } },
      { projection: { _id: 0, name: 1, email: 1 } } // 이름과 이메일만, _id는 제외
    );
    const projectedUsers = await projectionCursor.toArray();
    console.log("25세 이상 사용자 (이름, 이메일):", projectedUsers);
find 결과 화면
find 결과 화면

3. 데이터 수정: Update - updateOne() 🔗

조건에 맞는 첫 번째 문서를 수정합니다.
// run 함수 내부
 
    // 이름이 "홍길동"인 사용자의 나이를 31세로 수정
    const updateResult = await usersCollection.updateOne(
      { name: "홍길동" },               // 필터 조건
      { $set: { age: 31, status: "active" } } // 업데이트할 내용 ($set 연산자 사용)
    );
    console.log(`${updateResult.modifiedCount}개의 문서가 수정되었습니다.`);
updateOnematchedCount(조건에 맞는 문서 수)와 modifiedCount(실제로 수정된 문서 수)를 포함한 객체를 반환합니다.

4. 데이터 삭제 (Delete) - deleteOne() 🔗

조건에 맞는 첫 번째 문서를 삭제합니다.
// run 함수 내부
 
    // 이메일이 "gildong@example.com"인 사용자 삭제
    const deleteResult = await usersCollection.deleteOne({ email: "gildong@example.com" });
    console.log(`${deleteResult.deletedCount}개의 문서가 삭제되었습니다.`);
deleteOnedeletedCount(삭제된 문서 수)를 포함한 객체를 반환합니다.

🚀

결론 🔗

CRUD 통합 코드
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 환경에서 활용해 보시길 바랍니다.
다음 시간에는 Node.js 외에 다른 인기 있는 프로그래밍 언어인
Python과 Java에서 MongoDB를 연결하는 방법
에 대해 간략히 알아보겠습니다.

참고 🔗