[React] ๐Ÿ“ค PokeAPI ๋ฐ์ดํ„ฐ GET์š”์ฒญ ์—ฐ์Šต

์ด๋‹ค์˜ยท2024๋…„ 9์›” 27์ผ

React

๋ชฉ๋ก ๋ณด๊ธฐ
29/31

์ฒ˜์Œ์— ํ–ˆ๋˜ ๋ฐ์ดํ„ฐ ์š”์ฒญ ์—ฐ์Šต์€ for๋ฌธ์œผ๋กœ ๋ฐ˜๋ณตํ•ด์„œ ๋ถˆ๋Ÿฌ์™”๋‹ค. api ๋ฌธ์„œ๋ฅผ ์ฝ์–ด๋ดค์„ ๋•Œ URLํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ํฌ์ผ“๋ชฌ id์— ์ ‘๊ทผ์„ ์–ด๋–ป๊ฒŒ ํ•ด์•ผํ•  ์ง€ ๋ชจ๋ฅด๊ฒ ์–ด์„œ ๋ธ”๋กœ๊ทธ๋ฅผ ์ฐธ๊ณ ํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ์š”์ฒญํ–ˆ์ง€๋งŒ ์ด๊ฒƒ๋งˆ์ €๋„.. ๋งŽ์ด ์–ด๋ ค์› ๋‹ค.

for๋ฌธ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์š”์ฒญํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์ดˆ๊ธฐ ๋กœ๋”ฉ ์†๋„๊ฐ€ ๋А๋ฆฌ๊ธฐ ๋•Œ๋ฌธ์— ์˜ค๋Š˜ map ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ƒˆ๋กญ๊ฒŒ GET ์š”์ฒญํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ฐฐ์› ๋‹ค. ํ—ท๊ฐˆ๋ฆฌ๋Š” ๋ถ€๋ถ„์ด ์žˆ์–ด์„œ ์ดํ•ดํ•˜๊ณ  ๋‹ค์‹œ ๋งŒ๋“ค์–ด๋ณด๋ ค๊ณ  ํ•œ๋‹ค. ์ผ๋‹จ ์˜ค๋Š˜์€ ํ•œ์ค„ ํ•œ์ค„ ์ฝ”๋“œ๋ฅผ ์ดํ•ดํ•˜๋Š” ๊ฑฐ์— ์ค‘์ ์„ ๋‘๊ณ  ๊นŒ๋จน์ง€ ์•Š๊ธฐ ์œ„ํ•ด ๋ธ”๋กœ๊ทธ๋ฅผ ์จ๋ณด๋ ค๊ณ  ํ•œ๋‹ค.

