๊ด€๋ฆฌ ๋ฉ”๋‰ด

๐ŸŒฑ

๊ณ ๊ธ‰ ํ”„๋กœ์ ํŠธ: GlobalNomad ๋ณธ๋ฌธ

์ฝ”๋“œ์ž‡ ์Šคํ”„๋ฆฐํŠธ ํ”„๋ก ํŠธ์—”๋“œ 11๊ธฐ

๊ณ ๊ธ‰ ํ”„๋กœ์ ํŠธ: GlobalNomad

soo2051 2025. 3. 21. 22:59

๐Ÿ“ข ํ”„๋กœ์ ํŠธ ์†Œ๊ฐœ

  • ํ”„๋กœ์ ํŠธ ์ธ์› : ํ”„๋ก ํŠธ์—”๋“œ 5๋ช…
  • ๊ธฐ๊ฐ„ : 25.01.17 - 25.02.26
  • ํ”„๋กœ์ ํŠธ : ์‚ฌ์šฉ์ž๊ฐ€ ์ฒดํ—˜์„ ๋“ฑ๋กํ•˜๊ณ  ์˜ˆ์•ฝํ•  ์ˆ˜ ์žˆ๋Š” ์˜จ๋ผ์ธ ์ฒดํ—˜ ์˜ˆ์•ฝ ์„œ๋น„์Šค
  • GitHub: https://github.com/codeitFE11-part4-team2/globalnomad
  • ํ˜‘์—… : GitHub, Notion, Discord
  • ๊ธฐ์ˆ  ์Šคํƒ : React, Next.js(App Route), Tailwind CSS

 

๐Ÿ‘ฉ๐Ÿป‍๐Ÿ’ป ๋‚ด ์—ญํ• 

  • ํŽ˜์ด์ง€๋„ค์ด์…˜ ๊ณตํ†ต ์ปดํฌ๋„ŒํŠธ ๊ตฌํ˜„
  • ์ฒดํ—˜ ์ƒ์„ธ ํŽ˜์ด์ง€ ๊ตฌํ˜„

 

๐Ÿ’ป ํ”„๋กœ์ ํŠธ ๊ณผ์ •

๐Ÿ”— API ์—ฐ๋™ – Swagger ๊ธฐ๋ฐ˜ ๋ฐฑ์—”๋“œ API ์‚ฌ์šฉ

์ด๋ฒˆ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ์ฝ”๋“œ์ž‡ ์ธก์—์„œ ์ œ๊ณตํ•œ Swagger ๋ฌธ์„œ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•œ API๋ฅผ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. Swagger ๋ฌธ์„œ๋Š” ๋ช…์„ธ๊ฐ€ ์ž˜ ์ •๋ฆฌ๋˜์–ด ์žˆ์—ˆ๊ธฐ ๋•Œ๋ฌธ์—, ๋น ๋ฅด๊ฒŒ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋ฅผ ํŒŒ์•…ํ•˜๊ณ  ํ”„๋ก ํŠธ์—”๋“œ์—์„œ ํ•„์š”ํ•œ ์š”์ฒญ์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

๐Ÿงฉ ์ปดํฌ๋„ŒํŠธ ๊ตฌ์กฐ์™€ ์—ญํ•  ๋ถ„๋‹ด

ํ”„๋กœ์ ํŠธ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํŽ˜์ด์ง€ ๋‹จ์œ„๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์—ˆ์œผ๋ฉฐ, ๊ฐ๊ฐ์„ ์ปดํฌ๋„ŒํŠธ ์ค‘์‹ฌ์œผ๋กœ ๋ถ„ํ• ํ•˜์—ฌ ๊ฐœ๋ฐœํ–ˆ์Šต๋‹ˆ๋‹ค.

  • ๋ฉ”์ธ ํŽ˜์ด์ง€
  • ๋กœ๊ทธ์ธ/ํšŒ์›๊ฐ€์ž… ํŽ˜์ด์ง€
  • ์ฒดํ—˜ ์ƒ์„ธํŽ˜์ด์ง€
  • ๋‚ด ์ •๋ณด
  • ํ›„๊ธฐ ์ž‘์„ฑ
  • ์˜ˆ์•ฝ ๋‚ด์—ญ/๊ด€๋ฆฌ
  • ์ฒดํ—˜ ๋“ฑ๋ก/๊ด€๋ฆฌ/์ˆ˜์ •
  • ์˜ˆ์•ฝ ํ˜„ํ™ฉ

์ปดํฌ๋„ŒํŠธ๋Š” ์žฌ์‚ฌ์šฉ์„ฑ๊ณผ ์œ ์ง€๋ณด์ˆ˜์„ฑ์„ ๊ณ ๋ คํ•˜์—ฌ ๊ธฐ๋Šฅ ๋‹จ์œ„๋กœ ๋‚˜๋ˆ„์—ˆ์œผ๋ฉฐ, ๊ฐ ๊ธฐ๋Šฅ๋ณ„ ๋””๋ ‰ํ† ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ํ†ตํ•ด ํŒŒ์ผ ๊ด€๋ฆฌ๋ฅผ ์ฒด๊ณ„ํ™”ํ–ˆ์Šต๋‹ˆ๋‹ค.


๐ŸŽ“ ๋ฌธ์ œ ๋ฐ ํ•ด๊ฒฐ ๊ณผ์ •

๋ฌธ์ œ (1) - ์ฒดํ—˜ ์˜ˆ์•ฝ ํ๋ฆ„ ์„ค๊ณ„์˜ ๋ณต์žก์„ฑ

1. ๋ฌธ์ œ

