ย
useAxios๋
ย
๋จผ์ axios๋, ํด๋ผ์ด์ธํธ๊ฐ ์น์๋ฒ์ ์ฌ์ฉ์ ์์ฒญ์ ๋ชฉ์ /์ข
๋ฅ๋ฅผ ์๋ฆฌ๋ ์๋จ์ธ HTTP ๋ฉ์๋์ ์ด์ฉํด ๋ฐ์ดํฐ ํต์ ์ ํ ์ ์๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์
๋๋ค.
HTTP ๋ฉ์๋์๋ get,post,put,delete์ ๊ฐ์ด ๋ง์ด ์ฌ์ฉํ๋ ๋ฉ์๋๊ฐ ์์ต๋๋ค.
get
: ๋ฐ์ดํฐ๋ฅผ ์กฐํํ ๋ ์ฌ์ฉํฉ๋๋ค.
post
: ์๋ก์ด ๋ฐ์ดํฐ๋ฅผ ์ถ๊ฐํ ๋ ์ฌ์ฉํฉ๋๋ค.
put
: ๊ธฐ์กด์ ๋ฐ์ดํฐ๋ฅผ ์์ ํ ๋ ์ฌ์ฉํฉ๋๋ค.
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
ย
ย
ย
ย
ย