๐ŸŠ JejuMonth ํ”„๋กœ์ ํŠธ ํšŒ๊ณ 

jadeยท2025๋…„ 2์›” 10์ผ
0

์•ฝ 5์ฃผ๊ฐ„ ์ง„ํ–‰ํ–ˆ๋˜ ํ”„๋กœ์ ํŠธ์˜ ๋ฐฐํฌ์™€ ๋ฐœํ‘œ๊ฐ€ ๋งˆ๋ฌด๋ฆฌ ๋˜์—ˆ๋‹ค.
์•„์ง ๊ณ ์น ์ ์ด ๋งŽ์ด ๋ณด์ด๋Š” ํ”„๋กœ์ ํŠธ ์ด์ง€๋งŒ ์ž ์‹œ ์‰ผํ‘œ๋ฅผ ์ฐ๊ณ  ๋‹ค์‹œ ๋‚˜์•„๊ฐ€์ž๋Š” ์˜๋ฏธ์—์„œ ํšŒ๊ณ ๋กœ ๊ธฐ๋กํ•ด๋ณด์ž.

ํ”„๋กœ์ ํŠธ ๊ฒฐ๊ณผ๋ฌผ jeju month ๋ณด๋Ÿฌ๊ฐ€๊ธฐ jejumonth-github


ํ”„๋กœ์ ํŠธ ์ค€๋น„

์—ฌํ–‰ ์„œ๋น„์Šค

์ด๋ฒˆ ํ”„๋กœ์ ํŠธ์˜ ์š”๊ตฌ์‚ฌํ•ญ์€ ๊ธฐ๋ณธ์ ์ธ ์ปค๋ฎค๋‹ˆํ‹ฐ, ์œ ์ €๊ธฐ๋Šฅ, ์†Œ์…œ ์„œ๋น„์Šค๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๋ฉด์„œ open api๋ฅผ ํ™œ์šฉํ•˜๋Š” ๊ฒƒ์ด์˜€๋‹ค. ์—ฌ๊ธฐ์„œ open api๋ผ๋Š” ๊ฒƒ์˜ ๋ฒ”์œ„๊ฐ€ ๋งค์šฐ ๋„“์—ˆ๋Š”๋ฐ ์ฒซ์ฃผ๋Š” ๊ฐ์ž ํฅ๋ฏธ๋กœ์šด ์ปจํ…์ธ ๋ฅผ ์ œ๊ณตํ•˜๋Š” open api๋ฅผ ์กฐ์‚ฌํ•ด๋ณด์•˜๋‹ค.

๋“ฑ์‚ฐ, ์ž์ „๊ฑฐ๋Œ€์—ฌ ์„œ๋น„์Šค, ์ œ์ฃผ๋„ ์—ฌํ–‰ ์„œ๋น„์Šค, ๋„์„œ์„œ๋น„์Šค๋“ฑ ๋‹ค์–‘ํ•œ ์˜๊ฒฌ๋“ค์ด ๋งŽ์ด ๋„์ถœ๋˜์—ˆ๋‹ค. ํŒ€ ํšŒ์˜์—์„œ ์‚ฌ์šฉํ•  api๋ฅผ ๊ณ ๋ฅด๋ฉด์„œ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์„œ๋น„์Šค์ฃผ์ œ์— ๊ด€ํ•ด ํ† ์˜ํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค. ์šฐ๋ฆฌํŒ€์—์„œ๋Š” open api์—์„œ ์ œ๊ณตํ•˜๋Š” ๋ฐ์ดํ„ฐ์— ์‚ฌ์ง„์ด ๋“ค์–ด๊ฐ€ ์žˆ์„ ๊ฒƒ, ๋‹ค์–‘ํ•œ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•ด ์ค„๊ฒƒ, ์ด๋ฏธ ๋งŒ๋“ค์–ด์ง„ ์„œ๋น„์Šค๋ฅผ ์นดํ”ผํ•˜์ง€ ์•Š๊ณ  ์šฐ๋ฆฌํŒ€๋งŒ์˜ ๊ณ ์œ  ๊ธฐ๋Šฅ์„ ๋„ฃ์„ ๊ฒƒ๋“ฑ์„ ๊ณ ๋ คํ•ด์„œ ์ œ์ฃผ๋„์ฒญ์—์„œ ์ œ๊ณตํ•˜๋Š” visit jeju api๋ฅผ ํ™œ์šฉํ•˜๊ธฐ๋กœํ•˜์˜€๋‹ค.

