Skip to content

Latest commit

ย 

History

History
355 lines (253 loc) ยท 20.8 KB

README.md

File metadata and controls

355 lines (253 loc) ยท 20.8 KB

Synergy Project - TenTen

logo

์ฝ”๋“œ์ž‡ ์Šคํ”„๋ฆฐํŠธ : ํ”„๋ก ํŠธ์—”๋“œ 4๊ธฐ Part3 - Tenten(10ํŒ€)

ํ”„๋กœ์ ํŠธ๋ช… : Synergy(The Julge)

ํ”„๋กœ์ ํŠธ ์†Œ๊ฐœ : ๊ธ‰ํ•˜๊ฒŒ ์ผ์†์ด ํ•„์š”ํ•œ ์ž๋ฆฌ์— ๋” ๋งŽ์€ ์‹œ๊ธ‰์„ ์ œ๊ณตํ•ด์„œ ์•„๋ฅด๋ฐ”์ดํŠธ์ƒ์„ ๊ตฌํ•  ์ˆ˜ ์žˆ๋Š” ์„œ๋น„์Šค

๊ฐœ๋ฐœ ๊ธฐ๊ฐ„: 2024. 4. 15 ~ 5. 1

URL: https://synergy10.vercel.app/

๐Ÿ’กํŒ€์› ์†Œ๊ฐœ

์ด๋ชจ์ง€_์˜ˆ์ง„
[ํŒ€์žฅ] ๊น€์˜ˆ์ง„

์ด๋ชจ์ง€_์œ ์ง„
[ํŒ€์›] ์ด์œ ์ง„

์ด๋ชจ์ง€_์žฌ์„ฑ
[ํŒ€์›] ์ด์žฌ์„ฑ

์ด๋ชจ์ง€_ํ•œ๋นˆ
[ํŒ€์›] ์กฐํ•œ๋นˆ

์ด๋ชจ์ง€_ํƒœํ›ˆ
[ํŒ€์›] ํ•˜ํƒœํ›ˆ

๐Ÿ’ก ๊ธฐ์ˆ  ์Šคํƒ

๋ถ„๋ฅ˜ ๊ธฐ์ˆ 
ํ”„๋ ˆ์ž„์›Œํฌ Next.js App Router
์–ธ์–ด TypeScript
Styles CSS Modules SCSS
HTTP Fetch
์ฝ”๋“œ ์ปจ๋ฒค์…˜ Eslint Prettier Stylelint
ํ˜‘์—… Tools Git Github Discord Notion
๋ฐฐํฌ Vercel
๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ฐ ์ถ”๊ฐ€ Extension React Hook Form ClassNames React Date Picker

๐Ÿ’ก ํด๋” ๊ตฌ์กฐ

ํด๋”๊ตฌ์กฐ1 ํด๋”๊ตฌ์กฐ2

๐Ÿ’ก ์—ญํ• ๋ถ„๋‹ด

๐Ÿถ ๊น€์˜ˆ์ง„(ํŒ€์žฅ)

๐Ÿ–ฅ๏ธ ํŽ˜์ด์ง€ & ์ปดํฌ๋„ŒํŠธ ๊ตฌํ˜„ ๋‚ด์šฉ

