fetch
란 브라우저 내장 함수로, 네트워크 요청을 보내는데 사용된다
Promise 기반으로 동작하며, 브라우저가 제공하는 표준 API이다.
"Promise 기반으로 동작한다?"
fetch
는 항상 Promise 객체를 반환한다. 이 Prmoise의 상태에 따라 성공 또는 실패한 결과를 제공.
fetch는 네트워크 요청을 보냈을 때, 요청 자체가 성공했는지만을 기준으로 Promise의 결과를 결정한다.
fetch의 응답 객체(response)는 메타데이터(상태코드, 헤더 등)와 응답 데이터를 포함하지만, 본문은 비동기 스트림 형태로 제공되기 때문에, json 또는 text데이터로 변환하는 과정이 필요하다.
비동기 스트림 ?
비동기 스트림이란 데이터를 조금씩 나눠서 처리할 수 있도록 설계된 방식이다.
데이터를 한번에 모두 받는 대신, 데이터가 준비되는 대로 부분적으로 처리할 수 있게 해준다.
이렇게 설계된 이유는, 데이터를 한꺼번에 처리하지 않고 부분적으로 처리할 수 있게 하여 메모리를 절약하여 대용량 데이터를 더 효율적으로 다룰 수 있고, 필요할 때만 본문 데이터를 읽어 효율성을 높이기 위해서이다.
Fetch의 단점(fetch응답과 http응답 따로 처리)을 보완한 HTTP 클라이언트 라이브러리이다.
Promise 기반으로 동작하며, 브라우저와 Node.js 환경 모두 사용 가능
자동 HTTP 상태 처리
catch
블록으로 이동.자동 JSON 변환
요청/응답 인터셉터
CancelToken 지원
기본 설정 관리
baseURL
, headers
등 반복적인 설정을 한 곳에서 관리 가능.자동 HTTP 상태 처리
catch
블록으로 이동.자동 JSON 변환
요청/응답 인터셉터
CancelToken 지원
기본 설정 관리
baseURL
, headers
등 반복적인 설정을 한 곳에서 관리 가능.fetch('https://jsonplaceholder.typicode.com/posts')
.then((response) => {
if (!response.ok) {
throw new Error('HTTP Error');
}
return response.json(); // 전체 응답 객체
})
.then((data) => console.log(data))
.catch((error) => console.error('Error:', error)); // JSON 데이터
axios.get('https://jsonplaceholder.typicode.com/posts')
.then((response) => console.log(response.data)) // 상태 확인과 데이터 변환을 동시에 처리
.catch((error) => console.error('Error:', error));
AxiosInstance는 Axios를 커스터마이징한 객체로, 반복 설정(예: baseURL, headers, timeout)을 한 곳에서 관리할 수 있게 도와줌.
baseURL
, headers
, params
등 공통 설정을 한 번에 관리.
import axios from 'axios';
const axiosInstance = axios.create({
baseURL: 'https://jsonplaceholder.typicode.com', // 기본 URL
timeout: 5000, // 요청 제한 시간 (ms)
headers: { 'Content-Type': 'application/json' }, // 공통 헤더
});
export default axiosInstance;
baseURL
: 모든 요청의 기본 경로.timeout
: 요청 제한 시간 초과 시 실패.headers
: 공통 요청 헤더.javascript
코드 복사
import axiosInstance from './axiosInstance';
// 인기 영화 가져오기 (GET 요청)
export const fetchPopularMovies = async () => {
const response = await axiosInstance.get('/movie/popular', {
params: { api_key: import.meta.env.VITE_TMDB_KEY },
});
return response.data.results;
};
// 리뷰 작성하기 (POST 요청)
export const createReview = async (movieId, review) => {
const response = await axiosInstance.post(`/movie/${movieId}/reviews`, review);
return response.data;
};
baseURL
과 headers
가 제거됨.try-catch
로 처리해야 함.