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

    2024. 2. 26.

    by. 서카츄

     

    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

    댓글