< for๋ฌธ์„ ํ™œ์šฉํ•œ ํฌ์ผ“๋ชฌ ๋ฐ์ดํ„ฐ 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;
  1. ํฌ์ผ“๋ชฌ ์ „์ฒด ๋ฐ์ดํ„ฐ๊ฐ€ ๋“ค์–ด๊ฐˆ ๊ณต๊ฐ„์ธ useState๋กœ ๋ฐ์ดํ„ฐ์˜ ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•˜๋ ค๊ณ  ํ•œ๋‹ค. ๋ฐ์ดํ„ฐ๊ฐ€ ๋“ค์–ด๊ฐˆ ๊ณต๊ฐ„์„ pokemonNames๋กœ ์ด๋ฆ„์„ ์ž‘๋ช…ํ•˜๊ณ , ์ดˆ๊ธฐ๊ฐ’์„ ๋นˆ ๋ฐฐ์—ด๋กœ ์„ค์ •ํ–ˆ๋‹ค.

  2. ๋ฐ์ดํ„ฐ๊ฐ€ ์ฒ˜์Œ ๋ Œ๋” ์‹œ ํ•œ ๋ฒˆ๋งŒ ๋ถˆ๋Ÿฌ์™€์•ผ ๋˜๊ธฐ ๋•Œ๋ฌธ์— useEffect ํ›…์—์„œ ๋ถˆ๋Ÿฌ์™”๋‹ค.

  3. axios ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์„ค์น˜ ํ›„์— ๋ฐ์ดํ„ฐ๋ฅผ ์š”์ฒญํ•  ๊ฑด๋ฐ axios๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ์—๋Š” ๋ณดํ†ต try/catch ์™€ async/await์€ ๊ฐ™์ด ์“ด๋‹ค๊ณ  ๋ณด๋ฉด ๋œ๋‹ค. ์ด ๋ฐฉ๋ฒ•์ด ๋น„๋™๊ธฐ ์ฝ”๋“œ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š”๋ฐ ๊ฐ€์žฅ ๊ฐ„ํŽธํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๊ณ , ์˜ค๋ฅ˜ ํ™•์ธ๋„ ์‰ฝ๊ฒŒ ๊ฐ€๋Šฅํ•˜๋‹ค.

  4. useEffect ์•ˆ์— ๋“ค์–ด๊ฐˆ ๋ฐ์ดํ„ฐ๋ฅผ ์š”์ฒญํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ getData๋กœ ๋งŒ๋“ค์—ˆ๋‹ค.

  5. allpokemonList์˜ ๋ณ€์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด์ค€๋‹ค. ์ด ๋ณ€์ˆ˜ ์•ˆ์—๋Š” ํฌ์ผ“๋ชฌ ์ด๋ฏธ์ง€์™€ ํ•œ๊ตญ์–ด ์ด๋ฆ„์„ ๊ฐ€์ง„ ํฌ์ผ“๋ชฌ 100๋งˆ๋ฆฌ์˜ ๋Œ€ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๋„ฃ์–ด์ค„ ๊ฒƒ์ด๋‹ค. ๊ทธ ๋‹ค์Œ์— pokemonNames์•ˆ์— ๋„ฃ์–ด์ค˜์„œ ํ™”๋ฉด์— ๋ Œ๋”๋ง ์‹œํ‚ค๋ ค๊ณ  ํ•œ๋‹ค.

  6. /pokemon/${i} ์ด ๊ฒฝ๋กœ๋กœ ๋ฐ์ดํ„ฐ ์š”์ฒญ์„ ํ•  ๊ฑด๋ฐ i๋Š” for๋ฌธ์œผ๋กœ ๋Œ๋ฆด ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— URL ํŒŒ๋ผ๋ฏธํ„ฐ์— ๋™์ ์œผ๋กœ ํฌ์ผ“๋ชฌ id๊ฐ€ ๋“ค์–ด์˜จ๋‹ค. ์‚ฌ์‹ค id๊ฐ€ ์ง์ ‘์ ์œผ๋กœ ๋“ค์–ด์˜จ๋‹ค๊ธฐ ๋ณด๋‹ค๋Š” ๋‚ด๊ฐ€ ๋งŒ๋“  i ๋ณ€์ˆ˜๊ฐ€ ์ˆซ์ž 100์ด ๋  ๋•Œ๊นŒ์ง€ 1์”ฉ ๊ณ„์† ๋”ํ•ด์„œ ๋™์ ์œผ๋กœ ๋“ค์–ด์˜ฌ ์ˆ˜ ์žˆ๊ฒŒ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.

  7. res์™€ speciesRes๋กœ ์š”์ฒญ์„ 2๋ฒˆ ๋‚ ๋ฆฌ๋Š” ๊ฑฐ์— ์ฒ˜์Œ์—๋Š” ์˜๋ฌธ์ด ๋“ค์—ˆ๋‹ค... poke-API๋ฌธ์„œ๋ฅผ ์ž˜ ๋ณด๋ฉด pokemon์—์„œ๋Š” ํฌ์ผ“๋ชฌ ์ด๋ฏธ์ง€๋ฅผ ๋ถˆ๋Ÿฌ์˜ฌ ์ˆ˜ ์žˆ๊ณ , pokemon-species์—์„œ๋Š” ๊ฐ๊ฐ์˜ ํฌ์ผ“๋ชฌ ์ด๋ฆ„์„ ํ•œ๊ตญ์–ด๋กœ ๋ถˆ๋Ÿฌ์˜ฌ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— 2๋ฒˆ ์š”์ฒญ์„ ํ•ด์ค€ ๊ฒƒ์ด๋‹ค.

  8. ๋ฐ์ดํ„ฐ ์š”์ฒญ์„ ๋ณด๋ƒˆ์œผ๋ฉด ํ•œ๊ตญ์–ด๋กœ ํฌ์ผ“๋ชฌ ์ด๋ฆ„์„ ๋ถˆ๋Ÿฌ์˜ค๋Š”๋ฐ์— ๋ณต์žกํ•จ์„ ๋А๋‚„ ๊ฒƒ์ด๋‹ค.. ๋ธ”๋กœ๊ทธ๋ฅผ ์ฐธ๊ณ ํ•ด์„œ ๋ถˆ๋Ÿฌ์˜ค๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ƒˆ๋‹ค. pokemon-species๊ฒฝ๋กœ์— ์ ‘๊ทผํ•ด์„œ ๊ฐ์ฒด๋กœ ํƒ€๊ณ ํƒ€๊ณ  ๋“ค์–ด๊ฐ€์„œ ๋ณด๋ฉด ์ด์ƒํ•ด์”จ๊ฐ€ ๋‚˜์˜จ๋‹ค. names์—๋Š” ํ•œ๊ตญ์–ด ์ •๋ณด๊ฐ€ ๋“ค์–ด์žˆ๋Š”๋ฐ find ๋ฉ”์„œ๋“œ๋กœ names๋ฅผ ์ˆœํšŒํ•˜๋ฉด์„œ name.language.name์— ์ ‘๊ทผํ•˜์—ฌ ๊ฐ’์ด ko์™€ ์ผ์น˜ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋งŒ ์ฐพ์•„์ฃผ๋Š” ์กฐ๊ฑด๋ฌธ์„ ๋งŒ๋“ค์—ˆ๋‹ค.

  9. ๋งŒ๋“ค์–ด๋’€๋˜ ์ดˆ๊ธฐ๊ฐ’์ด ๋นˆ ๋ฐฐ์—ด์ธ allPokemonData ์— push ๋ฉ”์„œ๋“œ๋กœ ์ƒˆ๊ฐ์ฒด๋ฅผ ๋„ฃ์–ด์ค€๋‹ค. โ€ฆresponse.data๋กœ ๊ธฐ๋ณธ ์ •๋ณด๋“ค์„ ๋ณต์‚ฌํ•˜๊ณ  ๊ทธ ๋’ค์—๋Š” key๊ฐ€ korean_name์ด๊ณ , value ๊ฐ€ koreanName.name์ธ ์†์„ฑ์„ ์ถ”๊ฐ€ํ•˜์—ฌ ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ ๋‹ค. koreanName.name์—๋Š” ํ•œ๊ตญ์–ด ์ด๋ฆ„์„ ๊ฐ€์ง„ ํฌ์ผ“๋ชฌ์ด ๋“ค์–ด์žˆ๋‹ค.

  10. ๊ฒฐ๊ณผ์ ์œผ๋กœ allPokemonData ์— ์ถ”๊ฐ€ํ•œ ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ์ฒ˜์Œ์— ์ƒํƒœ ์ €์žฅ์œผ๋กœ ๋งŒ๋“ค์–ด ๋’€๋˜ setPokemonData(allPokemonData); ์— ๋„ฃ๊ณ , getData() ํ•จ์ˆ˜ ํ˜ธ์ถœ๊นŒ์ง€ ํ•˜๋ฉด ๋ !