Jeju month

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

์ฃผ์š” ๊ธฐ๋Šฅ๋“ค๋กœ๋Š” ์—ฌํ–‰ ์ปค๋ฎค๋‹ˆํ‹ฐ, ์—ฌํ–‰ ๊ณ„ํš ์ž‘์„ฑ ๋ฐ ๋ณด๊ธฐ, ์—ฌํ–‰ ์žฅ์†Œ ๊ฒ€์ƒ‰ ๋ฐ ์Šคํฌ๋žฉ๋“ฑ์ด ์žˆ๋‹ค.

๊ธฐํš ๋ฐ ๋””์ž์ธ

๊ธฐํš๊ณผ ๋””์ž์ธ ๋‹จ๊ณ„์—์„œ ๋‹ค์–‘ํ•œ ํˆด์„ ์‚ฌ์šฉํ•ด๋ณธ ํ”„๋กœ์ ํŠธ์ด๋‹ค.
๊ธฐํš ๋ช…์„ธ์„œ ์ž‘์„ฑ์„ ์œ„ํ•ด notion, IA์™€ ์™€์ด์–ดํ”„๋ ˆ์ž„ ์ž‘์„ฑ์„ ์œ„ํ•ด miro, ๋””์ž์ธ ์‹œ์•ˆ ์ž‘์„ฑ์„ ์œ„ํ•ดfigma๋ฅผ ํ™œ์šฉํ•˜์˜€๋‹ค.

๋ฌธ์„œํ™”

ํŒ€์žฅ๋‹˜์„ ์ œ์™ธํ•œ ๋‹ค๋ฅธ ํŒ€์›๋ถ„๋“ค์˜ ํ˜‘์—… ๊ฒฝํ—˜์ด ์ ์–ด์„œ ์ฝ”๋“œ ์ปจ๋ฒค์…˜, ๋ฌธ์„œํ™” ๋ฐฉ๋ฒ•๋“ฑ์„ ๋ฏธ๋ฆฌ ์ •๋ฆฌํ•ด๊ฐ€๊ณ  ํŒ€์›๋“ค์˜ ์˜๊ฒฌ์— ๋งž๊ฒŒ ์ˆ˜์ •ํ•ด๊ฐ€๋Š” ๋ฐฉ์‹์œผ๋กœ ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ–ˆ๋‹ค.(ํ•ด๋‹น ๋‚ด์šฉ์€ ํŒ€์œ„ํ‚ค์— ์ •๋ฆฌ๋˜์–ด ์žˆ๋‹ค.)

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

ํ”„๋กœ์ ํŠธ ์‹œ์ž‘

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

๋จผ์ € vite๊ธฐ๋ฐ˜์œผ๋กœ ํ”„๋กœ์ ํŠธ๋ฅผ ์„ธํŒ…ํ•˜๊ณ  tailwind, antd์™€ ๊ฐ™์€ ํ•„์š”ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์„ค์ •์„ ํ•œ๋’ค eslint(air-bnb style), prettier๋ฅผ ์„ค์น˜ํ•ด์„œ ํŒ€์›๋ชจ๋‘๊ฐ€ ๋™์ผํ•œ ์ฝ”๋“œ ์Šคํƒ€์ผ์„ ๊ฐ€์ง€๋„๋ก ํ•˜์˜€๋‹ค. ์ด์–ด์„œ react-query, redux, react-router๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ ํ”„๋กœ๋ฐ”์ด๋”๋ฅผ ์—ฐ๊ฒฐํ•ด์ฃผ์—ˆ๋‹ค.

ํ•ด๋‹น ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ์ค‘๊ฐ„์— ์ง„ํ–‰ํ•˜๊ธด ํ–ˆ์ง€๋งŒ vite-javascript ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ์ƒ๋Œ€๊ฒฝ๋กœ ๋Œ€์‹  ์ ˆ๋Œ€๊ฒฝ๋กœ๋กœ ํŒŒ์ผ์„ ์ž„ํฌํŠธ ํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ค์ •ํ•˜๋Š” ๊ฒƒ์„ ๋ฏธ๋ฆฌ ๊ถŒํ•œ๋‹ค.

