Skip to content

Latest commit

Β 

History

History
169 lines (135 loc) Β· 7.53 KB

README.md

File metadata and controls

169 lines (135 loc) Β· 7.53 KB

πŸŽ‰ μ›ν‹°λ“œ ν”„λ¦¬μ˜¨λ³΄λ”© ν”„λ‘ νŠΈμ—”λ“œ μ½”μŠ€ 3μ°¨ 과제

과제 μ†Œκ°œ

  • λͺ©ν‘œ : μ˜ν™” APIν™œμš©ν•œ 트레일러 μ‚¬μ΄νŠΈ λ§Œλ“€κΈ°
  • μž‘μ—…κΈ°κ°„ : 2022.09.06 ~ 2022.09.08

배포 링크

https://hotsix-imlab.netlify.app/


νŒ€μ›λ“€μ„ μ†Œκ°œν•©λ‹ˆλ‹€.

멀버 λ‹΄λ‹Ή 포뢀
κΉ€μŠΉλͺ¨(νŒ€μž₯) ν”„λ‘ νŠΈμ—”λ“œ ν”„λ¦¬μ˜¨λ³΄λ”© μ½”μŠ€ μˆ˜λ£Œν›„ κ΄€λ ¨κΈ°μ—… 취업성곡!
μ†μš°μ˜ ν”„λ‘ νŠΈμ—”λ“œ ν”„λ¦¬μ˜¨λ³΄λ”© 기반으둜 ν•˜λ£¨λΉ¨λ¦¬ 이직
μ΄μ’…ν˜Έ ν”„λ‘ νŠΈμ—”λ“œ μ›ν”ΌμŠ€ μ™„κ²° 전에 μ˜€ν”ˆμ†ŒμŠ€ μ»¨νŠΈλ¦¬λ·°ν„° 달기
민유경 ν”„λ‘ νŠΈμ—”λ“œ 10μ›” μ•ˆμ— 취직!
κ°•λ‹€ν˜„ ν”„λ‘ νŠΈμ—”λ“œ 싀무λ₯Ό μ•„λŠ” μ‹ μž…κ°œλ°œμž 되기
μž„μ„±ν›ˆ ν”„λ‘ νŠΈμ—”λ“œ μ’‹μ€νšŒμ‚¬λ‘œ 이직 μ„±κ³΅ν•˜κΈ°

Commit & Merge Convention

1. dev (개발) 브랜치λ₯Ό μƒμ„±ν•œλ‹€.
2. 각자 주어진 μž‘μ—…μ— λŒ€ν•œ issueλ₯Ό μƒμ„±ν•œλ‹€.
3. μƒμ„±λœ issue 번호둜 κ°œλ³„ branch 이름을 κ°–λŠ”λ‹€
4. κ°œλ³„ branchμ—μ„œ μž‘μ—…ν›„ Git μ»¨λ²€μ…˜μ— 따라 컀밋 및 PR을 ν•œλ‹€.
5. μ΄λ•Œ, PR은 dev(개발)둜 ν•œλ‹€.
6. λͺ¨λ“  issue close 및 μž‘μ—…μ‚¬ν•­ μ—†μ„μ‹œ main으둜 dev(개발) 브랜치λ₯Ό PRν•œλ‹€.
7. 이후 μž‘μ—… λ°œμƒμ‹œ 1~6을 λ°˜λ³΅ν•œλ‹€.

μ‹€ν–‰ 방법

λ ˆν¬μ§€ν† λ¦¬λ₯Ό clone ν•©λ‹ˆλ‹€

$ git clone https://github.com/Pre-HotSix/wanted-pre-onboarding-imlab.git

dependenciesλ₯Ό μ„€μΉ˜ν•©λ‹ˆλ‹€

$ npm install

ν”„λ‘œμ νŠΈλ₯Ό μ‹€ν–‰ν•©λ‹ˆλ‹€

$ npm start

폴더 ꡬ쑰

