
์ฒ์์ ํ๋ ๋ฐ์ดํฐ ์์ฒญ ์ฐ์ต์
for๋ฌธ์ผ๋ก ๋ฐ๋ณตํด์ ๋ถ๋ฌ์๋ค. api ๋ฌธ์๋ฅผ ์ฝ์ด๋ดค์ ๋ URLํ๋ผ๋ฏธํฐ๋ก ํฌ์ผ๋ชฌ id์ ์ ๊ทผ์ ์ด๋ป๊ฒ ํด์ผํ ์ง ๋ชจ๋ฅด๊ฒ ์ด์ ๋ธ๋ก๊ทธ๋ฅผ ์ฐธ๊ณ ํ์ฌ ๋ฐ์ดํฐ๋ฅผ ์์ฒญํ์ง๋ง ์ด๊ฒ๋ง์ ๋.. ๋ง์ด ์ด๋ ค์ ๋ค.
for๋ฌธ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์์ฒญํ๋ ๋ฐฉ๋ฒ์ ์ด๊ธฐ ๋ก๋ฉ ์๋๊ฐ ๋๋ฆฌ๊ธฐ ๋๋ฌธ์ ์ค๋ map ๋ฉ์๋๋ฅผ ์ฌ์ฉํด์ ์๋กญ๊ฒ GET ์์ฒญํ๋ ๋ฐฉ๋ฒ์ ๋ฐฐ์ ๋ค. ํท๊ฐ๋ฆฌ๋ ๋ถ๋ถ์ด ์์ด์ ์ดํดํ๊ณ ๋ค์ ๋ง๋ค์ด๋ณด๋ ค๊ณ ํ๋ค. ์ผ๋จ ์ค๋์ ํ์ค ํ์ค ์ฝ๋๋ฅผ ์ดํดํ๋ ๊ฑฐ์ ์ค์ ์ ๋๊ณ ๊น๋จน์ง ์๊ธฐ ์ํด ๋ธ๋ก๊ทธ๋ฅผ ์จ๋ณด๋ ค๊ณ ํ๋ค.
function App() {
const [pokemonNames, setPokemonNames] = useState([]);
useEffect(() => {
const getData = async () => {
try {
const allpokemonList = [];
for (let i = 1; i <= 100; i++) {
const res = await instance.get(`/pokemon/${i}`);
const speciesRes = await instance.get(`/pokemon-species/${i}`);
const koreanName = speciesRes.data.names.find(
(name) => name.language.name === "ko"
);
allpokemonList.push({ ...res.data, koreanName: koreanName.name });
}
setPokemonNames(allpokemonList);
} catch (error) {
console.error(`error ${error}`);
alert("์ค๋ฅ๊ฐ ์์ต๋๋ค. ์ฝ์์ ํ์ธํด์ฃผ์ธ์");
}
};
getData();
}, []);
return ()
}
export default App;
ํฌ์ผ๋ชฌ ์ ์ฒด ๋ฐ์ดํฐ๊ฐ ๋ค์ด๊ฐ ๊ณต๊ฐ์ธ useState๋ก ๋ฐ์ดํฐ์ ์ํ๋ฅผ ๊ด๋ฆฌํ๋ ค๊ณ ํ๋ค. ๋ฐ์ดํฐ๊ฐ ๋ค์ด๊ฐ ๊ณต๊ฐ์ pokemonNames๋ก ์ด๋ฆ์ ์๋ช
ํ๊ณ , ์ด๊ธฐ๊ฐ์ ๋น ๋ฐฐ์ด๋ก ์ค์ ํ๋ค.
๋ฐ์ดํฐ๊ฐ ์ฒ์ ๋ ๋ ์ ํ ๋ฒ๋ง ๋ถ๋ฌ์์ผ ๋๊ธฐ ๋๋ฌธ์ useEffect ํ
์์ ๋ถ๋ฌ์๋ค.
axios ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ค์น ํ์ ๋ฐ์ดํฐ๋ฅผ ์์ฒญํ ๊ฑด๋ฐ axios๋ฅผ ์ฌ์ฉํ ๋์๋ ๋ณดํต try/catch ์ async/await์ ๊ฐ์ด ์ด๋ค๊ณ ๋ณด๋ฉด ๋๋ค. ์ด ๋ฐฉ๋ฒ์ด ๋น๋๊ธฐ ์ฝ๋๋ฅผ ์ฒ๋ฆฌํ๋๋ฐ ๊ฐ์ฅ ๊ฐํธํ๊ฒ ์ฒ๋ฆฌํ ์ ์๊ณ , ์ค๋ฅ ํ์ธ๋ ์ฝ๊ฒ ๊ฐ๋ฅํ๋ค.
useEffect ์์ ๋ค์ด๊ฐ ๋ฐ์ดํฐ๋ฅผ ์์ฒญํ๋ ํจ์๋ฅผ getData๋ก ๋ง๋ค์๋ค.
allpokemonList์ ๋ณ์๋ฅผ ๋ง๋ค์ด์ค๋ค. ์ด ๋ณ์ ์์๋ ํฌ์ผ๋ชฌ ์ด๋ฏธ์ง์ ํ๊ตญ์ด ์ด๋ฆ์ ๊ฐ์ง ํฌ์ผ๋ชฌ 100๋ง๋ฆฌ์ ๋ํ ๋ฐ์ดํฐ๋ฅผ ๋ฃ์ด์ค ๊ฒ์ด๋ค. ๊ทธ ๋ค์์ pokemonNames์์ ๋ฃ์ด์ค์ ํ๋ฉด์ ๋ ๋๋ง ์ํค๋ ค๊ณ ํ๋ค.
/pokemon/${i} ์ด ๊ฒฝ๋ก๋ก ๋ฐ์ดํฐ ์์ฒญ์ ํ ๊ฑด๋ฐ i๋ for๋ฌธ์ผ๋ก ๋๋ฆด ๊ฒ์ด๊ธฐ ๋๋ฌธ์ URL ํ๋ผ๋ฏธํฐ์ ๋์ ์ผ๋ก ํฌ์ผ๋ชฌ id๊ฐ ๋ค์ด์จ๋ค. ์ฌ์ค id๊ฐ ์ง์ ์ ์ผ๋ก ๋ค์ด์จ๋ค๊ธฐ ๋ณด๋ค๋ ๋ด๊ฐ ๋ง๋ i ๋ณ์๊ฐ ์ซ์ 100์ด ๋ ๋๊น์ง 1์ฉ ๊ณ์ ๋ํด์ ๋์ ์ผ๋ก ๋ค์ด์ฌ ์ ์๊ฒ ๋ง๋๋ ๋ฐฉ๋ฒ์ด๋ค.
res์ speciesRes๋ก ์์ฒญ์ 2๋ฒ ๋ ๋ฆฌ๋ ๊ฑฐ์ ์ฒ์์๋ ์๋ฌธ์ด ๋ค์๋ค... poke-API๋ฌธ์๋ฅผ ์ ๋ณด๋ฉด pokemon์์๋ ํฌ์ผ๋ชฌ ์ด๋ฏธ์ง๋ฅผ ๋ถ๋ฌ์ฌ ์ ์๊ณ , pokemon-species์์๋ ๊ฐ๊ฐ์ ํฌ์ผ๋ชฌ ์ด๋ฆ์ ํ๊ตญ์ด๋ก ๋ถ๋ฌ์ฌ ์ ์๊ธฐ ๋๋ฌธ์ 2๋ฒ ์์ฒญ์ ํด์ค ๊ฒ์ด๋ค.
๋ฐ์ดํฐ ์์ฒญ์ ๋ณด๋์ผ๋ฉด ํ๊ตญ์ด๋ก ํฌ์ผ๋ชฌ ์ด๋ฆ์ ๋ถ๋ฌ์ค๋๋ฐ์ ๋ณต์กํจ์ ๋๋ ๊ฒ์ด๋ค.. ๋ธ๋ก๊ทธ๋ฅผ ์ฐธ๊ณ ํด์ ๋ถ๋ฌ์ค๋ ๋ฐฉ๋ฒ์ ์์๋๋ค. pokemon-species๊ฒฝ๋ก์ ์ ๊ทผํด์ ๊ฐ์ฒด๋ก ํ๊ณ ํ๊ณ ๋ค์ด๊ฐ์ ๋ณด๋ฉด ์ด์ํด์จ๊ฐ ๋์จ๋ค. names์๋ ํ๊ตญ์ด ์ ๋ณด๊ฐ ๋ค์ด์๋๋ฐ find ๋ฉ์๋๋ก names๋ฅผ ์ํํ๋ฉด์ name.language.name์ ์ ๊ทผํ์ฌ ๊ฐ์ด ko์ ์ผ์นํ๋ ๋ฐ์ดํฐ๋ง ์ฐพ์์ฃผ๋ ์กฐ๊ฑด๋ฌธ์ ๋ง๋ค์๋ค.
๋ง๋ค์ด๋๋ ์ด๊ธฐ๊ฐ์ด ๋น ๋ฐฐ์ด์ธ allPokemonData ์ push ๋ฉ์๋๋ก ์๊ฐ์ฒด๋ฅผ ๋ฃ์ด์ค๋ค. โฆresponse.data๋ก ๊ธฐ๋ณธ ์ ๋ณด๋ค์ ๋ณต์ฌํ๊ณ ๊ทธ ๋ค์๋ key๊ฐ korean_name์ด๊ณ , value ๊ฐ koreanName.name์ธ ์์ฑ์ ์ถ๊ฐํ์ฌ ์๋ก์ด ๊ฐ์ฒด๋ฅผ ๋ง๋ ๋ค. koreanName.name์๋ ํ๊ตญ์ด ์ด๋ฆ์ ๊ฐ์ง ํฌ์ผ๋ชฌ์ด ๋ค์ด์๋ค.
๊ฒฐ๊ณผ์ ์ผ๋ก allPokemonData ์ ์ถ๊ฐํ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ์ฒ์์ ์ํ ์ ์ฅ์ผ๋ก ๋ง๋ค์ด ๋๋ setPokemonData(allPokemonData); ์ ๋ฃ๊ณ , getData() ํจ์ ํธ์ถ๊น์ง ํ๋ฉด ๋ !
์ ์ฝ๋๋ ๋น์ทํ ๋ถ๋ถ์ด ์๊ธฐ ๋๋ฌธ์ ๊ฒน์น๋ ๋ถ๋ถ์ ์๋ตํด์ ์์ฑํ๋ค.
function App() {
const [list, setList] = useState([]);
useEffect(() => {
const getData = async () => {
try {
/** ๋ฉ์ธ ํฌ์ผ๋ชฌ ๋ฆฌ์คํธ */
const mainRes = await instance.get("/pokemon");
/** ๊ฐ ํฌ์ผ๋ชฌ ์์ธ ๋ฐ์ดํฐ (์ด๋ฏธ์ง ์ถ์ถ์ฉ) */
const result = await Promise.all(
mainRes.data.results.map(async (pokemon, i) => {
const detailRes = await instance.get(pokemon.url);
/** ๊ฐ ํฌ์ผ๋ชฌ species ๋ฐ์ดํฐ (ํ๊ธ ์ด๋ฆ์ฉ) */
const speciesRes = await instance.get(detailRes.data.species.url);
return {
id: i + 1,
name: speciesRes.data.names[2].name,
imageUrl: detailRes.data.sprites.front_default,
};
})
);
setList(result);
} catch (error) {
console.log("error", error);
}
};
getData();
}, []);
return ()
}
mainRes ๋ณ์์ pokemon ๋ฐ์ดํฐ๋ฅผ ์์ฒญํด์ ๋ด์์ค๋ค.
Promise.all๋ก map์ ๊ฐ์ธ์ฃผ๊ณ ๊ทธ ์์์ mainRes.data.results๋ก ์ ๊ทผํด ๋ฐฐ์ด์์ ํฌ์ผ๋ชฌ ๋ฐ์ดํฐ๋ฅผ ํ๋์ฉ ์ํํ๋ฉด์ url์ฃผ์๋ฅผ ๋ฐ์์จ๋ค. ์ด์ ๋ ๊ฐ๊ฐ์ ํฌ์ผ๋ชฌ url ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์ค๊ธฐ ์ํด์์ด๊ณ , ์ด๋ ์ด๋ฏธ์ง๋ฅผ ๋ฐ์์ค๊ธฐ ์ํจ์ด๋ค.
Promise.all ๊ทธ๊ฒ ๋ญ์ง ?
์์งํ
Promise.all์ ์ค๋ ์ฒ์ ์จ๋ณธ๋ค.map๋ฉ์๋๋ฅผPromise.all๋ก ๊ฐ์ธ์ค ์ด์ ์ ๋ํด์ ์ค๋ช ํด๋ณด์๋ฉดPromise.all์ ๊ฐ๋ ์ ์ฌ๋ฌ ๊ฐ์ ํ๋ก๋ฏธ์ค๋ฅผ ๋์์ ์คํํ๊ณ ๋ชจ๋ ํ๋ก๋ฏธ์ค๊ฐ ์ดํ๋ ๋๊น์ง ๊ธฐ๋ค๋ฆฐ ํ ๊ฒฐ๊ณผ๋ฅผ ๋ฐฐ์ด๋ก ๋ฐํํ๋ ํน์ง์ด ์๋ค. ํ ๊ฐ๋ผ๋ ์คํจ์ ์ ์ฒด๊ฐ ์คํจํ๋ฏ๋ก ์ด ์ฃผ์์ ๋ ์๊ณ ์์ผ๋ฉด ์ข์ ๊ฒ ๊ฐ๋ค.ํฌ์ผ๋ชฌ ๋ฐ์ดํฐ๋ฅผ ์์๋ก ๋ค์ด๋ณด์๋ฉด
async/await์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์์ฒญํ์ ๋์๋ ํ ์ค ํ ์ค ๋๊ธฐ์ ์ฝ๋์ฒ๋ผ ๋ณด์ด๊ฒ ์คํ๋์ง๋ง ์ค์ ๋ก๋ ๋น๋๊ธฐ ์์ ์ด ์์ฐจ์ ์ผ๋ก ์งํ๋๋ฏ๋ก ์์ฒญ ์๊ฐ์ด ๊ธธ์ด์ง ์ ์๋ค. ์๋ฅผ ๋ค์ด ํฌ์ผ๋ชฌ 5๋ง๋ฆฌ๋ฅผ ๋ถ๋ฌ์ค๋ ์์ฒญ์ด๋ผ๊ณ ๊ฐ์ ํ์ ๋ ๊ฐ ์์ฒญ์ด 1์ด ๊ฑธ๋ฆฌ๋ฉด ์ ์ฒด ์์ ์๊ฐ์ 5์ด๊ฐ ๋์ง๋ง Promise.all์ ๋์์ ์ฝ๋๊ฐ ์คํ๋๊ธฐ ๋๋ฌธ์ ์ด๋ก ์ ์ผ๋ก 1์ด๋ก ๋จ์ถ๋ ์ ์๋ค.๊ทผ๋ฐ ์ map์ Promise.all๋ก ๊ฐ์ธ์ค์ผ ํ ๊น ?
์ด๊ฑด ์ฌ์ค
Promise.All์ ํน์ง์ ๋ชฐ๋์ ๋ ๋ค์๋ ์๋ฌธ์ด๋ค. ๊ทธ๋์ ์๋ฌธ์ ์ ํด๊ฒฐํ๊ณ ์ ์ฐพ์๋ดค๋๋ฐ ์ ๊ธฐํ ์ฌ์ค์ ์๊ฒ๋๋ค.map์ ๋๊ธฐ์ ์ผ๋ก ์คํ๋๋ค. ๊ทผ๋ฐ ๋ง์ฝ์ map๋ฉ์๋ ์์์ ๋น๋๊ธฐ์ ์ธ ์ฝ๋๋asyncํจ์๋ฅผ ํธ์ถํ๊ฒ ๋๋ฉด ๊ฐ ํธ์ถ์ ๋น๋๊ธฐ ์ฝ๋๋ก ์คํ ๋๋ค๋ ์ ์ด๋ค.์ฆ ์ด๋ ์ฝ๋ฐฑ์ด ๋ฐํํ๋ ๊ฐ์ผ๋ก
Promise๋ฅผ ๋ฐํํ๋ค. ์ฌ๊ธฐ์map์Promise๋ค์ ๊ธฐ๋ค๋ฆฌ์ง ์๊ณ ๋ฐ๋ก ๋ค์ ์์๋ก ๋์ด๊ฐ๊ธฐ ๋๋ฌธ์map์ ๊ฒฐ๊ณผ๋ก ์์ฑ๋ ๋ฐฐ์ด์Promise๋ก ์ฑ์์ง๋ค๋ ์๋ฏธ์ด๋ค.์ ์ฒด์ ์ผ๋ก ์์ฝํด๋ณด์๋ฉด
map์ผ๋ก ์ํํ ์์๋ค์ ๊ฐ์Promise๋ฅผ ์ฆ์ ์คํํ์ง๋ง ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ๋ค๋ฆฌ์ง ์๊ธฐ ๋๋ฌธ์ ์ ์์ ์ธ ๊ฐ์ด ๋ค์ด์ค๋ ๊ฒ ์๋๋ผPromise๊ฐ์ฒด์ ๊ฐ์ด ๋ค์ด์จ๋ค๊ณ ์๊ฐํ๋ฉด ๋๋ค.๋ ์์๋ฅผ ๋ฐํํ๊ณ ์ถ์๋ฐ ๊ทธ๋ผ ์ด๋ป๊ฒ ํด์ผ ๋ ๊น ? ๋ฐฉ๋ฒ์ ๊ฐ๋จํ๋ค !! map ์ธ๋ถ์
Promise.all๋ก ๊ฐ์ผ๋ค. ์ด๋ ๊ฒ ๋๋ฉด ๋ชจ๋ ๋น๋๊ธฐ ์์ ์ด ์๋ฃ๋ ํ์ ๊ฒฐ๊ณผ๋ฅผ ์ฒ๋ฆฌํ ์ ์๋ค.
๊ฐ์ฒด๊ฐ ๋ฐํ์ด ์ ๋๋ค๋ฉด ์ด ์ ์ฒด์ ์ธ ์ฝ๋๋ result ๋ณ์์ ๋ด์์ setList ์ํ ๋ณํ ํจ์์ ๋ฃ์ด์ค๋ค. ์ด๋ ๊ฒ ๋๋ฉด ์ด ๋ชจ๋ ๋ฐ์ดํฐ๋ list State๊ฐ ์ํ๋ฅผ ๊ด๋ฆฌํด์ฃผ๋ ๊ฒ์ ์ ์ ์๋ค.
getData()๋ก ํจ์ ํธ์ถ๊น์ง ํ๋ฉด ๋ !
for๋ฌธ์ด๋ map์ ๋น๊ตํ์ ๋ for๋ฌธ์ ์์๊ฐ ํ๋์ฉ ์์ฐจ์ ์ผ๋ก ์คํ๋์ง๋ง map์ ๋์์ ์คํ๋์ด ์ ์ฒด ๋ก๋ฉ ์๋๋ ๋นจ๋ผ์ก๊ณ ,
for๋ฌธ์์๋ URL ๊ฒฝ๋ก๋ฅผ ํ๋ ์ฝ๋ฉ์ผ๋ก ๊ณ ์ ํด๋์์ ๋ง์ฝ ์๋ณธ ๋ฐ์ดํฐ์ ๊ฒฝ๋ก๊ฐ ์์ ๋ ๊ฒฝ์ฐ ์ ์ ์๋ํ์ง ์์ ์ํ์ฑ์ด ์๋ค. ๊ทผ๋ฐ map์ผ๋ก ํฌ์ผ๋ชฌ ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์์ ๊ฐ์ฒด ์ ๊ทผ ๋ฐฉ์์ ํ์ฉํ์ฌ URL์ ์ ๊ทผํ๊ธฐ ๋๋ฌธ์ ์ด ๋ถ๋ถ์์ ๋ดค์ ๋ ์ ์ง๋ณด์ ๋ฉด์์ ๋ ์์ ํด์ง ๊ฒ ๊ฐ๋ค.
๋ญ๊ฐ ์ฝ๋ ๋น๊ต๋ฅผ ํ๋ฉด์ ๋ธ๋ก๊ทธ์ ๋ํด์ ์ ์ข์ ์ ๋ค๋ง ์๊ธฐํ ๊ฒ ๊ฐ์๋ฐ,, ๋ธ๋ก๊ทธ๋ฅผ ์ฐธ๊ณ ํด์ GET์์ฒญ ์ฐ์ต์ ํ ๋ ์์ฒญํ๋ ๋ฐฉ๋ฒ๊ณผ ์ฝ๋์ ํ๋ฆ์ ๋ํด์ ์๊ฒ ๋์๊ณ , api๋ฌธ์๋ฅผ ์ดํดํ๋๋ฐ ์ ๋ง ๋ง์ ๋์์ด ๋์๋ค.
โ
name: speciesRes.data.names[2].nameํ๊ตญ์ด๋ฅผ ๊ฐ์ ธ์ค๋ ์ฝ๋์ธ๋ฐ ์ผ๋จ์ ์ธ๋ฑ์ค๋ก ๋ถ๋ฌ์๋ดค๋ค. ํผ์์ ๋ค์ GET์์ฒญ ์ฐ์ต์ ํ ํ์ ์ฝ๋๋ ์์ ๋ ์์ ์ด๋ค.
//์ฐ์ต ์ฝ๋
function App() {
const [pokemonData, setPokemonData] = useState<Pokemon[]>([]);
useEffect(() => {
const getData = async () => {
try {
//๋ฉ์ธ ํฌ์ผ๋ชฌ ๋ฆฌ์คํธ (ํฌ์ผ๋ชฌ ๋ฐ์ดํฐ 200๊ฐ ์์ฒญ)
const mainRes = await instance.get("/pokemon", {
params: {
limit: 200,
},
});
const result: Pokemon[] = await Promise.all(
mainRes.data.results.map(async (pokemonItem: { url: string }) => {
// ํฌ์ผ๋ชฌ ์์ธ ๋ฐ์ดํฐ (์ด๋ฏธ์ง ๋ถ๋ฌ์ค๊ธฐ)
const urlRes = await instance.get(pokemonItem.url);
//ํฌ์ผ๋ชฌ species ๋ฐ์ดํฐ (ํฌ์ผ๋ชฌ ํ๊ธ ์ด๋ฆ ๋ฐ์ดํฐ ๋ถ๋ฌ์ค๊ธฐ)
const speciesRes = await instance.get(urlRes.data.species.url);
//ํฌ์ผ๋ชฌ ์ด๋ฏธ์ง ์ถ์ถ
const imageURL =
urlRes.data.sprites.versions["generation-v"]["black-white"]
.animated["front_default"];
//ํฌ์ผ๋ชฌ ํ๊ตญ์ด ์ด๋ฆ ์ถ์ถ
const koreanName = speciesRes.data.names.find(
(koreanName: { language: { name: string } }) =>
koreanName.language.name === "ko"
);
//ํฌ์ผ๋ชฌ ๋ฐ์ดํฐ ๋ฐํ
return {
id: urlRes.data.id,
imgURL: imageURL,
name: koreanName.name,
};
})
);
setPokemonData(result);
} catch (error) {
console.error("error", error);
alert("์ค๋ฅ๋ฅผ ํ์ธํ์ธ์");
}
};
getData();
}, []);
return (
);
}
export default App;
1. getData ํจ์ ํธ์ถ ์ค๋ฅ
2. ํฌ์ผ๋ชฌ url ๊ฒฝ๋ก์์ ์๋ ๋ฐ์ดํฐ ์ ๊ทผ ๋ถ๊ฐ
mainRes ์์ฒญ ํ์ map์ ๋๋ฆฌ๊ณ url ์์ฒญ์ ํด์ผ ํ๋๋ฐ url์ ๊ฐ์ฒด ์ ๊ทผ ๋ฐฉ๋ฒ์ผ๋ก ๋ถ๋ฌ์๋ ๊ฒฝ๋ก ์์ ์๋ ๋ฐ์ดํฐ์ ์ ๊ทผํ ์ ์๋ค๊ณ ์๊ฐํ๋ค.
๋ฐ์ดํฐ๋ฅผ ๋ฐ์์จ ์ํ๊ฐ ์๋๊ธฐ ๋๋ฌธ์ ๋๋ฌด๋๋ ๋น์ฐํ๊ฒ undefined๊ฐ ๋์๋ค.. ๋ค์ get ์์ฒญ ํ์ ์ฝ์๋ก ์ฐ์ด๋ณด๋ url์์ ์๋ pokemon data๋ฅผ ํ์ธํ ์ ์๋ ์ํ๊ฐ ๋์๋ค.

