Skip to content
forked from ToKyun02/Taskify

๐Ÿ“… Task ๋ถ„๋ฐฐ๋กœ ์ผ์ • ๊ด€๋ฆฌ๋ฅผ ํšจ์œจ์ ์œผ๋กœ!

Notifications You must be signed in to change notification settings

cksrlcks/Taskify

ย 
ย 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

79 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

๐Ÿ–๏ธ ํ”„๋กœ์ ํŠธ ์†Œ๊ฐœ

Taskify๋Š” ์ผ์ • ๊ด€๋ฆฌ ๊ธฐ๋Šฅ์„ ์ง€์›ํ•˜๋Š” ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ž…๋‹ˆ๋‹ค.
์ดˆ๋Œ€ ๊ธฐ๋Šฅ์„ ํ™œ์šฉํ•˜์—ฌ ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž์™€ ์ผ์ • ๊ด€๋ฆฌ๋ฅผ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค๊ณผ ์ผ์ •์„ ๊ณต์œ ํ•˜์—ฌ ์„ฑ๊ณต์ ์œผ๋กœ Task๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ“… ์„œ๋น„์Šค ์†Œ๊ฐœ
๐Ÿ”ฅ Taskify ํŒ€์˜ ๊ฒฝํ—˜
๐Ÿ”ง ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ
๐Ÿง‘ ํŒ€์›์†Œ๊ฐœ

๐Ÿ“… ์„œ๋น„์Šค ์†Œ๊ฐœ

๐Ÿฝ๏ธ ์† ์‰ฌ์šด ๋Œ€์‹œ๋ณด๋“œ ๊ด€๋ฆฌ

๐Ÿ“ข ๋‚˜๋งŒ์˜ ๋Œ€์‹œ๋ณด๋“œ๋ฅผ ์ด๋ฆ„๊ณผ ์ƒ‰์ƒ์„ ์ง€์ •ํ•ด์„œ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๐Ÿ“ข ๋‚ด๊ฐ€ ์ƒ์„ฑํ•œ ๋Œ€์‹œ๋ณด๋“œ๋ฅผ ์ž์œ ๋กญ๊ฒŒ ๋„˜๋‚˜ ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๐Ÿ“ข ์ดˆ๋Œ€๋ฅผ ํ†ตํ•ด ๋Œ€์‹œ๋ณด๋“œ์˜ ๋ฉค๋ฒ„๊ฐ€ ๋˜๋ฉด ํ•ด๋‹น ๋Œ€์‹œ๋ณด๋“œ๋ฅผ ๋ฐฉ๋ฌธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


๐Ÿ“’ ์ž์œ ๋กœ์šด ์นผ๋Ÿผ ์ƒ์„ฑ๊ณผ ํ•  ์ผ ์ƒ์„ฑ

๐Ÿ“ข ํ•ด์•ผํ•  ์ผ์„ ์นผ๋Ÿผ ๋ณ„๋กœ ์ •๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๐Ÿ“ข ๋‹ด๋‹น์ž๋ฅผ ์ง€์ •ํ•˜์—ฌ ๋ˆ„๊ฐ€ ์–ด๋–ค ์ด์Šˆ๋ฅผ ์ž‘์—…ํ•˜๋Š”์ง€ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


๐Ÿš— ์† ์‰ฌ์šด ํ•  ์ผ ์นด๋“œ ์ด๋™

๐Ÿ“ข ์ง์ ‘ ํ•  ์ผ์„ ์ˆ˜์ •ํ•˜์ง€ ์•Š์•„๋„ ์ด๋™์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
๐Ÿ“ข ๋งˆ์šฐ์Šค ๋“œ๋ž˜๊ทธ๋กœ ํ•  ์ผ์„ ์žก์•„์„œ ์›ํ•˜๋Š” ์ปฌ๋Ÿผ์— ๋†“์•„๋ณด์„ธ์š”!


โฌ์•„๋ž˜ ๋งํฌ๋ฅผ ํด๋ฆญํ•˜์‹œ๋ฉด ๋” ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ๋“ค์„ ๋งŒ๋‚  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค!โฌ

โฉ์ง€๊ธˆ Taskify ์‚ฌ์šฉํ•˜๋Ÿฌ ๊ฐ€๋ณด๊ธฐ!โช

๐Ÿ”ฅ Taskify ํŒ€์˜ ๊ฒฝํ—˜

๐Ÿ–ฅ๏ธ ์„œ๋ฒ„ ๋ฐ์ดํ„ฐ์˜ ์ƒํƒœ ๊ด€๋ฆฌ