์ฒดํ—˜ ์˜ˆ์•ฝ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๋ฉด์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ณตํ•ฉ์ ์ธ ์š”๊ตฌ์‚ฌํ•ญ์„ ๋งŒ์กฑ์‹œ์ผœ์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค:

  1. ์‚ฌ์šฉ์ž๊ฐ€ ๋‚ ์งœ, ์‹œ๊ฐ„, ์ธ์›์„ ์ž…๋ ฅํ•ด์•ผ๋งŒ ์˜ˆ์•ฝ ๊ฐ€๋Šฅํ•˜๋„๋ก ๊ตฌ์„ฑ
  2. PC, ํƒœ๋ธ”๋ฆฟ๊ณผ ๋ชจ๋ฐ”์ผ UI๋ฅผ ๋™์‹œ์— ๊ณ ๋ คํ•˜์—ฌ UX๋ฅผ ์„ค๊ณ„
  3. ์‚ฌ์šฉ์ž๊ฐ€ ์ด๋ฏธ ์˜ˆ์•ฝํ•œ ์‹œ๊ฐ„๋Œ€๋Š” ์˜ˆ์•ฝ ๋ถˆ๊ฐ€๋Šฅํ•ด์•ผ ํ•˜๋ฉฐ, ์ด๋ฅผ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ช…ํ™•ํžˆ ์•ˆ๋‚ดํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•จ

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

 

2. ํ•ด๊ฒฐ๋ฐฉ์‹

์˜ˆ์•ฝ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๋Š” ๊ณผ์ •์—์„œ, getAvailableSchedules()๋กœ ์ „์ฒด ์˜ˆ์•ฝ ๊ฐ€๋Šฅ ์‹œ๊ฐ„๋Œ€๋ฅผ ๊ฐ€์ ธ์˜ค๊ณ , fetchMyReservations()๋ฅผ ํ†ตํ•ด ์‚ฌ์šฉ์ž์˜ ๊ธฐ์กด ์˜ˆ์•ฝ ๋‚ด์—ญ๋„ ํ•จ๊ป˜ ๋ถˆ๋Ÿฌ์™”์Šต๋‹ˆ๋‹ค. ์ดํ›„ format๊ณผ filter๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋‘ ๋ฐ์ดํ„ฐ๋ฅผ ๋น„๊ตํ•˜๊ณ , ์ค‘๋ณต๋˜๋Š” ์‹œ๊ฐ„๋Œ€๋ฅผ ์ œ๊ฑฐํ•œ ๋’ค ์‹ค์ œ๋กœ ์˜ˆ์•ฝ ๊ฐ€๋Šฅํ•œ ์‹œ๊ฐ„๋งŒ UI์— ํ‘œ์‹œํ•˜๋ ค๊ณ  ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋น„๋™๊ธฐ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ์ˆœ์„œ ๋ฌธ์ œ์™€ ๋น„๊ต ๋กœ์ง์˜ ๋ณต์žก์„ฑ์œผ๋กœ ์ธํ•ด ํ•„ํ„ฐ๋ง์ด ์ •์ƒ์ ์œผ๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š์•˜๊ณ , ์›ํ•˜๋Š” ๋Œ€๋กœ UI์—์„œ ์‚ฌ์ „์— ์˜ˆ์•ฝ ๋ถˆ๊ฐ€ ์‹œ๊ฐ„์„ ์ œ๊ฑฐํ•˜๋Š” ๋ฐ์—๋Š” ์‹คํŒจํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด์— ๋”ฐ๋ผ ์‚ฌ์šฉ์ž๊ฐ€ ์ด๋ฏธ ์‹ ์ฒญํ•œ ์‹œ๊ฐ„๋Œ€๋ฅผ ์„ ํƒํ–ˆ์„ ๊ฒฝ์šฐ, ์˜ˆ์•ฝ ์‹œ๋„ ์‹œ์ ์—์„œ alert()์„ ํ†ตํ•ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ์•ˆ๋‚ด ๋ฉ”์‹œ์ง€๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๋Œ€์ฒดํ–ˆ์Šต๋‹ˆ๋‹ค.

 

๊ธฐ๋ณธ์ ์œผ๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ๋ฆ„์œผ๋กœ ์˜ˆ์•ฝ ๊ฐ€๋Šฅ ์‹œ๊ฐ„๋Œ€๋ฅผ ํ•„ํ„ฐ๋งํ•˜๋ ค๊ณ  ์‹œ๋„ํ–ˆ์Šต๋‹ˆ๋‹ค:

getAvailableSchedules()๋ฅผ ํ†ตํ•ด ์ „์ฒด ์˜ˆ์•ฝ ๊ฐ€๋Šฅ ์‹œ๊ฐ„๋Œ€๋ฅผ ๋ฐ›์•„์˜ค๊ณ , fetchMyReservations()๋ฅผ ํ†ตํ•ด ํ˜„์žฌ ์‚ฌ์šฉ์ž์˜ ์˜ˆ์•ฝ ๋‚ด์—ญ์„ ๋ฐ›์•„์™”์Šต๋‹ˆ๋‹ค. ์ดํ›„ ๋‘ ๋ฐ์ดํ„ฐ์…‹์„ format()๊ณผ filter() ๋“ฑ์„ ์‚ฌ์šฉํ•ด ๋‚ ์งœ ๋ฐ ์‹œ๊ฐ„ ํ˜•์‹์„ ๋งž์ถ”๊ณ , ์ค‘๋ณต๋œ ์‹œ๊ฐ„๋Œ€๋ฅผ ์ œ๊ฑฐํ•œ ๋ฆฌ์ŠคํŠธ๋ฅผ UI์— ํ‘œ์‹œํ•˜๋ ค๊ณ  ํ–ˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด ์ ‘๊ทผ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฌธ์ œ์ ์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค

  • ๋‘ ๋น„๋™๊ธฐ ์š”์ฒญ์˜ ์ˆœ์„œ๋ฅผ ๋ณด์žฅํ•˜์ง€ ์•Š์Œ: UI๊ฐ€ ๋จผ์ € ๋ Œ๋”๋ง๋˜๊ฑฐ๋‚˜, ํ•˜๋‚˜์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ๋Šฆ๊ฒŒ ๋„์ฐฉํ•˜๋ฉด์„œ null, undefined, ํ˜น์€ ๋นˆ ๋ฐฐ์—ด ์ƒํƒœ๋กœ ์ž˜๋ชป๋œ ํ•„ํ„ฐ๋ง์ด ์ผ์–ด๋‚จ
  • ํ˜•์‹ ๋ถˆ์ผ์น˜์™€ ๋น„๊ต ๋กœ์ง์˜ ๋ณต์žก์„ฑ: ์‹œ๊ฐ„ ์ •๋ณด๊ฐ€ ๋‹จ์ˆœ ๋ฌธ์ž์—ด์ด ์•„๋‹Œ startTime, endTime ์Œ์œผ๋กœ ์ œ๊ณต๋˜์–ด, ๋‘ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋น„๊ตํ•˜๋Š” ๋กœ์ง์ด ๋‹จ์ˆœํžˆ format()์ด๋‚˜ filter()๋งŒ์œผ๋กœ๋Š” ์•ˆ์ •์ ์œผ๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š์Œ

