2024.06.21 8차 스터디
오늘의 스터디 주제는? Axios와 Promise의 사용!
프로젝트를 할 때는 axios를 사용할 때 async/await을 사용하여 비동기 처리를 하였는데 이번 도커를 배우는 과정에서는 then/catch를 사용하여서 무엇이 다른건지 알아보고자 한다!
Axios는 웹 페이지나 서버에서 HTTP 요청을 쉽게 처리할 수 있는 JavaScript 라이브러리입니다. Promise 기반으로 설계되어 비동기 작업을 간편하게 처리할 수 있으며, 다양한 HTTP 요청 메서드(GET, POST, PUT, DELETE 등)를 지원합니다.
Axios의 주요 기능이 많지만 그 중에서 자주 사용해본 기능 세가지만 알아봅시다.
axios.get('/data'); // 데이터 가져오기
axios.post('/data', { // 데이터 보내기
key: 'value'
});
axios.put('/data/1', { // 데이터 업데이트
key: 'newValue'
});
axios.delete('/data/1'); // 데이터 삭제
axios.get('https://api.example.com/data')
.then(response => {
console.log(response.data); // 자동으로 변환된 JavaScript 객체
});
axios.post('https://api.example.com/data', {
key: 'value'
});
axios.get('/data')
.then(response => {
console.log(response.data); // 자동으로 변환된 응답 데이터
});
위의 설명에서 Axios가 Promise 기반으로 설계되어있다고 하는데 그럼 Promise는 무엇일까요?
Promise는 JavaScript에서 비동기 작업을 처리하는 객체입니다. 비동기 작업의 완료 또는 실패를 나타내며, 세 가지 상태를 가질 수 있습니다:
Promise는 비동기 작업의 결과를 처리하기 위해 then, catch, finally 메서드를 제공합니다.
then과 catch는 Promise 객체의 메서드로, 비동기 작업이 완료되거나 실패했을 때 실행할 코드를 지정합니다.
GET 요청의 예시를 함께 볼까요?
const axios = require('axios');
axios.get('https://jsonplaceholder.typicode.com/posts/1')
.then(response => {
console.log(response.data); // 성공적으로 데이터를 받아온 경우
})
.catch(error => {
console.error('Error fetching data:', error); // 요청이 실패한 경우
});
async와 await 키워드를 사용하면 비동기 코드를 동기 코드처럼 작성할 수 있습니다. await는 Promise가 해결될 때까지 기다리며, async 함수 내에서만 사용할 수 있습니다. 오류 처리는 try/catch 블록을 사용하여 처리합니다.
GET 요청의 예시를 함께 볼까요?
const axios = require('axios');
async function fetchData() {
try {
const response = await axios.get('https://jsonplaceholder.typicode.com/posts/1');
console.log(response.data); // 성공적으로 데이터를 받아온 경우
} catch (error) {
console.error('Error fetching data:', error); // 요청이 실패한 경우
}
}
fetchData();
async/await와 then/catch를 혼용할 수도 있습니다. 그러나 3-2번 방식으로 코드를 작성하는 것이 더 가독성이 좋습니다.
const axios = require('axios');
async function fetchData() {
await axios.get('https://jsonplaceholder.typicode.com/posts/1')
.then(response => {
console.log(response.data); // 성공적으로 데이터를 받아온 경우
})
.catch(error => {
console.error('Error fetching data:', error); // 요청이 실패한 경우
});
}
fetchData();
then/catch 메서드를 사용하여 비동기 작업을 처리하는 경우와 async/await 키워드와 try/catch 블록을 사용하여 비동기 코드를 동기 코드처럼 작성하는 경우에는 몇 가지 차이점이 있습니다. 주로 코드의 가독성과 작성 방식에서 차이가 나타납니다.
then과 catch 메서드는 Promise 객체의 메서드로, 비동기 작업이 완료되거나 실패했을 때 실행할 코드를 지정합니다. 이 방식은 전통적인 Promise 사용 방식입니다.
const axios = require('axios');
axios.get('https://jsonplaceholder.typicode.com/posts/1')
.then(response => {
console.log(response.data); // 성공적으로 데이터를 받아온 경우
return axios.get('https://jsonplaceholder.typicode.com/posts/2');
})
.then(response => {
console.log(response.data); // 두 번째 데이터를 받아온 경우
})
.catch(error => {
console.error('Error fetching data:', error); // 요청이 실패한 경우
});
명시적 체이닝
여러 비동기 작업을 순차적으로 수행할 때 체이닝을 통해 명시적으로 연결할 수 있습니다.
직관적인 에러 핸들링
각 단계별로 에러를 개별적으로 처리할 수 있습니다.
콜백 지옥
여러 비동기 작업을 중첩하여 처리할 경우 코드가 복잡해지고 가독성이 떨어질 수 있습니다.
가독성 저하
코드의 흐름이 함수 체이닝으로 인해 분리되어 가독성이 떨어질 수 있습니다.
async/await는 비동기 작업을 처리하는 새로운 방식으로, 비동기 코드를 동기 코드처럼 작성할 수 있게 합니다. await는 Promise가 해결될 때까지 기다리며, async 함수 내에서만 사용할 수 있습니다.
const axios = require('axios');
async function fetchData() {
try {
const response1 = await axios.get('https://jsonplaceholder.typicode.com/posts/1');
console.log(response1.data); // 첫 번째 데이터를 받아온 경우
const response2 = await axios.get('https://jsonplaceholder.typicode.com/posts/2');
console.log(response2.data); // 두 번째 데이터를 받아온 경우
} catch (error) {
console.error('Error fetching data:', error); // 요청이 실패한 경우
}
}
fetchData();
가독성 향상
동기 코드처럼 작성할 수 있어 코드의 가독성과 유지보수성이 높아집니다.
간편한 에러 핸들링
try/catch 블록을 사용하여 한 곳에서 에러를 처리할 수 있습니다.
구조적 작성
비동기 작업을 순차적으로 작성할 때 코드 구조가 명확해집니다.
구형 브라우저 호환성 문제
오래된 브라우저에서는 async/await를 지원하지 않을 수 있습니다. 이 경우 Babel 같은 트랜스파일러가 필요합니다.
에러 전파가 복잡할 수 있음
여러 단계의 비동기 작업에서 에러를 체이닝할 경우 복잡해질 수 있습니다.
결론적으로, 간단한 비동기 작업에는 then/catch를 사용할 수 있지만, 복잡한 비동기 작업이나 여러 단계의 비동기 작업을 처리할 때는 async/await와 try/catch를 사용하는 것이 더 가독성이 좋고 유지보수가 쉽습니다.