// vite.config.js
export default defineConfig({
  plugins: [react()],
  resolve: {
    alias: [
      { find: '@', replacement: '/src' },
      { find: '@public', replacement: '/public' },
      { find: '@pages', replacement: '/src/pages' },
      { find: '@components', replacement: '/src/components' },
    ],
  },
});

๋˜ํ•œ tailwind๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด tailwindcss-preset-px-to-rem๋ฅผ ์‚ฌ์šฉํ•ด์„œ pxr ๋‹จ์œ„๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ์ถ”์ฒœํ•œ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด figma์ƒ์—์„œ ๊ตฌํ˜„๋œ px๋‹จ์œ„๋ฅผ ๊ฐœ๋ฐœ์‹œ์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์‹ค์ œ ๋ธŒ๋ผ์šฐ์ €์—์„œ๋Š” Rem๋‹จ์œ„๋กœ ์ ์šฉ๋˜์–ด ๋งค์šฐ ํŽธ๋ฆฌํ•˜๋‹ค.

์‚ฌ์ง„์€ ํ•ด๋‹น ๊ธฐ๋Šฅ์„ ๋„์ž…ํ•˜์—ฌ ์˜ฌ๋ฆฐ pr ๋‚ด์šฉ์ด๋‹ค..

Keep, Problem, Try

KEEP : ์ž˜ํ–ˆ๋˜ ์ , ์•ž์œผ๋กœ์˜ ํ”„๋กœ์ ํŠธ์—๋„ ์œ ์ง€ํ•ด์•ผํ•  ์‚ฌํ•ญ

1๏ธโƒฃ ๋‚ด ์ฝ”๋“œ ๋ฟ ์•„๋‹ˆ๋ผ ์˜ฌ๋ผ์˜จ PR์„ ๋ชจ๋‘ ํ™•์ธํ•˜๊ณ  ์ ๊ทน์ ์œผ๋กœ ์ฝ”๋“œ๋ฆฌ๋ทฐ๋ฅผ ํ•˜๋ ค๊ณ  ๋…ธ๋ ฅํ–ˆ๋˜ ์ .

๋‚ด ์ฝ”๋“œ ๋ฟ ์•„๋‹ˆ๋ผ ๋™๋ฃŒ์˜ ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด ๋‹ค์–‘ํ•œ ๊ตฌํ˜„๋ฐฉ์‹์— ๋Œ€ํ•ด์„œ ์•Œ๊ฒŒ๋œ๋‹ค. ๋Œ€ํ‘œ์ ์œผ๋กœ ์—ฌ๋Ÿฌ api๋ฅผ ์ˆœ์ฐจ์ ์œผ๋กœ ๊ฐ€์ ธ์™€์•ผํ•  ๋•Œ ์‚ฌ๋žŒ๋งˆ๋‹ค ๊ตฌํ˜„๋ฐฉ์‹์ด ๋‹ฌ๋ผ์„œ ์–ด๋–ค ๋ฐฉ๋ฒ•์ด ์ข‹์€์ง€ ๊ณ ๋ฏผํ•ด๋ณด๋Š” ๊ณ„๊ธฐ๊ฐ€ ๋˜์—ˆ๋‹ค.

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

๋ฆฌ๋ทฐ๋ฅผ ํ•˜๋ฉด ์‹œ์•ผ๋ฅผ ํ”„๋กœ์ ํŠธ ์ „์ฒด๋กœ ๋„“๊ฒŒ ๊ฐ€์ง€๊ฒŒ ๋œ๋‹ค. ์ฃผ์„์„ ํ†ตํ•ด ์–ด๋–ค ๊ณ ๋ฏผ์„ ํ•˜๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ๊ณ , ํŠน์ • ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋‚ด๊ฐ€ ๋‹ด๋‹นํ•œ ํŽ˜์ด์ง€ ๋ฟ์•„๋‹ˆ๋ผ ๋‹ค๋ฅธ ํŽ˜์ด์ง€์—์„œ๋„ ๋ฐ˜๋ณต์ ์œผ๋กœ ์“ฐ์ธ๋‹ค๋ฉด ๊ณตํ†ต ์ปดํฌ๋„ŒํŠธ๋กœ ๋งŒ๋“ค์ˆ˜๋„ ์žˆ๋‹ค.