Taskify ํŒ€์€ TanStack Query ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์ „์—ญ์ ์œผ๋กœ ์„œ๋ฒ„ ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์ด๋กœ ์ธํ•ด Props Drilling์„ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ์—ˆ๊ณ , ์„œ๋ฒ„์˜ Promise ์ƒํƒœ๋ฅผ ์ง‘์•ฝ์ ์œผ๋กœ ๊ด€๋ฆฌํ•˜์—ฌ ๋ณด๋‹ค ์‰ฝ๊ฒŒ API ํ๋ฆ„์„ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค.

zod๋ฅผ ํ™œ์šฉํ•˜์—ฌ API์˜ ์‘๋‹ต ์Šคํ‚ค๋งˆ๋ฅผ ํ† ๋Œ€๋กœ ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ์˜ˆ์ƒ๋œ ๊ฒฐ๊ณผ๊ฐ’์„ ๊ฐ€์ ธ์˜ค๋Š”์ง€ ๊ฒ€์ฆํ•˜๋Š” ๋กœ์ง์„ ์ถ”๊ฐ€ํ•˜์—ฌ, ๋”์šฑ ์•ˆ์ „ํ•˜๊ฒŒ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ“ ํผ์˜ ์ƒํƒœ ๊ด€๋ฆฌ

Taskify ํŒ€์€ Form์˜ ์ƒํƒœ๋ฅผ ์ง‘์•ฝ์ ์œผ๋กœ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด React Hook Form ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. ํ•ด๋‹น ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํ†ตํ•ด Form์˜ ์ƒํƒœ ์ถ”์ ์„ ์šฉ์ดํ•˜๊ฒŒ ํ•˜๊ณ , ๊ณตํ†ต๋œ controller, uncontroller๋ฅผ ๊ฐœ๋ฐœํ•˜์—ฌ ๋‹ค๋ฅธ ๊ฐœ๋ฐœ์ž๋“ค์ด ์ปดํฌ๋„ŒํŠธ๋ฅผ ์žฌ์‚ฌ์šฉํ•˜๊ธฐ ์‰ฝ๊ฒŒ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค.

Form์˜ Validation์€ zod๋ฅผ ํ™œ์šฉํ•˜์—ฌ Form ์Šคํ‚ค๋งˆ๋กœ ์ž‘์„ฑํ•˜์˜€๊ณ , ํ•ด๋‹น ์Šคํ‚ค๋งˆ๋ฅผ ํ† ๋Œ€๋กœ ํƒ€์ž…์„ ์ถ”์ถœํ•ด๋ƒ…๋‹ˆ๋‹ค.

๐Ÿ‘ฎ Route Handler๋กœ ์ธ์ฆ ์ฒ˜๋ฆฌํ•˜๊ธฐ

์™ธ๋ถ€ API์˜ ์‘๋‹ต body๋กœ ๋ฐ›๋Š” accessToken์„ HttpOnly ์ฟ ํ‚ค๋กœ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ๊ณ  ๊ณ„์‹ ๊ฐ€์š”?

Taskify ํŒ€์€ Next.js์˜ Route Handler๋ฅผ ํ†ตํ•ด logout์„ ์ œ์™ธํ•œ ๋ชจ๋“  API๋Š” ํ•˜๋‚˜์˜ route handler๋ฅผ ์ง๋ฉดํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ด route handler๊ฐ€ ํด๋ผ์ด์–ธํŠธ ๋Œ€์‹  ์™ธ๋ถ€ API์— ์š”์ฒญ์„ ๋ณด๋‚ด๊ธฐ ๋•Œ๋ฌธ์— HttpOnly ์ฟ ํ‚ค๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ๋•๋ถ„์—, ์™ธ๋ถ€ API์˜ ๋…ธ์ถœ์„ ์ตœ์†Œํ™” ํ•  ์ˆ˜ ์žˆ์—ˆ๊ณ , HttpOnly ์ฟ ํ‚ค๋ฅผ ์‚ฌ์šฉํ•จ์œผ๋กœ์จ ๋ณด๋‹ค ์•ˆ์ „ํ•˜๊ฒŒ ํ† ํฐ์„ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ”™ ๋กœ๊ทธ์ธ ์ƒํƒœ์— ๋”ฐ๋ฅธ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ

ํด๋ผ์ด์–ธํŠธ์—์„œ ๋กœ๊ทธ์ธ ์ƒํƒœ์— ๋”ฐ๋ฅธ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ ๊ตฌํ˜„์ด ์™œ ์•ˆ์ข‹์€ ์ง€ ์•Œ๊ณ  ๊ณ„์‹ ๊ฐ€์š”?

