๋๋ฌผ์ ์ฒ ์ ๋ณด ์นํ์ด์ง ๋ง๋ค๊ธฐ 1 - API ๋ถ๋ฌ์ค๊ธฐ

๋๋ฌผ์ ์ฒ์ ์์ฆ ํน ๋น ์ ธ์ฌ๋๋ฐ,
๋ด๊ฐ ์ข์ํ๋ ๊ฑธ๋ก ๋ญ๊ฐ๋ฅผ ๋ง๋ค์ด๋ณด๋ฉด ๋์ฑ ํฅ๋ฏธ๊ฐ ์๊ธธ ๊ฑฐ ๊ฐ์์
์ผ๋จ ๋
๋ค ๋๋ฌผ์์ฒ api๊ฐ ์๋ ์ฐพ์๋ณด์๋ค.
API ๋ถ๋ฌ์ค๊ธฐ
์ฌ๊ธฐ์ api key๋ฅผ ์์ฒญํ๋ค๊ณ ํผ์ ์์ฑํด ๋ณด๋๊ณ ,
๋ณด๋๋๋ ๋ฉฐ์น ๋ง์ ์์ํ๋ค๋ฉฐ (ใ
ใ
) ํค๋ฅผ ๋ณด๋ด์ฃผ์๋ค.

์ผ๋จ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฐ์์ฌ ์ ์๋ ํ
์คํธ๋ฅผ ํด๋ณด๊ธฐ์ํด
์ฃผ๋ฏผ ๋ชฉ๋ก๋ถํฐ postman ์ผ๋ก ๋ถ๋ฌ์ ๋ณด์๋ค.

X-API-KEY์ ๋ด๊ฐ ๋ฐ์ ํค๋ฅผ ๋ฃ์ด์ฃผ๊ณ ํธ์ถํ๋ฉด

์ด๋ ๊ฒ ์ ๋ณด๊ฐ ์ญ~ ๋ถ๋ฌ์์ง๋ค.
๋ฆฌ์กํธ๋ก ์ถ๋ ฅํ๊ธฐ
ํ๋ก์ ํธ ์์ฑ
npx create-react-app ์ฑ์ด๋ฆ
App key ์ถ๊ฐํ๊ธฐ
.env
ํค๋ ์ผ๋จ ์จ๊ฒจ์ผ ํ๋ ๋ด์ฉ์ด๋ฏ๋ก,
.gitignore ์์
# API KEY
.env
๋ก ์จ๊ฒจ๋์ค๋ค.
๊ทธ๋ฆฌ๊ณ .env ํ์ผ์๋ ์๋ ๋ด์ฉ์ ์ ์ด์ค
REACT_APP_API_KEY=๋ด๊ฐ ๋ฐ์ API KEY

์ด์ ๊ณต์๋ฌธ์๋ฅผ ์ฐธ๊ณ ํด ๋ถ๋ฌ์์ฃผ๋ฉด ๋๋ค.
App.js
import axios from "axios";
function App() {
const URL = "https://api.nookipedia.com/villagers";
const response = axios.get(URL, {
headers: {
"X-API-KEY": process.env.REACT_APP_API_KEY,
"Accept-Version": "1.1.0",
},
});
console.log(response);
return <div className="App"></div>;
}
export default App;
์ฝ์์ฐฝ์ ํ์ธํ์ ๋,

์ด๋ ๊ฒ ๋ถ๋ฌ์์ง๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
axios๋ฅผ ์คํํ์ผ๋ ์ผ๋จ promise ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ ํจ์๊ฐ ๋ง๋ค์ด์ง ๊ฒ.
์ด์ ๋๋จธ์ง ์ฝ๋๋ ์์ฑํด๋ณธ๋ค
๋น๋๊ธฐ ์คํ
aysnc await๋ฅผ ์ด์ฉํด์ค๋ค
App.js
import axios from "axios";
import React, { useEffect, useState } from "react";
function App() {
const [data, setData] = useState(null);
const [error, setError] = useState(null);
const URL = "https://api.nookipedia.com/villagers";
const VillagersData = async () => {
try {
setError(null);
setData(null);
const response = await axios.get(URL, {
headers: {
"X-API-KEY": process.env.REACT_APP_API_KEY,
"Accept-Version": "1.1.0",
},
});
setData(response.data);
console.log(response.data);
} catch (e) {
setError(e);
}
};
useEffect(() => {
VillagersData();
}, []);
if (error) return <div>error</div>;
if (!data) return <div>์๋ค๋ฅ</div>;
return <div className="App">{data[0].name}</div>; //Ace ์ถ๋ ฅ
}
export default App;
- setError(null), setData(null) : ์์ฒญ ์์ํ ๋ error์ data ์ด๊ธฐํ
- const response : API์์ ๋ถ๋ฌ์จ ๊ฐ์ response ๋ณ์์ ์ ์ฅ
- setData(response) : response ๊ฐ์ data์ ์ ์ฅ!

๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์๋ค...
ํ๋ฉด์ ๋ฆฌ์คํธ ์ถ๋ ฅ
ํ๋ฉด์ ์ฃผ๋ฏผ๋ชฉ๋ก์ ๋ฝ์์ฃผ๊ธฐ ์ํด ๋ฐ๋ก ํ์ผ์ ๋ง๋ค์๋ค.
Villagers.js
import React from "react";
function Villagers({ name, gender, image_url, species }) {
return (
<div>
<h2>{name}</h2>
<img src={image_url} alt="์ด๋ฏธ์ง" />
<h4>์ฑ๋ณ : {gender}</h4>
<h4>์ข
๋ฅ : {species}</h4>
<br></br> <br></br>
</div>
);
}
export default Villagers;
์ฌ๊ธฐ์ <img src={image_url} alt="์ด๋ฏธ์ง" />
์ด ๋ถ๋ถ์์ ํ ๋ฒ ์ค์๊ฐ ์์๋๋ฐ, ์ฌ์ง์ด ์๋ฐ์ด ๋ด์๋ค.
์ด์ ๋ { } ์ด๊ฑธ ์ฌ์ฉํ์ง ์๊ณ " " ์ด๊ฑธ ์ฌ์ฉํด์ image_url ํ๋ผ๋ฏธํฐ๊ฐ ์์ ์ฌ์ฉ๋๊ณ ์์ง ์์๋ค.
App.js
...
return (
<div className="App">
{data.map((item) => {
return (
<Villagers
key={item.id}
name={item.name}
species={item.species}
gender={item.gender}
image_url={item.image_url}
/>
);
})}
</div>
);
return ๋ถ๋ถ์ ์๋ฃ๋ฅผ ์ถ๋ ฅํด์ค ๊ตฌ๋ฌธ์ ์ง๋ฉด ๋๋น

ใ
ใ
ใ
ใ
๐ ์์ผ ์๊ธฐ๋ ์ฌ์ง ์ฌ์ด์ฆ๊ฐ ์ ๋ฉ๋๋ก๋๊น ์ด๋ถ๋ถ ์์ ํด์ฃผ๋ฉด ์ผ๋จ ๋์ผ
<img src={image_url} alt="์ด๋ฏธ์ง" width={"150px"} />

(App.css๋ฅผ ๋ถ๋ฌ์์ ๊ฐ์ด๋ฐ ์ ๋ ฌ์ด ๋์๋ค)
์๋ฌดํผ ๊ฑฐ์ 500๋ง๋ฆฌ์ ์ฃผ๋ฏผ์ด ํ์ํ ์ ๋ณด๋ค๋ง ๊ณจ๋ผ์ ๋ถ๋ฌ์์ก๋ค.
์ฝ๊ฐ์ css
display: flex
๋ฅผ ํด์ฃผ๋ฉด ๋~๋ฌด๋ ๋น์ฐํ๊ฒ๋
์ด๋ ๊ฒ ๋ฐฐ์น๊ฐ ๋๋ค. (์ฌ์ง ์ฌ์ด์ฆ๋ height์ ๋ง์ถฐ์ค์ผ๊ฒ ์)
๊ทผ๋ฐ 500๊ฐ๊ฐ ์ ๋ถ ๊ฐ๋ก๋ก ๋์ฌ์์ผ๋ฉด ๋ณด๊ธฐ๊ฐ ํ๋๋๊น ์์ ํด์ฃผ๊ณ ์ถ์๋ค
flex-wrap: wrap
ํด์ฃผ๊ณ villagers.js์์๋ ๊ฐ๊ฐ margin์ ์ฃผ์๋ค.
์ค๋์ ์ฌ๊ธฐ๊น์ง!
api์์ค๋ ๋ฌผ๊ณ ๊ธฐ, ๊ณค์ถฉ, ํ์... ๋ค์ํ ์ ๋ณด๊ฐ ์๊ณ
์ค๋์ ์ผ๋จ ์ฃผ๋ฏผ๋ง ๋ถ๋ฌ์ ๋ดค๋ค.
์ด์ ๋ถ๋ฌ์ค๋ ๊ฑฐ, ๋ฟ๋ ค์ฃผ๋ ๊ฑฐ ๋ค ํด๋ดค์ผ๋ ์ด๋ป๊ฒ ๋ง๋ค์ง ์๊ฐ๋ง ํ๋ฉด ๋๋ค. ใ
ใ
๊ณต๊ณต ์คํapi๋ ์ฌ๊ธฐ์ ๊ธฐ ์ ๋ณด๊ฐ ๋ง์๋ฐ ์ด๊ฑด ๋ญ ํ๋๋ ์์ด์...
๊ณ์ ๋งจ๋
์ ํด๋นํ๋ ๊ธฐ๋ถ์ผ๋ก ํ๊ณ ์๋ค ใ
ใ
๊ทธ๋๋ ์ด๋ค ์ผ ํ๋๋ฅผ ์์ฃผ 0์ธ ์ํ๋ถํฐ ์์ํ๋ ๊ฑด ์ฒ์์ด๋(?)
์ต์ ์ ๋คํด๋ณด๋ ค๊ณ ํ๋ค ํํ
๊ทธ๋๋ ๋ด๊ฐ ์ค์ค๋ก ์น ์ฝ๋๋ก ์ด๋ ๊ฒ ํ๋ฉด์ ๋ฑ! ๋์ค๋๊น ๋๋ฌด ๋ฟ๋ฏํ๋...