Skip to content

only-arrow-function/Taskify

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

โœจํ”„๋กœ์ ํŠธ ์†Œ๊ฐœ

๐Ÿ‘จโ€๐Ÿ’ป Members

Codeit FE Sprint 4๊ธฐ - 3ํŒ€

๋ฉค๋ฒ„ ์†Œ๊ฐœ๐Ÿ‘€



๊ตฌ์Šน๋ชจ

๊น€์žฌ์„ฑ

๋…ธ์€์ˆ˜

์œค์•„์˜

์ด๋™ํ˜„

๊ฐœ๋ณ„ ์—ญํ• โ˜๏ธ
  • ๊ตฌ์Šน๋ชจ
    • ๋กœ๊ทธ์ธ & ํšŒ์› ๊ฐ€์ž… ๊ด€๋ฆฌ
    • ํŽ˜์ด์ง€ : ๋งˆ์ด ํŽ˜์ด์ง€
  • ๊น€์žฌ์„ฑ
    • ์ปฌ๋Ÿผ, ์นด๋“œ ๋„๋ฉ”์ธ
    • ํŽ˜์ด์ง€ : ๋Œ€์‹œ๋ณด๋“œ ํŽ˜์ด์ง€
    • ๋กœ์ปฌ ์Šคํ† ๋ฆฌ์ง€ -> ์ฟ ํ‚ค, ๋ฏธ๋“ค์›จ์–ด
    • ๋ฌดํ•œ ์Šคํฌ๋กค
    • Dnd ์ ์šฉ
  • ๋…ธ์€์ˆ˜
    • git flow ์ดˆ๊ธฐ ์„ค์ •, ๋ ˆํฌ์ง€ํ† ๋ฆฌ ๊ด€๋ฆฌ
    • ๋ฌด์ค‘๋‹จ ๋ฐฐํฌ ๋ฐ ๋„๋ฉ”์ธ ์—ฐ๊ฒฐ
    • ํŽ˜์ด์ง€: ์ˆ˜์ • ํŽ˜์ด์ง€
    • react Query: ์„œ๋ฒ„ ์ƒํƒœ ์ดˆ๊ธฐ ์„ค์ •
    • ํŽ˜์ด์ง€ ๋„ค์ด์…˜
  • ์œค์•„์˜
    • ์ดˆ๋Œ€ ๋„๋ฉ”์ธ
    • ํŽ˜์ด์ง€ : ๋งˆ์ด ๋Œ€์‹œ๋ณด๋“œ, ์ˆ˜์ • ํŽ˜์ด์ง€
    • ๋ฌดํ•œ ์Šคํฌ๋กค
  • ์ด๋™ํ˜„
    • ํŽ˜์ด์ง€ : ๋งˆ์ด ๋Œ€์‹œ๋ณด๋“œ, ๋žœ๋”ฉ ํŽ˜์ด์ง€
    • ํŽ˜์ด์ง€๋„ค์ด์…˜, ๋ฌดํ•œ ์Šคํฌ๋กค
    • Dnd ์ ์šฉ
    • ์Šค์ผˆ๋ ˆํ†ค

๐ŸŽž Duration

2024.04.15(์›”) ~ 04.30(ํ™”)

โ˜€๏ธ Project Topic

์Šค๋งˆํŠธํ•˜๊ฒŒ ์ž์‹ ์˜ ์ผ์ •์„ ๊ด€๋ฆฌํ•˜๋Š” ์„œ๋น„์Šค

๐Ÿ’ป Site

https://taskify-six-eta.vercel.app/

๐Ÿ› ๏ธ Skills & Tools

next.js Typescript Figma NPM NodeJS GitHub Visual Studio Code

๐Ÿ“š Library

Tailwind css React Query zustand ESLint

๐Ÿ’ฌ Community

Jira Discord

๐Ÿšข Deploy

Vercel


โœจ๋กœ์ปฌ ํ™˜๊ฒฝ - ์„ค์น˜ ๋ฐ ์‹คํ–‰ ๊ฐ€์ด๋“œ

1. Getting the sources

git clone https://github.com/only-arrow-function/Taskify.git

2. Install packages

npm i

3. Run development server

npm run dev


โœจ Feature

1. ๋žœ๋”ฉ ํŽ˜์ด์ง€ (์ปดํฌ๋„ŒํŠธ ๋ช…: pages/index.tsx)

  • ํšŒ์›๊ฐ€์ž… ๋ฒ„ํŠผ์„ ํ†ตํ•ด, ํšŒ์› ๊ฐ€์ž… ํŽ˜์ด์ง€๋กœ ์ด๋™
  • ๋กœ๊ทธ์ธ ๋ฒ„ํŠผ์„ ํ†ตํ•ด, ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€๋กœ ์ด๋™