๊ฒฐ๊ณผ์ ์œผ๋กœ UI์—์„œ ์˜ˆ์•ฝ ๊ฐ€๋Šฅํ•œ ์‹œ๊ฐ„๋งŒ ๋ฏธ๋ฆฌ ์ œ๊ฑฐํ•˜๋Š” ๋ฐ ์‹คํŒจํ–ˆ์œผ๋ฉฐ, ๋Œ€์‹  ์‚ฌ์šฉ์ž๊ฐ€ ์ด๋ฏธ ์˜ˆ์•ฝํ•œ ์‹œ๊ฐ„๋Œ€๋ฅผ ์„ ํƒํ•  ๊ฒฝ์šฐ ์˜ˆ์•ฝ ์‹œ๋„ ์‹œ์ ์—์„œ alert()์œผ๋กœ ์•ˆ๋‚ดํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ œํ•œ์„ ๊ฑธ์–ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค.

 

3. ๊ฒฐ๊ณผ

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

 

→ ๊ฐœ์„  ๋ฐฉํ–ฅ

๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ตฌ์กฐ๋กœ ๊ฐœ์„ ํ•˜๋Š” ๊ฒƒ์ด ๋ฐ”๋žŒ์งํ•˜๋‹ค๊ณ  ํŒ๋‹จํ–ˆ์Šต๋‹ˆ๋‹ค:

  1. React Query์˜ ๋น„๋™๊ธฐ ํ๋ฆ„ ๊ด€๋ฆฌ ๊ธฐ๋Šฅ์„ ํ™œ์šฉ
    useQuery๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‘ API(getAvailableSchedules, fetchMyReservations)๋ฅผ ๊ฐ๊ฐ ๋…๋ฆฝ์ ์œผ๋กœ ํ˜ธ์ถœํ•˜๋˜, ๋‘ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ชจ๋‘ ์„ฑ๊ณต์ ์œผ๋กœ fetch๋˜์—ˆ์„ ๋•Œ์—๋งŒ ๋ Œ๋”๋ง ๋˜๋Š” ํ•„ํ„ฐ๋ง ๋กœ์ง์„ ์‹คํ–‰ํ•˜๋„๋ก ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.
  2. React Query์˜ ์บ์‹ฑ ๊ธฐ๋Šฅ ํ™œ์šฉ
    ๋™์ผํ•œ ์‚ฌ์šฉ์ž ํ˜น์€ ๋™์ผํ•œ ์›” ๊ธฐ์ค€์œผ๋กœ ๋ฐ˜๋ณตํ•ด์„œ ์˜ˆ์•ฝ ์ •๋ณด๋ฅผ ์š”์ฒญํ•˜๋Š” ๊ฒฝ์šฐ, React Query๊ฐ€ ๋‚ด๋ถ€์ ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์บ์‹ฑํ•˜๊ณ  ์žฌ์š”์ฒญ์„ ๋ฐฉ์ง€ํ•˜๊ฑฐ๋‚˜ ์ตœ์†Œํ™”ํ•˜์—ฌ ๋ถˆํ•„์š”ํ•œ ๋กœ๋”ฉ๊ณผ ์ค‘๋ณต ์š”์ฒญ์„ ์ค„์ผ ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.
  3. ๋‘ ๋ฐ์ดํ„ฐ์˜ ๊ตฌ์กฐ์  ์ฐจ์ด๋ฅผ ๋ช…ํ™•ํžˆ ๋ถ„์„ํ•˜๊ณ  ๋น„๊ต ๋กœ์ง์„ ๋ฆฌํŒฉํ† ๋ง
    ๋‹จ์ˆœํžˆ format()๊ณผ filter()๋กœ ๋น„๊ตํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ์˜ˆ์•ฝ ๊ฐ€๋Šฅ ์‹œ๊ฐ„์€ { date, times: [{ startTime, endTime }] } ๊ตฌ์กฐ, ๋‚ด ์˜ˆ์•ฝ ๋‚ด์—ญ์€ { date, startTime, endTime } ๊ตฌ์กฐ์ด๋ฏ€๋กœ ๋‚ ์งœ + ์‹œ๊ฐ„ ์กฐํ•ฉ์„ ๊ธฐ์ค€์œผ๋กœ ์ค‘์ฒฉ ๋ฃจํ”„ ํ˜น์€ ํ•ด์‹œ๋งต ๋“ฑ์œผ๋กœ ๋น„๊ตํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•ด ๋ณด๋Š” ๊ฒƒ๋„ ์ข‹์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ค‘์ฒฉ ๋ฃจํ”„๋Š” ๋‘ ๋ฐฐ์—ด์„ ๊ฐ๊ฐ ์ˆœํšŒํ•˜๋ฉด์„œ ํ•˜๋‚˜ํ•˜๋‚˜ ์ง์ ‘ ๋น„๊ตํ•˜๋Š” ๋ฐฉ์‹์ด๊ณ , ํ•ด์‹œ๋งต์€ ๋น„๊ต ๋Œ€์ƒ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์ „์— Map ํ˜•ํƒœ๋กœ ์ •๋ฆฌํ•ด๋‘๊ณ , ๋น ๋ฅด๊ฒŒ ์กฐํšŒํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ, ์ดˆ๊ธฐ์—๋Š” ์ค‘์ฒฉ ๋ฃจํ”„๋„ ๊ดœ์ฐฎ์ง€๋งŒ, ์กฐ๊ธˆ ๋ณต์žกํ•˜๋”๋ผ๋„ ํ•ด์‹œ๋งต์„ ์„ ํƒํ•˜์—ฌ ๋ฆฌํŒฉํ† ๋งํ•ด ๋ณด๋Š” ๊ฒƒ๋„ ์ข‹์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.
  4. ํ•„ํ„ฐ๋ง๋œ ๋ฐ์ดํ„ฐ๋งŒ AvailableTimes ์ปดํฌ๋„ŒํŠธ์— ์ „๋‹ฌ

 

