Node.js에서 비동기 처리: Callback, Promise, async/await 사용법

Node.js에서 비동기 처리: Callback, Promise, async/await 사용법

Node.js의 핵심 특징 중 하나는 비동기 이벤트 기반 프로그래밍입니다. 비동기 프로그래밍은 I/O 작업, 파일 시스템 작업, 네트워크 요청 등을 처리할 때 코드 실행을 차단하지 않고 작업의 완료를 기다리는 패턴입니다. 이는 더 효율적인 리소스 사용과 빠른 응답 시간을 가능하게 합니다.

동기적 처리

// 'fs' 모듈을 불러옵니다.
const fs = require('fs');

try {
  // 'fs.readFileSync' 메소드를 사용해 'example.txt' 파일을 동기적으로 읽습니다.
  // 이 메소드는 파일의 내용을 문자열로 바로 반환합니다.
  const data = fs.readFileSync('example.txt', 'utf-8');
  // 파일의 내용을 콘솔에 출력합니다.
  console.log(data);
} catch (err) {
  // 파일 읽기 작업에서 오류가 발생하면 오류 메시지를 출력합니다.
  console.error('파일 읽기 실패:', err);
}

코드는 fs.readFileSync 함수를 사용하여 지정된 파일의 내용을 동기적으로 읽고, 그 결과를 data 변수에 저장합니다. 함수 호출이 바로 결과를 반환하기 때문에, 비동기 처리 방식에서 사용했던 콜백 함수는 필요 없습니다. 오류 처리를 위해 try...catch 구문을 사용하여, 파일 읽기 중 발생할 수 있는 오류를 적절히 처리합니다.

비동기적 처리와 비교했을 때, 동기적 처리 방식은 코드의 실행 흐름이 순차적이고 직관적이지만, I/O 작업이 블로킹되어 애플리케이션의 전체적인 성능에 영향을 줄 수 있다는 단점이 있습니다. 따라서, Node.js 애플리케이션에서는 주로 비동기적 처리 방식을 권장합니다.

콜백 (Callback)

콜백은 비동기 작업을 처리하기 위해 널리 사용되는 초기 패턴 중 하나입니다. 함수를 다른 함수의 인자로 전달하여, 작업이 완료된 후에 해당 함수를 실행시키는 방식으로 작동합니다.

// 'fs' 모듈을 불러옵니다. 파일 시스템 작업을 위해 필요합니다.
const fs = require('fs');

// 'fs.readFile' 메소드를 사용해 'example.txt' 파일을 비동기적으로 읽습니다.
fs.readFile('example.txt', 'utf-8', (err, data) => {
  // 파일 읽기 작업에서 오류가 발생하면 오류 메시지를 출력합니다.
  if (err) {
    console.error('파일 읽기 실패:', err);
    return;
  }
  // 오류가 없으면 파일의 내용을 콘솔에 출력합니다.
  console.log(data);
});

위 코드는 Node.js에서 비동기적으로 파일을 읽는 기본적인 방법을 보여줍니다. fs.readFile 함수는 파일의 경로, 인코딩('utf-8'), 그리고 콜백 함수를 인자로 받습니다. 콜백 함수는 파일을 읽는 작업이 완료되었을 때 실행되며, 오류(err)와 파일의 내용(data)을 인자로 받습니다. 오류가 있을 경우 콘솔에 오류 메시지를 출력하고, 그렇지 않으면 파일의 내용을 출력합니다.

프로미스 (Promise)

프로미스는 콜백의 복잡성과 “콜백 지옥” 문제를 해결하기 위한 방법으로 등장했습니다. 프로미스는 비동기 작업의 최종 성공 또는 실패를 나타내는 객체입니다.

// 'fs' 모듈의 프로미스 기반 API를 불러옵니다. 이를 통해 비동기 파일 작업을 프로미스로 처리할 수 있습니다.
const fsPromises = require('fs').promises;

// 'fsPromises.readFile' 메소드를 사용해 'example.txt' 파일을 비동기적으로 읽습니다.
// 이 메소드는 프로미스를 반환하므로, then()을 사용해 성공한 경우의 동작을,
// catch()를 사용해 오류 처리를 할 수 있습니다.
fsPromises.readFile('example.txt', 'utf-8')
  .then(data => console.log(data)) // 파일 읽기 성공 시, 파일 내용을 콘솔에 출력합니다.
  .catch(err => console.error('파일 읽기 실패:', err)); // 파일 읽기 오류 발생 시, 오류 메시지를 콘솔에 출력합니다.

위 코드는 Node.js에서 fs 모듈의 프로미스 API를 활용하여 파일을 비동기적으로 읽는 방법을 보여줍니다. fs.promises.readFile 함수는 파일 읽기 작업을 위한 프로미스를 반환하며, 이 프로미스는 파일 읽기 작업이 성공적으로 완료되었을 때 결과 데이터를 제공하거나, 오류가 발생했을 때 오류를 던집니다. then() 메소드는 작업 성공 시 실행될 콜백 함수를, catch() 메소드는 오류 발생 시 실행될 콜백 함수를 등록하는 데 사용됩니다.

async/await

async/await은 프로미스를 기반으로 한 더 직관적인 비동기 코드 작성 방법입니다. async 함수 내에서 await 키워드를 사용하면 프로미스의 결과가 반환될 때까지 함수의 실행을 일시 중단하고, 결과를 변수에 할당할 수 있습니다.

// 비동기 함수를 정의합니다. 이 함수 내부에서 await 키워드를 사용할 수 있습니다.
async function readFile() {
  try {
    // 'fsPromises.readFile'를 await 키워드와 함께 사용하여 파일을 비동기적으로 읽습니다.
    // await는 프로미스의 해결을 기다립니다. 즉, 파일 읽기 작업이 완료될 때까지 함수 실행을 일시 중단합니다.
    const data = await fsPromises.readFile('example.txt', 'utf-8');
    // 파일의 내용을 콘솔에 출력합니다.
    console.log(data);
  } catch (err) {
    // 파일 읽기 작업에서 오류가 발생하면 오류 메시지를 출력합니다.
    console.error('파일 읽기 실패:', err);
  }
}

// readFile 함수를 호출하여 파일 읽기 작업을 시작합니다.
readFile();

위 코드는 asyncawait를 사용하여 비동기적인 파일 읽기 작업을 간결하고 직관적으로 처리하는 방법을 보여줍니다. async 함수 내에서 await 키워드를 사용하면 프로미스 기반의 비동기 작업을 동기적인 코드처럼 쉽게 작성할 수 있습니다. try...catch 구문은 비동기 작업에서 발생할 수 있는 오류를 처리하기 위해 사용됩니다.

참고 사이트

비동기 프로그래밍은 Node.js 애플리케이션의 성능과 사용자 경험을 향상시키는 중요한 요소입니다. 콜백, 프로미스, 그리고 async/await는 Node.js에서 비동기 프로그래밍을 구현하는 데 있어 핵심적인 개념과 도구입니다. 각 방법의 장단점을 이해하고 상황에 맞게 적절히 사용하는 것이 중요합니다.

관련 이전 게시글

이 글이 도움이 되셨다면 공유 부탁 드립니다.

위로 스크롤