-
Axios는 무엇인가?
Axios는 브라우저를 위한 promise기반의 HTTP 비동기식 통신을 하는 라이브러리다.
서버와 통신(데이터 가져오기) : 서버와의 통신을 위해 데이터를 가져오려면 HTTP 요청을 보내야하고 , 이를 처리하기위해 `fetch`, `axios` 또는 다른 HTTP 통신을 위한 클라이언트를 사용한다.
React 자체에는 서버와 통신하는 기능이 내장되어 있지 않기 때문에,
서버와 통신하려면 fetch 또는 axios 같은 HTTP 클라이언트를 사용해야 한다.
결국은!
React에서 서버와 통신하려면: fetch 또는 axios와 같은 클라이언트를 사용해야 한다.
fetch와 axios
`fetch` : 브라우저 내장 api로 간단한 HTTP요청을 처리한다. 별도의 설치가 필요없다!
`axios` : 더 많은 기능과 유연성을 제공하는 HTTP 클라이언트 라이브러리이다.
예를 들어, 자동 JSON 변환, 요청 및 응답 인터셉터, 취소 토큰, 그리고 좀 더 나은 에러 처리를 제공한다.
`next.js`에서는 13버전 이후의 `app router`가 나오면서, `fetch` 사용을 권장하고 있다.
fetch를 next.js에서 쓰면 데이터 캐싱등의 활용할 수 있는 요소가 있다. (Docs에 나와있음)
Functions: fetch | Next.js
API reference for the extended fetch function.
nextjs.org
하지만 어떤방식을 사용할지는 개발자의 몫이다.
Axios 기본 메서드
1. 데이터 가져오기 : `get`
2. 데이터 추가하기 : `post`
3. 데이터 삭제하기 : `delete`
4. 데이터 수정하기 : `patch & put`
설치하기
npm install axios 또는 yarn add axios
그럼 axios로 통신하는 todolist를 만들어보자 !
import axios from 'axios'; import { IInputForm } from '../hooks/interface'; const SERVER_URL = import.meta.env.VITE_REACT_APP_SERVER_URL; export const todoClient = axios.create({ baseURL: SERVER_URL, headers: { 'Content-Type': 'application/json', }, }); // 목록 가져오기 export const getTodos = async () => { const { data } = await todoClient.get('/todos'); return data; }; //추가하기 export const createTodos = async (item: Partial<IInputForm>) => { const { data } = await todoClient.post('/todos', item); return data; }; //삭제하기 export const deleteTodos = async (id: string) => { await todoClient.delete(`/todos/${id}`); return id; }; //수정하기 export const updateTodos = async ( id: string, todos: Partial<IInputForm> ): Promise<string> => { await todoClient.patch(`/todos/${id}`, todos); return id; };
Next.js에서 fetch 사용 데이터 가져오기
1. 서버 사이드 랜더링(SSR)에서 가져오기
next.js에서는 `getServerSideProps` 함수를 사용해서 SSR시점에 데이터를 가져올 수 있다.
이 방법은 페이지가 요청될 때 마다 데이터를 가져온다.
예시코드
// pages/index.js export async function getServerSideProps() { const res = await fetch('http://localhost:3001/posts'); const data = await res.json(); return { props: { posts: data, }, }; } export default function Home({ posts }) { return ( <div> <h1>Posts</h1> <ul> {posts.map(post => ( <li key={post.id}>{post.title}</li> ))} </ul> </div> ); }
2. 클라이언트 사이드에서 데이터 가져오기 (CSR)
next.js에서 CSR에서 데이터를 가져오고 싶을 때, useEffect와 useState를 활용해서 가져올 수 있다.
예시코드
// pages/index.js import { useEffect, useState } from 'react'; export default function Home() { const [posts, setPosts] = useState([]); useEffect(() => { const fetchData = async () => { const res = await fetch('http://localhost:3001/posts'); const data = await res.json(); setPosts(data); }; fetchData(); }, []); return ( <div> <h1>Posts</h1> <ul> {posts.map(post => ( <li key={post.id}>{post.title}</li> ))} </ul> </div> ); }
3. api 라우터에서 데이터 가져오기
Next.js의 API 라우트를 설정하여 json-server에서 데이터를 가져온 후, 클라이언트에 제공할 수도 있다.
이 방법은 클라이언트가 직접 json-server에 접근하는 것을 피하고 싶을 때 유용하다.
예시코드
// pages/api/posts.js export default async function handler(req, res) { const response = await fetch('http://localhost:3001/posts'); const data = await response.json(); res.status(200).json(data); }
이제 클라이언트는 Next.js의 API 라우트를 통해 데이터를 가져올 수 있다.
// pages/index.js import { useEffect, useState } from 'react'; export default function Home() { const [posts, setPosts] = useState([]); useEffect(() => { const fetchData = async () => { const res = await fetch('/api/posts'); const data = await res.json(); setPosts(data); }; fetchData(); }, []); return ( <div> <h1>Posts</h1> <ul> {posts.map(post => ( <li key={post.id}>{post.title}</li> ))} </ul> </div> ); }
결론
Next.js에서는 데이터를 어떻게 가져오느냐에 따라 서버사이드 렌더링 또는 클라이언트 사이드 렌더링 방법을 선택할 수 있다.
Axios Docs
시작하기 | Axios Docs
시작하기 브라우저와 node.js에서 사용할 수 있는 Promise 기반 HTTP 클라이언트 라이브러리 Axios란? Axios는 node.js와 브라우저를 위한 Promise 기반 HTTP 클라이언트 입니다. 그것은 동형 입니다(동일한 코
axios-http.com
'📚 이론정리 > React & Next.js' 카테고리의 다른 글
✏️ Recoil 사용하기 (0) 2024.03.02 ✏️ Zustand (0) 2024.02.29 ✏️ json-server 설치와 세팅방법 (2) 2024.02.18 ✏️ Optimistic Update (0) 2024.02.18 ✏️ Lazy-loading (0) 2024.02.18 댓글