[MongoDB 기초부터 실무까지] 4. Node.js 동기 프로그래밍(Callback, Promise, Await)

2022. 7. 27. 22:04· DB/MongoDB
목차
  1. 1. 동기 프로그래밍 vs 비동기 프로그래밍
  2. 2. 동기 프로그래밍으로 개발하는 방법
반응형

이 포스팅은 아래의 강의를 참고한 개인 정리본이니 강의를 통해 공부하시는 것을 추천드립니다.

 

https://inf.run/bWm8

 

mongoDB 기초부터 실무까지(feat. Node.js) - 인프런 | 강의

mongoDB, NoSQL 요즘 많이 들리지만 아직은 낯선 데이터베이스인가요? 관계형 데이터베이스(RDS/SQL)처럼 사용하고 계시지는 않으신가요? 아무리 좋은 기술도 올바르게 사용하지 않으면 역효과가 발

www.inflearn.com


1. 동기 프로그래밍 vs 비동기 프로그래밍

동기 프로그래밍 : 어떤 작업을 요청하고 그 작업이 완료되어야 다음 작업을 진행하는 형식

비동기 프로그래밍 : 어떤 작업을 요청하고 그 작업이 완료되기도 전에 다음 작업을 진행하는 형식

 

Node.js의 기본인 JavaScript는 비동기 호출 방식의 언어이다.

 

 

2. 동기 프로그래밍으로 개발하는 방법

Node.js에서 동기 프로그래밍으로 개발하기 위해서 3가지 방법에 대해서 정리하도록 하겠다.

 

1) Callback

아래의 소스는 addSum 함수를 거친 후에 callback 함수로 넘겨준 후 결과 or 에러를 통해서 콜백 함수가 처리하는 방식이다.

const addSum = function(a, b, callback){
    setTimeout(function(){
        if(typeof a != "number" || typeof b != "number"){
            return callback('a and b must be number');
        }
        callback(undefined, a+b);
    }, 3000);
}

// 일반적인 callback 함수
let callback = (error, result) => {
    if(error)
        return console.log({error});
        console.log({result});
}

addSum(10,20,callback);
addSum(10,'20',callback);

 

* callback 함수 안에서 성공 시, 다시 addSum을 호출 하는 방법

const addSum = function(a, b, callback){
    setTimeout(function(){
        if(typeof a != "number" || typeof b != "number"){
            return callback('a and b must be number');
        }
        callback(undefined, a+b);
    }, 3000);
}


// callback 함수 안에서 성공 시, 다시 addSum을 호출 하는 방법
// 아래처럼 다시 호출하려면 그만큼 깊게 계속 호출해야함 (변수이름도 바꿔줘야하므로 불편함)
addSum(10,20,(error, result) => {
    if(error)
        return console.log({error});

    console.log({result});
    addSum(result, 30, (error2, result2) => {
        if(error2)
            return console.log({error2});
            console.log({result2});
    });
});

 

 

2) Promise 

아래의 소스는 addSum 함수를 거친 후에 Promise라는 함수에 결과값과 함께 보내주면 결과 or 에러를 처리할 수 있다.

const addSum = function(a, b){
    // resolve : 응답이 성공했을 때
    // reject : 응답이 실패했을 때
    // resolve or reject 가 호출되면 해당 함수의 나머지 로직은 타지 않는다. (callback의 경우는 return 해주지 않으면 나머지 로직을 탐)
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            // a,b는 숫자만 인자로 받을 수 있다.
            if(typeof a != 'number' || typeof b != 'number'){
                reject('a and b must be number');
            }
            resolve(a+b);
        }, 3000);
    })
}

// 일반적인 promise 함수
addSum(10,20)
    .then(result => console.log({result}))
    .catch(error => console.log({error}));

 

 

* Promise 내에서 성공 시, 다시 addSum을 호출 하는 방법

const addSum = function(a, b){
    // resolve : 응답이 성공했을 때
    // reject : 응답이 실패했을 때
    // resolve or reject 가 호출되면 해당 함수의 나머지 로직은 타지 않는다. (callback의 경우는 return 해주지 않으면 나머지 로직을 탐)
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            // a,b는 숫자만 인자로 받을 수 있다.
            if(typeof a != 'number' || typeof b != 'number'){
                reject('a and b must be number');
            }
            resolve(a+b);
        }, 3000);
    })
}



// Promise 내에서 재호출 방법
addSum(10,20)
    .then(result => {
        console.log({result});
        return addSum(result, 30);
    })
    .then(result2 => console.log({result2}))
    .catch(error => console.log({error}));

 