๋ฌธ์ œ (2) - ํ›„๊ธฐ ๋ชฉ๋ก ๋กœ๋”ฉ ์„ฑ๋Šฅ ๋ฐ ํŽ˜์ด์ง€๋„ค์ด์…˜

1. ๋ฌธ์ œ

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

 

2. ํ•ด๊ฒฐ๋ฐฉ์‹

ํ›„๊ธฐ ๋ชฉ๋ก์€ ReviewList ์ปดํฌ๋„ŒํŠธ์—์„œ fetchReviews() API๋ฅผ ํ†ตํ•ด ํ˜„์žฌ ํŽ˜์ด์ง€ ๊ธฐ์ค€์˜ ๋ฐ์ดํ„ฐ๋งŒ ๊ฐ€์ ธ์˜ค๋„๋ก ๋ถ„๋ฆฌํ•˜์˜€์œผ๋ฉฐ, useState์™€ useEffect๋ฅผ ํ™œ์šฉํ•ด currentPage, totalPages, totalCount, averageRating ๋“ฑ์˜ ์ƒํƒœ๋ฅผ ๊ฐœ๋ณ„์ ์œผ๋กœ ๊ด€๋ฆฌํ•˜๋ฉด์„œ ํ›„๊ธฐ ๋ชฉ๋ก๊ณผ ๋ฉ”ํƒ€ ์ •๋ณด๋ฅผ ํ•จ๊ป˜ ๊ตฌ์„ฑํ•˜์˜€์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ, ์‚ฌ์šฉ์ž๊ฐ€ ์ง์ ‘ ํŽ˜์ด์ง€๋ฅผ ๋„˜๊ธธ ์ˆ˜ ์žˆ๋„๋ก ์ปค์Šคํ…€ Pagination ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋„์ž…ํ•ด UX๋ฅผ ๊ฐœ์„ ํ–ˆ๊ณ , ํ›„๊ธฐ ๊ฐœ์ˆ˜๊ฐ€ 3๊ฐœ ์ดํ•˜์ผ ๊ฒฝ์šฐ์—๋Š” Pagination์ด ๋ Œ๋”๋ง๋˜์ง€ ์•Š๋„๋ก ์กฐ๊ฑด๋ถ€ ์ฒ˜๋ฆฌ๋ฅผ ์ ์šฉํ•˜์—ฌ ๋ถˆํ•„์š”ํ•œ UI ๋…ธ์ถœ์„ ๋ฐฉ์ง€ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

 

3. ๊ฒฐ๊ณผ

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

 

๋ฌธ์ œ (3) - ์ด๋ฏธ์ง€ ๋ Œ๋”๋ง ๋‹ค์–‘์„ฑ ๋ฐ ํ™•๋Œ€ ๊ธฐ๋Šฅ

1. ๋ฌธ์ œ

์ฒดํ—˜์— ๋“ฑ๋ก๋œ ์ด๋ฏธ์ง€๊ฐ€ 1๊ฐœ ๋˜๋Š” ์—ฌ๋Ÿฌ ๊ฐœ์ธ ๊ฒฝ์šฐ ๋ ˆ์ด์•„์›ƒ์ด ๊นจ์ง€๊ฑฐ๋‚˜ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์ด ์ผ๊ด€๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋ฐ”์ผ์—์„œ๋Š” ์Šฌ๋ผ์ด๋” ๋ฐฉ์‹, ๋ฐ์Šคํฌํƒ‘์—์„œ๋Š” ์—ฌ๋Ÿฌ ์ด๋ฏธ์ง€ ๋ฐฐ์น˜๊ฐ€ ํ•„์š”ํ–ˆ์œผ๋ฉฐ, ์ด๋ฏธ์ง€ ํด๋ฆญ ์‹œ ํ™•๋Œ€ ๊ธฐ๋Šฅ๋„ ์š”๊ตฌ๋์Šต๋‹ˆ๋‹ค.

 

2. ํ•ด๊ฒฐ๋ฐฉ์‹

BannerImage ์ปดํฌ๋„ŒํŠธ์—์„œ ์ด๋ฏธ์ง€ ๊ฐœ์ˆ˜์— ๋”ฐ๋ผ ์„œ๋กœ ๋‹ค๋ฅธ ๋ ˆ์ด์•„์›ƒ์œผ๋กœ ์กฐ๊ฑด๋ถ€ ๋ Œ๋”๋ง์„ ์ ์šฉํ–ˆ๊ณ , ๋ชจ๋ฐ”์ผ์—์„œ๋Š” react-slick ๊ธฐ๋ฐ˜ ์Šฌ๋ผ์ด๋”๋ฅผ ์ ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ์ด๋ฏธ์ง€์—๋Š” ํด๋ฆญ ์‹œ ํ™•๋Œ€๋˜๋Š” ๋ชจ๋‹ฌ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜์—ฌ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ๊ฐœ์„ ํ–ˆ์Šต๋‹ˆ๋‹ค.

 

3. ๊ฒฐ๊ณผ