<๊ณต๊ณ  ๋ฆฌ์ŠคํŠธ ํŽ˜์ด์ง€>
  • ๋งž์ถค ๊ณต๊ณ 

    • ๋กœ๊ทธ์ธํ•˜์ง€ ์•Š์€ ์ƒํƒœ๊ฑฐ๋‚˜ ์‚ฌ์žฅ์ผ ๊ฒฝ์šฐ ๋ณด์—ฌ์ฃผ์ง€ ์•Š์Œ
    • ์•Œ๋ฐ”๋กœ ๋กœ๊ทธ์ธํ–ˆ์„ ๋•Œ ๋‚ด ํ”„๋กœํ•„์„ ๋“ฑ๋กํ•˜์ง€ ์•Š์•˜์„ ๊ฒฝ์šฐ, ์„ ํ˜ธ ์ง€์—ญ์„ ์„ ํƒํ•˜์ง€ ์•Š์•˜์„ ๊ฒฝ์šฐ ๋‚ด ํ”„๋กœํ•„๋กœ ์ด๋™ํ•ด ๋“ฑ๋กํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋ฐ•์Šค ํ‘œ์‹œ
    • ์„ ํ˜ธ ์ง€์—ญ์ด ์žˆ์„ ๊ฒฝ์šฐ ํ•ด๋‹นํ•˜๋Š” ์ง€์—ญ ๊ณต๊ณ  ์ค‘ ๋งˆ๊ฐ๋˜์ง€ ์•Š์€ ๊ณต๊ณ ๋ฅผ ์ตœ๋Œ€ 8๊ฐœ๋ฅผ ๋ณด์—ฌ์ฃผ์ง€๋งŒ 8๊ฐœ๊ฐ€ ์ฑ„์›Œ์ง€์ง€ ์•Š์•˜์„ ๊ฒฝ์šฐ ์ธ๊ทผ ์ง€์—ญ ๋ฐ์ดํ„ฐ๋„ ๋ณด์—ฌ์คŒ
    • ์ธ๊ทผ ์ง€์—ญ์—๋„ ๊ณต๊ณ ๊ฐ€ ์—†์„ ๊ฒฝ์šฐ ๊ณต๊ณ ๊ฐ€ ์—†๋‹ค๋Š” ๋ฌธ๊ตฌ ํ‘œ์‹œ
    • ํ•œ ๋ฒˆ์— 3๊ฐœ๊ฐ€ ๋ณด์ด๊ณ  ์‹œ๊ฐ„์ด ์ง€๋‚˜๋ฉด ํ•˜๋‚˜์”ฉ ๋„˜์–ด๊ฐ„๋‹ค(ํ…Œ๋ธ”๋ฆฟ, ๋ชจ๋ฐ”์ผ์—์„œ๋Š” ํ•œ๋ฒˆ์— 2๊ฐœ๋ณด์—ฌ์คŒ)
  • ์ •๋ ฌ ๋ฐ ์ƒ์„ธ ํ•„ํ„ฐ

    • ์ •๋ ฌ
      • 4๊ฐ€์ง€๋กœ ์ •๋ ฌ ๊ฐ€๋Šฅ
    • ์ƒ์„ธ ํ•„ํ„ฐ
      • ์œ„์น˜, ์‹œ์ž‘์ผ, ๊ธˆ์•ก์— ๊ฐ’์„ ์ž…๋ ฅํ•˜๋ฉด ๊ทธ์— ํ•ด๋‹นํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด์—ฌ์ฃผ๊ณ  ์„ ํƒํ•œ ํ•„ํ„ฐ ๊ฐœ์ˆ˜์— ๋”ฐ๋ผ ๋ฒ„ํŠผ์— ๊ฐœ์ˆ˜ ํ‘œ์‹œ
      • ์ž์œ ๋กœ์šด ์ฃผ์†Œ ์„ ํƒ, ์‚ญ์ œ. ์„ ํƒํ•œ ์ฃผ์†Œ๋Š” ํ‘œ์‹œํ•ด์„œ ๊ตฌ๋ถ„
      • ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ๊ณ ๋ คํ•ด ์‹œ์ž‘์ผ์€ ์˜ค๋Š˜๋กœ ์„ค์ • ๋˜์–ด์žˆ๊ณ , ์ดˆ๊ธฐํ™”ํ•ด์„œ ์ง€๋‚œ ๊ณต๊ณ ๋ฅผ ๋ณผ ์ˆ˜๋„ ์žˆ์Œ
  • ํŽ˜์ด์ง€๋„ค์ด์…˜

    • offset, limit ๊ฐ’์„ ๋ฐ›์•„์™€์„œ ํŽ˜์ด์ง€ ๋ฒˆํ˜ธ๋ฅผ ๋ˆ„๋ฅผ ๋•Œ๋งˆ๋‹ค ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„์˜จ๋‹ค
    • ์‚ฌ์šฉ์ž ์ž…์žฅ์„ ๊ณ ๋ คํ•ด ํ™”์‚ดํ‘œ๋ฅผ ๋ˆŒ๋ €์„ ์‹œ ๋‹ค์Œ ์„น์…˜(์ตœ๋Œ€ 7๊ฐœ์˜ ํŽ˜์ด์ง€๋ฅผ ๋ณด์—ฌ์ค„ ๊ฒฝ์šฐ 1~7์—์„œ ํ™”์‚ดํ‘œ๋ฅผ ๋ˆ„๋ฅด๋ฉด 8๋กœ)์œผ๋กœ ์ด๋™ํ•œ๋‹ค
    • ํŽ˜์ด์ง€ ์ด๋™์‹œ ๊ณต๊ณ ์˜ ์ƒ๋‹จ์œผ๋กœ ์ด๋™ํ•ด ์‚ฌ์šฉ์ž๊ฐ€ ๋ณด๊ธฐ ํŽธํ•˜๋„๋ก ์„ค์ •
<๊ณต๊ณ  ๊ฒ€์ƒ‰ ํŽ˜์ด์ง€>
  • ๊ฒ€์ƒ‰์ฐฝ์— ๊ฐ’์„ ์ž…๋ ฅํ•˜๊ณ  ์—”ํ„ฐ๋ฅผ ๋ˆ„๋ฅด๋ฉด ์ฟผ๋ฆฌ๊ฐ’์„ ์ด์šฉํ•ด ๊ฒ€์ƒ‰์–ด์— ํ•ด๋‹นํ•˜๋Š” ๊ณต๊ณ ๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” ํŽ˜์ด์ง€
<์ถ”๊ฐ€ ์‚ฌํ•ญ>
  • ์Šคํ”ผ๋„ˆ
    • ์‚ฌ์šฉ์ž ์ž…์žฅ์„ ๊ณ ๋ คํ•ด ๋กœ๋”ฉ๋˜๋Š” ๋™์•ˆ ๋‚˜ํƒ€๋‚˜๋Š” ํ™”๋ฉด์š”์†Œ ๊ตฌํ˜„

๐Ÿ˜บ ์ด์œ ์ง„

๐Ÿ–ฅ๏ธ ํŽ˜์ด์ง€ & ์ปดํฌ๋„ŒํŠธ ๊ตฌํ˜„ ๋‚ด์šฉ

<๋‚ด ํ”„๋กœํ•„ ํŽ˜์ด์ง€>
  • ํ”„๋กœํ•„ ๋ฐ์ดํ„ฐ, ์•Œ๋ฐ”์˜ ์‹ ์ฒญ๋‚ด์—ญ ๋ฐ์ดํ„ฐ๋ฅผ GET Method๋ฅผ ํ†ตํ•ด ๋ฐ›์•„๋“ค์ž„
  • userId, token์ด ์—†๊ฑฐ๋‚˜, userType์ด employee๊ฐ€ ์•„๋‹ ๊ฒฝ์šฐ ๋ฉ”์ธํŽ˜์ด์ง€๋กœ redirect
    • ๋“ฑ๋ก๋œ ํ”„๋กœํ•„์ด ์—†์œผ๋ฉด 'ํ”„๋กœํ•„์„ ๋“ฑ๋กํ•˜์„ธ์š”' ๋ Œ๋”๋ง
    • ํ”„๋กœํ•„์€ ์žˆ์œผ๋‚˜ ์‹ ์ฒญ ๋‚ด์—ญ์ด ์—†์œผ๋ฉด '์‹ ์ฒญ๋‚ด์—ญ์ด ์—†์–ด์š”' ๋ Œ๋”๋ง