๋ฆฌ์•กํŠธ ๊ธฐ๋ฐ˜ ํ”„๋กœ์ ํŠธ์ธ ๊ฒฝ์šฐ useEffect๋ฅผ ํ†ตํ•ด ๋กœ๊ทธ์ธ ์ƒํƒœ๋ฅผ ํŒ๋‹จํ•˜๊ฒŒ ๋˜๋Š”๋ฐ, ์ด๋ ‡๊ฒŒ ๊ตฌํ˜„๋  ๊ฒฝ์šฐ ํŽ˜์ด์ง€ ๊นœ๋นก์ž„ ํ˜„์ƒ์„ ํ•ด๊ฒฐ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ, ๋ณดํ˜ธ๋œ ํŽ˜์ด์ง€์ž„์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ๋…ธ์ถœ์„ ํ”ผํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด๊ฒƒ์€ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ๊ฐ€ ์•„๋‹ˆ๋ผ ๋ผ์šฐํŒ…์ด๋ผ๊ณ  ๋ถˆ๋Ÿฌ์•ผ ํ•˜๋Š” ๊ฒƒ์ด ๋งž์Šต๋‹ˆ๋‹ค. Taskify ํŒ€์€ ์ด๋Ÿฌํ•œ ํ˜„์ƒ์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด middleware๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋กœ๊ทธ์ธ ์ƒํƒœ๋ฅผ ํŒ๋‹จํ•ฉ๋‹ˆ๋‹ค.

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

โœ๏ธ Taskify ํŒ€์˜ ๊ธฐ๋ก

โฌ์•„๋ž˜ ๋งํฌ๋ฅผ ํด๋ฆญํ•˜์‹œ๋ฉด Taskify๋ฅผ ์–ด๋–ป๊ฒŒ ๋งŒ๋“ค์—ˆ๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.โฌ

โฉTaskify ํŒ€์˜ Notion ๊ตฌ๊ฒฝํ•˜๊ธฐโช

๐Ÿ”ง ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ

โš™๏ธ API ํ๋ฆ„ ๋„์‹ํ™”

์ผ๋ฐ˜์ ์ธ API ํ๋ฆ„๋„
๋กœ๊ทธ์ธ ํ๋ฆ„๋„
๋ฆฌ๋‹ค์ด๋ ‰ํŠธ ํ๋ฆ„๋„

๐Ÿ—‚๏ธ ๋””๋ ‰ํ† ๋ฆฌ ๊ตฌ์กฐ

๐Ÿ“‚src
 โ”ฃ ๐Ÿ“œmiddleware.ts
 โ”ฃ ๐Ÿ“‚apis
 โ”ƒ โ”ฃ ๐Ÿ“‚auth
 โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œindex.ts
 โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œqueries.ts
 โ”ƒ โ”ƒ โ”— ๐Ÿ“œtypes.ts
 โ”ƒ โ”— ...
 โ”ฃ ๐Ÿ“‚app
 โ”ƒ โ”ฃ ๐Ÿ“œglobals.css
 โ”ƒ โ”ฃ ๐Ÿ“œlayout.tsx
 โ”ƒ โ”ฃ ๐Ÿ“‚(after-login)
 โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“‚mydashboard
 โ”ƒ โ”ƒ โ”— ...
 โ”ƒ โ”— ๐Ÿ“‚(before-login)
 โ”ƒ   โ”ฃ ๐Ÿ“‚(auth)
 โ”ƒ   โ”ƒ โ”— ๐Ÿ“‚login
 โ”ƒ   โ”— ...
 โ”ฃ ๐Ÿ“‚assets
 โ”ฃ ๐Ÿ“‚components
 โ”ƒ โ”ฃ ๐Ÿ“‚auth
 โ”ƒ โ”ฃ ๐Ÿ“‚ui
 โ”ƒ โ”— ... 
 โ”ฃ ๐Ÿ“‚constants
 โ”ฃ ๐Ÿ“‚fonts
 โ”ฃ ๐Ÿ“‚hooks
 โ”ฃ ๐Ÿ“‚stores
 โ”ฃ ๐Ÿ“‚types
 โ”ƒ โ”— ๐Ÿ“œcommon.ts
 โ”— ๐Ÿ“‚utils

๐Ÿ’Ž ์ฃผ์š” ๊ธฐ์ˆ  ์Šคํƒ