2. ๋„๋ฉ”์ธ ๋ ˆ์ด์•„์›ƒ (์ปดํฌ๋„ŒํŠธ ๋ช…: components/dashboard/header & layout, components/side-menu)

  • ํ—ค๋”
    • ํ—ค๋”์—์„œ ํ˜„์žฌ ๋Œ€์‹œ๋ณด๋“œ ์ด๋ฆ„, ํ”„๋กœํ•„
    • ํ”„๋กœํ•„์„ ํ†ตํ•ด, ๋งˆ์ด ํŽ˜์ด์ง€๋กœ ์ด๋™
  • ์‚ฌ์ด๋“œ ๋ฉ”๋‰ด
    • ๋Œ€์‹œ๋ณด๋“œ ์กฐํšŒ (ํŽ˜์ด์ง€๋„ค์ด์…˜)
    • ๋Œ€์‹œ๋ณด๋“œ ์ƒ์„ฑ

3. ๋งˆ์ด ํŽ˜์ด์ง€ (์ปดํฌ๋„ŒํŠธ ๋ช…: pages/mypage/index.tsx)

  • ํšŒ์› ์ •๋ณด ์ˆ˜์ •
  • ํ”„๋กœํ•„ ์ด๋ฏธ์ง€ ๋ณ€๊ฒฝ

3. ํšŒ์›๊ฐ€์ž… & ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€ (์ปดํฌ๋„ŒํŠธ ๋ช…: pages/login/index.tsx, pages/signup/index.tsx)

  • ๋กœ๊ทธ์ธ ๋ฐ ํšŒ์› ๊ฐ€์ž…
  • ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ

4. ๋งˆ์ด ๋Œ€์‹œ๋ณด๋“œ ํŽ˜์ด์ง€ (์ปดํฌ๋„ŒํŠธ ๋ช…: pages/my-dashboard/index.tsx)

  • ๊ฐœ๋ณ„ ๋Œ€์‹œ๋ณด๋“œ ์ƒ์„ฑ (ํŽ˜์ด์ง€๋„ค์ด์…˜)
  • ๋‹ค๋ฅธ ์ด์šฉ์ž์˜ ์ดˆ๋Œ€ ์ˆ˜๋ฝ (๋ฌดํ•œ ์Šคํฌ๋กค)

5. ๋Œ€์‹œ๋ณด๋“œ ํŽ˜์ด์ง€ (์ปดํฌ๋„ŒํŠธ ๋ช…: pages/dashboard/[id]/index.tsx)

  • ์ปฌ๋Ÿผ ์ƒ์„ฑ, ์‚ญ์ œ(๋ฌดํ•œ ์Šคํฌ๋กค)
  • ๊ฐ ์ปฌ๋Ÿผ์˜ ์นด๋“œ ์ƒ์„ฑ, ์‚ญ์ œ
  • ๊ฐ ์นด๋“œ ๋ณ„ ๋Œ“๊ธ€ ์ƒ์„ฑ, ์‚ญ์ œ

6. ๋Œ€์‹œ๋ณด๋“œ ์ˆ˜์ • ํŽ˜์ด์ง€ (์ปดํฌ๋„ŒํŠธ ๋ช…: pages/dashboard/[id]/edit/index.tsx)

  • ์ž์‹ ์ด ์ƒ์„ฑํ•œ ๋Œ€์‹œ๋ณด๋“œ์ธ ๊ฒฝ์šฐ ์ ‘๊ทผ ๊ฐ€๋Šฅ
  • ๋Œ€์‹œ๋ณด๋“œ ์ด๋ฆ„ ๋ณ€๊ฒฝ, ์ƒ‰์ƒ ๋ณ€๊ฒฝ
  • ๋Œ€์‹œ๋ณด๋“œ ์‚ญ์ œ
  • ๋Œ€์‹œ๋ณด๋“œ ์ดˆ๋Œ€
  • ๋Œ€์‹œ๋ณด๋“œ ๋งด๋ฒ„ ์กฐํšŒ


๐Ÿ’ก Git branch strategy : Git flow

ํ”„๋ ˆ์  ํ…Œ์ด์…˜2



โœจ Problem & solution

๊ฐœ๋ฐœ ํ™˜๊ฒฝ ๋ฐ ํ˜‘์—… ๊ด€๋ จ