<๊ณต๊ณ  ์ƒ์„ธ๋ณด๊ธฐ ํŽ˜์ด์ง€(์‚ฌ์žฅ)>
  • ์‚ฌ์žฅ์˜ ์ง€์›์ž ๋‚ด์—ญ ๋ฐ์ดํ„ฐ๋ฅผ GET Method๋ฅผ ํ†ตํ•ด ๋ฐ›์•„๋“ค์ž„
  • ์ง€์›์ž๊ฐ€ ์žˆ์œผ๋ฉด table ๋ Œ๋”๋ง, ์—†์œผ๋ฉด '์‹ ์ฒญ์ž๊ฐ€ ์—†์–ด์š”' ์š”์†Œ ๋ Œ๋”๋ง
<๊ณตํ†ต ์ปดํฌ๋„ŒํŠธ>
  • AlarmSet, AlarmContainer Component
    • ์•Œ๋žŒ ๋ฐ์ดํ„ฐ GET, ์•Œ๋žŒ ์ฝ์œผ๋ฉด ์ฝ์Œ์ฒ˜๋ฆฌ PUT
    • ์•Œ๋žŒ ์ฝ๊ฑฐ๋‚˜, ์•Œ๋žŒ์•„์ด์ฝ˜์„ ๋ˆ„๋ฅด๋ฉด ํด๋ผ์ด์–ธํŠธ ์‚ฌ์ด๋“œ์—์„œ ์žฌ๋ Œ๋”๋ง
    • ์•Œ๋žŒ ๋ฐ์ดํ„ฐ์—์„œ ์•Œ๋ฐ” ๋ณธ์ธ์ด ์ทจ์†Œํ•œ ์•Œ๋žŒ์€ filter
    • ์ฝ์ง€ ์•Š์€ ์•Œ๋žŒ ์œ ๋ฌด์— ๋”ฐ๋ผ ์•Œ๋žŒ ์•„์ด์ฝ˜ ๋‹ค๋ฅด๊ฒŒ ๊ตฌํ˜„
    • getFromTimeํ•จ์ˆ˜ ๊ตฌํ˜„
  • Label Component
    • ์œ„์น˜๋ผ๋ฒจ๊ณผ ์ƒํƒœ๋ผ๋ฒจ์„ ๊ณตํ†ต ์ปดํฌ๋„ŒํŠธ๋กœ ์ถ”์ƒํ™”
  • NoList Component
<์ถ”๊ฐ€ ์‚ฌํ•ญ>
  • ApplyTable Component

    • ๋ฐ˜์‘ํ˜• ๊ตฌํ˜„
    • userType์— ๋”ฐ๋ฅธ ๋ฐ์ดํ„ฐ ๋‹ค๋ฃจ๊ธฐ
    • ์‚ฌ์žฅ์ด ์Šน์ธํ•˜๊ธฐ/๊ฑฐ์ ˆํ•˜๊ธฐ ๋ฒ„ํŠผ ๋ˆ„๋ฅด๋ฉด ๋ชจ๋‹ฌ ๋„์šฐ๊ธฐ, ๋ชจ๋‹ฌ์˜ โ€˜์˜ˆโ€™ ๋ˆ„๋ฅด๋ฉด status ๋ฐ”๊พธ๊ธฐ
      • ํด๋ผ์ด์–ธํŠธ ์‚ฌ์ด๋“œ์—์„œ ๋ฐ”๋กœ ๋ฐ”๋€Œ๋„๋ก ๊ตฌํ˜„
    • ์‚ฌ์žฅ์ด ์Šน์ธํ•˜๊ธฐ ๋ฒ„ํŠผ ๋ˆ„๋ฅด๋ฉด pending์ค‘์ธ ๋‹ค๋ฅธ ์ง€์›๋“ค์€ ๊ฑฐ์ ˆ ๋ผ๋ฒจ๋กœ ๋ณด์ด๋„๋ก ๊ตฌํ˜„
      • ํด๋ผ์ด์–ธํŠธ ์‚ฌ์ด๋“œ์—์„œ ๋ฐ”๋กœ ๋ฐ”๋€Œ๋„๋ก ๊ตฌํ˜„
    • ํŽ˜์ด์ง€๋„ค์ด์…˜ ์—ฐ๊ฒฐ
  • MyProfile Component

๐Ÿบ ์ด์žฌ์„ฑ

๐Ÿ–ฅ๏ธ ํŽ˜์ด์ง€ & ์ปดํฌ๋„ŒํŠธ ๊ตฌํ˜„ ๋‚ด์šฉ

  • react-hook-form ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํ™œ์šฉํ•œ ์ž…๋ ฅ๊ฐ’ ๊ด€๋ฆฌ