๋ชจ๋ฐ”์ผ๊ณผ ๋ฐ์Šคํฌํƒ‘ ๋ชจ๋‘์—์„œ ์ผ๊ด€๋œ UI๋ฅผ ์ œ๊ณตํ•˜๋ฉด์„œ ๋‹ค์–‘ํ•œ ์ด๋ฏธ์ง€ ํƒ์ƒ‰์ด ๊ฐ€๋Šฅํ•ด์กŒ๊ณ , ์‚ฌ์šฉ์ž๊ฐ€ ์ฒดํ—˜ ์ •๋ณด๋ฅผ ๋” ๊นŠ์ด ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋„๋ก ์‹œ๊ฐ์  ์ •๋ณด ์ „๋‹ฌ๋ ฅ์„ ๋†’์ผ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

 

→ ๊ฐœ์„  ๋ฐฉํ–ฅ : ํ™•๋Œ€ ๋ชจ๋‹ฌ์˜ ์ ‘๊ทผ์„ฑ ํ–ฅ์ƒ(ํ‚ค๋ณด๋“œ ์ ‘๊ทผ ๊ฐ€๋Šฅ ์—ฌ๋ถ€, ๋‹ซ๊ธฐ ๋ฒ„ํŠผ ์™ธ ํด๋ฆญ ์‹œ ๋‹ซ๊ธฐ ๋ฐฉ์ง€ ์ฒ˜๋ฆฌ ๋“ฑ)์„ ์ถ”๊ฐ€๋กœ ๊ณ ๋ คํ•  ์ˆ˜ ์žˆ์Œ.

 

๋ฌธ์ œ (4) - ์„œ๋ธŒ ์ด๋ฏธ์ง€ ๋ฐฐ์น˜ ๊ตฌ์กฐ์˜ ๋ฐ˜๋ณต์„ฑ๊ณผ ๋น„ํšจ์œจ์„ฑ

1. ๋ฌธ์ œ

์ฒดํ—˜ ์ƒ์„ธ ํŽ˜์ด์ง€์—์„œ ์„œ๋ธŒ ์ด๋ฏธ์ง€์˜ ์ˆ˜(1~4์žฅ)์— ๋”ฐ๋ผ ๊ฐ๊ธฐ ๋‹ค๋ฅธ ๋ ˆ์ด์•„์›ƒ์„ ์ ์šฉํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค.

์ด๋ฏธ์ง€๊ฐ€ 1๊ฐœ์ผ ๋• ์ „์ฒด ์˜์—ญ์— ๋‹จ์ผ ์ด๋ฏธ์ง€, 2๊ฐœ์ผ ๋• ์„ธ๋กœ๋กœ ๋ถ„ํ• , 3๊ฐœ์ผ ๋• ์ƒ๋‹จ 1 + ํ•˜๋‹จ 2, 4๊ฐœ์ผ ๋• 2x2 ํ˜•ํƒœ์˜ ์ •์‚ฌ๊ฐํ˜• ๊ฒฉ์ž ๋ ˆ์ด์•„์›ƒ์œผ๋กœ ๊ตฌ์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

 

2. ํ•ด๊ฒฐ๋ฐฉ์‹

SubImageBanner ์ปดํฌ๋„ŒํŠธ ๋‚ด๋ถ€์—์„œ ์ด๋ฏธ์ง€ ์ˆ˜๋ฅผ ๊ธฐ์ค€์œผ๋กœ if-else ์กฐ๊ฑด ๋ถ„๊ธฐ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ , ๊ฐ ์ผ€์ด์Šค๋งˆ๋‹ค div + Image ๊ตฌ์„ฑ์œผ๋กœ ๋‹ค๋ฅธ ๋ ˆ์ด์•„์›ƒ์„ ์ˆ˜๋™ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค. 2์žฅ, 4์žฅ ์ผ€์ด์Šค๋Š” for ๋ฌธ์œผ๋กœ ๋ฐ˜๋ณต ๋ Œ๋”๋ง์„ ๊ตฌํ˜„ํ–ˆ์œผ๋ฉฐ, 3์žฅ ์ผ€์ด์Šค๋Š” ๋ถ„ํ•  ๋ฐฉ์‹์ด ๋” ๋ณต์žกํ•ด ์ง์ ‘ ๋ฐฐ์น˜ ๊ตฌ์กฐ๋ฅผ ๋ช…์‹œํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด ๋กœ์ง์„ ๊ตฌํ˜„ํ•˜๋Š” ๊ณผ์ •์—์„œ if ์กฐ๊ฑด๊ณผ for ๋ฌธ์„ ๊ฐ ์ผ€์ด์Šค๋งˆ๋‹ค ๋ฐ˜๋ณต์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ตฌ์กฐ๊ฐ€ ๋งŒ๋“ค์–ด์กŒ๊ณ , ์ถ”ํ›„ ์ด๋ฏธ์ง€ ๋ฐฐ์น˜๊ฐ€ ๋ณ€๊ฒฝ๋  ๊ฒฝ์šฐ ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์–ด๋ ต๋‹ค๋Š” ํ•œ๊ณ„๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

 

3. ๊ฒฐ๊ณผ

๊ธฐํš๋œ ๋ชจ๋“  ์ด๋ฏธ์ง€ ์ผ€์ด์Šค๋ฅผ ์ •ํ™•ํžˆ ๊ตฌํ˜„ํ–ˆ๊ณ , ์‚ฌ์šฉ์ž๋Š” ์ด๋ฏธ์ง€ ์ˆ˜์— ๋”ฐ๋ผ ์‹œ๊ฐ์ ์œผ๋กœ ์•ˆ์ •์ ์ธ ์ฝ˜ํ…์ธ  ํƒ์ƒ‰์ด ๊ฐ€๋Šฅํ–ˆ์Šต๋‹ˆ๋‹ค. ํŠนํžˆ ๋ชจ๋ฐ”์ผ/PC์—์„œ๋„ ๋ฐ˜์‘ํ˜•์œผ๋กœ ์ž˜ ์ž‘๋™ํ–ˆ๊ณ , ํด๋ฆญ ์‹œ ํ™•๋Œ€ ๋ชจ๋‹ฌ๊นŒ์ง€ ์ œ๊ณตํ•˜๋ฉด์„œ ์ „๋ฐ˜์ ์ธ UX ์™„์„ฑ๋„๋Š” ๋†’์•˜์Šต๋‹ˆ๋‹ค.

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

 