2๏ธโƒฃ ๊ณต์‹๋ฌธ์„œ๋กœ ์ง€์‹์„ ์Œ“์•˜๋˜ ์ .

์ด์ „์—๋Š” ๋‚จ์ด ์†Œํ™”ํ•œ ์ง€์‹์„ ๋ณด๋Š” ๋ธ”๋กœ๊ทธ์— ๋จผ์ € ์†์ด ๊ฐ”๋‹ค๋ฉด,ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋ฉด์„œ Axios, Redux, Tanstack-query์˜ ๊ณต์‹๋ฌธ์„œ๋ฅผ ์ฝ๊ณ  ๋‚˜์˜ ์ง€์‹์œผ๋กœ ์†Œํ™”ํ•˜๋ ค๋Š” ๋…ธ๋ ฅ์„ ๊ธฐ์šธ์˜€๋‹ค.

์ด๋Š” ๊ณผ์ •์ค‘์—์„œ ์ง„ํ–‰ํ•œ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ์Šคํ„ฐ๋””, ๋ฆฌ์•กํŠธ ๊ณต์‹๋ฌธ์„œ ์Šคํ„ฐ๋””์˜ ์˜ํ–ฅ์ด ์ปธ๋‹ค๊ณ  ์ƒ๊ฐํ•œ๋‹ค. ์ข€๋” ์–ด๋ ค์šด ๊ธ€์„ ์ฝ์œผ๋ ค๊ณ  ์‹œ๋„ํ•˜๋‹ˆ ์ฝ๊ธฐ๋Šฅ๋ ฅ์ด ๋” ํ–ฅ์ƒ๋œ ๊ฒƒ๊ฐ™๊ณ , ํŠนํžˆ ๊ณต์‹๋ฌธ์„œ์—์„œ ์„ค๋ช…ํ•˜๋Š” ์˜์–ด๋‹จ์–ด๋กœ ์ตํ˜”์„ ๋•Œ ์ง๊ด€์ ์œผ๋กœ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ์ ๋“ค์ด ์žˆ์–ด์„œ ์ด์ œ๋Š” ๊ณต์‹๋ฌธ์„œ๋ฅผ ๋จผ์ € ์ฐพ์•„๋ณด๋Š” ์Šต๊ด€์ด ๋“ค์—ˆ๋‹ค. ํ˜น์—ฌ ์ง€์‹์„ ์™„๋ฒฝํ•˜๊ฒŒ ์•”๊ธฐํ•˜๊ณ  ์žˆ์ง€ ์•Š๋”๋ผ๋„ 'ํ•ด๋‹น ๊ฐœ๋…์ด ์—ฌ๊ธฐ ์žˆ์—ˆ์ง€'๋ผ๊ณ  ๋– ์˜ค๋ฅด๋ฉด ์ฐพ์•„์„œ ์ฝ๊ณ  ๋‹ค์‹œ ์ฐพ์•„๋ณด๋Š” ํšŸ์ˆ˜๊ฐ€ ํ˜„์ €ํžˆ ์ค„์–ด๋“ค๊ฒŒ ๋˜์—ˆ๋‹ค.

3๏ธโƒฃ ํ”„๋กœ์ ํŠธ ์ค‘๊ฐ„๋งˆ๋‹ค ๋ฆฌํŒฉํ† ๋ง์„ ์ง„ํ–‰ํ–ˆ๋˜ ์ .