<๋‚ด ํ”„๋กœํ•„ ๋“ฑ๋ก ๋ฐ ์ˆ˜์ • ํŽ˜์ด์ง€>
  • ์ž…๋ ฅ๊ฐ’ ๋ฆฌ์ŠคํŠธ : ์ด๋ฆ„, ์—ฐ๋ฝ์ฒ˜, ์„ ํ˜ธ์ง€์—ญ, ์ž๊ธฐ์†Œ๊ฐœ
    • ํ•„์ˆ˜ ์ž…๋ ฅ๊ฐ’์„ ์„ค์ •ํ•˜์ง€ ์•Š๊ณ  ์ œ์ถœ ์‹œ ์—๋Ÿฌ ๋ฉ”์„ธ์ง€ ๋…ธ์ถœ
    • ์—ฐ๋ฝ์ฒ˜์˜ ๊ฒฝ์šฐ 010-0000-0000 ์˜ ํ˜•์‹์„ ์ง€ํ‚ค์ง€ ์•Š์„ ์‹œ ์—๋Ÿฌ ๋ฉ”์„ธ์ง€ ๋…ธ์ถœ
    • ์„ ํ˜ธ์ง€์—ญ์˜ ๊ฒฝ์šฐ Dropdown ํ˜•์‹์œผ๋กœ UI ๊ตฌ์„ฑ
    • ์ž๊ธฐ์†Œ๊ฐœ์˜ ๊ฒฝ์šฐ ๊ธ€์ž ์ˆ˜๋ฅผ ์ œํ•œํ•˜์—ฌ ์ดˆ๊ณผํ•  ์‹œ ํ…์ŠคํŠธ ์ž…๋ ฅ์„ ๋ง‰์Œ
  • ๋‚ด ํ”„๋กœํ•„ ๋“ฑ๋ก ๋ฐ ์ˆ˜์ • ํŽ˜์ด์ง€๋Š” ๊ฐ™์€ ํŽ˜์ด์ง€๋ฅผ ๊ณต์œ ํ•˜๋ฉฐ url์˜ ์ฟผ๋ฆฌ๊ฐ’์œผ๋กœ ๋“ฑ๋ก, ์ˆ˜์ • ์—ฌ๋ถ€๋ฅผ ํŒ๋‹จ
    • ๋“ฑ๋ก ํŽ˜์ด์ง€ (/myprofile/register), ์ˆ˜์ • ํŽ˜์ด์ง€(/myprofile/register/?action=edit)
    • ์ˆ˜์ • ํŽ˜์ด์ง€๋กœ ํŒ๋‹จ ๋  ์‹œ ๊ธฐ์กด ์œ ์ €์˜ ์ •๋ณด๋ฅผ fetch ํ•˜์—ฌ ์ž…๋ ฅ์ฐฝ์˜ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ์„ค์ •
    • ์ˆ˜์ • ํŽ˜์ด์ง€ ์ง„์ž… ์‹œ ์œ ์ € ์ •๋ณด๊ฐ€ fetch ๋˜๊ธฐ ์ „๊นŒ์ง€ spinner๋ฅผ ๊ตฌํ˜„ํ•˜์—ฌ ์œ ์ € ํŽธ์˜์„ฑ ๊ณ ๋ ค
  • ๋ชจ๋“  ์ž…๋ ฅ๊ฐ’์„ ์ค€์ˆ˜ํ•˜๊ณ  ์ œ์ถœ ์‹œ API ์„ฑ๊ณต ์—ฌ๋ถ€์— ๋”ฐ๋ผ ํ™•์ธ ๋ชจ๋‹ฌ์ฐฝ์— ๋ฉ”์„ธ์ง€ ๋…ธ์ถœ
  • ๋‚ด ํ”„๋กœํ•„ ๋“ฑ๋ก์ด ๋˜์–ด ์žˆ๋Š”๋ฐ url๋กœ ๋“ฑ๋ก ํŽ˜์ด์ง€ ์ ‘๊ทผ ์‹œ โ€˜/โ€™ ๋ฃจํŠธ ํŽ˜์ด์ง€๋กœ redirect ๋˜๋„๋ก ๊ตฌํ˜„
<๋‚ด ๊ฐ€๊ฒŒ ๋“ฑ๋ก ๋ฐ ์ˆ˜์ • ํŽ˜์ด์ง€>
  • ์ž…๋ ฅ๊ฐ’ ๋ฆฌ์ŠคํŠธ : ๊ฐ€๊ฒŒ์ด๋ฆ„, ๋ถ„๋ฅ˜, ์ฃผ์†Œ, ์ƒ์„ธ์ฃผ์†Œ, ๊ฐ€๊ฒŒ์ด๋ฏธ์ง€, ๊ธฐ๋ณธ์‹œ๊ธ‰, ๊ฐ€๊ฒŒ์„ค๋ช…
    • ํ•„์ˆ˜ ์ž…๋ ฅ๊ฐ’์„ ์„ค์ •ํ•˜์ง€ ์•Š๊ณ  ์ œ์ถœ ์‹œ ์—๋Ÿฌ ๋ฉ”์„ธ์ง€ ๋…ธ์ถœ
    • ๊ธฐ๋ณธ ์‹œ๊ธ‰์˜ ๊ฒฝ์šฐ 24๋…„ ๊ธฐ์ค€ ์ตœ์ €์ž„๊ธˆ ์ดํ•˜๋กœ ์ž…๋ ฅ ์‹œ ์—๋Ÿฌ๋ฉ”์„ธ์ง€ ๋…ธ์ถœ
    • ๊ฐ€๊ฒŒ ์ด๋ฏธ์ง€
      • S3 ์™ธ๋ถ€ ํด๋ผ์šฐ๋“œ ์ €์žฅ์†Œ๋ฅผ ์ด์šฉํ•˜์—ฌ ์ด์šฉ์ž๊ฐ€ ์ฒจ๋ถ€ํ•œ ์‚ฌ์ง„ ํŒŒ์ผ์„ ์ด๋ฏธ์ง€ url๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ์‚ฌ์šฉ
      • ๊ฐ€๊ฒŒ ์ด๋ฏธ์ง€ Box๋ฅผ ํด๋ฆญํ•˜๋ฉด display: none; ์œผ๋กœ ์„ค์ •๋˜์–ด์žˆ๋˜ file type์˜ input์˜ Ref๋ฅผ ์ฐธ์กฐํ•˜์—ฌ click ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๊ฒŒ ๊ตฌํ˜„
    • ์ž๊ธฐ์†Œ๊ฐœ์˜ ๊ฒฝ์šฐ ๊ธ€์ž ์ˆ˜๋ฅผ ์ œํ•œํ•˜์—ฌ ์ดˆ๊ณผํ•  ์‹œ ํ…์ŠคํŠธ ์ž…๋ ฅ์„ ๋ง‰์Œ
    • ๊ฐ€๊ฒŒ ๋ถ„๋ฅ˜์™€ ์ฃผ์†Œ๋Š” Dropdown ํ˜•์‹์œผ๋กœ UI ๊ตฌ์„ฑ
  • ๋‚ด ๊ฐ€๊ฒŒ ๋“ฑ๋ก ๋ฐ ์ˆ˜์ • ํŽ˜์ด์ง€๋Š” ๊ฐ™์€ ํŽ˜์ด์ง€๋ฅผ ๊ณต์œ ํ•˜๋ฉฐ url์˜ ์ฟผ๋ฆฌ๊ฐ’์œผ๋กœ ๋“ฑ๋ก, ์ˆ˜์ • ์—ฌ๋ถ€๋ฅผ ํŒ๋‹จ
    • ๋“ฑ๋ก ํŽ˜์ด์ง€(/myshop/register), ์ˆ˜์ • ํŽ˜์ด์ง€(myshop/register/?action=edit)
    • ์ˆ˜์ • ํŽ˜์ด์ง€๋กœ ํŒ๋‹จ ๋  ์‹œ ๊ธฐ์กด ๊ฐ€๊ฒŒ ์ •๋ณด๋ฅผ fetch ํ•˜์—ฌ ์ž…๋ ฅ์ฐฝ์˜ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ์„ค์ •
    • ์ˆ˜์ • ํŽ˜์ด์ง€ ์ง„์ž… ์‹œ ๊ฐ€๊ฒŒ ์ •๋ณด๊ฐ€ fetch ๋˜๊ธฐ ์ „๊นŒ์ง€ spinner๋ฅผ ๊ตฌํ˜„ํ•˜์—ฌ ์œ ์ € ํŽธ์˜์„ฑ ๊ณ ๋ ค
  • ๋ชจ๋“  ์ž…๋ ฅ๊ฐ’์„ ์ค€์ˆ˜ํ•˜๊ณ  ์ œ์ถœ ์‹œ API ์„ฑ๊ณต ์—ฌ๋ถ€์— ๋”ฐ๋ผ ํ™•์ธ ๋ชจ๋‹ฌ์ฐฝ์— ๋ฉ”์„ธ์ง€ ๋…ธ์ถœ
  • ๋‚ด ๊ฐ€๊ฒŒ๊ฐ€ ๋“ฑ๋ก๋˜์–ด ์žˆ๋Š”๋ฐ url๋กœ ๋“ฑ๋ก ํŽ˜์ด์ง€ ์ ‘๊ทผ ์‹œ โ€˜/โ€™ ๋ฃจํŠธ ํŽ˜์ด์ง€๋กœ redirect ๋˜๋„๋ก ๊ตฌํ˜„
