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의 심장, 이벤트 루프와 워커 스레드"를 깊게 파헤쳐 보겠습니다.