์•„์ฃผ ์—ฌ์œ ์žˆ์ง€๋Š” ์•Š์•˜์ง€๋งŒ, ๋นˆ ์‹œ๊ฐ„์ด ์ƒ๊ธธ ๋•Œ๋งˆ๋‹ค ์ด์ „ ์ฝ”๋“œ๋ฅผ ๋ณต๊ธฐํ•˜๊ณ  ๊ฐœ์„ ์ ์„ ์ฐพ์œผ๋ ค๊ณ  ๋…ธ๋ ธํ–ˆ๋‹ค. ํŠนํžˆ ์ด๋ฒˆํ”„๋กœ์ ํŠธ๋Š” ํ˜ผ์žํ•˜๋Š” ํ”„๋กœ์ ํŠธ๊ฐ€ ์•„๋‹ˆ์˜€๊ธฐ ๋•Œ๋ฌธ์— ํƒ€์ธ๋„ ์ดํ•ดํ•˜๊ธฐ ์‰ฌ์šด ์ฝ”๋“œ๋ฅผ ์งœ์•ผ๊ฒ ๋‹ค๋Š” ๋ชฉํ‘œ๊ฐ€ ์žˆ์—ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค๋ฉด, ์—ฌํ–‰ ๊ณ„ํš์„ ๋“ฑ๋กํ•˜๋Š” ๊ณผ์ •์„ ๋ฉ€ํ‹ฐ์Šคํ…ํผ์œผ๋กœ ๊ตฌํ˜„ํ•˜๋ฉด์„œ ๋‹ค๋ฅธ ๋™๋ฃŒ๋“ค์ด ๋ณด์•˜์„ ๋•Œ์—๋„, ์ถ”๊ฐ€ ์„ค๋ช…์—†์ด ์ฝ”๋“œ๋งŒ์œผ๋กœ ๋“ฑ๋ก๊ณผ์ •์ด ์ดํ•ด๋ฌ์œผ๋ฉด ํ•˜๋Š” ๋ฐ”๋žจ์ด ์žˆ์—ˆ๋‹ค.์—ฌ๊ธฐ์„œ ํ† ์Šค์˜ useFunnel ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๊ตฌํ˜„๊ณผ์ •์„ ์„ค๋ช…ํ•˜๋Š” ์˜์ƒ์„ ์ ‘ํ•˜๊ฒŒ ๋˜์—ˆ๊ณ  ์ด๋ฅผ ํ•ด๋‹น ํ”„๋กœ์ ํŠธ์—์„œ๋„ ์ ์šฉํ•ด๋ณด์•˜๋‹ค.ํŽ˜์ด์ง€๋ฅผ ๋„˜๋‚˜๋“ค๋ฉฐ ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๋ฐฉ์‹๋Œ€์‹  ํ•˜๋‚˜์˜ ํŽ˜์ด์ง€์—์„œ ๊ฐ ๋‹จ๊ณ„์˜ ํ๋ฆ„์„ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜์˜€๋‹ค.
onNext, onSkip, onBack์„ ํ†ตํ•ด ๊ฐ๋‹จ๊ณ„์˜ ์ด์ „๋‹จ๊ณ„๋Š” ๋ฌด์—‡์ธ์ง€, skip์‹œ ์–ด๋””๋กœ ์ด๋™ํ•˜๋Š”์ง€๋ฅผ ํ•œ๋ˆˆ์— ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ๋‹ค.

 return (
    <div>
      {step === 'SEARCH' && (
        <Search
          onBackClick={handleBackClick}
          onNext={data => {
            // "์žฅ์†Œ ์ด๋ฏธ์ง€ "ํด๋ฆญ์‹œ
            setDetail(data);
            setStep('DETAIL');
          }}
          onSkipDetail={data => {
            // "์„ ํƒ"๋ฒ„ํŠผ ํด๋ฆญ์‹œ
            setRegisterData(prev => ({ ...prev, ...data }));
            setStep('TIME');
          }}
        />
      )}

      {step === 'DETAIL' && (
        <Details
          onBackClick={() => {
            setStep('SEARCH');
            setDetail('');
          }}
          onNext={data => {
            // ์ผ์ • ์ƒ์„ฑ ํด๋ฆญ์‹œ
            setRegisterData(prev => ({ ...prev, ...data }));
            setStep('TIME');
          }}
        />
      )}

      {step === 'TIME' && (
        <div className=" h-full">
          <RegisterDayAndTime {...RegisterTimeProps} />
        </div>
      )}
    </div>
  );
};

problem : ์•„์‰ฌ์› ๋˜ ์ , ์•ž์œผ๋กœ ๊ฐœ์„ ํ•ด์•ผํ•  ์‚ฌํ•ญ

1๏ธโƒฃ bottom up ๊ฐœ๋ฐœ์˜ ์ค‘์š”์„ฑ

