/Moving

🎬 λ¬΄ν•œ 슀크둀 기반 μ˜ν™” 검색 μ‚¬μ΄νŠΈ

Primary LanguageTypeScript

Moving | μ˜ν™” 검색 μ‚¬μ΄νŠΈ

ν•΄μ™Έ μ˜ν™” 검색 APIλ₯Ό μ΄μš©ν•œ μ˜ν™” 검색 μ‚¬μ΄νŠΈμž…λ‹ˆλ‹€.

🌐 Demo

Moving | μ˜ν™” 검색 μ‚¬μ΄νŠΈ

βš’οΈ Tech Stack

Category Technologies
ν”„λ ˆμž„μ›Œν¬ 및 μ–Έμ–΄
λΉŒλ“œ 도ꡬ
μƒνƒœ 관리
μŠ€νƒ€μΌλ§
μ½”λ“œ 관리
배포 ν”Œλž«νΌ

🏠 ν”„λ‘œμ νŠΈ ꡬ쑰

  1. eslint, prettier, huskyλ₯Ό μ΄μš©ν•œ μΌκ΄€λœ μ½”λ“œ 관리

  2. createBrowserRouterλ₯Ό μ΄μš©ν•œ λΌμš°νŒ…

  3. μ΅œμƒμœ„ Layout μ»΄ν¬λ„ŒνŠΈ ꡬ쑰

    • μ—λŸ¬κ°€ λ°œμƒν•΄λ„ HeaderλŠ” λ°˜λ“œμ‹œ λ³΄μ—¬μ§€κ²Œ μ„€μ •
    • Outlet을 μ΄μš©ν•˜μ—¬ route별 μžμ‹ μ»΄ν¬λ„ŒνŠΈ λ Œλ”λ§
    • μ—λŸ¬ λŒ€μ‘
      • ErrorBoundary의 FallbackComponentλ₯Ό 톡해 메인 νŽ˜μ΄μ§€λ‘œ 이동할 수 있게 λŒ€μ‘
    • Waterfall UI 방지
      • Suspenseλ₯Ό μ΄μš©ν•œ 일괄적 비동기 데이터 λ‘œλ”© 처리
    • lazy λ‘œλ”©
      • Suspense와 lazyλ₯Ό μ΄μš©ν•œ λ²ˆλ“€ μ΅œμ ν™” μ‹œλ„
    • λͺ¨λ‹¬ μ»¨ν…Œμ΄λ„ˆ 뢄리
      • createPortal을 μ΄μš©ν•˜μ—¬ λͺ¨λ‹¬μ„ root λ…Έλ“œ 외뢀에 μœ„μΉ˜μ‹œμΌœ λ‹€λ₯Έ μ»΄ν¬λ„ŒνŠΈλ“€κ³Ό λ…λ¦½μ‹œν‚΄
      • λͺ¨λ‹¬ type별 λ‚΄λΆ€ μ»΄ν¬λ„ŒνŠΈλ₯Ό κ΅μ²΄ν•˜λŠ” λ°©μ‹μœΌλ‘œ ν™•μž₯성을 λ†’μž„
  4. μƒνƒœκ΄€λ¦¬

    • recoil: λͺ¨λ‹¬ 및 μ˜ν™” 데이터 μƒνƒœ 관리
    • react-query: API 데이터 관리, React suspense와 μ—°λ™ν•œ loading 처리
  5. κΈ°λŠ₯

    • 검색
    • λ¬΄ν•œ 슀크둀
      • Web API의 IntersectionObserver λ₯Ό μ‚¬μš©ν•˜μ—¬ hook을 톡해 λ§ˆμ§€λ§‰ μ•„μ΄ν…œμ΄ κ°μ§€λ˜λ©΄ APIλ₯Ό ν˜ΈμΆœν•˜λŠ” λ¬΄ν•œ 슀크둀 κ΅¬ν˜„
      • 검색 κ²°κ³Όλ₯Ό μ΅œλŒ€ 10κ°œμ”© λ°›μ•„μ˜¬ 수 μžˆλ„λ‘ μ„€μ •
      • isLoading μƒνƒœμ™€ isScrollEnd μƒνƒœλ₯Ό κ³ λ €ν•œ API 쀑볡 호좜 μ΅œμ†Œν™”
      • μŠ€μΌˆλ ˆν†€ 을 μ΄μš©ν•œ μ‚¬μš©μž UX κ°œμ„ 

πŸ“¦ 파일 ꡬ쑰

πŸ“¦ src
β”œβ”€β”€ πŸ“‚ atoms
|── πŸ“‚ components
|   β”œβ”€β”€ πŸ“‚ common
|   β”œβ”€β”€ πŸ“‚ movie
|   |   β”œβ”€β”€β”€ πŸ“‚ movieDetail
|   |   └─── πŸ“‚ movieList
|   └── πŸ“‚ search
β”œβ”€β”€ πŸ“‚ hooks
β”œβ”€β”€ πŸ“‚ pages
β”œβ”€β”€ πŸ“‚ routes
β”œβ”€β”€ πŸ“‚ services
β”œβ”€β”€ πŸ“‚ styles
└── πŸ“‚ types

πŸš€ μ‹œμž‘ν•˜κΈ°

yarn install
yarn dev