동기와 비동기란?
동기와 비동기는 프로그래밍에서 작업을 처리하는 방식의 차이를 나타냅니다.
- 동기: 작업이 순차적으로 처리됩니다. 하나의 작업이 끝나야 다음 작업이 실행됩니다. 예를 들어, 식당에서 요리를 하나씩 만들어 순서대로 제공하는 방식입니다.
- 비동기: 작업이 병렬적으로 처리될 수 있습니다. 하나의 작업이 끝날 때까지 기다리지 않고, 다음 작업을 바로 실행합니다. 예를 들어, 여러 요리를 동시에 준비하고, 준비가 끝난 요리부터 제공하는 방식입니다.
JavaScript에서는 Promise와 async/await를 사용하여 비동기 작업을 처리합니다. 이때 return await와 return은 함수가 비동기 작업을 반환할 때의 동작 방식을 결정합니다.
return await의 동작 방식
return await는 비동기 함수 내부에서 작업의 결과값을 기다린 후 반환하는 방식입니다. 함수가 호출되었을 때, 해당 작업이 완료될 때까지 대기한 다음 결과를 반환합니다.
동작 설명
- 함수 내부에서 await는 비동기 작업이 완료될 때까지 기다립니다.
- 함수는 비동기 작업의 결과값을 반환합니다.
- 비동기 작업 중 에러가 발생하면 함수 내부에서 이를 처리할 수 있습니다.
코드 예제
async function fetchDataWithAwait() {
try {
const data = await someAsyncFunction(); // 비동기 작업 완료 대기
return await data; // 결과 반환
} catch (error) {
console.error("에러 발생:", error);
throw error; // 에러를 호출자에게 전달
}
}
// 호출
fetchDataWithAwait()
.then(result => console.log("결과:", result))
.catch(error => console.error("처리 실패:", error));
주요 특징
- 함수가 비동기 작업의 완료된 결과값을 반환합니다.
- 함수 내부에서 try...catch를 사용해 에러를 처리할 수 있습니다.
- 비동기 작업이 완료될 때까지 함수 실행이 일시적으로 중단됩니다.
return 비동기의 동작 방식
return은 Promise 객체를 그대로 반환하는 방식입니다. 함수는 비동기 작업의 결과를 기다리지 않고, 호출자에게 Promise를 반환합니다.
동작 설명
- 함수 내부에서 작업의 완료 여부를 기다리지 않고, 즉시 Promise를 반환합니다.
- 호출자는 반환된 Promise를 처리해야 합니다.
- 에러가 발생하면 호출자가 이를 처리해야 합니다.
코드 예제
async function fetchDataWithoutAwait() {
return someAsyncFunction(); // Promise 반환
}
// 호출
fetchDataWithoutAwait()
.then(result => console.log("결과:", result))
.catch(error => console.error("처리 실패:", error));
주요 특징
- 함수가 Promise 객체를 반환합니다.
- 함수 내부에서 에러를 처리하지 않습니다. 호출자가 에러를 처리해야 합니다.
- 함수 실행은 작업의 완료 여부와 상관없이 계속 진행됩니다.
return await와 return의 비교 및 정리
특징 | return await | return |
비동기 작업 완료 대기 | 작업이 완료될 때까지 대기한 후 결과를 반환. | Promise를 반환하며, 작업 완료 여부를 기다리지 않음. |
에러 처리 | 함수 내부에서 try...catch로 에러 처리 가능. | 에러를 호출자에게 넘기며 호출자가 직접 처리. |
코드 간결성 | await 사용으로 인해 코드가 약간 복잡해질 수 있음. | 간결하고 짧은 코드 작성 가능. |
사용 시점 | 에러를 내부에서 처리하거나, 결과값을 즉시 반환해야 할 때. | 호출자가 Promise를 직접 처리하도록 위임할 때. |
사용 권장
- return await를 사용하는 경우
- 함수 내부에서 에러를 처리해야 하는 경우.
- 비동기 작업의 결과를 명시적으로 반환하려는 경우.
- return을 사용하는 경우
- 에러 처리를 호출자에게 위임하려는 경우.
- 함수가 단순히 비동기 작업의 Promise를 전달하는 역할만 할 때.
예제 비교
return await 예제
async function fetchDataWithAwait() {
try {
const data = await someAsyncFunction();
return await data; // 완료된 결과 반환
} catch (error) {
console.error("에러 발생:", error);
throw error; // 에러를 호출자에게 전달
}
}
return 예제
async function fetchDataWithoutAwait() {
return someAsyncFunction(); // Promise 반환
}
결론
- return await는 함수 내부에서 에러를 처리하거나 결과값을 반환해야 할 때 유용합니다.
- return은 호출자에게 작업의 책임을 위임하며, 간결한 코드 작성에 적합합니다.
- 불필요한 await 사용은 피하고, 상황에 맞는 방식을 선택해 효율적인 비동기 처리를 구현하세요!
'BE 공부 > Node.js' 카테고리의 다른 글
NPM 미러링 서버란? (0) | 2025.01.10 |
---|---|
[JavaScript] map, flatMap, reduce (1) | 2024.12.30 |
Middleware란? (0) | 2023.09.01 |
동기와 비동기란? (0) | 2023.04.06 |
Callback(콜백) 함수란? (0) | 2023.04.06 |
댓글