→ ๊ฐœ์„  ๋ฐฉํ–ฅ

๋‹จ์ˆœํžˆ ๊ตฌํ˜„์„ ๋„˜์–ด์„œ ์žฌ์‚ฌ์šฉ์„ฑ๊ณผ ์œ ์ง€๋ณด์ˆ˜์„ฑ, ์ฝ”๋“œ ๊ตฌ์กฐ๋ฅผ ๊ณ ๋ คํ•œ ๊ฐœ์„ ์ด ํ•„์š”ํ•˜๋‹ค๊ณ  ํŒ๋‹จํ–ˆ์Šต๋‹ˆ๋‹ค.

 

  • Grid ๋˜๋Š” Flex ๊ธฐ๋ฐ˜์œผ๋กœ ๋ ˆ์ด์•„์›ƒ ๊ตฌ์„ฑ ๋‹จ์ˆœํ™”
    • ์ด๋ฏธ์ง€ ์ˆ˜์— ๋”ฐ๋ผ Grid์˜ grid-template-areas ๋˜๋Š” grid-auto-flow ์†์„ฑ์„ ์กฐ์ •ํ•ด ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋ผ ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์กฐ๊ฑด ๋ถ„๊ธฐ ์—†์ด๋„ ๋ฐ˜๋ณต์  ๊ตฌ์กฐ๋ฅผ ์„ ์–ธ์ ์œผ๋กœ ํ‘œํ˜„ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ํŠนํžˆ 2x2, 1+2 ํ˜•ํƒœ๋Š” Grid์—์„œ ์‰ฝ๊ฒŒ ์ฒ˜๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
  • map ๊ธฐ๋ฐ˜ ๋ฐ˜๋ณต ๋ Œ๋”๋ง ์ ์šฉ
    • ํ˜„์žฌ๋Š” for ๋ฌธ๊ณผ ํ•˜๋“œ์ฝ”๋”ฉ๋œ ์ฝ”๋“œ๊ฐ€ ํ˜ผํ•ฉ๋˜์–ด ์žˆ๋Š”๋ฐ, ์ด๋ฅผ map์œผ๋กœ ์ถ”์ƒํ™”ํ•˜๋ฉด ๋” ๊ฐ„๊ฒฐํ•˜๊ณ  ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ๊ตฌ์กฐ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

 

 

๋ฌธ์ œ (5) - ์นด์นด์˜ค ์ง€๋„ ๊ตฌํ˜„๊ณผ ๋ฆฌ์•กํŠธ ๋ฒ„์ „ ์ถฉ๋Œ

1. ๋ฌธ์ œ

์ฒดํ—˜ ์ƒ์„ธ ํŽ˜์ด์ง€์—์„œ ์œ„์น˜ ์ •๋ณด๋ฅผ ์‹œ๊ฐ์ ์œผ๋กœ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•ด ์นด์นด์˜ค ์ง€๋„ API๋ฅผ ์ ์šฉํ•˜๋ ค ํ–ˆ์œผ๋‚˜, react-kakao-maps-sdk ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ React 18 ์ด์ƒ๊ณผ ํ˜ธํ™˜๋˜์ง€ ์•Š์•„ ๋ Œ๋”๋ง ์˜ค๋ฅ˜์™€ ํƒ€์ž… ์ถฉ๋Œ์ด ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.

 

2. ํ•ด๊ฒฐ๋ฐฉ์‹

๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์‚ฌ์šฉ ๋Œ€์‹  ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋™์ ์œผ๋กœ ์‚ฝ์ž…ํ•ด ์นด์นด์˜ค ์ง€๋„ SDK๋ฅผ ๋กœ๋“œํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ „ํ™˜ํ–ˆ์Šต๋‹ˆ๋‹ค. useEffect ๋‚ด๋ถ€์—์„œ window.kakao.maps.load()๋ฅผ ์‚ฌ์šฉํ•ด ์ง€๋„ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ์ฃผ์†Œ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ขŒํ‘œ ๋ณ€ํ™˜ ํ›„ ๋งˆ์ปค๋ฅผ ํ‘œ์‹œํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ง์ ‘ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค.

 

3. ๊ฒฐ๊ณผ

React ๋ฒ„์ „ ์ด์Šˆ๋ฅผ ํ•ด๊ฒฐํ•˜๋ฉด์„œ๋„ ์•ˆ์ •์ ์ธ ์ง€๋„ ๋ Œ๋”๋ง์ด ๊ฐ€๋Šฅํ•ด์กŒ๊ณ , ๋ถˆํ•„์š”ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์˜์กด์„ฑ์„ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž์—๊ฒŒ ์ฒดํ—˜ ์œ„์น˜๋ฅผ ์‹œ๊ฐ์ ์œผ๋กœ ๋ณด์—ฌ์ฃผ๋ฉฐ ์ •๋ณด ์ „๋‹ฌ๋ ฅ์„ ๋†’์ด๋Š” ๋ฐ ๊ธฐ์—ฌํ–ˆ์Šต๋‹ˆ๋‹ค.

 


๐ŸŽ“ ๋ฐฐ์šด ์ /๋А๋‚€ ์ 

1. ์˜ˆ์•ฝ ๊ธฐ๋Šฅ ํ๋ฆ„์˜ UX ์„ค๊ณ„์™€ ์ƒํƒœ ์—ฐ๊ฒฐ ๊ฒฝํ—˜

