๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

โœ๏ธ/React

React ๊ณต๋ถ€ํ•˜๊ธฐ(4) - API ์—ฐ๋™ํ•˜๊ธฐ

1. API ์—ฐ๋™์˜ ๊ธฐ๋ณธ

 

$ yarn add axios
  • GET: ๋ฐ์ดํ„ฐ ์กฐํšŒ
  • POST: ๋ฐ์ดํ„ฐ ๋“ฑ๋ก
  • PUT: ๋ฐ์ดํ„ฐ ์ˆ˜์ •
  • DELETE: ๋ฐ์ดํ„ฐ ์ œ๊ฑฐ
import axios from 'axios';

axios.get('/users/1');
axios.get('https://jsonplaceholder.typicode.com/users');

axios.post('/users', {
  username: 'blabla',
  name: 'blabla'
});

 

useState์™€ useEffect๋กœ ๋ฐ์ดํ„ฐ ๋กœ๋”ฉํ•˜๊ธฐ

useState: ์š”์ฒญ ์ƒํƒœ ๊ด€๋ฆฌ

  • ์š”์ฒญ์˜ ๊ฒฐ๊ณผ
  • ๋กœ๋”ฉ ์ƒํƒœ
  • ์—๋Ÿฌ

useEffect: ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ Œ๋”๋ง๋˜๋Š” ์‹œ์ ์— ์š”์ฒญ์„ ์‹œ์ž‘

import React, { useState, useEffect } from 'react';
import axios from 'axios';

function Users() {
  const [users, setUsers] = useState(null);
  const [loading, setLoading] = useState(false);
  const [error, setError] = useState(null);

  const fetchUsers = async () => {
    try {
      // ์š”์ฒญ์ด ์‹œ์ž‘ ํ•  ๋•Œ์—๋Š” error ์™€ users ๋ฅผ ์ดˆ๊ธฐํ™”ํ•˜๊ณ 
      setError(null);
      setUsers(null);
      // loading ์ƒํƒœ๋ฅผ true ๋กœ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.
      setLoading(true);
      const response = await axios.get(
        'https://jsonplaceholder.typicode.com/users'
      );
      setUsers(response.data); // ๋ฐ์ดํ„ฐ๋Š” response.data ์•ˆ์— ๋“ค์–ด์žˆ์Šต๋‹ˆ๋‹ค.
    } catch (e) {
      setError(e);
    }
    setLoading(false);
  };

  useEffect(() => {
    fetchUsers();
  }, []);

  if (loading) return <div>๋กœ๋”ฉ์ค‘..</div>;
  if (error) return <div>์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค</div>;
  if (!users) return null;
  return (
    <>
      <ul>
        {users.map(user => (
          <li key={user.id}>
            {user.username} ({user.name})
          </li>
        ))}
      </ul>
      <button onClick={fetchUsers}>๋‹ค์‹œ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ</button>
    </>
  );
}

export default Users;

 

 

2. useReducer๋กœ ์š”์ฒญ ์ƒํƒœ ๊ด€๋ฆฌํ•˜๊ธฐ

์žฅ์ !

useState์˜ setState ํ•จ์ˆ˜๋ฅผ ์—ฌ๋Ÿฌ๋ฒˆ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค

๋ฆฌ๋“€์„œ๋กœ ๋กœ์ง์„ ๋ถ„๋ฆฌํ–ˆ์œผ๋‹ˆ ๋‹ค๋ฅธ ๊ณณ์—์„œ๋„ ์‰ฝ๊ฒŒ ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค

 

 

3. useAsync ์ปค์Šคํ…€ Hook ๋งŒ๋“ค์–ด์„œ ์‚ฌ์šฉํ•˜๊ธฐ

 

useAsync(API ์š”์ฒญ์„ ์‹œ์ž‘ํ•˜๋Š” ํ•จ์ˆ˜, deps)

  - deps ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ๋ฐ”๋€” ๋•Œ ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ๋ฅผ ๋ถˆ๋Ÿฌ์˜จ๋‹ค

  - ๊ธฐ๋ณธ๊ฐ’์€ [] => ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๊ฐ€์žฅ ์ฒ˜์Œ ๋ Œ๋”๋ง ํ•  ๋•Œ๋งŒ API๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค

(+ ์ถ”๊ฐ€ ๊ธฐ๋Šฅ)

useAsync(API ์š”์ฒญ์„ ์‹œ์ž‘ํ•˜๋Š” ํ•จ์ˆ˜, deps, skip)

  - skip=true๋ฉด useEffect์—์„œ ์•„๋ฌด๋Ÿฐ ์ž‘์—…๋„ ํ•˜์ง€ ์•Š๋„๋ก ์„ค์ •ํ•œ๋‹ค (๊ธฐ๋ณธ๊ฐ’์€ false)

 

 

4. react-async๋กœ ์š”์ฒญ ์ƒํƒœ ๊ด€๋ฆฌํ•˜๊ธฐ

=> ๋งค๋ฒˆ ํ”„๋กœ์ ํŠธ๋ฅผ ๋งŒ๋“ค ๋•Œ ๋งˆ๋‹ค ์ง์ ‘ ์š”์ฒญ ์ƒํƒœ ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•œ ์ปค์Šคํ…€ Hook์„ ๋งŒ๋“ค๊ธฐ ๊ท€์ฐฎ๋‹ค๋ฉด ์ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์ž!

=> ์ปค์Šคํ…€ Hook์€ ๊ฒฐ๊ณผ๋ฌผ๋กœ ๋ฐฐ์—ด๋กœ ๋ฐ˜ํ™˜, ์ด Hook์€ ๊ฐ์ฒด ํ˜•ํƒœ๋กœ ๋ฐ˜ํ™˜

 

$ yarn add react-async
import { useAsync } from "react-async"

 

const {data, error, isLoading, reload} = useAsync({promiseFn(ํ˜ธ์ถœํ•  ํ•จ์ˆ˜), id})

(+ ์ถ”๊ฐ€ ๊ธฐ๋Šฅ)

useAsync({promiseFn(ํ˜ธ์ถœํ•  ํ•จ์ˆ˜), id, watch})

  - watch์— ํŠน์ • ๊ฐ’์„ ๋„ฃ์–ด์ฃผ๋ฉด ์ด ๊ฐ’์ด ๋ฐ”๋€” ๋•Œ๋งˆ๋‹ค promiseFn์— ๋„ฃ์€ ํ•จ์ˆ˜๋ฅผ ๋‹ค์‹œ ํ˜ธ์ถœํ•ด์ค€๋‹ค

(+ ๋ Œ๋”๋งํ•˜๋Š” ์‹œ์ ์ด ์•„๋‹Œ ์‚ฌ์šฉ์ž์˜ ํŠน์ • ์ธํ„ฐ๋ ‰์…˜์— ๋”ฐ๋ผ API๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  ์‹ถ์„ ๋•Œ)

const {data, error, isLoading, run} = useAsync({deferFn(ํ˜ธ์ถœํ•  ํ•จ์ˆ˜), id})

 

 

5. Context์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๊ธฐ

 

import React, { createContext, useContext } from 'react';