useAxios

ย 

useAxios๋ž€

ย 
๋จผ์ € axios๋ž€, ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์›น์„œ๋ฒ„์— ์‚ฌ์šฉ์ž ์š”์ฒญ์˜ ๋ชฉ์ /์ข…๋ฅ˜๋ฅผ ์•Œ๋ฆฌ๋Š” ์ˆ˜๋‹จ์ธ HTTP ๋ฉ”์„œ๋“œ์„ ์ด์šฉํ•ด ๋ฐ์ดํ„ฐ ํ†ต์‹ ์„ ํ•  ์ˆ˜ ์žˆ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ž…๋‹ˆ๋‹ค.
HTTP ๋ฉ”์„œ๋“œ์—๋Š” get,post,put,delete์™€ ๊ฐ™์ด ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” ๋ฉ”์„œ๋“œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
  1. get : ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•  ๋•Œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  1. post : ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•  ๋•Œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  1. put : ๊ธฐ์กด์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ •ํ•  ๋•Œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  1. delete : ๊ธฐ์กด์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ญ์ œํ•  ๋•Œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
ย 
์˜ˆ๋ฅผ ๋“ค์–ด, ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•  ๋•Œ๋Š” axios ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.
์ฒซ๋ฒˆ์งธ ์ธ์ž๋Š” url, ๊ทธ๋ฆฌ๊ณ  ๋‘ ๋ฒˆ์งธ ์ธ์ž๋Š” headers์™€ ์ถ”๊ฐ€ํ•  ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ด์€ ๊ฐ์ฒดํ˜•์‹์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.
ย 
๐Ÿ’ก
https://jsonplaceholder.typicode.com/ ๋Š” ๋ฐฑ์—”๋“œ ์„œ๋ฒ„๊ฐ€ ์—†์„๋•Œ ์ž„์‹œ๋กœ ๊ฐ€์ƒ ๋ฐ์ดํ„ฐ๋ฅผ ๋งŒ๋“ค์–ด api๋ฅผ ํ…Œ์ŠคํŠธ ํ•ด๋ณผ ์ˆ˜ ์žˆ๋Š” ์‚ฌ์ดํŠธ์ž…๋‹ˆ๋‹ค. POST, PUT, PATCH, DELETE ์š”์ฒญ์€ ์‹ค์ œ๋กœ ์ด๋ฃจ์–ด์ง€์ง€๋Š” ์•Š์ง€๋งŒ ๋งˆ์น˜ ๊ฐ€์งœ์ธ ๊ฒƒ ์ฒ˜๋Ÿผ ํ‘œ์‹œ๊ฐ€๋˜๋ฉฐ, GET์š”์ฒญ์˜ ๊ฒฝ์šฐ https://jsonplaceholder.typicode.com/ ์—์„œ ์ œ๊ณตํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
ย 
axios.post(`https://jsonplaceholder.typicode.com/posts`, { headers: { accept: '*/*' }, data: { userId: 1, id: 19392, title: 'title', body: 'Sample text', }, })
ย 
๋งŒ์•ฝ, ๋‹ค์Œ๊ณผ ๊ฐ™์ด axios์˜ ๋ฉ”์„œ๋“œ๋ฅผ ์ ์ง€ ์•Š๋Š”๋‹ค๋ฉด ๊ธฐ๋ณธ์ ์œผ๋กœ get๋ฉ”์†Œ๋“œ๊ฐ€ ์‹คํ–‰๋˜๊ณ 
๋‘๋ฒˆ์งธ ์ธ์ž์˜ ํ”„๋กœํผํ‹ฐ๋กœ method๋ฅผ ์ž‘์„ฑํ•˜๋ฉด ์œ„์™€ ๋™์ผํ•œ ๊ฒฐ๊ณผ๊ฐ’์„ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
axios(`https://jsonplaceholder.typicode.com/posts`, { method: 'POST', headers: { accept: '*/*' }, data: { userId: 1, id: 19392, title: 'title', body: 'Sample text', }, })
ย 
๋งŒ์•ฝ, API๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ์ฝ”๋“œ๊ฐ€ ์—ฌ๋Ÿฌ ๋ฒˆ ๋ฐ˜๋ณต๋œ๋‹ค๋ฉด ๋™์ผํ•œ ์ฝ”๋“œ๋ฅผ ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๋งŒ๋“œ๋Š” ์ปค์Šคํ…€ ํ›…์ด useAxios์ž…๋‹ˆ๋‹ค.
๊ทธ๋ ‡๋‹ค๋ฉด ๋‹ค์Œ ์˜ˆ์ œ๋ฅผ ํ†ตํ•ด useAxios๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
ย 
ย 
  • post ๋ฐฉ์‹ ์ƒˆ๋กœ์šด ๊ฒŒ์‹œ๊ธ€ ์ถ”๊ฐ€ ์˜ˆ์ œ
import useAxios from './useAxios'; function App() { const { response, error, loading } = useAxios({ method: 'POST', url: '/posts', headers: { accept: '*/*', }, data: { userId: 7, title: '์ƒˆ ๊ฒŒ์‹œ๊ธ€', body: '๋‚ด์šฉ์ž…๋‹ˆ๋‹ค.', }, }); // {url, method, body, headers}๋กœ ๊ตฌ์„ฑ๋œ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ  useAxios ์— ์ธ์ˆ˜๋ฅผ ์ „๋‹ฌํ•˜์—ฌ HTTP ํ˜ธ์ถœ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. return ( <div className="app"> {loading ? ( <div>Loading...</div> ) : ( <div> <h1> ์ œ๋ชฉ : {error && error.message} {response && response.title} </h1> <p>{response.body}</p> </div> )} </div> ); }; export default App;
App.jsx
ย 
  • get ๋ฒ„์ „ ๊ฒŒ์‹œ๊ธ€ ๋ชฉ๋ก ๊ฐ€์ ธ์˜ค๋Š” ์˜ˆ์ œ
import useAxios from './useAxios'; function App() { const { response, error, loading } = useAxios({ method: 'GET', url: '/posts', }); // {url, method, body, headers}๋กœ ๊ตฌ์„ฑ๋œ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ  useAxios ์— ์ธ์ˆ˜๋ฅผ ์ „๋‹ฌํ•˜์—ฌ HTTP ํ˜ธ์ถœ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. console.log(response); return ( <div className="app"> {loading ? ( <div>Loading...</div> ) : ( <> <h1>๊ฒŒ์‹œ๊ธ€ ๋ชฉ๋ก</h1> <ul> {response && response.map( (res) => <li> {console.log(res.title)} <h1> ์ œ๋ชฉ : {error && error.message} {res && res.title} </h1> <p>{res.body}</p> </li> )} </ul> </> )} </div> ); }; export default App;
App.jsx
ย 
ย 
import { useState, useEffect } from 'react'; import axios from 'axios'; axios.defaults.baseURL = 'https://jsonplaceholder.typicode.com'; function useAxios(params) { const [response, setResponse] = useState(null); const [error, setError] = useState(''); const [loading, setLoading] = useState(true); const fetchData = async (params) => { try{ const res = await axios(params); setResponse(res.data); }catch(err) { setError(err); } finally{ setLoading(false); }; }; useEffect(() => { fetchData(params); }, []); return { response, error, loading }; }; export default useAxios;
useAxios.jsx
ย 
ย 
ย 
ย 
ย