<๋‚ด ๊ฐ€๊ฒŒ ๊ณต๊ณ  ๋“ฑ๋ก ๋ฐ ์ˆ˜์ • ํŽ˜์ด์ง€>
  • ์ž…๋ ฅ๊ฐ’ ๋ฆฌ์ŠคํŠธ : ์‹œ๊ธ‰, ์‹œ์ž‘์ผ์‹œ, ์—…๋ฌด์‹œ๊ฐ„, ๊ณต๊ณ  ์„ค๋ช…
    • ํ•„์ˆ˜ ์ž…๋ ฅ๊ฐ’์„ ์„ค์ •ํ•˜์ง€ ์•Š๊ณ  ์ œ์ถœ ์‹œ ์—๋Ÿฌ ๋ฉ”์„ธ์ง€ ๋…ธ์ถœ
    • ์‹œ๊ธ‰์˜ ๊ฒฝ์šฐ ๊ฐ€๊ฒŒ ์ •๋ณด๋ฅผ ๋“ฑ๋กํ•  ๋•Œ์˜ ๊ธฐ๋ณธ ์‹œ๊ธ‰๋ณด๋‹ค ๋‚ฎ์€ ๊ธˆ์•ก์€ ์„ค์ •ํ•˜์ง€ ๋ชปํ•˜๋„๋ก ๊ตฌํ˜„
    • ์‹œ์ž‘์ผ์‹œ
      • react-datePicker ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‹œ์ž‘์ผ์‹œ ๊ฐ’์„ ์„ ํƒํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ตฌํ˜„
      • react-hook-form๊ณผ ์—ฐ๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์ œ๊ณต๋˜๋Š” Controller ์ปดํฌ๋„ŒํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ react-datePicker ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ์—ฐ๋™ํ•˜์˜€์Œ
      • ๋‚ ์งœ์™€ ์‹œ๊ฐ„๋Œ€๋ฅผ ์„ ํƒํ•  ์ˆ˜ ์žˆ์Œ
      • ํ˜„์žฌ ์‹œ๊ฐ„๋ณด๋‹ค ์ด์ „ ์‹œ๊ฐ„์„ ์„ ํƒํ•  ๊ฒฝ์šฐ ์—๋Ÿฌ ๋ฉ”์„ธ์ง€ ๋…ธ์ถœ
    • ๊ณต๊ณ  ์„ค๋ช…์˜ ๊ฒฝ์šฐ ๊ธ€์ž ์ˆ˜๋ฅผ ์ œํ•œํ•˜์—ฌ ์ดˆ๊ณผํ•  ์‹œ ํ…์ŠคํŠธ ์ž…๋ ฅ์„ ๋ง‰์Œ
  • ๋‚ด ๊ฐ€๊ฒŒ ๊ณต๊ณ  ๋“ฑ๋ก ๋ฐ ์ˆ˜์ • ํŽ˜์ด์ง€๋Š” ๊ฐ™์€ ํŽ˜์ด์ง€๋ฅผ ๊ณต์œ ํ•˜๋ฉฐ url์˜ ์ฟผ๋ฆฌ๊ฐ’์œผ๋กœ ๋“ฑ๋ก, ์ˆ˜์ • ์—ฌ๋ถ€๋ฅผ ํŒ๋‹จ
    • ๊ณต๊ณ  ๋“ฑ๋ก ํŽ˜์ด์ง€(/myshop/register/notice), ๊ณต๊ณ  ์ˆ˜์ • ํŽ˜์ด์ง€(/myshop/register/notice?noticeId=${noticeId})
    • ์ˆ˜์ • ํŽ˜์ด์ง€๋กœ ํŒ๋‹จ ๋  ์‹œ ๊ธฐ์กด ๊ณต๊ณ  ์ •๋ณด๋ฅผ fetch ํ•˜์—ฌ ์ž…๋ ฅ์ฐฝ์˜ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ์„ค์ •
    • ์ˆ˜์ • ํŽ˜์ด์ง€ ์ง„์ž… ์‹œ ๊ณต๊ณ  ์ •๋ณด๊ฐ€ fetch ๋˜๊ธฐ ์ „๊นŒ์ง€ spinne๋ฅผ ๊ตฌํ˜„ํ•˜์—ฌ ์œ ์ € ํŽธ์˜์„ฑ ๊ณ ๋ ค
  • ๋ชจ๋“  ์ž…๋ ฅ๊ฐ’์„ ์ค€์ˆ˜ํ•˜๊ณ  ์ œ์ถœ ์‹œ API ์„ฑ๊ณต ์—ฌ๋ถ€์— ๋”ฐ๋ผ ํ™•์ธ ๋ชจ๋‹ฌ์ฐฝ์— ๋ฉ”์„ธ์ง€ ๋…ธ์ถœ
  • ๊ณต๊ณ  ์ˆ˜์ • ์™„๋ฃŒ ์‹œ ์ž‘์„ฑ๋œ ๊ณต๊ณ  ์ƒ์„ธ ํŽ˜์ด์ง€๋กœ ์ด๋™
  • ๊ณต๊ณ  ๋“ฑ๋ก ์‹œ ๋‚ด ๊ฐ€๊ฒŒ ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•˜์—ฌ ์ƒ์„ฑ๋œ ๊ณต๊ณ  ๋ฆฌ์ŠคํŠธ ๋…ธ์ถœ