< map ๋ฉ”์„œ๋“œ๋ฅผ ํ™œ์šฉํ•œ ํฌ์ผ“๋ชฌ ๋ฐ์ดํ„ฐ GET ์š”์ฒญ ์—ฐ์Šต >

์œ„ ์ฝ”๋“œ๋ž‘ ๋น„์Šทํ•œ ๋ถ€๋ถ„์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ฒน์น˜๋Š” ๋ถ€๋ถ„์€ ์ƒ๋žตํ•ด์„œ ์ž‘์„ฑํ–ˆ๋‹ค.

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 ()
}
  1. mainRes ๋ณ€์ˆ˜์— pokemon ๋ฐ์ดํ„ฐ๋ฅผ ์š”์ฒญํ•ด์„œ ๋‹ด์•„์ค€๋‹ค.

  2. 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๋กœ ๊ฐ์‹ผ๋‹ค. ์ด๋ ‡๊ฒŒ ๋˜๋ฉด ๋ชจ๋“  ๋น„๋™๊ธฐ ์ž‘์—…์ด ์™„๋ฃŒ๋œ ํ›„์— ๊ฒฐ๊ณผ๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

  3. ๊ฐ์ฒด๊ฐ€ ๋ฐ˜ํ™˜์ด ์ž˜ ๋๋‹ค๋ฉด ์ด ์ „์ฒด์ ์ธ ์ฝ”๋“œ๋Š” result ๋ณ€์ˆ˜์— ๋‹ด์•„์„œ setList ์ƒํƒœ ๋ณ€ํ™” ํ•จ์ˆ˜์— ๋„ฃ์–ด์ค€๋‹ค. ์ด๋ ‡๊ฒŒ ๋˜๋ฉด ์ด ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋Š” list State๊ฐ€ ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•ด์ฃผ๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

  4. getData()๋กœ ํ•จ์ˆ˜ ํ˜ธ์ถœ๊นŒ์ง€ ํ•˜๋ฉด ๋ !


์ฝ”๋“œ ๋น„๊ต

