async와 await은 무엇인가요?
async와 await은 JS의 비동기 처리 패턴 중 가장 최근에 나온 문법입니다. 기존의 비동기 처리 방식인 콜백 함수와 프로미스의 단점을 보완하고 개발자가 읽기 좋은 코드를 작성할 수 있게 도와줍니다.
읽기 좋은 코드와 async, await의 상관 관계
var user = {
id: 1,
name: 'Josh'
};
if (user.id === 1) {
console.log(user.name); // Josh
}
이 코드는 user라는 변수에 객체를 할당한 뒤 조건문으로 사용자의 아이디를 확인하고 콘솔에 사용자의 name을 찍는 간단한 코드입니다.
우리는 이렇게 위에서부터 아래로 한 줄 한 줄 차근히 읽으면서 사고하는 것이 편합니다.
조금 전에 읽고 이해한 방식대로 코드를 구성하는 것이 async, await 문법의 목적입니다. 다음 코드를 한번 볼까요?
var user = fetchUser('domain.com/users/1');
if (user.id === 1) {
console.log(user.name);
}
fetchUser()라는 메서드를 호출하면 앞에서 봤던 코드처럼 사용자 객체를 반환한다고 해보겠습니다. 그리고 여기서 fetchUser() 메서드가 서버에서 사용자 정보를 가져오는 HTTP 통신 코드라고 가정한다면 위 코드는 async & await 문법이 적용된 형태라고 보셔도 됩니다.
async, await 적용된 코드와 그렇지 않은 코드
위에서 살펴본 코드를 logName()이라는 간단한 함수로 감싸보겠습니다.
function logName() {
var user = fetchUser('domain.com/users/1');
if (user.id === 1) {
console.log(user.name);
}
}
여기서 fetchUser()라고 하는 코드는 서버에서 데이터를 받아오는 HTTP 통신 코드라고 가정했습니다. 일반적으로 자바스크립트의 비동기 처리 코드는 아래와 같이 콜백을 사용해야지 코드의 실행 순서를 보장받을 수 있죠.
function logName() {
// 아래의 user 변수는 위의 코드와 비교하기 위해 일부러 남겨놓았습니다.
var user = fetchUser('domain.com/users/1', function(user) {
if (user.id === 1) {
console.log(user.name);
}
});
}
하지만 콜백을 사용하지 않고도 async await 만 붙여서 실행 순서를 보장 받을 수 있습니다.
// async & await 적용 후
async function logName() {
var user = await fetchUser('domain.com/users/1');
if (user.id === 1) {
console.log(user.name);
}
}
async와 await 예외처리
async & await에서 예외를 처리하는 방법은 바로 try catch입니다. 프로미스에서 에러 처리를 위해 .catch()를 사용했던 것처럼 async에서는 catch {} 를 사용하시면 됩니다.
async function logTodoTitle() {
try {
var user = await fetchUser();
if (user.id === 1) {
var todo = await fetchTodo();
console.log(todo.title); // delectus aut autem
}
} catch (error) {
console.log(error);
}
}
위의 코드를 실행하다가 발생한 네트워크 통신 오류뿐만 아니라 간단한 타입 오류 등의 일반적인 오류까지도 catch로 잡아낼 수 있습니다. 발견된 에러는 error 객체에 담기기 때문에 에러의 유형에 맞게 에러 코드를 처리해주시면 됩니다.
해당 글은 async와 await을 공부하고자 다음 블로그 글을 재작성한 글 입니다.
https://joshua1988.github.io/web-development/javascript/js-async-await/
'Frontend > Javascript' 카테고리의 다른 글
[Javascript] Promise Rejected 에러 해결 (1) | 2024.08.30 |
---|---|
[Javascript] Promise 객체 (0) | 2024.08.30 |
[Javascript] 비동기 처리와 콜백 함수 (3) | 2024.08.30 |
[Javascript] 예외 처리 (0) | 2024.08.30 |
[Javascript] fetch 적용하기 (0) | 2024.08.12 |