<๊ณตํ†ต ์ปดํฌ๋„ŒํŠธ>
  • Header Component
    • ๋กœ๊ณ , ๊ฒ€์ƒ‰์ฐฝ ๋ฐ ๋‚ด ๊ฐ€๊ฒŒ(๋‚ด ํ”„๋กœํ•„), ๋กœ๊ทธ์•„์›ƒ, ๋กœ๊ทธ์ธ ๋ฐ ํšŒ์›๊ฐ€์ž… ๋ฒ„ํŠผ์œผ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋Š” ์ƒ๋‹จ ๊ณ ์ • component

๐Ÿฆ ์กฐํ•œ๋นˆ

๐Ÿ–ฅ๏ธ ํŽ˜์ด์ง€ & ์ปดํฌ๋„ŒํŠธ ๊ตฌํ˜„ ๋‚ด์šฉ

<๋‚ด ๊ฐ€๊ฒŒ, ๊ณต๊ณ  ์ƒ์„ธ๋ณด๊ธฐ(์•Œ๋ฐ”) ํŽ˜์ด์ง€>
  • ๊ฐ€๊ฒŒ์ƒ์„ธ์™€ ๊ณต๊ณ ์ƒ์„ธ์— ๊ณตํ†ต์ ์œผ๋กœ ์“ฐ์ผ Box ๊ตฌํ˜„

    • ๋ฒ„ํŠผ ๊ฐฏ์ˆ˜๋‚˜ ์“ฐ์ž„์ƒˆ์˜ ๊ฒฝ์šฐ์˜ ์ˆ˜๊ฐ€ ๋งŽ์•„์„œ ๋ฒ„ํŠผ์„ children์œผ๋กœ ๋ฐฐ์น˜
    • ๋กœ๊ทธ์ธ์„ ํ†ตํ•ด ์ €์žฅ๋œ cookie๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ํ•˜์—ฌ, ์œ ์ € ์ข…๋ฅ˜ ๋ฐ ๊ฐ€๊ฒŒ์˜ ๋งˆ๊ฐ ์—ฌ๋ถ€ ๋“ฑ์— ๋”ฐ๋ผ ๋ฒ„ํŠผ์„ ๋ Œ๋”๋ง ํ•˜๋„๋ก ์กฐ๊ฑด์‹ ์ž‘์„ฑ
  • ์‹œ๊ธ‰ ์ธ์ƒ์œจ ๋ฑƒ์ง€ ์ œ์ž‘

    • ์นด๋“œ์—์„œ ๋ณด์—ฌ์งˆ ๋•Œ์™€ ํŽ˜์ด์ง€์—์„œ ๋ณด์—ฌ์งˆ ๋•Œ ๋””์ž์ธ ๊ตฌ๋ณ„
    • ์‹œ๊ธ‰์ด๋‚˜ ์ธ์ƒ์œจ ํ…์ŠคํŠธ๊ฐ€ ๊ธธ์–ด์ ธ์„œ ์ƒ๋žต๋  ๊ฒฝ์šฐ (text-overflow) ํ˜ธ๋ฒ„ ์‹œ ์ „์ œ ํ…์ŠคํŠธ ํ‘œ์‹œ
  • ๋“ฑ๋กํ•œ ๊ณต๊ณ ๋Š” ๋ฌดํ•œ์Šคํฌ๋กค ๋ฐฉ์‹์œผ๋กœ ๋กœ๋“œ

    • Intersection Observer ์‚ฌ์šฉ, ํด๋ผ์ด์–ธํŠธ ์ปดํฌ๋„ŒํŠธํ™”
  • ๋‚ด ๊ฐ€๊ฒŒ ํŽ˜์ด์ง€

    • '/myshop' layout ๋‹จ๊ณ„์—์„œ ์œ ์ €ํƒ€์ž… ๊ฒ€์‚ฌ ํ›„ ์‚ฌ์žฅ์ด ์•„๋‹ˆ๋ฉด ๋ฃจํŠธ ํŽ˜์ด์ง€๋กœ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ
  • ๊ณต๊ณ  ์ƒ์„ธ๋ณด๊ธฐ ํŽ˜์ด์ง€(์•Œ๋ฐ”)

    • ์ตœ๊ทผ์— ๋ณธ ๊ณต๊ณ ๋ฅผ ๋กœ์ปฌ์Šคํ† ๋ฆฌ์ง€์— JSON ๊ฐ์ฒด๋กœ ์ €์žฅ
    • ์ค‘๋ณต์„ ์—†์• ๊ณ , ์ตœ์‹ ์ˆœ ์ •๋ ฌํ•˜๊ธฐ ์œ„ํ•œ ๋กœ์ง ๊ตฌํ˜„
