Node.js에서 Promise와 async/await의 차이점은 무엇인가요?
_____A1: Promise는 비동기 작업의 완료 또는 실패를 나타내는 객체입니다. 비동기 작업이 성공하면 `resolve`되고, 실패하면 `reject`됩니다. 콜백 함수 대신 `.then()`, `.catch()` 메서드로 결과를 처리합니다.
Q2: async/await란 무엇인가요?
A2: async/await는 Promise 기반 비동기 코드를 동기 코드처럼 작성할 수 있도록 만든 최신 문법입니다. `async` 함수는 항상 Promise를 반환하며, `await` 키워드는 Promise가 처리될 때까지 함수 실행을 일시 중단합니다.
Q3: Promise와 async/await의 근본적인 차이점은 무엇인가요?
A3: Promise는 비동기 작업의 처리를 위한 객체 및 메서드 체인 방식이고, async/await는 Promise를 좀 더 직관적이고 가독성 높게 작성하기 위한 문법적 설탕(syntactic sugar)입니다. 즉, async/await은 Promise를 내부적으로 사용합니다.
Q4: Promise의 사용 예시는 어떻게 되나요?
A4:
```javascript
fetchData()
.then(result => {
console.log(result);
})
.catch(error => {
console.error(error);
});
```
Q5: async/await의 사용 예시는 어떻게 되나요?
A5:
```javascript
try {
const result = await fetchData();
console.log(result);
} catch (error) {
console.error(error);
}
}
getData();
```
Q6: 두 방법 중 더 나은 가독성을 제공하는 것은 무엇인가요?
A6: 일반적으로 async/await가 가독성이 좋고 오류 처리가 직관적이며, 동기 코드처럼 작성 가능해 유지보수가 쉽습니다.
Q7: 두 방법 중 비동기 흐름 제어에 더 효율적인 것은 무엇인가요?
A7: async/await는 복잡한 비동기 작업을 순차적으로 처리하거나 error 처리를 간편하게 만들지만, Promise는 `.all()`, `.race()` 같은 메서드를 통해 병렬 처리 제어에 용이합니다. 상황에 따라 적절한 방식을 선택하는 것이 좋습니다.
Q8: 호환성 측면에서 차이가 있나요?
A8: Promise는 ES6(2015)부터 지원되며, async/await는 ES2017(ES8)부터 지원됩니다. 최신 Node.js 환경에서는 둘 다 기본적으로 지원되지만, 구형 환경에서는 Promise가 더 널리 호환됩니다.
Q9: 오류 처리 방법에 차이가 있나요?
A9: Promise는 `.catch()`로 오류를 처리하고, async/await는 `try-catch` 구문을 사용합니다. async/await가 전통적인 동기 코드의 예외 처리 방식과 유사해 이해하기 쉽습니다.
Q10: 요약하면, 언제 Promise, 언제 async/await를 사용해야 하나요?
A10: 간단한 비동기 연속 작업이나 가독성을 중시할 때 async/await를 권장합니다. 반면, 여러 비동기 작업을 병렬 처리하거나 `.then()` 체인으로 간단히 작성할 때는 Promise를 직접 사용하는 것도 유용합니다.
이 두 가지는 비동기 작업을 처리하는 데 사용되지만, 그 사용 방식과 코드의 가독성에 있어 차이가 있습니다.
아래에서 Promise와 async/await의 차이점에 대해 자세히 설명하겠습니다.
1. Promise Promise는 비동기 작업의 완료 또는 실패를 나타내는 객체입니다.
Promise는 세 가지 상태를 가집니다: - 대기(pending) : 초기 상태, 이행되지도 않고 거부되지도 않은 상태. - 이행(fulfilled) : 비동기 작업이 성공적으로 완료된 상태. - 거부(rejected) : 비동기 작업이 실패한 상태. Promise는 `then()`, `catch()`, `finally()` 메서드를 사용하여 비동기 작업의 결과를 처리합니다.
예를 들어: ```javascript const fetchData = () => { return new Promise((resolve, reject) => { setTimeout(() => { const success = true; // 예시를 위한 성공 여부 if (success) { resolve("데이터를 성공적으로 가져왔습니다.
"); } else { reject("데이터를 가져오는 데 실패했습니다.
"); } }, 1000); }); }; fetchData() .then(result => { console.log(result); }) .catch(error => { console.error(error); }); ``` 위의 예제에서 `fetchData` 함수는 Promise를 반환하며, `then()` 메서드를 사용하여 성공적인 결과를 처리하고, `catch()` 메서드를 사용하여 오류를 처리합니다.
2. Async/Await Async/Await는 Promise를 기반으로 한 문법으로, 비동기 코드를 더 직관적이고 동기적인 방식으로 작성할 수 있게 해줍니다.
`async` 키워드를 사용하여 비동기 함수를 정의하고, `await` 키워드를 사용하여 Promise가 이행될 때까지 기다립니다.
예를 들어: ```javascript const fetchData = () => { return new Promise((resolve, reject) => { setTimeout(() => { const success = true; // 예시를 위한 성공 여부 if (success) { resolve("데이터를 성공적으로 가져왔습니다.
"); } else { reject("데이터를 가져오는 데 실패했습니다.
"); } }, 1000); }); }; const getData = async () => { try { const result = await fetchData(); console.log(result); } catch (error) { console.error(error); } }; getData(); ``` 위의 예제에서 `getData` 함수는 `async`로 정의되어 있으며, `await`를 사용하여 `fetchData`의 결과를 기다립니다.
이 방식은 코드의 흐름을 더 쉽게 이해할 수 있게 해줍니다.
3. 주요 차이점 - 가독성 : Async/Await는 비동기 코드를 동기 코드처럼 작성할 수 있게 해주므로, 가독성이 높아집니다.
Promise 체이닝은 복잡한 비동기 작업을 처리할 때 가독성이 떨어질 수 있습니다.
- 에러 처리 : Promise에서는 `catch()` 메서드를 사용하여 에러를 처리하지만, async/await에서는 `try/catch` 블록을 사용하여 에러를 처리할 수 있습니다.
이는 동기 코드에서의 에러 처리 방식과 유사하여 더 직관적입니다.
- 코드 흐름 : Async/Await는 코드의 흐름을 더 명확하게 만들어줍니다.
Promise 체이닝에서는 여러 개의 `then()`을 사용해야 할 경우, 코드가 중첩되어 가독성이 떨어질 수 있습니다.
- 병렬 처리 : Promise는 여러 비동기 작업을 병렬로 처리할 수 있는 `Promise.all()`과 같은 메서드를 제공합니다.
Async/Await에서도 병렬 처리를 할 수 있지만, `await`를 사용하면 각 작업이 순차적으로 실행되므로 주의가 필요합니다.
병렬 처리를 원할 경우, `Promise.all()`을 사용해야 합니다.
결론 Promise와 async/await는 각각의 장단점이 있으며, 상황에 따라 적절한 방법을 선택하여 사용할 수 있습니다.
일반적으로는 async/await가 더 직관적이고 가독성이 좋기 때문에, 최신 Node.js 코드에서는 async/await를 선호하는 경향이 있습니다.
그러나 Promise는 여전히 유용하며, 특히 병렬 처리가 필요한 경우에는 유용하게 사용될 수 있습니다.
작성자:
정민서 [비회원]
| 작성일자: 1년 전
2024-09-13 05:21:38
조회수: 157 | 댓글: 0 | 좋아요: 0 | 싫어요: 0
조회수: 157 | 댓글: 0 | 좋아요: 0 | 싫어요: 0
내용이 부정확하다면 싫어요를 클릭해주세요.