💻
프로그래밍
async/await
Async Await
비동기 코드를 동기처럼 작성하는 문법. JavaScript, Python, Rust에서 지원. Promise 기반.
Async Await
비동기 코드를 동기처럼 작성하는 문법. JavaScript, Python, Rust에서 지원. Promise 기반.
async/await는 비동기 프로그래밍을 동기 코드처럼 직관적으로 작성할 수 있게 해주는 문법입니다. JavaScript, Python, Rust, C# 등 현대 프로그래밍 언어에서 광범위하게 지원되며, 콜백 지옥이나 복잡한 Promise 체이닝 문제를 해결합니다.
async 키워드는 함수를 비동기 함수로 선언하며, 해당 함수는 항상 Promise(또는 해당 언어의 Future 타입)를 반환합니다. await 키워드는 async 함수 내에서만 사용 가능하며, Promise가 resolve될 때까지 함수 실행을 일시 중지합니다.
내부적으로 async/await는 제너레이터와 Promise를 조합한 것과 유사하게 동작합니다. await를 만나면 현재 실행 컨텍스트를 저장하고 이벤트 루프에 제어권을 넘깁니다. Promise가 완료되면 저장된 지점부터 실행을 재개합니다.
에러 처리도 동기 코드처럼 try-catch 블록을 사용할 수 있어 코드 가독성이 크게 향상됩니다. 다만 비동기 함수의 특성상 실행 순서와 에러 전파 방식을 정확히 이해하고 사용해야 예상치 못한 버그를 방지할 수 있습니다.
// async/await 기본 사용법
async function fetchUserData(userId) {
try {
const response = await fetch(`/api/users/${userId}`);
if (!response.ok) {
throw new Error('사용자를 찾을 수 없습니다');
}
const userData = await response.json();
return userData;
} catch (error) {
console.error('에러 발생:', error.message);
throw error;
}
}
// 여러 비동기 작업 병렬 처리
async function loadDashboard(userId) {
const [user, posts, notifications] = await Promise.all([
fetchUserData(userId),
fetch(`/api/posts?userId=${userId}`).then(r => r.json()),
fetch('/api/notifications').then(r => r.json())
]);
return { user, posts, notifications };
}
// 사용 예시
loadDashboard(123)
.then(data => console.log(data))
.catch(err => console.error(err));