<๋‚ด ๊ฐ€๊ฒŒ ํŽ˜์ด์ง€>
<๊ณตํ†ต ์ปดํฌ๋„ŒํŠธ>
  • Modal Component
    • ๊ฒฝ๊ณ , ๋กœ๊ทธ์•„์›ƒ ๋“ฑ์˜ ๊ฒฝ๊ณ  ๋ฐ ์•Œ๋ฆผ์„ ๋‚˜ํƒ€๋‚ด๊ธฐ ์œ„ํ•œ ์ปดํฌ๋„ŒํŠธ
<์ถ”๊ฐ€ ์‚ฌํ•ญ>
  • ํ”„๋กœ์ ํŠธ ๋ฐฐํฌ ๋ฐ ๋ฐฐํฌ ์‹œ ๋ฐœ์ƒํ•˜๋Š” ์˜ค๋ฅ˜ ๊ฒ€ํ† 

๐Ÿป ํ•˜ํƒœํ›ˆ

๐Ÿ–ฅ๏ธ ํŽ˜์ด์ง€ & ์ปดํฌ๋„ŒํŠธ ๊ตฌํ˜„ ๋‚ด์šฉ

<๋กœ๊ทธ์ธ, ํšŒ์›๊ฐ€์ž… ํŽ˜์ด์ง€>
  • react-hook-form์„ ํ™œ์šฉํ•˜์—ฌ ๋กœ๊ทธ์ธ, ํšŒ์›๊ฐ€์ž… ํŽ˜์ด์ง€ ์ œ์ž‘
  • setCookies ์ƒ์„ฑ
    • ๋กœ๊ทธ์ธ ์‹œ, u_id(userID), s_id(shopID), userType, token์ด cookie์— ์ž๋™์œผ๋กœ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋„๋ก setCookies ์ƒ์„ฑ
      • ๊ธฐ๋ณธ ์ฟ ํ‚ค(์•Œ๋ฐ”์ƒ, ์‚ฌ์žฅ๋‹˜ ๊ณตํ†ต) : u_id, userType, token ์ƒ์„ฑ
      • userType === employer : ๋‚ด ๊ฐ€๊ฒŒ ๋“ฑ๋ก ์—ฌ๋ถ€์— ๋”ฐ๋ผ cookie์— s_id ์ถ”๊ฐ€
<๊ณตํ†ต ์ปดํฌ๋„ŒํŠธ>
  • Input Component
    • label ๋“ฑ ์„ค์ • ๊ฐ€๋Šฅ
    • label์˜ ๋‚ด์šฉ์— ๋”ฐ๋ผ input box์— โ€˜์›โ€™, โ€˜์‹œ๊ฐ„โ€™ ๋‹จ์œ„ ์ถ”๊ฐ€
    • type === password : eyeIcon ์ถ”๊ฐ€, ๋น„๋ฐ€๋ฒˆํ˜ธ๊ฐ€ ๋ณด์ด๋„๋ก ์„ค์ • ๊ฐ€๋Šฅ
  • Button Component
    • props์— ์ƒ‰์ƒ, ํฌ๊ธฐ, ๋‚ด์šฉ, button type ์„ค์ • ๊ฐ€๋Šฅ
  • TypeSelector Component
    • ํšŒ์›๊ฐ€์ž…์—์„œ userType ์„ค์ •
    • ์•Œ๋ฐ”์ƒ : employee, ์‚ฌ์žฅ๋‹˜ : employer
  • Toast Component
    • ๋กœ๊ทธ์ธ, ํšŒ์›๊ฐ€์ž…์—์„œ ์„ฑ๊ณต, ๊ฒฝ๊ณ  ์—ฌ๋ถ€ ์ถœ๋ ฅ
    • ๊ธฐ๋ณธ Toast ์œ ์ง€ ์‹œ๊ฐ„ : 1.5์ดˆ
  • Footer Componet
    • ๋ฐ˜์‘ํ˜• ๋™์ž‘ ๊ตฌํ˜„
<์ถ”๊ฐ€ ์‚ฌํ•ญ>
  • Header์—์„œ ๋กœ๊ทธ์•„์›ƒ ์‹œ, ๋กœ๊ทธ์•„์›ƒ ์ง„ํ–‰
    • ๋กœ๊ทธ์•„์›ƒ ๋ฒ„ํŠผ ํด๋ฆญ ์‹œ, modal ํ™”๋ฉด์„ ํ†ตํ•˜์—ฌ ๋‹ค์‹œํ•œ๋ฒˆ ๋กœ๊ทธ์•„์›ƒ ์—ฌ๋ถ€ ํ™•์ธ
  • ๋กœ๊ทธ์ธ ์‹œ Header ๊ตฌ์„ฑ ์š”์†Œ ์กฐ๊ฑด ์ถ”๊ฐ€
    • userType, token ์ฟ ํ‚ค๋ฅผ ๋ฐ›์•„์™€์„œ token ์กด์žฌ ์—ฌ๋ถ€ ๋ฐ userType์— ๋”ฐ๋ผ ๋ฒ„ํŠผ ๊ฒฐ์ •
  • ๊ฒ€์ƒ‰ ํ›„ ๋‹ค๋ฅธ ํŽ˜์ด์ง€ ์ ‘๊ทผ ์‹œ ๊ฒ€์ƒ‰์ฐฝ์˜ ๋‚ด์šฉ ์ดˆ๊ธฐํ™”
    • usePathname() ์‚ฌ์šฉ