์‚ฌ์šฉ์ž๊ฐ€ ๋‚ ์งœ → ์‹œ๊ฐ„ → ์ธ์› ์ˆ˜ → ์˜ˆ์•ฝ๊นŒ์ง€ ๋‹จ๊ณ„์ ์œผ๋กœ ์ง„ํ–‰ํ•˜๋Š” ํ๋ฆ„์„ ๊ตฌํ˜„ํ•˜๋ฉด์„œ, ๊ฐ ์ƒํƒœ ๊ฐ„์˜ ์—ฐ๊ฒฐ์„ฑ๊ณผ UI ๋ฐ˜์‘ ์†๋„๋ฅผ ์กฐ์œจํ•˜๋Š” ๊ฒƒ์ด ์–ผ๋งˆ๋‚˜ ์ค‘์š”ํ•œ์ง€๋ฅผ ์‹ค๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ๊ณ ๋ คํ•ด ์กฐ๊ฑด๋ถ€ ๋ Œ๋”๋ง ๋ฐ ๋ชจ๋‹ฌ ์ปดํฌ๋„ŒํŠธ ๋ถ„๋ฆฌ ๋“ฑ์„ ์ ์šฉํ•˜๋ฉฐ, UX ์ค‘์‹ฌ์˜ ๋กœ์ง ๊ตฌ์„ฑ ๋ฐฉ์‹์— ์ต์ˆ™ํ•ด์กŒ์Šต๋‹ˆ๋‹ค.

 

2. React Query ์‹ค์ „ ์ ์šฉ ๊ฒฝํ—˜

์˜ˆ์•ฝ ๊ฐ€๋Šฅ ์‹œ๊ฐ„๊ณผ ์‚ฌ์šฉ์ž ์˜ˆ์•ฝ ๋‚ด์—ญ์„ ๋ณ‘๋ ฌ์ ์œผ๋กœ ๋น„๋™๊ธฐ ํ˜ธ์ถœํ•˜๊ณ , ์ด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ Œ๋”๋ง์„ ๊ตฌ์„ฑํ•˜๋Š” ๊ณผ์ •์—์„œ React Query์˜ ์บ์‹ฑ ๋ฐ ์ƒํƒœ ๊ด€๋ฆฌ ๋Šฅ๋ ฅ์„ ์‹ค๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค. ํ•ด๋‹น ํ๋ฆ„์€ ํŒ€์›์˜ ๋„์›€์„ ๋ฐ›์•„ ๊ตฌํ˜„ํ–ˆ์œผ๋‚˜, ์ดํ›„ ๋น„๋™๊ธฐ ๋ฐ์ดํ„ฐ ํ๋ฆ„์˜ ์„ค๊ณ„ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ํฐ ์ธ์‚ฌ์ดํŠธ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

 

 

3. ๋™์  ์ง€๋„ ๋ฐ ์บ˜๋ฆฐ๋” ๊ตฌํ˜„์„ ํ†ตํ•œ ์™ธ๋ถ€ ๋„๊ตฌ ํ™œ์šฉ ๋Šฅ๋ ฅ ํ–ฅ์ƒ

์ฒดํ—˜ ์ƒ์„ธ ํŽ˜์ด์ง€์—์„œ ์‚ฌ์šฉ์ž๊ฐ€ ์œ„์น˜๋ฅผ ์ง๊ด€์ ์œผ๋กœ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋„๋ก ์นด์นด์˜ค ์ง€๋„๋ฅผ ๋„์ž…ํ–ˆ๋Š”๋ฐ, ๊ธฐ์กด react-kakao-maps-sdk ์‚ฌ์šฉ ์‹œ React 18๊ณผ์˜ ํ˜ธํ™˜์„ฑ ๋ฌธ์ œ๋กœ ์ธํ•ด ์ง์ ‘ script ํƒœ๊ทธ๋ฅผ ํ†ตํ•ด SDK๋ฅผ ๋™์ ์œผ๋กœ ๋กœ๋“œํ•˜๊ณ  useEffect ๋‚ด์—์„œ ์•ˆ์ „ํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ „ํ™˜ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์˜ˆ์•ฝ ๊ฐ€๋Šฅํ•œ ๋‚ ์งœ๋ฅผ ํ‘œ์‹œํ•˜๊ธฐ ์œ„ํ•ด react-calendar ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํ™œ์šฉํ–ˆ๊ณ , ์˜ˆ์•ฝ ๊ฐ€๋Šฅ ์—ฌ๋ถ€์— ๋”ฐ๋ผ ๋‚ ์งœ ์„ ํƒ UI๊ฐ€ ๋‹ฌ๋ผ์ง€๋„๋ก ์ปค์Šคํ„ฐ๋งˆ์ด์ง•ํ•˜์—ฌ ์‹ค์šฉ์ ์ธ ์บ˜๋ฆฐ๋” UI๋ฅผ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค. ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์žฅ์ ๊ณผ ํ•œ๊ณ„๋ฅผ ๋ชจ๋‘ ๊ฒฝํ—˜ํ•˜๋ฉด์„œ, ์ƒํ™ฉ์— ๋”ฐ๋ผ ์ ์ ˆํ•œ ๊ตฌํ˜„ ๋ฐฉ์‹์„ ์„ ํƒํ•˜๋Š” ๊ฐ๊ฐ๋„ ํ•จ๊ป˜ ์ตํž ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

 


๐Ÿ˜ข ์•„์‰ฌ์šด ์ 

1. React Query์— ๋Œ€ํ•œ ๋ฏธ์ˆ™ํ•จ