3) Await

아래의 소스처럼 await를 이용해서 간단하게 동기 처리를 할 수 있다.

const addSum = function(a, b){
    // resolve : 응답이 성공했을 때
    // reject : 응답이 실패했을 때
    // resolve or reject 가 호출되면 해당 함수의 나머지 로직은 타지 않는다. (callback의 경우는 return 해주지 않으면 나머지 로직을 탐)
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            // a,b는 숫자만 인자로 받을 수 있다.
            if(typeof a != 'number' || typeof b != 'number'){
                reject('a and b must be number');
            }
            resolve(a+b);
        }, 3000);
    })
}

// await를 이용한 재호출
const totalSum = async() => {
    try{
        let sum = await addSum(10,10);
        let sum2 = await addSum(sum, 10);

        console.log({sum, sum2});
    }catch(err){
        if(err)
            console.log(err);
    }
}
totalSum();

 

 

이것으로, node.js의 동기 프로그래밍 방법을 간단하게나마 알아봤으니, 다음에는 이 동기 방식으로 DB에 접근하는 것을 공부해보겠다.

반응형

'DB > MongoDB' 카테고리의 다른 글

[MongoDB 기초부터 실무까지] 6. Board API 만들기 및 라우터 안에 라우터 파라미터 사용 방법  (0) 2022.08.05
[MongoDB 기초부터 실무까지] 5. Node.js로 MongoDB 접근해보기  (0) 2022.08.01
[MongoDB 기초부터 실무까지] 3. Node.js 환경 세팅 및 REST API 만들기  (0) 2022.07.25
[MongoDB 기초부터 실무까지] 2. 데이터 간단하게 조작해보기  (0) 2022.07.23
[MongoDB 기초부터 실무까지] 1. MongoDB 설치  (0) 2022.07.20
  1. 1. 동기 프로그래밍 vs 비동기 프로그래밍
  2. 2. 동기 프로그래밍으로 개발하는 방법
'DB/MongoDB' 카테고리의 다른 글
  • [MongoDB 기초부터 실무까지] 6. Board API 만들기 및 라우터 안에 라우터 파라미터 사용 방법
  • [MongoDB 기초부터 실무까지] 5. Node.js로 MongoDB 접근해보기
  • [MongoDB 기초부터 실무까지] 3. Node.js 환경 세팅 및 REST API 만들기
  • [MongoDB 기초부터 실무까지] 2. 데이터 간단하게 조작해보기
멍목
멍목
개발 관련 새롭게 알게 된 지식이나 좋은 정보들을 메모하는 공간입니다.
반응형
멍목
김멍목의 개발블로그
멍목
전체
오늘
어제
  • 분류 전체보기 (514)
    • BE (190)
      • Spring (21)
      • Java (141)
      • Kotlin (6)
      • JPA (22)
    • FE (33)
      • Javascript (16)
      • Typescript (0)
      • React (5)
      • Vue.js (9)
      • JSP & JSTL (3)
    • DB (32)
      • Oracle (22)
      • MongoDB (10)
    • Algorithm (195)
    • Linux (8)
    • Git (6)
    • etc (42)
    • ---------------------------.. (0)
    • 회계 (4)
      • 전산회계 2급 (4)
    • 잡동사니 (2)

블로그 메뉴

  • 홈
  • 관리

공지사항

인기 글

태그

  • 자바 공부
  • vue3 공부
  • 프로젝트로 배우는 Vue.js 3
  • MongoDB with Node.js
  • 알고리즘공부
  • 자기 공부
  • 코틀린
  • 자기공부
  • 이펙티브 자바
  • 자바 개발자를 위한 코틀린 입문
  • 자기개발
  • Oracle
  • Effective Java
  • 자기 개발
  • 자바공부
  • Java to Kotlin
  • 전산회계 2급 준비
  • JPA
  • 이펙티브자바
  • 자바 테스팅 프레임워크
  • MongoDB 공부
  • 알고리즘 공부
  • 더 자바 애플리케이션을 테스트하는 다양한 방법
  • java 8
  • junit5
  • 더 자바 Java 8
  • JPA 공부
  • 코테공부
  • 코테 공부
  • MongoDB 기초부터 실무까지

최근 댓글

최근 글

hELLO · Designed By 정상우.v4.2.0
멍목
[MongoDB 기초부터 실무까지] 4. Node.js 동기 프로그래밍(Callback, Promise, Await)
상단으로

티스토리툴바

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.