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 변수에 할당하고, 이후 처리를 진행합니다.
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 요청
- 데이터베이스 쿼리: sequelize나 mongoose 등의 ORM을 이용한 데이터베이스 작업
- 타임아웃: setTimeout 함수를 이용한 지연 처리
async/await와 Generator 함수
async/await는 ES6에서 도입된 Generator 함수를 기반으로 구현되었습니다. Generator 함수는 yield 키워드를 사용하여 실행을 일시 중단하고, next() 메서드를 호출하여 다시 실행할 수 있는 기능을 제공합니다. async/await는 Generator 함수의 복잡성을 숨기고 더 간편하게 비동기 코드를 작성할 수 있도록 해줍니다.
결론
async/await는 Node.js에서 비동기 처리를 더욱 간결하고 직관적으로 만들어주는 강력한 기능입니다. 콜백 지옥 문제를 해결하고 코드 가독성을 향상시켜 개발 생산성을 높일 수 있습니다. 비동기 작업이 많은 Node.js 개발에서 async/await는 필수적인 도구라고 할 수 있습니다.
'Node.js 를 배워보자' 카테고리의 다른 글
npm 사용을 위한 방화벽 해제: Node.js 개발 환경 구축 가이드 (0) | 2024.12.07 |
---|---|
Oracle 데이터베이스에서 테이블 목록을 가져오고 각 테이블의 필드 정보와 총 행 수를 기반으로 페이징된 SELECT 문을 동적으로 생성 (0) | 2024.12.05 |
Node.js Express에서는 모듈을 동적으로 호출 (0) | 2024.12.05 |
Node.js를 활용한 Oracle과 PostgreSQL 간 데이터 이동: 실전 가이드 (0) | 2024.12.05 |
Node.js 크론 잡 스케줄러 구현: 정기적인 작업 자동화하기 (1) | 2024.12.04 |