โš ๏ธ ์†Œํ†ต์˜ ๋ถ€์žฌ

โœ… ๊ฐœ๋ฐœ ์‹ค๋ ฅ ๋Œ€๋น„, ๋ฏธํกํ–ˆ๋˜ ์ปค๋ฎค๋‹ˆ์ผ€์ด์…˜


โš ๏ธ ๊ธด ํ† ์˜ ์‹œ๊ฐ„

โœ… ๊ฐ์ž์˜ ์ผ๋ฆฌ ์žˆ๋Š” ์ฃผ์žฅ์ด ๋Š์ž„์—†์ด ๋ˆ„์ .

โœ… ํƒ€ํ˜‘์ด ์–ด๋ ค์› ๋˜ ๊ฐœ๋ฐœ ๊ฐ€์น˜๊ด€


๊ธฐ๋Šฅ ๊ตฌํ˜„ ์š”์†Œ ๊ด€๋ จ

โš ๏ธ ํ…Œ์ผ์œˆ๋“œ์—์„œ ํด๋ž˜์Šค ์ด๋ฆ„ ์ ์šฉ ๋ฌธ์ œ

โœ… tailwinnd.config.ts ํŒŒ์ผ์— ์ ์šฉ ๊ฒฝ๋กœ์—์„œ ๋ฒ—์–ด๋‚  ๊ฒฝ์šฐ tailwind๊ฐ€ ์ธ์‹ํ•˜์ง€ ๋ชปํ•จ.

ํ•ด๊ฒฐ ๋ฐฉ์•ˆ
  • ํ…Œ์ผ์œˆ๋“œ๋Š” ํด๋ž˜์Šค ์ด๋ฆ„์„ ์ถ”์ถœํ•  ๋•Œ ๋Š์–ด์ง€์ง€ ์•Š์€ ์™„์ „ํ•œ ๋ฌธ์ž์—ด๋กœ ์กด์žฌํ•˜๋Š” ํด๋ž˜์Šค๋งŒ ์ธ์‹. ์ฆ‰, font-${fontWeight}์™€ ๊ฐ™์ด ์‚ฌ์šฉ ๋ถˆ๊ฐ€. ๋”ฐ๋ผ์„œ, ์กฐ๊ฑด์— ๋งž๋Š” ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค์–ด์„œ ์‚ฌ์šฉ.
  • ํด๋ž˜์Šค ์ด๋ฆ„์„ ๋ชจ์•„๋‘” ๊ฐ์ฒด๋ฅผ ๋ถ„๋ฆฌํ•ด์„œ ์‚ฌ์šฉํ•˜์˜€๋Š”๋ฐ, ํด๋ž˜์Šค๊ฐ€ ๋ฏธ์ ์šฉ. ์ด์œ ๋Š”, tailwinnd.config.ts ํŒŒ์ผ์— ์ ์šฉ ๊ฒฝ๋กœ์—์„œ ๋ฒ—์–ด๋‚  ๊ฒฝ์šฐ tailwind๊ฐ€ ์ธ์‹ํ•˜์ง€ ๋ชปํ•จ.
  • tailwinnd.config.ts์˜ ์ ์ ˆํ•œ ๊ฒฝ๋กœ์— ๋ฐฐ์น˜.

โš ๏ธ zustand: ๋‹ค๋ฅธ ์ „์—ญ ์ƒํƒœ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€๋Š” ๋‹ค๋ฅธ ์‹œ์Šคํ…œ.

โœ… Redux, context-api์™€๋Š” ๋‹ค์†Œ ๊ฒฐ์ด ๋‹ค๋ฅธ zustand ์‹œ์Šคํ…œ์„ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ดํ•ดํ•˜์ง€ ๋ชปํ•˜๊ณ  ๊ฐœ๋ฐœ์„ ์ง„ํ–‰.