root
β”œβ”€β”€ .babelrc
β”œβ”€β”€ .eslintrc
β”œβ”€β”€ .vscode
β”œβ”€β”€ .prettierrc
β”œβ”€β”€ package-lock.json
β”œβ”€β”€ package.json
β”œβ”€β”€ tsconfig.json
β”œβ”€β”€ public
|   β”œβ”€β”€ favicon.ico
|   └── index.html
β”œβ”€β”€ config
|   β”œβ”€β”€ webpack.common.js
|   β”œβ”€β”€ webpack.dev.js
|   └── webpack.prod.js
└── src
    β”œβ”€β”€ apis
    β”œβ”€β”€ assets
    β”œβ”€β”€ components
    β”œβ”€β”€ hooks
    β”œβ”€β”€ pages
    β”œβ”€β”€ routes
    β”œβ”€β”€ styles
    β”œβ”€β”€ App.jsx
    β”œβ”€β”€ types.d.ts
    └── index.js
폴더 ꡬ뢄
apis apiν•¨μˆ˜λ“€μ„ λͺ¨μ•„λ‘” 폴더
assets 더미 및 이미지 λ“± 둜컬 파일
components μ½”λ“œ μž¬μ‚¬μš©μ„ μœ„ν•œ μ»΄ν¬λ„ŒνŠΈ κ΄€λ¦¬ν˜• 폴더
hooks react의 μ»€μŠ€ν…€ hook을 κ΄€λ¦¬ν•˜λŠ” 폴더
pages urlμ£Όμ†Œμ— λ”°λ₯Έ νŽ˜μ΄μ§€ ꡬ성 폴더
routes λΌμš°νŒ… κ΄€λ ¨ 처리 폴더
styles μ „μ—­μœΌλ‘œ μ‚¬μš©ν•˜λŠ” style 관리 폴더

λ””μžμΈ μ‹œμ•ˆ by κ°•λ‹€ν˜„

ν”Όκ·Έλ§ˆ λ°”λ‘œκ°€κΈ°


μš”κ΅¬μ‚¬ν•­

  1. 곡톡

    • Loading μƒνƒœ ν‘œκΈ°
    • Infinite scroll
    • 슀크둀 κ°μ§€ν•˜μ—¬ ScrollUp button ν‘œμ‹œλ˜λ„λ‘, λˆ„λ₯Ό μ‹œ μ΅œμƒλ‹¨μœΌλ‘œ 슀크둀 이동
    • API Response 데이터 캐쉬 (라이브러리 μ‚¬μš©)
      • 캐싱에 λŒ€ν•œ κ°„λ‹¨ν•œ κ°œλ…μ„ κΈ€λ‘œ μž‘μ„±ν•΄μ„œ README에 포함 or λ§ν¬ν˜•νƒœλ‘œ μ—°κ²°ν•΄μ£Όμ„Έμš”
  2. movies / 리슀트 νŽ˜μ΄μ§€

    • ν•œλ²ˆμ— κ°€μ Έμ˜¬ 데이터 μ΅œλŒ€ 20
    • 제λͺ©, ν¬μŠ€ν„°, 별점 ν‘œμ‹œ
    • ν¬μŠ€ν„° μ—†λŠ” 경우, λŒ€μ²΄ 이미지 μ‚¬μš©
  3. movie / 상세 νŽ˜μ΄μ§€

    • λΉ„λ””μ˜€ μžˆλŠ” 경우, νŽ˜μ΄μ§€ μ§„μž… μ‹œ μžλ™μœΌλ‘œ λΉ„λ””μ˜€ ν”Œλ ˆμ΄
    • 제λͺ©, ν¬μŠ€ν„°, 별점, μ œμž‘ 연도, μž₯λ₯΄ 데이터 ν™œμš©ν•΄μ„œ UI ν‘œκΈ°
    • κ·Έ μ™Έμ˜ 데이터 μΆ”κ°€ ν™œμš© μ—¬λΆ€λŠ” 자유
  4. search

    • 제λͺ©, ν¬μŠ€ν„°, 별점
    • ν¬μŠ€ν„° μ—†λŠ” 경우, λŒ€μ²΄ 이미지 μ‚¬μš©

기술 μŠ€νƒ

React React Router Styled Components React Query TypeScript


Best Practice

1. μ»΄ν¬λ„ŒνŠΈμ—μ„œ tSX 파일과 styled-component νŒŒμΌμ„ λΆ„λ¦¬ν–ˆμŠ΅λ‹ˆλ‹€.