๐Ÿ‘€ ํŽ˜์ด์ง€ preview

๋ฉ”์ธ ํŽ˜์ด์ง€

  • ๋กœ๊ทธ์ธ x image

  • ์•Œ๋ฐ”์ƒ ๋กœ๊ทธ์ธ(ํ”„๋กœํ•„ ๋“ฑ๋ก O, ๋งž์ถค ๊ณต๊ณ  ์ถ”๊ฐ€) image

๋กœ๊ทธ์ธ, ํšŒ์›๊ฐ€์ž… ํŽ˜์ด์ง€

  • ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€ image

  • ํšŒ์›๊ฐ€์ž… ํŽ˜์ด์ง€ image

๊ฐ€๊ฒŒ ์ƒ์„ธ ํŽ˜์ด์ง€

image

๋‚ด ๊ฐ€๊ฒŒ ํŽ˜์ด์ง€

image

๋‚ด ํ”„๋กœํ•„ ํŽ˜์ด์ง€

image

ํ”„๋กœํ•„ ์ƒ์„ฑ(ํŽธ์ง‘) ํŽ˜์ด์ง€

image

๊ฐ€๊ฒŒ ์ •๋ณด(ํŽธ์ง‘) ํŽ˜์ด์ง€

image

๊ฐ€๊ฒŒ ๊ณต๊ณ  ๋“ฑ๋ก ํŽ˜์ด์ง€

  • ๋“ฑ๋ก ํ›„ ํŽ˜์ด์ง€ image
  • ๋“ฑ๋ก ํŽธ์ง‘ ํŽ˜์ด์ง€ image

404 ํŽ˜์ด์ง€

image

๐ŸŽš๏ธ ๊ธฐ๋Šฅ๋ณ„ preview

๋กœ๊ทธ์ธ

๋กœ๊ทธ์ธ

๊ฐ€๊ฒŒ ๊ฒ€์ƒ‰

๊ฒ€์ƒ‰

โš ๏ธ ํŠธ๋Ÿฌ๋ธ” ์ŠˆํŒ…

1. ๋กœ๊ทธ์ธ ์‹œ, ๋กœ๊ทธ์ธ ํ•œ ์‚ฌ๋žŒ์ด ๋ˆ„๊ตฌ์ธ์ง€ ๊ตฌ๋ถ„ํ•˜๋Š” ๋ฌธ์ œ ๋ฐ userType ํŒŒ์•…์— ๋Œ€ํ•œ ๋ฌธ์ œ

ํ•ด๊ฒฐ๋ฐฉ๋ฒ•

  • ๋กœ๊ทธ์ธํ•  ๋•Œ ์ฟ ํ‚ค์— ์ €์žฅ๋˜๋Š” ๊ฐ’(userType)์œผ๋กœ ์•Œ๋ฐ”์ƒ, ์‚ฌ์žฅ๋‹˜ ๊ตฌ๋ถ„
  • ๊ฐ ํŽ˜์ด์ง€์—์„œ ์ฟ ํ‚ค ๊ฐ’์„ ๊ฐ€์ ธ์™€ ์กฐ๊ฑด๋ถ€ ๋ Œ๋”๋ง์œผ๋กœ ๊ตฌํ˜„

2. useRouter, useEffect๋Š” CSR์—์„œ๋งŒ ๊ฐ€๋Šฅ, ์ฟ ํ‚ค ๊ฐ’ ์ฐธ์กฐ๋Š” SSR์—์„œ๋งŒ ๊ฐ€๋Šฅํ•˜๋˜ ๋ฌธ์ œ

ํ•ด๊ฒฐ๋ฐฉ๋ฒ•

  • ๊ฐ ํŽ˜์ด์ง€์—์„œ๋Š” ์ฟ ํ‚ค ๊ฐ’ ์ฐธ์กฐ๋ฅผ ์œ„ํ•ด SSR๋กœ ๊ตฌํ˜„
  • ๋ฐ์ดํ„ฐ ๋ณ€ํ™” ์‹œ ๋ฆฌ๋ Œ๋”๋ง์„ ์œ„ํ•ด ์ปดํฌ๋„ŒํŠธ ๋ถ„๋ฆฌ ํ›„ CSR๋กœ ์„ค์ •
    • ์ฟ ํ‚ค ๊ฐ’์€ props๋กœ ๋„˜๊ฒจ๋ฐ›์Œ

3. React-hook-form์„ ์ฒ˜์Œ ์‚ฌ์šฉํ•˜๋ฉด์„œ register, submit ๊ด€๋ จํ•˜์—ฌ ์–ด๋ ค์›€

  • ์ž…๋ ฅ ํ•„๋“œ์— register ํ•จ์ˆ˜๋ฅผ ์ ์šฉํ–ˆ์Œ์—๋„ ์ž…๋ ฅ ๊ฐ’์ด ์ œ๋Œ€๋กœ ๋“ฑ๋ก๋˜์ง€ ์•Š์Œ
  • onSubmit ์ด๋ฒคํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋ฉด์„œ, ํผ ์ œ์ถœ ์‹œ ์‚ฌ์šฉ์ž ์ž…๋ ฅ ๋ฐ์ดํ„ฐ๋ฅผ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ฒ˜๋ฆฌํ•˜์ง€ ๋ชปํ•จ

ํ•ด๊ฒฐ๋ฐฉ๋ฒ•

  • form ํƒœ๊ทธ์˜ props์—์„œ handleSubmit์„ ํ™œ์šฉํ•จ์œผ๋กœ ๋ฌธ์ œ ํ•ด๊ฒฐ
  • input field์— React Hook Form๊ณผ ์—ฐ๊ฒฐํ•˜๊ณ , ํผ ์ œ์ถœ ์‹œ ์ž…๋ ฅ ๊ฐ’์„ ๊ฒ€์ƒ‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ์ ์šฉ