728x90
반응형
1. 비동기 프로그래밍이란
비동기 프로그래밍은 특정 작업이 완료될 때까지 기다리지 않고 다음 작업을 실행하는 프로그래밍 방식입니다. Node.js는 싱글 스레드 기반으로 동작하기 때문에 비동기 프로그래밍이 필수적입니다. 파일 읽기, 네트워크 요청, 데이터베이스 쿼리 등의 I/O 작업을 비동기로 처리하여 블로킹 없이 다른 요청을 처리할 수 있습니다.
2. 동기 vs 비동기 비교
2.1 동기 방식
const fs = require('fs');
console.log('1: 시작');
// 동기 방식 - 파일 읽기가 완료될 때까지 대기
const data = fs.readFileSync('file.txt', 'utf8');
console.log('2: 파일 내용:', data);
console.log('3: 완료');
// 출력 순서: 1 → 2 → 3 (순차적)
2.2 비동기 방식
const fs = require('fs');
console.log('1: 시작');
// 비동기 방식 - 파일 읽기를 기다리지 않고 다음 코드 실행
fs.readFile('file.txt', 'utf8', (err, data) => {
console.log('2: 파일 내용:', data);
});
console.log('3: 완료');
// 출력 순서: 1 → 3 → 2 (비동기)
3. Node.js의 비동기 처리 방식
Node.js에서 비동기 작업을 처리하는 세 가지 주요 방식이 있습니다.
- 콜백(Callback): 가장 기본적인 방식으로, 작업 완료 시 호출될 함수를 전달
- 프로미스(Promise): ES6에서 도입된 비동기 처리 객체
- async/await: ES2017에서 도입된 프로미스 기반의 동기적 코드 스타일
// 1. 콜백 방식
fs.readFile('file.txt', 'utf8', (err, data) => {
if (err) throw err;
console.log(data);
});
// 2. 프로미스 방식
const fsPromises = require('fs').promises;
fsPromises.readFile('file.txt', 'utf8')
.then(data => console.log(data))
.catch(err => console.error(err));
// 3. async/await 방식
async function readFile() {
const data = await fsPromises.readFile('file.txt', 'utf8');
console.log(data);
}
반응형
4. 비동기 패턴 활용
4.1 병렬 실행
여러 비동기 작업을 동시에 실행하여 성능을 향상시킵니다.
const fs = require('fs').promises;
async function readFilesParallel() {
const startTime = Date.now();
// 병렬 실행 - 세 파일을 동시에 읽음
const [file1, file2, file3] = await Promise.all([
fs.readFile('file1.txt', 'utf8'),
fs.readFile('file2.txt', 'utf8'),
fs.readFile('file3.txt', 'utf8')
]);
console.log(`소요 시간: ${Date.now() - startTime}ms`);
return { file1, file2, file3 };
}
4.2 순차 실행
이전 작업의 결과가 필요한 경우 순차적으로 실행합니다.
async function processSequential() {
// 순차 실행 - 각 작업이 완료된 후 다음 작업 시작
const user = await getUser(userId);
const orders = await getOrders(user.id);
const details = await getOrderDetails(orders[0].id);
return details;
}
5. 에러 처리
5.1 콜백의 에러 처리
fs.readFile('file.txt', 'utf8', (err, data) => {
if (err) {
console.error('파일 읽기 실패:', err.message);
return;
}
console.log(data);
});
5.2 async/await의 에러 처리
async function readFileWithError() {
try {
const data = await fs.promises.readFile('file.txt', 'utf8');
return data;
} catch (err) {
console.error('파일 읽기 실패:', err.message);
throw err;
}
}
결론
Node.js의 비동기 프로그래밍은 싱글 스레드 환경에서 효율적인 I/O 처리를 가능하게 합니다. 콜백, 프로미스, async/await 세 가지 방식을 상황에 맞게 활용하고, Promise.all을 통한 병렬 처리로 성능을 최적화할 수 있습니다. 적절한 에러 처리를 통해 안정적인 비동기 코드를 작성하는 것이 중요합니다.
728x90
반응형
'Node.js' 카테고리의 다른 글
| Node.js의 이벤트 루프(Event Loop) (0) | 2026.02.21 |
|---|---|
| Node.js 설치 및 설정 방법 (0) | 2026.02.21 |
| Node.js란 무엇인가 (0) | 2026.02.21 |