πŸ› οΈ ν”„λ‘œμ νŠΈ/[Taskify] - ν˜‘μ—… 툴(일정 관리 μ‹œμŠ€ν…œ)

[Taskify] - ν”„λ‘œμ νŠΈ 생싱 및 초기 μ„ΈνŒ…

yyezzzy 2024. 10. 19. 04:15

πŸ‚ 10μ›” μ€‘μˆœ, νŒ€ ν”„λ‘œμ νŠΈ 첫날 기둝 - μ‹œμž‘

μ˜€λŠ˜μ€ 쀑급 ν”„λ‘œμ νŠΈμ˜ 첫날이닀. λ“œλ””μ–΄ Part 3 νŒ€μ›λ“€κ³Ό ν•¨κ»˜ ν”„λ‘œμ νŠΈλ₯Ό μ‹œμž‘ν•˜κ²Œ λ˜μ—ˆλŠ”λ°, μš°λ¦¬νŒ€μ€ 첫 회의λ₯Ό 톡해 ν˜‘μ—… 툴둜 μ‚¬μš©ν•  수 μžˆλŠ” 일정 관리 μ‹œμŠ€ν…œ “Taskify”λΌλŠ” 주제λ₯Ό μ„ μ •ν•˜κ²Œ λ˜μ—ˆλ‹€.

 

πŸ’‘ 주제 μ„ μ • 이유

Taskifyλ₯Ό 주제둜 κ³ λ₯Έ μ΄μœ λŠ” μ•„μ£Ό κ°„λ‹¨ν•˜λ‹€ γ…Žγ…Ž! 일정 관리 μ‹œμŠ€ν…œμ€ μΌμƒμ—μ„œ 자주 μ‚¬μš©λ˜λŠ” μ„œλΉ„μŠ€μΈ 만큼, μ‚¬μš©μžμ˜ 편의λ₯Ό κ³ λ €ν•œ μ—¬λŸ¬ κΈ°λŠ₯을 κ΅¬ν˜„ν•΄λ³Ό 수 μžˆμ„ 것 κ°™μ•˜λ‹€. κ²Œλ‹€κ°€ ν”„λ‘œμ νŠΈμ˜ 규λͺ¨κ°€ μ»€μ„œ λ‹€μ–‘ν•œ μ»΄ν¬λ„ŒνŠΈλ₯Ό λ§Œλ“€μ–΄λ³΄λŠ” 쒋은 기회라고 μƒκ°ν–ˆλ‹€. νŒ€μ›λ“€λ„ λͺ¨λ‘ λ™μ˜ν•΄μ£Όμ–΄ κΈ°λΆ„ μ’‹κ²Œ ν”„λ‘œμ νŠΈλ₯Ό μ‹œμž‘ν•  수 μžˆμ—ˆλ‹€. 😊

 

πŸ› οΈ ν”„λ‘œμ νŠΈ μ„ΈνŒ… κ³Όμ •

첫걸음으둜, κΉƒν—ˆλΈŒμ— ν”„λ‘œμ νŠΈ λ ˆν¬μ§€ν† λ¦¬λ₯Ό λ§Œλ“€κ³  νŒ€μ›λ“€μ„ μ΄ˆλŒ€ν–ˆμŠ΅λ‹ˆλ‹€. ν˜‘μ—…μ„ μ›ν™œν•˜κ²Œ ν•˜κΈ° μœ„ν•΄ Next.js와 Tailwind CSSλ₯Ό μ‚¬μš©ν•˜κΈ°λ‘œ ν–ˆλ‹€.

ν”„λ‘œμ νŠΈ 초기 μ„ΈνŒ…μ— μ‚¬μš©ν•œ μ£Όμš” 기술 μŠ€νƒ

  •  Next.js (Page Routing): νŽ˜μ΄μ§€ λΌμš°νŒ…μ„ μœ„ν•œ ν”„λ ˆμž„μ›Œν¬λ‘œ 채택
  • Tailwind CSS: λΉ λ₯΄κ³  κ°„νŽΈν•œ μŠ€νƒ€μΌλ§
  • Axios: API μš”μ²­ 처리λ₯Ό μœ„ν•œ HTTP ν΄λΌμ΄μ–ΈνŠΈ
  • 곡톡 μ»΄ν¬λ„ŒνŠΈ λͺ¨λ“ˆν™”: μž¬μ‚¬μš©μ„±μ„ 높이기 μœ„ν•΄ 곡톡 μ»΄ν¬λ„ŒνŠΈλŠ” λͺ¨λ“ˆλ‘œ κ΄€λ¦¬ν•˜κΈ°λ‘œ ν–ˆλ‹€.