ํŽ˜์ด์ง€ ๋ผ์šฐํ„ฐ, api์—”๋“œํฌ์ธํŠธ๋ฅผ ๊ฐ์ฒด์ƒ์ˆ˜๋กœ ๊ด€๋ฆฌํ•ด์•ผ๊ฒ ๋‹ค๋Š” ์ƒ๊ฐ์ด ์žˆ์—ˆ๋Š”๋ฐ ์ด๋ฅผ ์ข€๋” ๋นจ๋ฆฌ ํ”„๋กœ์ ํŠธ์— ๋„์ž…ํ•˜์ง€ ๋ชปํ–ˆ๋‹ค. ๊ฒฐ๊ตญ ๋งˆ์ง€๋ง‰ ์ฃผ์ฐจ์— ๋ชฐ์•„์„œ ์ •๋ฆฌ๋ฅผ ํ•˜๊ฒŒ ๋˜์—ˆ๋Š”๋ฐ ํ”„๋กœ์ ํŠธ ์ดˆ๋ฐ˜๋ถ€ํ„ฐ ๋ฏธ๋ฆฌ ์ •ํ•˜๊ณ  ๊ฐ”๋”๋ผ๋ฉด ํ›„๋ฐ˜์— ๋‹ค์‹œ ์ฝ”๋“œ๋ฅผ ์ •๋ฆฌํ•˜๋Š” ์ž‘์—…์„ ํ•˜์ง€ ์•Š์•„๋„ ๋˜์—ˆ์„๊ฒƒ ๊ฐ™๋‹ค.
ํ•ด๋‹น ๊ณผ์ •์„ ์–ด๋–ป๊ฒŒ ์ •๋ฆฌํ•˜๊ณ ์ž ํ•˜์˜€๋Š”์ง€๋Š” qeury key ๊ตฌ์กฐํ™” ๊ณผ์ •๊ณผ ํ•จ๊ป˜ ํฌ์ŠคํŒ…ํ•  ์˜ˆ์ •์ด๋‹ค!

2๏ธโƒฃ ๊ธฐํš, ์„ค๊ณ„์˜ ์ค‘์š”์„ฑ

๊ธฐํš์€ ๋งค์šฐ๋งค์šฐ ์ค‘์š”ํ•˜๋‹ค. ํ”„๋กœ์ ํŠธ ์ „์ฒด์˜ ์ฒญ์‚ฌ์ง„์„ ๊ทธ๋ฆฌ๊ณ , ์šฐ๋ฆฌ ์„œ๋น„์Šค๊ฐ€ ํ•ด๊ฒฐํ•ด์•ผํ•  ๋ฌธ์ œ๋ฅผ ์ •์˜ํ•˜๊ณ , ์‚ฌ์šฉ์ž์—๊ฒŒ ์–ด๋–ค ๋ฐ์ดํ„ฐ๋ฅผ ์–ด๋–ป๊ฒŒ ๋ณด์—ฌ์ค„์ง€๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ๊ณผ์ •์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

์ด๋ฒˆ ํ”„๋กœ์ ํŠธ์—์„œ ๊ธฐํš๋‹จ๊ณ„์—์„œ ๋†“์นœ ๋ถ€๋ถ„ ๋‘๊ฐ€์ง€๊ฐ€ ์žˆ์—ˆ๋‹ค.
1. ๋ฐ์Šคํฌํƒ‘ view์™€ ๋ชจ๋ฐ”์ผ view์— ์–ด์šธ๋ฆฌ๋Š” UI๋Š” ๋”ฐ๋กœ์žˆ๋‹ค.
์—ฌํ–‰๊ณ„ํš ์ƒ์„ฑ์‹œ ๊ฒ€์ƒ‰์ฐฝ์„ ๋ชจ๋ฐ”์ผ ๋ทฐ ์Šค๋Ÿฝ๊ฒŒ ๋””์ž์ธํ–ˆ๋‹ค๋Š” ํ”ผ๋“œ๋ฐฑ์ด ์žˆ์—ˆ๋‹ค. ๋ ˆํผ๋Ÿฐ์Šคํ•œ ์„œ๋น„์Šค์˜ ๋””์ž์ธ์„ ๊ทธ๋Œ€๋กœ ๊ฐ€์ ธ์˜จ๊ฒƒ์ธ๋ฐ, ์ด๋Š” ๋ชจ๋ฐ”์ผํ™”๋ฉด์— ๋งž๋Š” Ui์˜€๋‹ค.
2. open api๋ฅผ ์„ ํƒํ•  ๋•Œ๋Š” ํ’ํ‘ธํ•œ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์„ ์„ ํƒํ•˜์ž.
๋น„์ง“์ œ์ฃผ API์˜ ์žฅ์ ์€ ์ผ๊ด€๋œ ๋ฐ์ดํ„ฐ๋กœ ์ƒ๋žต๋˜๋Š” ํ•„๋“œ๊ฐ’์ด ์ ๋‹ค๋Š” ์ . ๊ณ ํ™”์งˆ์˜ ์‚ฌ์ง„์„ ์ œ๊ณตํ•œ๋‹ค๋Š” ์ ์ด์˜€๋‹ค. ๋‹ค๋งŒ ํ•ด๋‹น ๊ด€๊ด‘์ง€์— ๋Œ€ํ•œ ์ƒ์„ธ์ •๋ณด๊ฐ€ description ํ•„๋“œ๋กœ๋งŒ ์˜ค๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค๋ฅธ ํŒ€๋“ค์— ๋น„ํ•ด ์ƒ์„ธํŽ˜์ด์ง€๊ฐ€ ๋นˆ์•ฝํ•ด๋ณด์ด๋Š” ๋‹จ์ ์ด ์žˆ์—ˆ๋‹ค.

