PF/Poketmon

[ํฌ์ผ“๋ชฌ ๋„๊ฐ ํ”„๋กœ์ ํŠธ] #6 – ๐Ÿงฌ PokéAPI์—์„œ ์ง„ํ™” ์ •๋ณด ๊ฐ€์ ธ์˜ค๊ธฐ

akii 2025. 6. 18. 18:59
๋ฐ˜์‘ํ˜•

 

๐Ÿ“ [ํฌ์ผ“๋ชฌ ๋„๊ฐ ํ”„๋กœ์ ํŠธ] #6 – ๐Ÿงฌ PokéAPI์—์„œ ์ง„ํ™” ์ •๋ณด ๊ฐ€์ ธ์˜ค๊ธฐ

 

 

๐ŸŽฏ ๋ชฉํ‘œ

์ƒ์„ธ ํŽ˜์ด์ง€์—์„œ ํ•ด๋‹น ํฌ์ผ“๋ชฌ์˜ ์ง„ํ™” ํŠธ๋ฆฌ๋ฅผ ๋ณด์—ฌ์ค€๋‹ค!
์˜ˆ: ํ”ผ์นด์ธ„ → ๋ผ์ด์ธ„, ํŒŒ์ด๋ฆฌ → ๋ฆฌ์ž๋“œ → ๋ฆฌ์ž๋ชฝ

 

 


 

โœ… API ํ๋ฆ„ ์ •๋ฆฌ

PokéAPI์—์„œ ์ง„ํ™” ์ •๋ณด๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ ์œ„ํ•ด 3๋‹จ๊ณ„๋กœ ๊ตฌ์„ฑ๋œ API ์š”์ฒญ์„ ๊ฑฐ์ณ์•ผํ•œ๋‹ค.

1. `pokemon-species` → `evolution_chain` URL ํ™•์ธ
2. `evolution-chain` → ์ง„ํ™” ํŠธ๋ฆฌ ๋ฐ์ดํ„ฐ ๊ฐ€์ ธ์˜ค๊ธฐ
3. ์žฌ๊ท€ ๊ตฌ์กฐ๋ฅผ ํŒŒ์‹ฑํ•˜์—ฌ ์ง„ํ™” ๋ฆฌ์ŠคํŠธ ์™„์„ฑ

ํ•„์š” api ๋ฆฌ์ŠคํŠธ
species.url(์ข… ์ •๋ณด) https://pokeapi.co/api/v2/pokemon/{name}
evolution_chain.url https://pokeapi.co/api/v2/pokemon-species/{name}
์ง„ํ™” ํŠธ๋ฆฌ https://pokeapi.co/api/v2/evolution-chain/{id}

 

 

๐Ÿ“ก  ์ง„ํ™”๋ฆฌ์ŠคํŠธ fetch ํ•จ์ˆ˜ 

https://pokeapi.co/api/v2/evolution-chain/1/

evolution_chain์˜ api๋Š” ์œ„์™€ ๊ฐ™์ด ๋ณต์žกํ•œ ์ค‘์ฒฉ ๊ตฌ์กฐ๋กœ ๋˜์–ด์žˆ๋‹ค.
์ตœ์ข…์ ์œผ๋กœ ๋ฐ์ดํ„ฐ๋Š” ['bulbasaur', 'ivysaur', 'venusaur'] ์™€ ๊ฐ™์€ ์ง„ํ™” ๋„ค์ž„ ๋ฐฐ์—ด์ด ํ•„์š”!!

 

// ํƒ€์ž…์— ํ•ด๋‹นํ•˜๋Š” ํฌ์ผ“๋ชฌ ๋ฆฌ์ŠคํŠธ ๊ฐ€์ ธ์˜ค๊ธฐ
export const fetchPokeEvoChain = async (name: string) => {
  {/* ... */}
  let evoChain: string[] = [];

  const evoNames = (obj: any) => {
    if (!obj) return evoChain;
    evoChain.push(obj.species.name);

    if (obj.evolves_to && obj.evolves_to.length > 0) {
      return evoNames(obj.evolves_to[0]);
    }
    return evoChain;
  };
  evoNames(evoRes.chain);

  return evoChain;
};

