콜백, 프로미스, async/await의 차이점과 장단점을 비교하고, 각 패턴을 언제 사용하면 좋은지 이해한다.
1. 비동기 처리 패턴 개요
비동기 프로그래밍이란?
· 비동기 프로그래밍은 긴 작업을 수행하는 동안 프로그램의 실행을 중단하지 않고, 나중에 그 작업이 완료되면 결과를 처리하는 방식이다.
· 비동기 처리는 사용자 경험을 향상시키고, 서버의 효율성을 높일 수 있다.
주요 비동기 처리 패턴
· 콜백 함수
· 프로미스
· 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)
프로미스란?
· 비동기 작업의 결과를 나타내는 객체.
· 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();
- 이전 수업 목록
'프로그래밍 > Node.js' 카테고리의 다른 글
[Node.js 강의 시리즈] 19강 - 라우팅 (0) | 2024.07.18 |
---|---|
[Node.js 강의 시리즈] 18강 - Express를 사용한 웹 서버 구축 (1) | 2024.07.17 |
[Node.js 강의 시리즈] 16강 - async/await (0) | 2024.07.15 |
[Node.js 강의 시리즈] 15강 - 프로미스 (Promise) (0) | 2024.07.12 |
[Node.js 강의 시리즈] 14강 - 비동기 프로그래밍 심화 (0) | 2024.07.11 |