Node.js 약속 튜토리얼

⚡ 스마트 요약

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

  • 🔘 콜백 문제: 중첩된 콜백 함수는 길어지고 유지 관리가 어려워집니다.
  • ☑️ 약속의 기본 사항: 프로미스는 값을 반환하며 정확히 한 번만 완료됩니다.
  • ✅ 체인 : 그런 다음 그 자체가 프로미스를 반환하므로 삽입은 순서대로 실행됩니다.
  • 🧪 사용자 지정 약속: q 라이브러리의 denodeify는 모든 콜백을 래핑합니다.
  • 🛠️ 현대적 형태: async와 await는 then 콜백 없이 프로미스를 소비합니다.
  • 📊 오류 규칙: Node.js는 버전 15부터 처리되지 않은 거부 메시지로 인해 종료됩니다.

Node.js Promise 튜토리얼: 콜백을 Promise에 연결하는 방법

이전 튜토리얼에서 비동기 이벤트에 사용되는 콜백 함수를 보았을 것입니다. 하지만 때때로 콜백 함수는 중첩되기 시작하고 프로그램이 길고 복잡해지기 시작하면 악몽이 될 수 있습니다.

약속이란 무엇입니까?

약속에 대해 알아보기 전에, 먼저 "콜백" 함수가 무엇인지 다시 한번 살펴보겠습니다. Node.js를우리는 이전 장에서 이러한 콜백 함수를 많이 보았으므로, 그중 하나를 간단히 살펴보겠습니다.

아래 예는 연결하는 데 사용되는 코드 조각을 보여줍니다. MongoDB 데이터베이스를 검색하여 데이터베이스의 레코드 중 하나에 대한 업데이트 작업을 수행합니다.

Node.js 콜백 함수가 연결됩니다. MongoDB 그리고 기록을 업데이트합니다

  1. 위 코드에서 function(err,db) 부분은 익명 또는 콜백 함수의 선언으로 알려져 있습니다. MongoClient가 MongoDB 데이터베이스에서 연결 작업이 완료되면 콜백 함수로 돌아갑니다. 따라서 어떤 의미에서 연결 작업은 백그라운드에서 발생하고 완료되면 콜백 함수를 호출합니다. 이것이 Node.js의 핵심 중 하나이며 여러 작업이 동시에 발생하여 사용자가 작업을 수행하는 것을 차단하지 않도록 하는 것입니다.
  2. 두 번째 코드 블록은 콜백 함수가 실제로 호출될 때 실행되는 것입니다. 콜백 함수는 우리의 레코드 하나만 업데이트합니다. 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) 약속을 포함하도록 코드를 수정하세요.

Promise 모듈이 다시 작성하는 모습을 보여주는 에디터 스크린샷 MongoDB 최신 정보

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 설명 :

  1. 첫 번째 부분은 코드에서 promise 기능을 사용할 수 있게 해주는 'promise' 모듈을 포함하는 것입니다.
  2. 이제 MongoClient.connect 함수에 'then' 함수를 추가할 수 있습니다. 따라서 이것이 수행하는 작업은 데이터베이스에 대한 연결이 설정되면 이후에 정의된 코드 조각을 실행해야 한다는 것입니다.
  3. 마지막으로 이름이 "Martin"인 직원의 EmployeeName을 "Mohan"으로 업데이트하는 작업을 수행하는 코드 조각을 정의합니다.

참고 :

지금 내용을 확인해보면 MongoDB 데이터베이스에서 EmployeeName이 "Martin"인 레코드가 있으면 "Mohan"으로 업데이트된다는 것을 알 수 있습니다.

데이터가 데이터베이스에 제대로 삽입되었는지 확인하려면 다음 명령을 실행해야 합니다. MongoDB

  1. EmployeeDB를 사용하세요
  2. db.Employee.find({EmployeeName : “Mohan”})

첫 번째 명령문은 EmployeeDB 데이터베이스에 연결되었는지 확인합니다. 두 번째 명령문은 직원 이름이 "Mohan"인 레코드를 검색합니다.

중첩된 약속 다루기

Promise를 정의할 때 "then" 메서드 자체가 Promise를 반환한다는 점에 유의해야 합니다. 따라서 어떤 의미에서 약속은 서로 중첩되거나 연결될 수 있습니다.

아래 예에서는 연결을 사용하여 2개의 콜백 함수를 정의합니다. 두 함수 모두 레코드를 MongoDB 데이터 베이스.

(주의 사항: 체인화(Chaining)는 메소드 실행을 서로 연결하는 데 사용되는 개념입니다. 애플리케이션에 'methodA'와 'methodB'라는 2개의 메소드가 있다고 가정해 보겠습니다. 그리고 논리는 'methodA' 다음에 'methodB'를 호출해야 하며, 'methodA' 다음에 'methodB'가 직접 호출되는 방식으로 실행을 연결하는 것입니다.)

