Node.js 마스터 클래스 Ep 4. 데이터베이스 연동과 비동기 처리 실전

Ep 4. 데이터베이스 연동과 비동기 처리 실전

서버를 껐다 켜면 사라지는 변수(Variable) 대신, 영원히 데이터를 저장할 수 있는 데이터베이스(DB)가 필요합니다. 오늘은 Node.js에서 가장 많이 쓰이는 MongoDB와 비동기 처리를 위한 `async/await`를 알아보겠습니다.

---

1. 데이터베이스 선택: MongoDB vs SQL

Node.js는 모든 데이터베이스와 잘 어울리지만, 특히 MongoDB와 찰떡궁합입니다.

  • MongoDB (NoSQL): 데이터를 JSON(BSON) 형태로 저장합니다. 자바스크립트 객체와 구조가 똑같아서 배우기 쉽습니다.
  • MySQL/PostgreSQL (SQL): 엑셀처럼 표(Table) 형태로 저장합니다. 관계(Relation)가 복잡할 때 좋습니다.

오늘은 Mongoose라는 도구를 이용해 MongoDB를 사용하는 흉내를 내보겠습니다. (실제 DB 설치 없이 개념 위주로 설명합니다)

2. 지옥에서 탈출하라: Callback Hell vs Promise vs Async/Await

Node.js는 비동기 처리가 기본이라고 했죠? 예전에는 콜백 함수를 계속 겹쳐 써서 코드가 오른쪽으로 계속 밀려나는 "콜백 지옥"이 있었습니다.

(1) 과거: Callback Hell

getData((a) => {
  getMoreData(a, (b) => {
    getFinalData(b, (c) => {
      console.log(c);
    });
  });
});

보기만 해도 어지럽죠? 😵

(2) 현재: Async/Await

최신 자바스크립트에서는 `async`와 `await` 키워드로 비동기 코드를 마치 동기 코드처럼 깔끔하게 짤 수 있습니다.

async function main() {
  try {
    const a = await getData();
    const b = await getMoreData(a);
    const c = await getFinalData(b);
    console.log(c);
  } catch (error) {
    console.error("에러 발생!", error);
  }
}

훨씬 읽기 쉽죠? `await`는 "이 작업이 끝날 때까지 기다려!"라는 뜻입니다.

---

🛠️ 오늘의 미션: 가짜 DB 조회 함수 만들기

실제 DB는 없지만, `setTimeout`을 이용해 DB에서 데이터를 가져오는 것처럼 오래 걸리는 함수를 만들고 `async/await`로 제어해 봅시다.

1. `async-db.js` 파일을 만듭니다.

2. 아래 코드를 작성합니다.

// 1. 가짜 DB 조회 함수 (Promise 반환)
function getUserFromDB(id) {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      if (id === 1) {
        resolve({ id: 1, name: "홍길동" });
      } else {
        reject("사용자를 찾을 수 없습니다.");
      }
    }, 2000); // 2초 걸림
  });
}

// 2. 실행 함수 (Async/Await)
async function showUserProfile(id) {
  console.log(`${id}번 사용자 조회 중...`);
  try {
    const user = await getUserFromDB(id);
    console.log("조회 성공:", user);
  } catch (error) {
    console.log("조회 실패:", error);
  }
}

// 테스트
showUserProfile(1); // 성공 케이스
showUserProfile(2); // 실패 케이스

3. `node async-db.js`를 실행해 보세요.

4. "조회 중..." 메시지가 뜨고 2초 뒤에 결과가 나오나요? 이것이 바로 비동기 처리의 핵심입니다!

---

🔗 다음 예고

이제 기능 구현은 다 배웠습니다. 하지만 진정한 고수는 "내부 동작 원리"를 꿰뚫고 있어야 하죠. 다음 시간에는 "Node.js의 심장, 이벤트 루프와 워커 스레드"를 깊게 파헤쳐 보겠습니다.