본문 바로가기

리액트

포켓몬 API 활용한 포켓몬 도감 토이 프로젝트에 대한 회고

🏆 포켓몬 도감 (PokeAPI React Project)

📌 프로젝트 소개

  • 포켓몬 도감을 구현한 React + TypeScript 프로젝트입니다.
    P- okeAPI를 활용하여 무한 스크롤을 적용하고, React Query로 데이터를 관리합니다.

🚀 주요 기능

  • ✅ React Query로 API 데이터 관리
  • ✅ 무한 스크롤 적용 (Infinite Scroll)
  • ✅ TypeScript 적용 (정적 타입 검증)
  • ✅ Styled Components로 UI 스타일링
  • ✅ Vercel을 통한 자동 배포

🛠️ 기술 스택

  • Frontend: React, TypeScript
  • State Management: React Query
  • CSS: Styled Components
  • Deployment: Vercel

📂 프로젝트 폴더 구조

pokeapi/  
├── public/ # 정적 파일 (HTML, 이미지 등)  
│ └── favicon.ico  
├── src/ # 소스 코드  
│ ├── api/ # API 관련 코드  
│ │ └── pokemonApi.ts  
│ ├── assets/ # 프로젝트에서 사용하는 정적 자산  
│ │ └── Spinner.gif  
│ ├── components/ # UI 컴포넌트  
│ │ ├── Card.tsx  
│ │ ├── CardList.tsx  
│ │ ├── Loading.tsx  
│ │ └── Modal.tsx  
│ ├── types/ # 타입 정의 파일  
│ │ ├── Card/  
│ │ │ └── cardType.ts  
│ │ ├── Modal/  
│ │ │ └── modalType.ts  
│ │ └── PoketApi/  
│ │ └── pokemonApiType.ts  
│ ├── App.css # 전역 스타일  
│ ├── App.tsx # 최상위 React 컴포넌트  
│ ├── index.css # 기본 스타일 파일  
│ └── index.tsx # 엔트리 포인트  
├── .eslintrc.json # ESLint 설정 파일  
├── .gitignore # Git에서 무시할 파일 목록  
├── .prettierrc # Prettier 설정 파일  
├── package.json # 프로젝트 의존성 및 스크립트  
├── package-lock.json # 의존성 잠금 파일  
└── README.md # 프로젝트 설명 파일

⚡ 문제 해결 과정 & 회고

  • 1️⃣ React Query + 무한 스크롤 구현 시 어려웠던 점
  • 처음에는 useEffect + useState를 사용했지만, 데이터 캐싱과 성능 최적화를 위해 React Query로 변경함.
  • 쿼리와, state + effect에 성능 차이는 진짜 어마어마 했다. 바로 느껴짐...
  • 처음에 무한 로딩이 되었는데 useState로 loading을 따로 관리하였다. 그래서 무한 로딩이 발생했다.
  • Query에서 제공해주는 isLoading으로 변경하여 해결하였다... 멍청한 녀석...

1️⃣ TypeScript의 어려움

  • API 응답 데이터를 적절한 타입으로 정의하는 것이 가장 어려웠음.
  • TS는 아직 많이 부족한거 같다. 더 연습을 하고 더 공부를 해야 겠다. 이 프로젝트에서도 잘 정의하지 못한 데이터가 많은 것 같다.
  • 해결: interface를 명확하게 정의하고, 필요한 데이터만 가공하여 저장.

1️⃣Vercel 배포 오류

1️⃣ Ul컴포넌트 List컴포넌트 분리하여 생성하였을 떄 같은 요소가 두 번 렌더링

  • React에서 key는 컴포넌트를 식별하는 중요한 요소이기 때문에, key 설정을 실수하면 React가 잘못된 재렌더링을 수행할 수 있다.
  • 이번 문제를 통해 key 값을 고유하게 설정하는 것이 얼마나 중요한지 배웠다.

1️⃣ API데이터 요청

  • 포켓몬API가 공식문서 보기가 어려웠다.
  • 데이터 구조가 너무 중첩이 되어 있어가지고 처음에는 map과 find를 사용하여 처리 하는 변수 들이 너무 많이 늘어났다.
  • 해결: 내가 사용한 방법은 flatMap()을 사용하는 방법 이였다.
  • 더 깔끔하게 구조를 잘 가져오는 방법이 있을꺼라고 생각한다.

1️⃣ Git 브랜치 전략

  • Git을 브랜치 전략으로 사용 해볼려고 많은 고민을 하면서 커밋과 푸쉬를 하였다.
  • 이렇게 하는게 잘 맞는지 몰르겠지만 다음 프로젝트 에서는 더 깃을 잘 사용하여 브랜치 전략을 할 수 있을꺼 같다.

1️⃣ 임포트 시 .tsx를 입력해야 렌더링이 되는 문제

  • 문제: 임포트할 때 .tsx 확장자를 입력하지 않으면 컴포넌트가 렌더링되지 않는 문제가 발생.
  • 원인: 초기 프로젝트 설정에서 잘못된 경로 설정 또는 빌드 환경 문제가 있었던 것으로 추정됨.
  • 시도: 구글링과 GPT를 활용해 문제를 해결하려 했으나 정확한 원인을 찾지 못함. 4시간 동안 했는데도 수정을 못함..
  • 교훈: 다음 프로젝트에서는 초기에 프로젝트 환경 설정(빌드 및 경로 설정)을 꼼꼼히 확인하고 구성해야겠다고 생각함
  • "멍청한 나, 지반부터 잘 다져야지..." 😂

📌 개선하고 싶은 점

  • 🔹 React Query를 좀 더 깊게 활용해 캐싱 최적화
  • 🔹 Redux/Zustand 같은 상태 관리 라이브러리 적용 연습 이 프로젝트에서는 props가 깊지 않아서 사용은 안 했지만 다음에는 사용을 해보고 싶다.
  • 🔹 다크 모드 지원 추가하기
  • 🔹 더 깔끔하게 데이터를 가져오는 방법을 생각해보기
  • 🔹 내 나름대로 코드를 생각하면서 작성했지만 더 리팩토링을 할 수 있다고 생각한다. 🔹 성능 최적화를 했다고 하지만 더 성능 최적화를 할 수 있을꺼 같다

📌 자세한 것은 여기서 확인하세요