πŸ’‘ 이유 : styled-componet 파일이 κΈΈμ–΄μ§€λ©΄μ„œ ν•œ 파일 λ‚΄μ—μ„œ JSX μ½”λ“œμ™€ CSS μ½”λ“œλ₯Ό λ™μ‹œμ— 보기가 μ–΄λ €μ›Œμ Έ, 가독성을 μœ„ν•΄ λΆ„λ¦¬ν•˜μ˜€μŠ΅λ‹ˆλ‹€. μΆ”κ°€μ μœΌλ‘œ style μ»΄ν¬λ„ŒνŠΈμ—λŠ” μ•žμ— S.을 포함해 넀이밍을 ν•˜μ—¬, 일반 μ»΄ν¬λ„ŒνŠΈμ™€ κ΅¬λΆ„ν•˜μ˜€μŠ΅λ‹ˆλ‹€.

2. κ³΅ν†΅μ μœΌλ‘œ μ“°λŠ” μ»΄ν¬λ„ŒνŠΈλ₯Ό Layout(/src/components/common/layout) μ•ˆμ—μ„œ κ΅¬μ„±ν•˜κ³  Routes νŒŒμΌμ— μ μš©ν–ˆμŠ΅λ‹ˆλ‹€. (Navigation, Footer, Header).

πŸ’‘ 이유 : μ΅œλŒ€ν•œ μ½”λ“œ 양을 쀄이기 μœ„ν•΄μ„œ 이며, μ½”λ“œκ°€ λ§Žμ•„μ§€λ©΄ λΉŒλ“œ 속도 및 λ Œλ”λ§ 속도가 μ €ν•˜λ˜κΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€. λ˜ν•œ, import의 λΉˆλ„λ„ μ€„μΌμˆ˜ μžˆμŠ΅λ‹ˆλ‹€.

3. λ§Žμ€ μ»΄ν¬λ„ŒνŠΈ, μ½”λ“œλ₯Ό export ν•΄μ„œ 관리해야 ν•˜λŠ” 경우 index.ts νŒŒμΌμ„ λ§Œλ“€μ–΄ import 경둜λ₯Ό μ€„μ˜€μŠ΅λ‹ˆλ‹€.

πŸ’‘ 이유 : import κ²½λ‘œκ°€ 길어지면 가독성이 떨어지고, 파일 좔적이 λΆˆνŽΈν•˜λ‹€λŠ” 단점이 μžˆκΈ°λ•Œλ¬Έμž…λ‹ˆλ‹€. 이λ₯Ό 쀄이기 μœ„ν•΄ 각 root 폴더에 index.js νŒŒμΌμ„ λ§Œλ“€μ–΄ export default 핸듀링을 ν–ˆμŠ΅λ‹ˆλ‹€.

4. λ¬΄ν•œμŠ€ν¬λ‘€ μ»΄ν¬λ„ŒνŠΈ, useInfiQry ν›… λΆ„λ¦¬λ‘œ μž¬μ‚¬μš© κ°€λŠ₯ν•˜λ„λ‘ 좔상화 ν•˜μ˜€μŠ΅λ‹ˆλ‹€.

πŸ’‘ 이유 : λ¬΄ν•œμŠ€ν¬λ‘€μ΄ λ“€μ–΄κ°€λŠ” νŽ˜μ΄μ§€λ“€μ—μ„œ μž¬μ‚¬μš©μ„ μœ„ν•΄ μ»΄ν¬λ„ŒνŠΈν™” ν–ˆκ³  , cacheκ°œλ…μ΄ μ“°μ΄λŠ” 뢀뢄을 μ»€μŠ€ν…€ν›…μœΌλ‘œ λ§Œλ“€μ–΄μ„œ μž¬μ‚¬μš©ν–ˆμŠ΅λ‹ˆλ‹€.

5. 각 λΌμš°ν„°μ—μ„œ κ³΅ν†΅μ μœΌλ‘œ 쓰일 μ»΄ν¬λ„ŒνŠΈλ“€μ„ /src/components ν•˜μœ„ 파일둜 μ •λ¦¬ν–ˆμŠ΅λ‹ˆλ‹€.