ν˜‘μ—…μ˜ 기본은 일관성! κ·Έλž˜μ„œ μ½”λ“œ μ»¨λ²€μ…˜λ„ ν•¨κ»˜ μ •ν•˜κ³  ν˜‘μ—…μ„ μœ„ν•œ 브랜치 μ „λž΅λ„ μˆ˜λ¦½ν–ˆμŠ΅λ‹ˆλ‹€. 브랜치 μ „λž΅μœΌλ‘œλŠ” ν˜‘μ—…μ— 널리 μ‚¬μš©λ˜λŠ” GitFlow방식을 μ±„νƒν•˜μ—¬, κΈ°λŠ₯λ³„λ‘œ 브랜치λ₯Ό λ‚˜λˆ„μ–΄ μž‘μ—…ν•˜κ³  ν•©μΉ˜λŠ” κ³Όμ •μ—μ„œ μΆ©λŒμ„ μ΅œμ†Œν™”ν•  수 μžˆλ„λ‘ ν–ˆλ‹€.

 

πŸ“‹ R&D 뢄배와 μ—­ν•  μ •ν•˜κΈ°

초기 섀정이 λλ‚œ ν›„, ν”Όκ·Έλ§ˆμ— λ””μžμΈν•΄λ‘” λ‹€μ–‘ν•œ νŽ˜μ΄μ§€λ₯Ό λ³΄λ‹ˆ 정말 λ§Žμ•˜λ‹€ 😱 κ·Έλž˜μ„œ κΈ°λŠ₯λ³„λ‘œ μž‘μ—…μ„ λ‚˜λˆ„κΈ°λ‘œ ν–ˆλ‹€. 

  • λžœλ”© νŽ˜μ΄μ§€
  • 둜그인/νšŒμ›κ°€μž… νŽ˜μ΄μ§€
  • λŒ€μ‹œλ³΄λ“œ νŽ˜μ΄μ§€
  • λͺ¨λ‹¬ μ°½ <- λ‚΄κ°€ 맑은 것 πŸ™‚

 

πŸ§‘‍πŸ’» λͺ¨λ‹¬ μž‘μ—…κ³Ό 첫 ν…ŒμŠ€νŠΈ

사싀 μ²˜μŒμ—λŠ” μ–΄λ””μ„œλΆ€ν„° μž‘μ—…μ„ μ‹œμž‘ν•΄μ•Ό ν• μ§€ μ’€ λ§‰λ§‰ν–ˆλ‹€. κ·Έλž˜μ„œ κ°€μž₯ λ¨Όμ € λͺ¨λ‹¬ κΈ°λŠ₯λΆ€ν„° ν…ŒμŠ€νŠΈν•΄λ³΄κΈ°λ‘œ ν–ˆλ‹€. μ΄μ „μ—λŠ” z-indexλ₯Ό μ‚¬μš©ν•΄μ„œ λͺ¨λ‹¬μ„ ν™”λ©΄ 맨 μœ„μ— λ„μ› μ—ˆλŠ”λ°, μ΄λ²ˆμ—λŠ” λ©˜ν† λ‹˜μ΄ μΆ”μ²œν•΄μ£Όμ‹  Portal을 ν™œμš©ν•΄λ³΄κΈ°λ‘œ ν–ˆλ‹€.

Portal은 λͺ¨λ‹¬μ„ νŠΉμ • DOM λ…Έλ“œλ‘œ λ³΄λ‚΄μ„œ μ–΄λ””μ„œλ“  μ΅œμƒλ‹¨μ— μœ„μΉ˜μ‹œν‚¬ 수 μžˆλŠ” κΈ°λŠ₯μž…λ‹ˆλ‹€. Portal둜 λͺ¨λ‹¬μ„ ν…ŒμŠ€νŠΈν•΄ λ³΄λ‹ˆ, 생각보닀 κΉ”λ”ν•˜κ²Œ μ μš©λ˜μ–΄ 기뢄이 μ’‹μ•˜λ‹€! πŸ˜„

 

πŸ”— API 톡신과 둜그인 κΈ°λŠ₯

이제 λͺ¨λ‹¬ ν…ŒμŠ€νŠΈκ°€ λλ‚œ ν›„, λ‹€μ–‘ν•œ κΈ°λŠ₯을 더 ν…ŒμŠ€νŠΈν•˜λ €λ©΄ API 톡신이 ν•„μš”ν–ˆλ‹€.

ν•˜μ§€λ§Œ 막상 API μž‘μ—…μ„ μ‹œμž‘ν•˜λ €λ‹ˆ ν•  일이 λ§Žμ•˜λ‹€. 일단 axiosInstance만 λ§Œλ“€μ–΄ 놓은 μƒνƒœμ˜€λŠ”λ°, ν•„μš”ν•œ APIκ°€ λ§Žμ•„μ„œ μ»€μŠ€ν…€ Hook을 λ§Œλ“€κΈ°κΉŒμ§€λŠ” μ‹œκ°„μ΄ μ’€ 걸릴 것 κ°™μ•˜λ‹€.

κ²Œλ‹€κ°€ 이번 ν”„λ‘œμ νŠΈμ—μ„œλŠ” API 호좜 μ‹œ  ν† ν°μ΄ ν•„μš”ν–ˆλŠ”λ°, 이λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄ κ°„λ‹¨ν•œ 둜그인 νŽ˜μ΄μ§€λ₯Ό λ§Œλ“€μ–΄μ„œ ν…ŒμŠ€νŠΈμš©μœΌλ‘œ 토큰을 λ°œκΈ‰λ°›μ•„ μ§„ν–‰ν•˜κΈ°λ‘œ ν–ˆλ‹€.