for๋ฌธ์ด๋ž‘ map์„ ๋น„๊ตํ–ˆ์„ ๋• for๋ฌธ์€ ์š”์†Œ๊ฐ€ ํ•˜๋‚˜์”ฉ ์ˆœ์ฐจ์ ์œผ๋กœ ์‹คํ–‰๋˜์ง€๋งŒ map์€ ๋™์‹œ์— ์‹คํ–‰๋˜์–ด ์ „์ฒด ๋กœ๋”ฉ ์†๋„๋„ ๋นจ๋ผ์กŒ๊ณ ,

for๋ฌธ์—์„œ๋Š” URL ๊ฒฝ๋กœ๋ฅผ ํ•˜๋“œ ์ฝ”๋”ฉ์œผ๋กœ ๊ณ ์ • ํ•ด๋†“์•„์„œ ๋งŒ์•ฝ ์›๋ณธ ๋ฐ์ดํ„ฐ์˜ ๊ฒฝ๋กœ๊ฐ€ ์ˆ˜์ • ๋  ๊ฒฝ์šฐ ์ •์ƒ ์ž‘๋™ํ•˜์ง€ ์•Š์„ ์œ„ํ—˜์„ฑ์ด ์žˆ๋‹ค. ๊ทผ๋ฐ map์œผ๋กœ ํฌ์ผ“๋ชฌ ๋ฐ์ดํ„ฐ๋ฅผ ๋ถˆ๋Ÿฌ์™€์„œ ๊ฐ์ฒด ์ ‘๊ทผ ๋ฐฉ์‹์„ ํ™œ์šฉํ•˜์—ฌ URL์— ์ ‘๊ทผํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด ๋ถ€๋ถ„์—์„œ ๋ดค์„ ๋•Œ ์œ ์ง€๋ณด์ˆ˜ ๋ฉด์—์„œ ๋” ์•ˆ์ „ํ•ด์ง„ ๊ฒƒ ๊ฐ™๋‹ค.


๋ญ”๊ฐ€ ์ฝ”๋“œ ๋น„๊ต๋ฅผ ํ•˜๋ฉด์„œ ๋ธ”๋กœ๊ทธ์— ๋Œ€ํ•ด์„œ ์•ˆ ์ข‹์€ ์ ๋“ค๋งŒ ์–˜๊ธฐํ•œ ๊ฒƒ ๊ฐ™์€๋ฐ,, ๋ธ”๋กœ๊ทธ๋ฅผ ์ฐธ๊ณ ํ•ด์„œ GET์š”์ฒญ ์—ฐ์Šต์„ ํ•  ๋•Œ ์š”์ฒญํ•˜๋Š” ๋ฐฉ๋ฒ•๊ณผ ์ฝ”๋“œ์˜ ํ๋ฆ„์— ๋Œ€ํ•ด์„œ ์•Œ๊ฒŒ ๋˜์—ˆ๊ณ , api๋ฌธ์„œ๋ฅผ ์ดํ•ดํ•˜๋Š”๋ฐ ์ •๋ง ๋งŽ์€ ๋„์›€์ด ๋˜์—ˆ๋‹ค.

โž• name: speciesRes.data.names[2].name ํ•œ๊ตญ์–ด๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ์ฝ”๋“œ์ธ๋ฐ ์ผ๋‹จ์€ ์ธ๋ฑ์Šค๋กœ ๋ถˆ๋Ÿฌ์™€๋ดค๋‹ค. ํ˜ผ์ž์„œ ๋‹ค์‹œ GET์š”์ฒญ ์—ฐ์Šต์„ ํ•œ ํ›„์— ์ฝ”๋“œ๋Š” ์ˆ˜์ • ๋  ์˜ˆ์ •์ด๋‹ค.


2024-09-28 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 ํ•จ์ˆ˜ ํ˜ธ์ถœ ์˜ค๋ฅ˜

  • get์š”์ฒญํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ try ์•ˆ์— ๋„ฃ์–ด๋†“๊ณ ๋Š” ์™œ ํ•จ์ˆ˜ ํ˜ธ์ถœ์ด ์•ˆ ๋˜์ง€ ํ•˜๊ณ  ์žˆ์—ˆ๋‹ค..

