프로그래밍/Node.js

[Node.js 강의 시리즈] 17강 - 비동기 처리 패턴 비교

월횽 2024. 7. 16. 06:30
728x90
반응형
SMALL

콜백, 프로미스, async/await의 차이점과 장단점을 비교하고, 각 패턴을 언제 사용하면 좋은지 이해한다.

 

1. 비동기 처리 패턴 개요

비동기 프로그래밍이란?

728x90

· 비동기 프로그래밍은 긴 작업을 수행하는 동안 프로그램의 실행을 중단하지 않고, 나중에 그 작업이 완료되면 결과를 처리하는 방식이다.
· 비동기 처리는 사용자 경험을 향상시키고, 서버의 효율성을 높일 수 있다.

 

주요 비동기 처리 패턴

· 콜백 함수
· 프로미스
· async/await

 

2. 콜백 함수

콜백 함수란?

반응형

· 비동기 작업이 완료되면 호출되는 함수.
· 함수의 인수로 전달되어 작업 완료 후 호출된다.
· 초기 Node.js 코드에서 많이 사용됨.

 

콜백 함수 사용 예제

const fs = require('fs');

fs.readFile('example.txt', 'utf8', (error, data) => {
  if (error) {
    console.error('Error reading file:', error);
  } else {
    console.log('File content:', data);
  }
});

 

 

장점

· 간단하고 이해하기 쉬움.
· Node.js 초기 버전과 호환됨.

단점

· 콜백 지옥(Callback Hell): 중첩된 콜백으로 인해 코드 가독성이 떨어지고, 유지보수가 어려워짐.
· 에러 처리의 어려움: 여러 콜백에서 발생하는 에러를 일관되게 처리하기 어려움.

 

3. 프로미스(Promise)

SMALL

프로미스란?

· 비동기 작업의 결과를 나타내는 객체.
· then, catch, finally 메서드를 통해 비동기 작업 완료 후의 동작을 정의할 수 있음.

 

프로미스 사용 예제

const fs = require('fs').promises;

fs.readFile('example.txt', 'utf8')
  .then((data) => {
    console.log('File content:', data);
  })
  .catch((error) => {
    console.error('Error reading file:', error);
  })
  .finally(() => {
    console.log('Read operation complete');
  });

 

 

장점

· 콜백 지옥을 해결하고, 코드 가독성을 높임.
· then, catch 체이닝을 통해 명확한 비동기 처리 흐름을 제공.
· 일관된 에러 처리 가능.

 

단점

· 문법이 콜백보다 다소 복잡할 수 있음.
· 여러 프로미스를 병렬로 처리할 때 코드가 길어질 수 있음.

 

4. async/await

 

async/await란?

· ES8에 도입된 비동기 처리 패턴.
· async 키워드를 함수 앞에 붙여 사용하고, await 키워드를 비동기 작업 앞에 사용하여 결과를 기다림.

 

async/await 사용 예제

const fs = require('fs').promises;

async function readFileContent() {
  try {
    const data = await fs.readFile('example.txt', 'utf8');
    console.log('File content:', data);
  } catch (error) {
    console.error('Error reading file:', error);
  } finally {
    console.log('Read operation complete');
  }
}

readFileContent();

 

 

장점

· 동기 코드처럼 작성할 수 있어 가독성이 매우 높음.
· 에러 처리를 try와 catch 블록을 통해 일관되게 처리할 수 있음.
· 디버깅이 쉬움.

단점

· async 함수 내에서만 await를 사용할 수 있음.
· 오래된 Node.js 버전에서는 지원되지 않음.

 

5. 비동기 처리 패턴 비교

패턴 장점 단점
콜백 간단하고 이해하기 쉬움 콜백 지옥 발생 가능, 에러 처리 어려움
프로미스 콜백 지옥 해결, 코드 가독성 향상 문법이 다소 복잡, 병렬 처리 코드 길어질 수 있음
async/await 동기 코드처럼 작성 가능, 가독성 높음, 디버깅 쉬움 async 함수 내에서만 사용 가능, 오래된 Node.js 버전에서 지원되지 않음

 

6. 언제 어떤 패턴을 사용할 것인가?

 

콜백 함수

· 단순한 비동기 작업.
· 코드 가독성이 중요한 경우가 아닐 때.

 

프로미스

· 여러 비동기 작업을 체이닝해야 할 때.
· 콜백 지옥을 피하고 싶을 때.

 

async/await

· 가독성과 유지보수성이 중요한 복잡한 비동기 작업.
· 최신 Node.js 버전을 사용할 때.

 

실습: 비동기 처리 패턴 비교

 

1. 콜백 함수 사용 예제 작성

· 파일을 읽고, 내용을 출력하는 콜백 함수 예제를 작성하세요.

const fs = require('fs');

fs.readFile('example.txt', 'utf8', (error, data) => {
  if (error) {
    console.error('Error reading file:', error);
  } else {
    console.log('File content:', data);
  }
});

 

 

2. 프로미스 사용 예제 작성

· 파일을 읽고, 내용을 출력하는 프로미스 예제를 작성하세요.

const fs = require('fs').promises;

fs.readFile('example.txt', 'utf8')
  .then((data) => {
    console.log('File content:', data);
  })
  .catch((error) => {
    console.error('Error reading file:', error);
  })
  .finally(() => {
    console.log('Read operation complete');
  });

 

 

3. async/await 사용 예제 작성

· 파일을 읽고, 내용을 출력하는 async/await 예제를 작성하세요.

const fs = require('fs').promises;

async function readFileContent() {
  try {
    const data = await fs.readFile('example.txt', 'utf8');
    console.log('File content:', data);
  } catch (error) {
    console.error('Error reading file:', error);
  } finally {
    console.log('Read operation complete');
  }
}

readFileContent();

 

 

- 이전 수업 목록

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

728x90
반응형
LIST