๋‹ค์Œ ํ”„๋กœ์ ํŠธ์—์„œ open api๋ฅผ ์„ ํƒํ•˜๊ฒŒ ๋œ๋‹ค๋ฉด ๋ณด๋‹ค ์ถฉ๋ถ„ํ•œ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์„ ์„ ํƒํ•ด์•ผ๊ฒ ๊ณ , ํƒ€๊นƒ ๋””๋ฐ”์ด์Šค์— ๋งž๋Š” ํ™”๋ฉด์„ ๋””์ž์ธํ•ด์•ผ๊ฒ ๋‹ค๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ๋‹ค.

try : ๋‹ค์Œ ํ”„๋กœ์ ํŠธ์— ์ ์šฉํ•ด๋ณผ Action Item

1๏ธโƒฃ ๊ธฐ์ˆ ์ ์œผ๋กœ ๋„์ „ํ•˜๊ธฐ

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

2๏ธโƒฃ ๊ฐ์ •์ ์œผ๋กœ ๊ณต๊ฐํ•˜๋ฉฐ ์ปค๋ฎค๋‹ˆ์ผ€์ด์…˜ํ•˜๊ธฐ

๋‚˜๋Š” ๋Œ€๋ฌธ์ž T ์„ฑํ–ฅ์ด๋ผ ์ƒ๋Œ€๋ฐฉ์„ ๋…ผ๋ฆฌ์ ์œผ๋กœ ์„ค๋“์‹œํ‚ค๊ฒ ๋‹ค๋Š” ๋งˆ์Œ์ด ์•ž์„œ ๋™๋ฃŒ์˜ ๋งˆ์Œ์„ ๋จผ์ € ํ—ค์•„๋ฆฌ์ง€ ๋ชปํ•  ๋•Œ๊ฐ€ ๋งŽ๋‹ค. ์ด๋Ÿฐ ๋‹จ์ ์„ ์•Œ๊ธฐ์— ๋‚˜๋„ ์˜์‹์ ์œผ๋กœ ๋…์„ฑ๋งํˆฌ๋ฅผ ์ง€์–‘ํ•˜๋ ค๊ณ  ๋…ธ๋ ฅํ•˜๊ณ ์žˆ๋‹ค.