πŸ’‘ 이유 : HomePage, TopRatedPage, NowPlayingPage, UpComingPage, SearchPageμ—μ„œ, 같은 ꡬ쑰의 μΉ΄λ“œ μ»΄ν¬λ„ŒνŠΈ ν˜•μ‹μœΌλ‘œ μ˜ν™”μ •λ³΄λ₯Ό κ΅¬μ„±ν•˜μ—¬ 보여주렀고 ν•˜κΈ° λ•Œλ¬Έμ— λΆ„λ¦¬ν•˜μ—¬ κ΅¬μ„±ν–ˆμŠ΅λ‹ˆλ‹€.

  • Card(μΉ΄λ“œ)
  • CardContainer(Cardλ₯Ό κ΅¬μ„±ν•˜λŠ” μ»¨νƒœμ΄λ„ˆ)
  • Container(CardContainerλ₯Ό κ΅¬μ„±ν•˜λŠ” μ»¨νƒœμ΄λ„ˆ)

API Response 데이터 캐쉬

1. 캐싱 μ΄λž€?

  • 캐싱은 μ½˜μ†”μ—μ„œ λ³Όλ•ŒλŠ” 데이터가 μ—…λ°μ΄νŠΈ 되고 μžˆμœΌλ‚˜, μ‹€μ œλ‘œ μ„œλ²„μ— μš”μ²­μ€ 날리지 μ•ŠλŠ” 것 μž…λ‹ˆλ‹€.
  • 전에 κ°€μ Έμ˜¨ λ°μ΄ν„°λ‚˜ κ³„μ‚°λœ κ²°κ³Όκ°’μ˜ 볡사본을 μ €μž₯ν•˜μ—¬, μ²˜λ¦¬μ†λ„λ₯Ό ν–₯μƒμ‹œν‚€κ³  이λ₯Ό 톡해 이후 μš”μ²­μ„ 더 λΉ λ₯΄κ²Œ μ²˜λ¦¬ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

2. μ‚¬μš© 라이브러리

  • 캐싱 κΈ°λŠ₯을 μ‚¬μš©ν•˜κΈ° μœ„ν•΄, React Query 라이브러리의 useInfiniteQuery 훅을 μ‚¬μš©ν–ˆμŠ΅λ‹ˆλ‹€.
  • React QueryλŠ”, μœ λ‹ˆν¬ν•œ ν‚€κ°’μœΌλ‘œ κ΅¬λΆ„ν•˜μ—¬ 데이터 캐싱이 κ°€λŠ₯ν•©λ‹ˆλ‹€. λ¬Έμžμ—΄κ³Ό 배열이 μ‚¬μš©κ°€λŠ₯ν•˜μ§€λ§Œ, μ»¨λ²€μ…˜μ„ λ§žμΆ”κΈ° μœ„ν•΄ 보톡 배열을 μ‚¬μš©ν•©λ‹ˆλ‹€.
  • useQuery와 useInfiniteQueryλŠ” μœ λ‹ˆν¬ν•œ ν‚€κ°’, Promiseλ₯Ό λ¦¬ν„΄ν•˜λŠ” ν•¨μˆ˜, μ˜΅μ…˜μ„ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • staletime은 μΊμ‹œ λ°μ΄ν„°μ˜ μ‹ μ„ ν•œ μƒνƒœμ— λŒ€ν•œ μ˜΅μ…˜μž…λ‹ˆλ‹€. λ”°λ‘œ 섀정해주지 μ•ŠμœΌλ©΄, 캐싱 λ°μ΄ν„°λŠ” 항상 stale ν•˜λ‹€κ³  여겨져 μ„œλ²„μ— 계속적인 μš”μ²­μ„ ν•˜κ²Œλ©λ‹ˆλ‹€.
  • cachetime은 λ©”λͺ¨λ¦¬μ— μ €μž₯λ˜μ–΄ μžˆλŠ” μΊμ‹œ 데이터가 μ–Έμ œκΉŒμ§€ μœ μ§€λ˜λŠ”μ§€μ— λŒ€ν•œ μ˜΅μ…˜μž…λ‹ˆλ‹€.
  • μΊμ‹±λœ λ°μ΄ν„°λŠ” QueryClient()λ₯Ό 톡해 μ‘°νšŒν•  수 μžˆμŠ΅λ‹ˆλ‹€. (+ queriesMap)