- chain.species.name
- chain.evolves_to[0].species.name
- chain.evolves_to[0].evolves_to[0].species.name

๐Ÿ‘‰ evolution_chain์˜ api์—์„œ ์œ„์™€ ๊ฐ™์€ 3๊ฐœ์˜ ๊ฒฐ๊ณผ๊ฐ’์„ ๊ตฌํ•˜๋Š”๋ฐ evolves_to๊ฐ€ ๊ณ„์† ์ค‘์ฒฉ๋˜๋ฏ€๋กœ ์ผ๋ฐ˜์ ์ธ ๋ฐ˜๋ณต๋ฌธ์€ ๋ณต์žกํ•ด์ง„๋‹ค๊ณ  ์ƒ๊ฐ, ์—ฌ๋Ÿฌ ๋ฐ˜๋ณต๋ฌธ์„ ์ฐพ์•„๋ณด๋‹ค๊ฐ€ ์žฌ๊ท€ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด ๊ฐ„๋‹จํ•˜๊ฒŒ ์“ฐ๋Š” ๋ฐฉ๋ฒ•์„ ์ฑ„ํƒํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค.

 

 

๐Ÿ“Œ  ์ƒ์„ธ ํŽ˜์ด์ง€ ๋ Œ๋”๋ง

Error: Route "/pokemon/[name]" used `params.name`. `params` should be awaited before using its properties. Learn more: https://nextjs.org/docs/messages/sync-dynamic-apis
    at PokemonDetail (src/app/pokemon/[name]/page.tsx:10:52)
// /[name]/page.tsx

  const { name } = await params;
  const data = await fetchPokemonDetail(name);
  const evolutions = await fetchPokeEvoChain(name);

๐Ÿ‘‰ page.tsx์—์„œ ์„œ๋ฒ„๋ Œ๋”๋ง์œผ๋กœ params๋ฅผ ๋ถˆ๋Ÿฌ์˜ฌ๋•Œ ๋น„๋™๊ธฐ๋กœ ํ˜ธ์ถœ์ด ๋˜๊ธฐ ๋•Œ๋ฌธ์— async await ์„ ์‚ฌ์šฉํ•ด์„œ ๋™๊ธฐ์ ์œผ๋กœ ์จ์•ผํ•œ๋‹ค.

 

 

๐ŸŽ‰ ๊ฒฐ๊ณผ

์ƒ์„ธํŽ˜์ด์ง€

 

 

๐Ÿง  ์˜ค๋Š˜์˜ ํšŒ๊ณ 

์ด๋ฒˆ ํŽธ์—์„œ๋Š” ๋ณต์žกํ•œ ์ค‘์ฒฉ ๊ตฌ์กฐ์˜ api๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๋ฉด์„œ ์—ฌ๋Ÿฌ ํ•จ์ˆ˜๋ฅผ ๋น„๊ตํ•ด์„œ ์‚ฌ์šฉํ•˜๋ฉด์„œ ๋ฐ˜๋ณต๋ฌธ์— ๋Œ€ํ•œ ์—ฌ๋Ÿฌ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์„ ์•Œ๊ฒŒ ๋˜์—ˆ๊ณ , ๋ณต์žกํ•œ ์ค‘์ฒฉ ๊ตฌ์กฐ๋ฅผ ์–ด๋–ป๊ฒŒ ํ’€์–ด๋‚˜๊ฐ€์•ผ ํ• ์ง€ ์ข€ ๋” ๊ณต๋ถ€ํ•ด์•ผ ๋˜๊ฒ ๋‹ค๊ณ  ๋А๊ผˆ๋‹ค.


 

๐Ÿ“Ž ๋‹ค์Œ ๋ชฉํ‘œ 

  • ๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ 
  • ์ง„ํ™” ๊ฒฝ๋กœ ๊ฐ•์กฐ
  • ์• ๋‹ˆ๋ฉ”์ด์…˜ ํšจ๊ณผ ๋“ฑ๋“ฑ
๋ฐ˜์‘ํ˜•