์ด๋ฒˆ ํ”„๋กœ์ ํŠธ์—์„œ ํŒ€์žฅ๋‹˜์˜ ์ปค๋ฎค๋‹ˆ์ผ€์ด์…˜ ๋ฐฉ๋ฒ•์ด ๋‚˜์™€ ๋‹ฌ๋ผ์„œ ๋งŽ์ด ๋ฐฐ์› ๋‹ค. ํ”„๋กœ์ ํŠธ ์ดˆ๋ฐ˜์—๋Š” axios ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜์ง€ ์•Š๊ณ  ์ƒ(?)์œผ๋กœ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์—ˆ๋Š”๋ฐ ์—ฌ๋Ÿฌ ์š”๊ตฌ์‚ฌํ•ญ์ด ์ถ”๊ฐ€๋˜๋ฉด์„œ axios์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์ธํ„ฐ์…‰ํ„ฐ๋กœ ์—๋Ÿฌ๋ฅผ ํ•ธ๋“ค๋งํ•˜๋Š”๊ฒƒ์ด ์ข‹๊ฒ ๋‹ค๋Š” ์˜๊ฒฌ์„ ํŒ€์—๊ฒŒ ์–ดํ•„ํ–ˆ์—ˆ๋‹ค. ํ•˜์ง€๋งŒ api ์—ฐ๊ฒฐ์ด ํ™œ๋ฐœํ•˜๊ฒŒ ์ง„ํ–‰๋˜๋˜ํ„ฐ๋ผ ํ•ด๋‹น๊ธฐ๋Šฅ์„ ๋ฐ”๋กœ ์ถ”๊ฐ€ํ•˜๋ฉด ์ถฉ๋Œ์ด ๋งŽ์ด ๋ฐœ์ƒํ• ๊ฒƒ ๊ฐ™๋‹ค๋Š” ํŒ€์žฅ๋‹˜์˜ ์˜๊ฒฌ์ด ์žˆ์–ด์„œ ๋‹ค๋ฅธ ๋™๋ฃŒ๋“ค์ด ๊ธฐ๋Šฅ์„ ์™„์„ฑํ• ๋•Œ๊นŒ์ง€ ๋ณด๋ฅ˜ํ•˜๋ฉด ์–ด๋–ป๊ฒ ๋ƒ๋Š” ํ”ผ๋“œ๋ฐฑ์„ ๋ฐ›๊ฒŒ๋˜์—ˆ๋‹ค. ์‚ฌ์‹ค ์†์œผ๋กœ๋Š” ์ธ์Šคํ„ด์Šค ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ •๋„์˜ ๋ณ€๊ฒฝ์ด ์ถฉ๋Œ์„ ๊ณ ๋ คํ•ด์•ผ๋˜๋Š” ๊ฒƒ์ธ์ง€ ํฌ๊ฒŒ ๋‚ฉ๋“๋˜์ง€๋Š” ์•Š์•˜์ง€๋งŒ '์ •์ˆ˜๋‹˜์ด ํ•˜๊ณ  ์‹ถ์œผ์‹ ๊ฒŒ ๋Š๊ปด์ ธ์š” ์ดํ•ด๋˜์š”'ํ•œ๋งˆ๋””์— ์ž์—ฐ์Šค๋ ˆ ์˜๊ฒฌ์„ ๊ตฝํžˆ๊ฒŒ๋˜์—ˆ๋‹ค. ์ƒ๋Œ€๋ฅผ ์„ค๋“ํ•˜๋Š” ๊ฒƒ์€ ๋…ผ๋ฆฌ์ ์ธ ์„ค๋ช… ๋ฟ์•„๋‹ˆ๋ผ ์ƒ๋Œ€์˜ ๋งˆ์Œ์„ ํ—ค์•„๋ฆฌ๋Š” ๊ฒƒ๋„ ๊ณ ๋ คํ•ด์•ผ ํ•œ๋‹ค๋Š” ์ ์„ ์•Œ๊ฒŒ๋˜์—ˆ๋‹ค.

3๏ธโƒฃ ๋งŽ์€ ์‚ฌ๋žŒ์—๊ฒŒ ํ”ผ๋“œ๋ฐฑ ๋ฐ›๊ธฐ

๊ฐ•์‚ฌ๋‹˜๊ณผ ๋ฉ˜ํ† ๋‹˜๊ป˜ ์—ฌ๋Ÿฌ๋ฒˆ ํ”ผ๋“œ๋ฐฑ ๋ฐ›์œผ๋ฉฐ ๋ฏธ์ฒ˜ ์ƒ๊ฐ์น˜ ๋ชปํ•œ ๋ถ€๋ถ„์—์„œ ๊ฐœ์„ ํ•ด์•ผํ•  ์ ์„ ์ฐพ๊ฒŒ๋˜์—ˆ๊ณ , UX ๊ด€์ ์—์„œ ๋ฌด์—‡์„ ์‹ ๊ฒฝ์จ์•ผํ•˜๋Š”์ง€ ์•Œ๊ฒŒ๋˜์—ˆ๋‹ค.

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

profile
keep on pushing

0๊ฐœ์˜ ๋Œ“๊ธ€

๊ด€๋ จ ์ฑ„์šฉ ์ •๋ณด