이 예제에서 주목해야 할 중요한 점은 중첩된 프로미스를 사용하면 코드가 더 깔끔하고, 읽기 쉽고, 유지 관리하기 쉬워진다는 것입니다.

두 직원 기록을 삽입하는 연결된 then 절 MongoDB

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 설명 :

  1. 이제 차례로 실행되는 2개의 "then" 절을 정의하고 있습니다. 첫 번째 then 절에서는 데이터베이스 연결이 포함된 'db' 매개변수를 전달합니다. 그런 다음 'Employee' 컬렉션에 레코드를 삽입하기 위해 'db' 연결의 컬렉션 속성을 사용합니다. 'insertOne' 메소드는 Employee 컬렉션에 실제 문서를 삽입하는 데 사용됩니다.
  2. 그런 다음 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) 사용자 지정 약속을 만드는 데 사용될 다음 코드를 정의합니다.

wrap으로 구축된 맞춤형 약속ping q denodeify를 사용한 추가 기능

Code 설명 :

  1. 첫 번째 비트는 require 키워드를 사용하여 'q' 라이브러리를 포함하는 것입니다. 이 라이브러리를 사용하면 콜백을 반환하는 모든 함수를 정의할 수 있습니다.
  2. 우리는 변수 a와 b에 정의된 두 숫자를 더하는 Add라는 함수를 만들고 있습니다. 이 값들의 합은 변수 c에 저장됩니다.
  3. 다음으로, q 라이브러리를 사용하여 Add 함수를 denodeify(어떤 함수든 프로미스를 반환하는 함수로 변환하는 데 사용되는 메서드)합니다. 다시 말해, Add 함수를 프로미스를 반환하는 함수로 변환하는 것입니다.
  4. 이제 "Add" 함수를 호출하고 Add 함수를 탈노드화하기 위해 수행한 이전 단계로 인해 반환 약속 값을 얻을 수 있습니다.
  5. 'then' 키워드는 함수가 성공적으로 실행되면 콘솔 로그에 "덧셈 함수 완료"라는 문자열을 표시하도록 지정하는 데 사용됩니다.

위 코드를 실행하면 아래와 같이 console.log에 "추가 함수 완료"라는 출력이 표시됩니다.

콘솔 출력: 사용자 정의 프로미스에서 덧셈 함수가 완료되었습니다.

자주 묻는 질문

Node.js 15 버전부터는 경고 대신 0이 아닌 종료 코드로 프로세스가 종료됩니다. 모든 체인에 `.catch()`를 추가하거나, 등록하세요. 프로세스 핸들러 로그를 기록하고 복구합니다.

`.catch()`는 try 블록과 같이 체인 앞부분에서 발생한 오류를 처리합니다. `.finally()`는 체인이 최종적으로 처리된 방식에 따라 실행되므로 연결을 종료하는 데 적합합니다.

Promise.all은 입력값 하나라도 거부되면 즉시 실패합니다. allSettled는 항상 해결되고 모든 결과를 보고합니다. race는 먼저 확정된 결과를 채택합니다. any는 하나의 성공이 필요하며, 그렇지 않으면 AggregateError를 발생시킵니다.

둘 다 동일한 프로미스를 사용합니다. `await`는 비동기 함수 내부에서 일시 정지를 발생시키므로 결과는 일반 변수에 저장되고 오류는 `try-catch` 블록으로 전달됩니다.

드물게. Generator yield를 사용하는 함수는 한때 co와 같은 라이브러리를 구동하는 데 사용되었지만, async와 await가 그 역할을 기본적으로 처리합니다. Generators는 여전히 지연 시퀀스와 사용자 정의 반복자에 적합합니다.

util.promisify는 콜백 스타일 함수를 직접 변환하고, fs.promises와 같은 모듈은 이미 프로미스를 반환합니다. 둘 다 위에 표시된 q 라이브러리를 대체합니다.

예. 머신러닝 분석기는 거부 처리기가 없는 체인, 루프 내 대기 시간, 순서에 따라 달라지는 쓰기 작업을 표시한 다음 결과를 순위별로 분류합니다. 테스트 가장 위험한 길을 택하라.

GitHub 부조종사 이와 유사한 에이전트형 도우미는 중첩된 콜백을 await 호출로 빠르게 재작성하지만, 오류 경로 때문에 각 재작성 작업은 검토가 필요합니다. 길 의미론은 조용히 변화한다.

이 게시물을 요약하면 다음과 같습니다.