본문 바로가기
📄Today I Learned

챔피언 리스트 Fetch 과정에서의 문제 해결

by 영진학생 2025. 3. 14.

오늘은 챔피언 데이터를 가져오는 과정에서 발생한 문제를 해결한 경험을 정리해보려고 한다.


챔피언 데이터를 Fetch하는 함수

챔피언 리스트를 가져오기 위해 작성한 함수는 다음과 같다.

export const fetchChampionList = async () => {
  const versions = await fetchVersions();
  const response = await fetch(
    `${BASE_URL}/cdn/${versions[0]}/data/en_US/champion.json`,
    {
      next: { revalidate: 86400 },
    }
  );
  
  const data = await response.json();
 
  if (!response.ok) throw new Error(`HTTP request error: ${response.status}`);

  return data;
};

위의 코드를 작성하던 중 데이터가 어떤 형태로 오는지 궁금해서 console.log(data)로 확인해보았다.

하지만 예상과 다르게 전혀 예상하지 못했던 404 에러가 발생했다.

분명 API 주소도 정확하게 입력했는데, 왜 에러가 나는지 고민하던 중, 함께 공부하는 클래스메이트들에게 질문을 했다.

그리고 결국 문제의 원인은 page.tsx 파일의 잘못된 위치 때문이었다!!!😭

 

잘못된 폴더 구조 (챔피언 리스트 페이지가 개별 챔피언 상세 페이지 내부에 위치함)
📂 champions
 ┗ 📂 [id]        # 개별 챔피언 상세 페이지 폴더
    ┗ 📜 page.tsx  (잘못된 위치)

올바른 폴더 구조 (챔피언 리스트 페이지와 개별 챔피언 상세 페이지가 분리됨)
📂 champions
 ┣ 📂 [id]
 ┃ ┗ 📜 page.tsx  # 올바른 챔피언 디테일 페이지
 ┗ 📜 page.tsx  # 올바른 챔피언 리스트 페이지

 

page.tsx의 위치가 잘못되었을까?

Next.js에서는 폴더 구조가 라우팅을 결정하기 때문에, [id] 폴더 안에 page.tsx를 두면 해당 파일이 특정 챔피언의 상세 페이지로 인식된다. 즉, champions/[id]/page.tsxchampions/ahri, champions/yasuo와 같은 개별 챔피언 페이지로 해석된다.

 

반면, 챔피언 리스트를 보여주는 페이지champions/page.tsx에 있어야 한다.

  • champions/page.tsx/champions 경로에서 챔피언 리스트를 보여줌
  • champions/[id]/page.tsx/champions/ahri, /champions/yasuo 등 개별 챔피언 상세 페이지로 해석됨

5. 해결 방법

page.tsx 파일을 [id] 폴더 바깥의 champions 폴더로 옮긴 후 다시 실행해보니, 정상적으로 챔피언 리스트가 렌더링되었다.

이 과정을 통해 Next.js의 폴더 구조가 라우팅에 미치는 영향을 다시 한번 깊이 이해할 수 있었다 😊