ν•˜μ§€λ§Œ μ—¬κΈ°μ„œ λœ»λ°–μ˜ λ‚œκ΄€μ΄ 기닀리고 μžˆμ—ˆμœΌλ‹ˆ, λ°”λ‘œ CORS μ—λŸ¬πŸ˜΅

 

🚨 CORS 문제 ν•΄κ²°ν•˜κΈ°

CORS μ—λŸ¬μ˜ 원인은 μ„œλ²„μ—μ„œ Access-Control-Allow-Origin을 *둜 μ„€μ •ν•œ 반면, ν΄λΌμ΄μ–ΈνŠΈμ—μ„œ withCredentials: trueλ₯Ό μ‚¬μš©ν•˜λ € ν–ˆκΈ° λ•Œλ¬Έμ΄μ—ˆλ‹€.

CORS 문제 ν•΄κ²° 방법

Access-Control-Allow-Origin: *와 withCredentials: trueλŠ” ν•¨κ»˜ μ‚¬μš©ν•  수 μ—†λ‹€λŠ” 사싀을 μ•Œκ²Œ λ˜μ—ˆλ‹€. 이 섀정은 λͺ¨λ“  μΆœμ²˜μ—μ„œ μš”μ²­μ„ ν—ˆμš©ν•˜μ§€λ§Œ, 인증 정보λ₯Ό ν¬ν•¨ν•œ μš”μ²­μ€ ν—ˆμš©ν•˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ΄λ‹€. κ·Έλž˜μ„œ ν΄λΌμ΄μ–ΈνŠΈμ—μ„œ withCredentials: false둜 μ„€μ •ν•΄ 문제λ₯Ό ν•΄κ²°ν–ˆλ‹€. μ΅œκ·Όμ—λŠ” JWT와 같은 토큰 기반 인증 방식이 많이 μ‚¬μš©λ˜κΈ° λ•Œλ¬Έμ—, 인증 정보λ₯Ό 헀더에 포함해 μ²˜λ¦¬ν•˜λŠ” 방식을 μ„ νƒν–ˆλ‹€.

 

πŸ”§ Next.js μ„€μ • μ΅œμ ν™”

λ§ˆμ§€λ§‰μœΌλ‘œ, 개발 κ³Όμ •μ—μ„œ νŽΈλ¦¬ν•¨μ„ λ”ν•˜κΈ° μœ„ν•΄ Next.js 섀정을 λ‹€λ“¬μ—ˆλ‹€.

SVG μ»΄ν¬λ„ŒνŠΈν™” : next.config.mjsμ—μ„œ SVG νŒŒμΌμ„ μ»΄ν¬λ„ŒνŠΈμ²˜λŸΌ μ‚¬μš©ν•  수 μžˆλ„λ‘ μ„€μ •ν–ˆλ‹€. 덕뢄에 SVG μ•„μ΄μ½˜μ„ 더 μ‰½κ²Œ ν™œμš©ν•  수 μžˆμ—ˆλ‹€.

  • 경둜 Alias μ„€μ •: @/λ₯Ό μ‚¬μš©ν•΄ 루트 경둜λ₯Ό κ°„νŽΈν•˜κ²Œ μ°Έμ‘°ν•  수 μžˆλ„λ‘ Node.js의 path λͺ¨λ“ˆμ„ ν™œμš©ν•΄ μ„€μ •ν–ˆλ‹€. μ΄λ ‡κ²Œ μ„€μ •ν•΄λ‘λ‹ˆ μ½”λ“œλ₯Ό μž‘μ„±ν•  λ•Œ λΆˆν•„μš”ν•œ 경둜 μž‘μ„±μ—μ„œ ν•΄λ°©λœ λŠλ‚Œμ΄λž„κΉŒ? πŸ˜†

 

🌟 λ§ˆλ¬΄λ¦¬ν•˜λ©°

ν”„λ‘œμ νŠΈ 첫날, νŒ€μ›λ“€κ³Ό ν•¨κ»˜ 초기 섀정을 마치고 λ‚˜λ‹ˆ 잘 ν•  수 μžˆμ„κΉŒ, κ±±μ •λ˜κΈ°λ„ ν–ˆμ§€λ§Œ μ΄ˆκΈ‰ ν”„λ‘œμ νŠΈλ₯Ό μˆ˜ν–‰ν•œ 이후 ν˜‘μ—…μ— λŒ€ν•œ μžμ‹ κ°μ΄ μ‘°κΈˆμ€ 생긴 것 κ°™μ•„μ„œ μ•žμœΌλ‘œ Taskify ν”„λ‘œμ νŠΈκ°€ μ–΄λ–»κ²Œ 완성될지 κΈ°λŒ€κ°€ λœλ‹€. μ—΄μ‹¬νžˆ λ°°μ›Œκ°€λ©° μ„±μž₯ν•˜λŠ” μ‹œκ°„μ΄ 되길 λ°”λΌλ©΄μ„œ, μ˜€λŠ˜μ€ μ—¬κΈ°μ„œ 마무리 ! 😊