Node.js 약속 튜토리얼
⚡ 스마트 요약
Node.js의 Promise는 깊게 중첩된 콜백 함수를 한 번만 실행되는 반환 객체로 대체하므로, 비동기 데이터베이스 작업은 익명 함수의 피라미드 구조 대신 일련의 then 절로 이루어진 평면적인 구조로 표현됩니다.

이전 튜토리얼에서 비동기 이벤트에 사용되는 콜백 함수를 보았을 것입니다. 하지만 때때로 콜백 함수는 중첩되기 시작하고 프로그램이 길고 복잡해지기 시작하면 악몽이 될 수 있습니다.
약속이란 무엇입니까?
약속에 대해 알아보기 전에, 먼저 "콜백" 함수가 무엇인지 다시 한번 살펴보겠습니다. Node.js를우리는 이전 장에서 이러한 콜백 함수를 많이 보았으므로, 그중 하나를 간단히 살펴보겠습니다.
아래 예는 연결하는 데 사용되는 코드 조각을 보여줍니다. MongoDB 데이터베이스를 검색하여 데이터베이스의 레코드 중 하나에 대한 업데이트 작업을 수행합니다.
- 위 코드에서 function(err,db) 부분은 익명 또는 콜백 함수의 선언으로 알려져 있습니다. MongoClient가 MongoDB 데이터베이스에서 연결 작업이 완료되면 콜백 함수로 돌아갑니다. 따라서 어떤 의미에서 연결 작업은 백그라운드에서 발생하고 완료되면 콜백 함수를 호출합니다. 이것이 Node.js의 핵심 중 하나이며 여러 작업이 동시에 발생하여 사용자가 작업을 수행하는 것을 차단하지 않도록 하는 것입니다.
- 두 번째 코드 블록은 콜백 함수가 실제로 호출될 때 실행되는 것입니다. 콜백 함수는 우리의 레코드 하나만 업데이트합니다. MongoDB 데이터 베이스.
그렇다면 약속은 무엇입니까? 음, Promise는 Node.js의 콜백 함수를 향상시킨 것일 뿐입니다. 개발 수명 주기 동안 여러 콜백 함수를 함께 중첩해야 하는 경우가 있을 수 있습니다. 이는 특정 시점에 지저분해지고 유지 관리가 어려울 수 있습니다. 간단히 말해서, Promise는 이러한 문제를 완화하기 위한 콜백의 향상된 기능입니다.
Promise의 기본 구문은 아래와 같습니다.
var promise = doSomethingAync()
promise.then(onFulfilled, onRejected)
- "doSomethingAync"는 어떤 종류의 처리를 수행하는 콜백이나 비동기 함수입니다.
- 이번에는 콜백을 정의할 때 '프라미스(promise)'라는 값이 반환되는데요.
- 약속이 반환되면 2개의 출력을 가질 수 있습니다. 이는 'then 절'로 정의됩니다. 작업은 'onFulfilled' 매개변수로 표시되는 성공일 수 있습니다. 또는 'onRejected' 매개변수로 표시되는 오류가 있을 수 있습니다.
A 약속 세 가지 상태 중 하나에 앉아 한 번 정착합니다.
| 주 정부 | 의미 |
|---|---|
| 대기중 | 아직 일이 끝나지 않았습니다. |
| 발송됨 | onFulfilled는 해당 값으로 실행됩니다. |
| 거부됨 | onRejected는 오류와 함께 실행됩니다. |
참고 : 따라서 Promise의 핵심 측면은 반환 값입니다. Node.js에서 일반 콜백을 사용할 때는 반환 값이라는 개념이 없습니다. 반환 값으로 인해 콜백 함수를 정의하는 방법을 더 많이 제어할 수 있습니다.
버전 참고: 이 예제들은 2026년 당시 활성 LTS 버전이었던 Node.js 24에서도 여전히 실행됩니다. Node.js 15 이후로는 처리되지 않은 거부 경고를 출력하는 대신 프로세스를 종료하므로 모든 체인을 .catch()로 닫으세요.
다음 주제에서는 Promise의 예와 콜백의 이점을 살펴보겠습니다.
약속에 대한 콜백
이제 Node.js 애플리케이션 내에서 "프라미스"를 사용하는 방법의 예를 살펴보겠습니다. Node.js 애플리케이션에서 Promise를 사용하려면 먼저 'promise' 모듈을 다운로드하여 설치해야 합니다.
이제 아래와 같이 코드를 수정하여 프로미스를 사용하여 'Employee' 컬렉션의 EmployeeName을 업데이트하겠습니다.
단계 1) 를 설치 NPM 모듈
Node.js 애플리케이션에서 Promise를 사용하려면 `promise` 모듈이 필요합니다. `promise` 모듈을 설치하려면 아래 명령어를 실행하세요.
npm 설치 약속
단계 2) 약속을 포함하도록 코드를 수정하세요.
var Promise = require('promise'); var MongoClient = require('mongodb').MongoClient; var url = 'mongodb://localhost/EmployeeDB'; MongoClient.connect(url) .then(function(err, db) { db.collection('Employee').updateOne({ "EmployeeName": "Martin" }, { $set: { "EmployeeName": "Mohan" } }); });
Code 설명 :
- 첫 번째 부분은 코드에서 promise 기능을 사용할 수 있게 해주는 'promise' 모듈을 포함하는 것입니다.
- 이제 MongoClient.connect 함수에 'then' 함수를 추가할 수 있습니다. 따라서 이것이 수행하는 작업은 데이터베이스에 대한 연결이 설정되면 이후에 정의된 코드 조각을 실행해야 한다는 것입니다.
- 마지막으로 이름이 "Martin"인 직원의 EmployeeName을 "Mohan"으로 업데이트하는 작업을 수행하는 코드 조각을 정의합니다.
참고 :
지금 내용을 확인해보면 MongoDB 데이터베이스에서 EmployeeName이 "Martin"인 레코드가 있으면 "Mohan"으로 업데이트된다는 것을 알 수 있습니다.
데이터가 데이터베이스에 제대로 삽입되었는지 확인하려면 다음 명령을 실행해야 합니다. MongoDB
- EmployeeDB를 사용하세요
- db.Employee.find({EmployeeName : “Mohan”})
첫 번째 명령문은 EmployeeDB 데이터베이스에 연결되었는지 확인합니다. 두 번째 명령문은 직원 이름이 "Mohan"인 레코드를 검색합니다.
중첩된 약속 다루기
Promise를 정의할 때 "then" 메서드 자체가 Promise를 반환한다는 점에 유의해야 합니다. 따라서 어떤 의미에서 약속은 서로 중첩되거나 연결될 수 있습니다.
아래 예에서는 연결을 사용하여 2개의 콜백 함수를 정의합니다. 두 함수 모두 레코드를 MongoDB 데이터 베이스.
(주의 사항: 체인화(Chaining)는 메소드 실행을 서로 연결하는 데 사용되는 개념입니다. 애플리케이션에 'methodA'와 'methodB'라는 2개의 메소드가 있다고 가정해 보겠습니다. 그리고 논리는 'methodA' 다음에 'methodB'를 호출해야 하며, 'methodA' 다음에 'methodB'가 직접 호출되는 방식으로 실행을 연결하는 것입니다.)
이 예제에서 주목해야 할 중요한 점은 중첩된 프로미스를 사용하면 코드가 더 깔끔하고, 읽기 쉽고, 유지 관리하기 쉬워진다는 것입니다.
var Promise = require('promise'); var MongoClient = require('mongodb').MongoClient; var url = 'mongodb://localhost/EmployeeDB'; MongoClient.connect(url) .then(function(db) { db.collection('Employee').insertOne({ Employeeid: 4, EmployeeName: "NewEmployee" }) .then(function(db1) { db1.collection('Employee').insertOne({ Employeeid: 5, EmployeeName: "NewEmployee1" }) }) });
Code 설명 :
- 이제 차례로 실행되는 2개의 "then" 절을 정의하고 있습니다. 첫 번째 then 절에서는 데이터베이스 연결이 포함된 'db' 매개변수를 전달합니다. 그런 다음 'Employee' 컬렉션에 레코드를 삽입하기 위해 'db' 연결의 컬렉션 속성을 사용합니다. 'insertOne' 메소드는 Employee 컬렉션에 실제 문서를 삽입하는 데 사용됩니다.
- 그런 다음 2를 사용하고 있습니다.nd then 절을 사용하여 데이터베이스에 다른 레코드를 삽입할 수도 있습니다.
지금 내용을 확인해보면 MongoDB 데이터베이스에서 2개의 레코드가 삽입된 것을 확인할 수 있습니다. MongoDB 데이터 베이스.
현대적 표현: ES2017부터 표준으로 자리 잡은 async와 await는 then 콜백 없이 이러한 프로미스를 처리하며, 대부분의 기존 프로미스를 대체했습니다. 생성기 기반 co와 같은 흐름 제어 라이브러리가 있는 반면, 네이티브 Promise 지원으로 인해 q와 bluebird는 불필요해집니다. 두 번째 블록은 db만 수신하는 경우를 보여줍니다.
맞춤 약속 만들기
Node.js 모듈 'q'를 사용하면 사용자 정의 프로미스를 생성할 수 있습니다. 'q' 라이브러리는 Node Package Manager를 사용하여 다운로드하고 설치해야 합니다. 'q' 라이브러리를 설치한 후에는 "denodeify" 메서드를 호출하여 모든 함수를 프로미스를 반환하는 함수로 만들 수 있습니다.
아래 예에서 우리는 숫자 2개를 더하는 "Add"라는 간단한 함수를 만들 것입니다. 우리는 이 함수를 promise를 반환하는 함수로 변환할 것입니다.
완료되면 Add 함수에서 반환된 Promise를 사용하여 console.log에 메시지를 표시합니다.
Promise를 반환하는 사용자 정의 함수를 생성하려면 아래 단계를 따르세요.
단계 1) NPM 모듈 설치
Node.js 애플리케이션에서 'q'를 사용하려면 'q' 모듈이 필요합니다. 'q' 모듈을 설치하려면 아래 명령어를 실행하세요.
npm 설치 q
단계 2) 사용자 지정 약속을 만드는 데 사용될 다음 코드를 정의합니다.
Code 설명 :
- 첫 번째 비트는 require 키워드를 사용하여 'q' 라이브러리를 포함하는 것입니다. 이 라이브러리를 사용하면 콜백을 반환하는 모든 함수를 정의할 수 있습니다.
- 우리는 변수 a와 b에 정의된 두 숫자를 더하는 Add라는 함수를 만들고 있습니다. 이 값들의 합은 변수 c에 저장됩니다.
- 다음으로, q 라이브러리를 사용하여 Add 함수를 denodeify(어떤 함수든 프로미스를 반환하는 함수로 변환하는 데 사용되는 메서드)합니다. 다시 말해, Add 함수를 프로미스를 반환하는 함수로 변환하는 것입니다.
- 이제 "Add" 함수를 호출하고 Add 함수를 탈노드화하기 위해 수행한 이전 단계로 인해 반환 약속 값을 얻을 수 있습니다.
- 'then' 키워드는 함수가 성공적으로 실행되면 콘솔 로그에 "덧셈 함수 완료"라는 문자열을 표시하도록 지정하는 데 사용됩니다.
위 코드를 실행하면 아래와 같이 console.log에 "추가 함수 완료"라는 출력이 표시됩니다.