2. ํฌ์ผ“๋ชฌ url ๊ฒฝ๋กœ์•ˆ์— ์žˆ๋Š” ๋ฐ์ดํ„ฐ ์ ‘๊ทผ ๋ถˆ๊ฐ€

  • mainRes ์š”์ฒญ ํ›„์— map์„ ๋Œ๋ฆฌ๊ณ  url ์š”์ฒญ์„ ํ•ด์•ผ ํ•˜๋Š”๋ฐ url์„ ๊ฐ์ฒด ์ ‘๊ทผ ๋ฐฉ๋ฒ•์œผ๋กœ ๋ถˆ๋Ÿฌ์™€๋„ ๊ฒฝ๋กœ ์•ˆ์— ์žˆ๋Š” ๋ฐ์ดํ„ฐ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๋‹ค.

    ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„์˜จ ์ƒํƒœ๊ฐ€ ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋„ˆ๋ฌด๋‚˜๋„ ๋‹น์—ฐํ•˜๊ฒŒ undefined๊ฐ€ ๋‚˜์™”๋‹ค.. ๋‹ค์‹œ get ์š”์ฒญ ํ›„์— ์ฝ˜์†”๋กœ ์ฐ์–ด๋ณด๋‹ˆ url์•ˆ์— ์žˆ๋Š” pokemon data๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋Š” ์ƒํƒœ๊ฐ€ ๋˜์—ˆ๋‹ค.

3. ํฌ์ผ“๋ชฌ ํ•œ๊ธ€์ด๋ฆ„ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๊ธฐ ์œ„ํ•œ url์š”์ฒญํ•˜๋Š” ๋ฐฉ๋ฒ•

  • ํฌ์ผ“๋ชฌ ํ•œ๊ธ€ ์ด๋ฆ„ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฝ‘๊ธฐ ์œ„ํ•ด์„œ /pokemon-species์—์„œ ์š”์ฒญํ•˜๋ฉด ๋˜๋Š” ์ค„ ์•Œ์•˜์œผ๋‚˜ ์ด๋ ‡๊ฒŒ ํ•˜๊ฒŒ ๋˜๋ฉด urlRes๋กœ ์š”์ฒญํ•œ ์ฝ”๋“œ ์•ˆ์— species ์†์„ฑ์ด ์ด๋ฏธ ์žˆ๋Š”๋ฐ ๋˜ ๋‹ค์‹œ ๊ฐ™์€ ์ฝ”๋“œ๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ ๋•Œ๋ฌธ์— ๋น„ํšจ์œจ์ ์ด๊ณ , ์ค‘๋ณต๋œ ์ฝ”๋“œ๊ฐ€ ์ƒ๊ธด๋‹ค.

    ๊ฒฐ๋ก ์€ ๊ธฐ์กด์— mainRes๋ฐ์ดํ„ฐ ์•ˆ์— ๋ณด๋ฉด ํ•œ๊ตญ์–ด ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ง„ spacies ํ”„๋กœํผํ‹ฐ๊ฐ€ ์žˆ์œผ๋‹ˆ๊นŒ ์ด์ชฝ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์š”์ฒญํ•˜๋ฉด ๋œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ ๋˜์—ˆ๋‹ค.

4. promise.All ์‚ฌ์šฉ ๋ฐฉ๋ฒ•

  • promise.All ์‚ฌ์šฉํ•  ๋•Œ ์•ž์— await์•ˆ ๋ถ™์ด๋ฉด promise ๊ฐ์ฒด๊ฐ€ ๋ฐ˜ํ™˜๋˜๋‹ˆ๊นŒ ์ด ์ ๋„ ์ฃผ์˜ํ•ด์•ผ ํ•  ๊ฒƒ ๊ฐ™๋‹ค

์œ„์— ์ ์€ ๋‚ด์šฉ๋“ค์€ GET์š”์ฒญ ์—ฐ์Šต์„ ํ•˜๋ฉด์„œ ๋ง‰ํ˜”๋˜ ๋ถ€๋ถ„๋“ค์ด๋‹ค.. poke-api ๋ฌธ์„œ๋Š” ๋ด๋„๋ด๋„ ์ง„์งœ ์–ด๋ ค์šด ๊ฒƒ ๊ฐ™๊ณ , ๋ง‰ํ˜”๋˜ ๋ถ€๋ถ„๋“ค์ด ๋งŽ์€ ๊ฒƒ ๊ฐ™์•„์„œ ๋‚ด์ผ ํ•œ๋ฒˆ ๋” ๋งŒ๋“ค์–ด ๋ด์•ผ ๋  ๊ฒƒ ๊ฐ™๋‹ค... ์ฝ”๋“œ๋ฅผ ์ดํ•ดํ•˜๋Š” ๊ฒƒ๊ณผ ์‹ค์ œ๋กœ ๋‚˜ํ˜ผ์ž์„œ ์ฝ”๋“œ๋ฅผ ์งœ๋Š” ๊ฑด ์ƒ์ƒํ•œ ๊ฒƒ ์ด์™ธ๋กœ ๋„ˆ๋ฌด ์–ด๋ ค์› ๋‹ค.

0๊ฐœ์˜ ๋Œ“๊ธ€