3. ํฌ์ผ๋ชฌ ํ๊ธ์ด๋ฆ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๊ธฐ ์ํ url์์ฒญํ๋ ๋ฐฉ๋ฒ
ํฌ์ผ๋ชฌ ํ๊ธ ์ด๋ฆ ๋ฐ์ดํฐ๋ฅผ ๋ฝ๊ธฐ ์ํด์ /pokemon-species์์ ์์ฒญํ๋ฉด ๋๋ ์ค ์์์ผ๋ ์ด๋ ๊ฒ ํ๊ฒ ๋๋ฉด urlRes๋ก ์์ฒญํ ์ฝ๋ ์์ species ์์ฑ์ด ์ด๋ฏธ ์๋๋ฐ ๋ ๋ค์ ๊ฐ์ ์ฝ๋๋ฅผ ๋ถ๋ฌ์ค๊ธฐ ๋๋ฌธ์ ๋นํจ์จ์ ์ด๊ณ , ์ค๋ณต๋ ์ฝ๋๊ฐ ์๊ธด๋ค.
๊ฒฐ๋ก ์ ๊ธฐ์กด์ mainRes๋ฐ์ดํฐ ์์ ๋ณด๋ฉด ํ๊ตญ์ด ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ง spacies ํ๋กํผํฐ๊ฐ ์์ผ๋๊น ์ด์ชฝ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์์ฒญํ๋ฉด ๋๋ค๋ ๊ฒ์ ์๊ฒ ๋์๋ค.

4. promise.All ์ฌ์ฉ ๋ฐฉ๋ฒ
์์ ์ ์ ๋ด์ฉ๋ค์ GET์์ฒญ ์ฐ์ต์ ํ๋ฉด์ ๋งํ๋ ๋ถ๋ถ๋ค์ด๋ค.. poke-api ๋ฌธ์๋ ๋ด๋๋ด๋ ์ง์ง ์ด๋ ค์ด ๊ฒ ๊ฐ๊ณ , ๋งํ๋ ๋ถ๋ถ๋ค์ด ๋ง์ ๊ฒ ๊ฐ์์ ๋ด์ผ ํ๋ฒ ๋ ๋ง๋ค์ด ๋ด์ผ ๋ ๊ฒ ๊ฐ๋ค... ์ฝ๋๋ฅผ ์ดํดํ๋ ๊ฒ๊ณผ ์ค์ ๋ก ๋ํผ์์ ์ฝ๋๋ฅผ ์ง๋ ๊ฑด ์์ํ ๊ฒ ์ด์ธ๋ก ๋๋ฌด ์ด๋ ค์ ๋ค.