비동기 프로그래밍(Asynchronous Programming)은 작업 완료를 기다리지 않고 다른 작업을 계속 수행하는 프로그래밍 패러다임이다. I/O 바운드 작업(네트워크, 파일, DB)에서 대기 시간을 활용해 처리량을 높인다.
콜백 → Promise → async/await 진화
javascript
// 1세대: 콜백 (콜백 지옥)
fs.readFile('a.txt', (err, data) => {
if (err) throw err;
fs.readFile('b.txt', (err, data2) => {
if (err) throw err;
// 깊어지는 중첩...
});
});
// 2세대: Promise (체이닝)
readFile('a.txt')
.then(data => readFile('b.txt'))
.then(data2 => process(data2))
.catch(err => console.error(err));
// 3세대: async/await (동기 코드처럼 읽힘)
async function main() {
try {
const data = await readFile('a.txt');
const data2 = await readFile('b.txt');
return process(data2);
} catch (err) {
console.error(err);
}
}
python
import asyncio
import aiohttp
async def fetch_all(urls):
async with aiohttp.ClientSession() as session:
tasks = [fetch(session, url) for url in urls]
return await asyncio.gather(*tasks) # 병렬 실행
async def fetch(session, url):
async with session.get(url) as resp:
return await resp.json()
비동기 패턴 비교
| 패턴 | 특징 | 적합 |
|---|
| 콜백 | 저수준 | Node.js 레거시 |
| Promise | 체이닝 | 브라우저, Node |
| async/await | 직관적 | 현대 코드 |
| 이벤트 이미터 | 다중 이벤트 | 스트림, UI |
| 리액티브 (RxJS) | 데이터 스트림 | 복잡한 이벤트 흐름 |
관련 개념