๊ธฐ์ˆ  ์ด๋ฆ„ ์„ ์ • ์ด์œ 
Static Badge ์ปดํฌ๋„ŒํŠธ ๊ธฐ๋ฐ˜ ์„ค๊ณ„ ๋ฐฉ์‹์ธ ๋ฆฌ์•กํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํ™œ์šฉํ•˜์—ฌ SSR๊ณผ CSR๋ฅผ ํ˜ผํ•ฉํ•ด์„œ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ์„ ์ •ํ•œ ํ”„๋ ˆ์ž„์›Œํฌ์ž…๋‹ˆ๋‹ค.
Static Badge Props ํƒ€์ž… ์ง€์ •์œผ๋กœ ์ธํ•œ ๋Ÿฐํƒ€์ž„ ์˜ค๋ฅ˜ ๊ฐ์†Œ, vscode ์ž๋™ ์™„์„ฑ ๊ธฐ๋Šฅ ๋“ฑ ํƒ€์ž… ์•ˆ์ •์„ฑ์„ ํ†ตํ•œ ์ฝ”๋“œ ํ’ˆ์งˆ ๊ฐœ์„ ์„ ์œ„ํ•ด ์„ ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.
Static Badge UI ์ƒํƒœ์™€ ์„œ๋ฒ„ ์ƒํƒœ๋ฅผ ๋ถ„๋ฆฌํ•˜๊ณ , api ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ Promise๋ฅผ ์ง‘์•ฝ์ ์œผ๋กœ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์„ ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.
Static Badge ์ „์—ญ UI ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์„ ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ๋ชจ๋‹ฌ์˜ ์ƒํƒœ๋ฅผ zustand๋กœ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
Static Badge axios instance์˜ interceptor ๊ธฐ๋Šฅ์„ ํ†ตํ•œ ์ค‘๋ณต ์ฝ”๋“œ ์ตœ์†Œํ™” ๋“ฑ์„ ์œ„ํ•ด ์„ ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.
Static Badge ํผ์˜ ์ƒํƒœ๋ฅผ ์ง‘์•ฝ์ ์œผ๋กœ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์„ ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.
Static Badge ํผ์˜ ์œ ํšจ์„ฑ ์ •์˜ ๋ฐ ํƒ€์ž… ์ถ”์ถœ์ด ์šฉ์ดํ•˜๊ณ , API request ํƒ€์ž…์ •์˜ ๋ฐ safeParse()๋ฉ”์†Œ๋“œ๋ฅผ ํ†ตํ•œ API ์‘๋‹ต ๋ฐ์ดํ„ฐ ํƒ€์ž… ๊ฒ€์ฆ์„ ํ•˜๊ธฐ ์œ„ํ•ด ์„ ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.
Static Badge ์œ ํ‹ธ๋ฆฌํ‹ฐ ๊ธฐ๋Šฅ์„ ์„ ์–ธํ˜•์œผ๋กœ ์ž‘์„ฑํ•จ์œผ๋กœ์จ ์ฝ”๋“œ ๊ฐ€๋…์„ฑ์„ ํ–ฅ์ƒ์‹œํ‚ค๊ธฐ ์œ„ํ•ด ์„ ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.
Static Badge ์œ ํ‹ธ๋ฆฌํ‹ฐ ํด๋ž˜์Šค ์‚ฌ์šฉ์œผ๋กœ ํด๋ž˜์Šค ๋„ค์ด๋ฐ ๊ณ ๋ฏผ ๊ฐ์†Œ, ๋””์ž์ธ ์‹œ์Šคํ…œ์ด ๋ฏธํก ์‹œ ์œ ์—ฐํ•œ ๋Œ€์‘์ด ๊ฐ€๋Šฅํ•˜๊ธฐ์— ์„ ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.
Static Badge Next.js์™€์˜ ์™„๋ฒฝํ•œ ํ†ตํ•ฉ ๋ฐ ์†Œ๊ทœ๋ชจ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋ฌด๋ฃŒ ํ”Œ๋žœ์„ ์ œ๊ณตํ•ด์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ์„ ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.

๐Ÿง‘ ํŒ€์› ์†Œ๊ฐœ

๊น€๋„๊ท  ๊น€์ฐฌ๊ธฐ ์ด์„์ฐฌ ์ตœ์„ฑ๋ฝ

About

๐Ÿ“… Task ๋ถ„๋ฐฐ๋กœ ์ผ์ • ๊ด€๋ฆฌ๋ฅผ ํšจ์œจ์ ์œผ๋กœ!

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Languages

  • TypeScript 97.6%
  • CSS 2.0%
  • JavaScript 0.4%