Node.js 를 배워보자

Node.js의 async/await: 비동기 처리를 동기처럼 간편하게

_Blue_Sky_ 2024. 12. 5. 22:51
728x90
728x90

Node.js는 비동기 I/O 모델을 기반으로 하여 높은 성능을 제공하지만, 콜백 지옥과 같은 문제점을 야기하기도 합니다. 이러한 문제를 해결하기 위해 도입된 것이 바로 async/await 문법입니다. async/await는 비동기 코드를 동기 코드처럼 작성할 수 있도록 해주어 가독성을 높이고 코드 유지보수를 용이하게 만들어줍니다.

async/await의 기본 개념

  • async 키워드: 함수 앞에 async 키워드를 붙여 비동기 함수로 선언합니다.
  • await 키워드: Promise 객체 앞에 await 키워드를 붙여 Promise가 해결될 때까지 기다립니다. 즉, 비동기 작업이 완료될 때까지 코드 실행을 멈추고 결과를 받아올 수 있습니다.

async/await 사용 예시

 
async function fetchData() {
  const response = await fetch('https://api.example.com/data');
  const data = await response.json();
  return data;
}

fetchData()
  .then(data => {
    console.log(data);
  })
  .catch(error => {
    console.error(error);
  });

위 코드는 fetch 함수를 이용하여 데이터를 가져오는 비동기 작업을 async/await 문법으로 간결하게 표현한 예시입니다. await 키워드 덕분에 fetch 함수가 완료될 때까지 기다렸다가 결과를 data 변수에 할당하고, 이후 처리를 진행합니다.

728x90

async/await의 장점

  • 가독성 향상: 콜백 지옥을 방지하고 코드를 순차적으로 작성할 수 있어 가독성이 높아집니다.
  • 오류 처리: try-catch 블록을 사용하여 비동기 작업 중 발생하는 오류를 쉽게 처리할 수 있습니다.
  • Promise와의 호환성: Promise 객체와 완벽하게 호환되므로 기존에 작성된 Promise 기반 코드를 쉽게 async/await로 변경할 수 있습니다.

async/await의 주의점

  • 최상위 레벨에서 async 함수 호출 시: Node.js 환경에서는 최상위 레벨에서 async 함수를 호출할 때 unhandledPromiseRejection 이벤트가 발생할 수 있습니다. 이를 방지하기 위해 process.on('unhandledRejection', (reason) => { ... })와 같은 이벤트 리스너를 등록하거나, try...catch 블록으로 감싸는 것이 좋습니다.
  • 동기 코드와의 차이: await 키워드는 비동기 작업이 완료될 때까지 코드 실행을 멈추기 때문에, 동기 코드처럼 보이지만 실제로는 이벤트 루프를 이용하여 비동기적으로 동작합니다.

async/await 활용 시나리오

  • 파일 시스템 작업: fs 모듈을 이용한 파일 읽기/쓰기 작업
  • 네트워크 요청: http 모듈이나 axios 등을 이용한 HTTP 요청
  • 데이터베이스 쿼리: sequelizemongoose 등의 ORM을 이용한 데이터베이스 작업
  • 타임아웃: setTimeout 함수를 이용한 지연 처리
728x90

async/await와 Generator 함수

async/await는 ES6에서 도입된 Generator 함수를 기반으로 구현되었습니다. Generator 함수는 yield 키워드를 사용하여 실행을 일시 중단하고, next() 메서드를 호출하여 다시 실행할 수 있는 기능을 제공합니다. async/awaitGenerator 함수의 복잡성을 숨기고 더 간편하게 비동기 코드를 작성할 수 있도록 해줍니다.

결론

async/await는 Node.js에서 비동기 처리를 더욱 간결하고 직관적으로 만들어주는 강력한 기능입니다. 콜백 지옥 문제를 해결하고 코드 가독성을 향상시켜 개발 생산성을 높일 수 있습니다. 비동기 작업이 많은 Node.js 개발에서 async/await는 필수적인 도구라고 할 수 있습니다.

 

728x90
728x90