์ƒํƒœ ์บ์‹ฑ๊ณผ ๋ณ‘๋ ฌ ๋น„๋™๊ธฐ ํ˜ธ์ถœ์— ๊ฐ•๋ ฅํ•œ React Query์˜ ์žฅ์ ์„ ์ฒด๊ฐํ–ˆ์ง€๋งŒ, ์‚ฌ์šฉ ๊ฒฝํ—˜์ด ๋ถ€์กฑํ•ด ์ง์ ‘ ํ™œ์šฉ๋ณด๋‹ค๋Š” ํŒ€์›์˜ ๊ตฌํ˜„์„ ์ฐธ๊ณ ํ•˜๋Š” ๋ฐ์— ๊ทธ์ณค์Šต๋‹ˆ๋‹ค. ์ดํ›„์—๋Š” ์Šค์Šค๋กœ ์ƒํƒœ ๊ด€๋ฆฌ ํ๋ฆ„์„ ์„ค๊ณ„ํ•˜๊ณ  React Query๋ฅผ ์ ๊ทน ํ™œ์šฉํ•ด๋ณด๊ณ ์ž ํ•ฉ๋‹ˆ๋‹ค.

 

2. ์ด๋ฏธ์ง€ ๋ ˆ์ด์•„์›ƒ ์กฐ๊ฑด ์ฒ˜๋ฆฌ์˜ ์•„์‰ฌ์›€

์„œ๋ธŒ ์ด๋ฏธ์ง€๊ฐ€ 1~4์žฅ์ผ ๊ฒฝ์šฐ ๋ฐฐ์น˜ ๋ฐฉ์‹์ด ๋‹ฌ๋ผ์ง€๋„๋ก ์กฐ๊ฑด ๋ถ„๊ธฐ๋ฅผ ์ ์šฉํ–ˆ์ง€๋งŒ, ์ด๋ฅผ ๋ชจ๋‘ for๋ฌธ๊ณผ ๋ถ„๊ธฐ ์ฒ˜๋ฆฌ๋กœ ๊ตฌ์„ฑํ•˜๋ฉด์„œ ์ฝ”๋“œ๊ฐ€ ์žฅํ™ฉํ•ด์กŒ์Šต๋‹ˆ๋‹ค. ๋ฐ˜๋ณต๋˜๋Š” ์กฐ๊ฑด ์ฒ˜๋ฆฌ๋ณด๋‹ค๋Š” ์ข€ ๋” ์„ ์–ธ์ ์ด๊ณ  ์œ ์—ฐํ•œ ๋ฐฉ์‹์œผ๋กœ ๋ฆฌํŒฉํ„ฐ๋งํ•  ์—ฌ์ง€๊ฐ€ ์žˆ์—ˆ๊ณ , ์ดํ›„ ์œ ์ง€๋ณด์ˆ˜ ์ธก๋ฉด์—์„œ๋„ ๋‹ค์†Œ ๋ณต์žกํ•œ ๊ตฌ์กฐ๊ฐ€ ๋œ ์ ์ด ์•„์‰ฌ์› ์Šต๋‹ˆ๋‹ค.

 

3. ์˜ˆ์•ฝ ์‹œ๊ฐ„ ํ•„ํ„ฐ๋ง์˜ ๋ฐ˜์˜ ์‹คํŒจ

์‚ฌ์šฉ์ž๊ฐ€ ์ด๋ฏธ ์˜ˆ์•ฝํ•œ ์‹œ๊ฐ„๋Œ€๋ฅผ ์‚ฌ์ „์— ์ œ๊ฑฐํ•˜๋ ค๊ณ  ํ–ˆ์ง€๋งŒ ์‹คํŒจํ–ˆ๊ณ  ๊ฒฐ๊ตญ ์˜ˆ์•ฝ ์‹œ๋„ ์‹œ์ ์— alert๋กœ ์•ˆ๋‚ดํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ดˆ๊ธฐ ๊ธฐํš ๋‹จ๊ณ„์—์„œ API ํ๋ฆ„๊ณผ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋ฅผ ๋” ๋ช…ํ™•ํžˆ ํŒŒ์•…ํ–ˆ๋”๋ผ๋ฉด UI ๋‹จ๊ณ„์—์„œ ์™„์„ฑ๋„ ๋†’์€ ๊ฒฐ๊ณผ๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์—ˆ์„ ๊ฒƒ์ด๋ผ๋Š” ์•„์‰ฌ์›€์ด ๋‚จ์Šต๋‹ˆ๋‹ค.

 

4. ํŒ€์› ์ดํƒˆ๋กœ ์ธํ•œ ์ผ์ • ์ง€์—ฐ

ํ”„๋กœ์ ํŠธ ํ›„๋ฐ˜๋ถ€, ํ•œ ํŒ€์›๊ณผ์˜ ์—ฐ๋ฝ์ด ๊ฐ‘์ž๊ธฐ ์–ด๋ ค์›Œ์ ธ ํ•ด๋‹น ํŒŒํŠธ์˜ ์ง„ํ–‰์ด ์ผ์‹œ์ ์œผ๋กœ ์ง€์—ฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ตฌํ˜„ ์ž์ฒด๊ฐ€ ๋ณต์žกํ•œ ๋ถ€๋ถ„์€ ์•„๋‹ˆ์—ˆ์ง€๋งŒ, ํŒ€์›์˜ ๋ณต๊ท€๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๋™์•ˆ ์ผ์ •์ด ์กฐ๊ธˆ ๋Šฆ์ถฐ์กŒ์ง€๋งŒ, ๋‹คํ–‰ํžˆ ์ž˜ ๋งˆ๋ฌด๋ฆฌ ํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์ „์— ํ๋ฆ„์— ๋Œ€ํ•œ ๊ณต์œ ๊ฐ€ ์–ด๋А ์ •๋„ ์ด๋ฃจ์–ด์กŒ๊ธฐ ๋•Œ๋ฌธ์— ํฐ ๋ฌธ์ œ ์—†์ด ๋งˆ๋ฌด๋ฆฌํ•  ์ˆ˜ ์žˆ์—ˆ์ง€๋งŒ, ์ผ์ • ๋ฆฌ์Šคํฌ๋ฅผ ์ค„์ด๊ธฐ ์œ„ํ•œ ์‚ฌ์ „ ๊ณต์œ ์™€ ๋ฐฑ์—… ์ฒด๊ณ„์˜ ์ค‘์š”์„ฑ์„ ์ฒด๊ฐํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.