์„ค๋ช… & ํ•ด๊ฒฐ ๋ฐฉ์•ˆ
  • zustand๋Š” ๊ฐ์ฒด ์ž์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค(ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ๋ฆฌํ„ด) : provider๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š๋Š”๋‹ค.
  • ์ฆ‰, ํ›…์œผ๋กœ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ, ์ด๋ฏธ ์ƒ์„ฑ๋œ ๊ฐ์ฒด์—, ์ƒํƒœ๋ฅผ ์ €์žฅํ•˜๋Š” ๊ตฌ์กฐ๋‹ค. (์›๋ฆฌ : https://react.dev/reference/react/useSyncExternalStore)
  • ๋”ฐ๋ผ์„œ, ์ „์—ญ์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ƒํƒœ๋ฅผ ์—„๋ฐ€ํžˆ ๋ถ„๋ฆฌํ•ด์•ผ ํ•œ๋‹ค. (๋ชจ๋‹ฌ์˜ ํ† ๊ธ€ ํ›…์„ zustand๋กœ ๊ด€๋ฆฌํ•ด, ๊ฐ™์€ ํŽ˜์ด์ง€์—์„œ ๋ชจ๋“  ๋ชจ๋‹ฌ์ด ๋œจ๋Š” ์ด์Šˆ ๋ฐœ์ƒ.)

โš ๏ธ SWR -> React-Query ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜

โœ… SWR VS react-Query : ๊ฐ„ํŽธํ•จ vs ํญ ๋„“์€ ์ƒํƒœ๊ณ„

์„ค๋ช… & ํ•ด๊ฒฐ ๋ฐฉ์•ˆ
  • useSWRInfinite VS useinfinitequery: ๋ฌดํ•œ ์Šคํฌ๋กค๊ณผ ํŽ˜์ด์ง€๋„ค์ด์…˜์˜ ์ฟผ๋ฆฌ ํ‚ค ๊ด€๋ฆฌ์˜ ์–ด๋ ค์›€. ํŠนํžˆ, ๋ฎคํ…Œ์ด์…˜์—์„œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒ.
  • SWR์˜ ๋ฎคํ…Œ์ด์…˜์€ ์ž์œ ๋„๊ฐ€ ๋†’์€ ๋Œ€์‹ , ์ „์—ญ์ ์œผ๋กœ ํฉ์–ด์ง€๋Š” ์„œ๋ฒ„ ์ƒํƒœ ์ฟผ๋ฆฌ๋ฅผ ๊ด€๋ฆฌํ•˜๊ธฐ ๋‚œํ•ดํ•ด ์ง„๋‹ค๊ณ  ํŒ๋‹จ.

โš ๏ธ react-Query ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ์ œ๊ณต๋ฐ›์€ api์™€์˜ ํ˜ธํ™˜์„ฑ

โœ… useInfiniteQuery๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๋ฐ ์ปค์„œ ๊ธฐ๋ฐ˜ ํŽ˜์ด์ง€๋„ค์ด์…˜์ผ ๋•Œ.

ํ•ด๊ฒฐ ๋ฐฉ์•ˆ
  • initialPageParam๋Š” ํ•„์ˆ˜์ธ๋ฐ, ์ฒซ api ์š”์ฒญํ•  ๋•Œ cursorId params๊ฐ€ ์กด์žฌํ•˜๋ฉด ์•ˆ ๋œ๋‹ค.
  • initialPageParam์„ 0์œผ๋กœ ํ•ด์„œ ๋ถ„๊ธฐ ์ฒ˜๋ฆฌ

โš ๏ธ ์„œ๋ฒ„์™€ ํด๋ผ์ด์–ธํŠธ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ์ด์Šˆ

โœ… next์˜ useRouter๋กœ ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ’์„ ๊ฐ€์ ธ์™€์„œ SWR๋กœ ๋น„๋™๊ธฐ ๋ฐ์ดํ„ฐ ํŒจ์นญ์„ ์ง„ํ–‰ํ•˜๋Š” ๋กœ์ง์—์„œ, ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ’์„ ๊ฐ€์ ธ์˜ค๊ธฐ ์ „์— SWR์ด ๋จผ์ € ์‹คํ–‰ ๋˜์–ด์„œ id๊ฐ’์— undefined๊ฐ€ ๋œจ๋Š” ์ด์Šˆ ๋ฐœ์ƒ

ํ•ด๊ฒฐ ๋ฐฉ์•ˆ
  • ์„œ๋ฒ„์ชฝ ๋™์ž‘๊ณผ ํด๋ผ์ด์–ธํŠธ์ชฝ ๋™์ž‘์ด ๋น„๋™๊ธฐ๋กœ ์ˆœ์„œ๊ฐ€ ์—‰ํ‚ค๋ฉด์„œ ๋ฐœ์ƒํ•˜๋Š” ์ด์Šˆ๋กœ ํŒ๋‹จ
  • ํ”„๋ฆฌ๋ Œ๋”๋ง์„ ์ด์šฉํ•ด์„œ getServerSideProp์œผ๋กœ ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ’์„ ๊ฐ€์ ธ์™€์„œ ํŽ˜์ด์ง€์— ์ „๋‹ฌํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ˆ˜์ •

โš ๏ธ ํ† ํฐ๊ฐ’ ์—†์„ ์‹œ loginํŽ˜์ด์ง€๋กœ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ ์ฒ˜๋ฆฌ ์ค‘ ํŽ˜์ด์ง€ ๋ Œ๋”๋ง๋˜๋Š” ์ด์Šˆ

โœ… accessToken์„ localStorage๋กœ ๊ด€๋ฆฌ -> ํŽ˜์ด์ง€์—์„œ localStorage์— ์ ‘๊ทผํ•ด์„œ ๋ถ„๊ธฐํ•˜๋ ค๋‹ˆ 1์ฐจ์ ์œผ๋กœ ์œ ์ €ํ™”๋ฉด์— ํŽ˜์ด์ง€๊ฐ€ ๋ Œ๋”๋ง๋˜๊ณ  ๋„˜์–ด๊ฐ€๋Š” ์ด์Šˆ ๋ฐœ์ƒ

ํ•ด๊ฒฐ ๋ฐฉ์•ˆ
  • ํด๋ผ์ด์–ธํŠธ์—์„œ localStorage์ ‘๊ทผํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํŽ˜์ด์ง€๊ฐ€ ๋ Œ๋”๋ง ๋˜๋Š” ๋ชจ์Šต์ด ๋ณด์˜€๋‹ค๊ฐ€ ์ด๋™ํ•˜๋Š” ๋ฌธ์ œ๋กœ ํŒ๋‹จ
  • ์„œ๋ฒ„์ธก์—์„œ localStorage์— ์ ‘๊ทผ์ด ๋ถˆ๊ฐ€ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ† ํฐ ๊ด€๋ฆฌ๋ฅผ ์„œ๋ฒ„์—์„œ๋„ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•œ ์ฟ ํ‚คํ˜•ํƒœ๋กœ ๋ณ€ํ™˜ ํ›„ middleware๋ฅผ ์ถ”๊ฐ€ํ•ด์„œ ์„œ๋ฒ„์—์„œ ์ฟ ํ‚ค๋ฅผ ๊ฒ€์‚ฌํ•ด์„œ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ ์‹œํ‚ค๋Š” ๋ฐฉ์‹์œผ๋กœ ๋ณ€๊ฒฝ
  • ๋‹จ, ๋กœ๊ทธ์ธ ๋ Œ๋”ฉํŽ˜์ด์ง€ ํšŒ์›๊ฐ€์ž… ํŽ˜์ด์ง€๋Š” middleware์ž‘๋™ ์ œ์™ธ

โœจ ํ”„๋กœ์ ํŠธ ์ง„ํ–‰ํ•˜๋ฉด์„œ ์˜๋ฏธ์žˆ์—ˆ๋˜ ์ 

โœ… "๊ธฐ์ˆ  ์Šคํƒ์˜ ์ „ํ™˜"

  • ๊ธฐ๊ฐ„์ด ์งง์€ ํ”„๋กœ์ ํŠธ์ด๊ธฐ์— ๊ธฐ์ˆ  ์Šคํƒ์„ ๋ฐ”๊พธ๋Š” ์ ์ด ํŒ€ํ•œํ…Œ๋Š” ์น˜๋ช…์ ์ผ ์ˆ˜ ์žˆ์ง€๋งŒ, ์Šคํ”„๋ฆฐํ„ฐ์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ธ์ •์ ์ธ ์˜๋ฏธ๋กœ ๋‹ค๋ฅธ ๊ธฐ์ˆ  ์Šคํƒ์„ ์ „ํ™˜ํ–ˆ๋˜ ๊ฒƒ์ด ๊ฐ€์žฅ ํฐ ์˜๋ฏธ.
  • ํ”„๋กœ์ ํŠธ ์ง„ํ–‰์ด ๋งค๋„๋Ÿฝ์ง„ ์•Š์•˜์ง€๋งŒ, ์–ด๋– ํ•œ ํ™˜๊ฒฝ์—๊ฐ€๋”๋ผ๋„ ์ ์‘ํ•  ์ˆ˜ ์žˆ๋‹ค๋ผ๋Š” ์ž์‹ ๊ฐ์„ ํ‚ค์› ๊ณ , ๊ทธ๋งŒํผ ๋งŽ์ด ๋ฐฐ์›Œ๊ฐˆ ์ˆ˜ ์žˆ์—ˆ์Œ.

๐Ÿ™QnA