📚 이론정리/React & Next.js

✏️ axios는 무엇일까? Next.js app router의 fetch

서카츄 2024. 2. 26. 21:26

 

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