project : Chap-Chap

55555-Jyeonยท2024๋…„ 2์›” 6์ผ
1

Memoirs

๋ชฉ๋ก ๋ณด๊ธฐ
2/7
post-thumbnail
post-custom-banner

Chap-Chap(์ฑฑ์ฑฑ)์€ mobithon ๊ธฐ๊ฐ„์— ์ง„ํ–‰ํ•œ ํ† ์ด ํ”„๋กœ์ ํŠธ๋กœ, open API๋ฅผ ํ™œ์šฉํ•ด ๋ ˆ์‹œํ”ผ๋ฅผ ๊ฒ€์ƒ‰ํ•˜๊ณ  ์Šคํฌ๋žฉํ•  ์ˆ˜ ์žˆ๋Š” ์‚ฌ์ดํŠธ์ž…๋‹ˆ๋‹ค.

  • ํ”„๋กœ์ ํŠธ ์ง„ํ–‰ ๊ธฐ๊ฐ„ : 2024.01.19 ~ 2024.01.28
  • ๋ฆฌํŒฉํ„ฐ๋ง ๊ธฐ๊ฐ„ : 2024.01.30 ~ 2024.02.01

์•ฝ 10์ผ๋™์•ˆ ์ง„ํ–‰๋œ ํ”„๋กœ์ ํŠธ Chap-Chap์„ ํ†ตํ•ด ์ œ๊ฐ€ ํ™•์‹คํžˆ ์–ป๊ณ  ์‹ถ์—ˆ๋˜ ํฌ์ธํŠธ๋Š” ๋‘ ๊ฐ€์ง€์˜€์Šต๋‹ˆ๋‹ค.

  1. ์ด์ „ ํ”„๋กœ์ ํŠธ์—์„œ ์—‰์„ฑํ–ˆ๋˜ ํ˜‘์—…์„ ๋‹ค์ง€๊ธฐ
  2. ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ์™€ ์นœํ•ด์ง€๊ธฐ

์ด์ „ ํ”„๋กœ์ ํŠธ MMM์—์„œ ๋ณด์™„์ด ์‹œ๊ธ‰ํ–ˆ๋˜ ํ˜‘์—…๊ณผ ์ €๋ฒˆ ์ฃผ์— ์ฒ˜์Œ ์ ‘ํ•œ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ์˜ ์‚ฌ์šฉ์ด์—ˆ์Šต๋‹ˆ๋‹ค.
ํ˜‘์—…์˜ ํ•„์š”์„ฑ์€ ์ด์ „ ํšŒ๊ณ ์—์„œ ์ ˆ์‹คํžˆ ๋Š๊ผˆ๋˜ ๋ถ€๋ถ„์ด๊ณ , ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋Š” ๋‹ค์Œ ์ฃผ์— Next.js์™€ ํ•จ๊ป˜ ์‚ฌ์šฉ์„ ํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์นœํ•ด์งˆ ํ•„์š”๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
์ฃผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ํƒ€์ž…๋“ค์„ ๊ฐ„๋‹จํ•œ ์˜ˆ์‹œ์™€ ํ•จ๊ป˜ ๋ณผ ๋• ์ดํ•ด๋„ ์ž˜ ๋˜๋Š” ๊ฒƒ ๊ฐ™๊ณ  ๋‹น์žฅ ์‚ฌ์šฉํ•˜๊ธฐ ๊ดœ์ฐฎ์€ ๊ฒƒ ๊ฐ™์ง€๋งŒ ๋ง‰์ƒ ๊ฐ„๋‹จํ•œ ํšŒ์›๊ฐ€์ž…/๋กœ๊ทธ์ธ ํผ(form)์— ์ ์šฉํ•˜๋ ค๊ณ ๋งŒ ํ•ด๋„ ๊ธˆ๋ฐฉ ๋ง‰์—ฐํ•˜๊ฒŒ ๋Š๊ปด์กŒ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ด๋ฒˆ ํ† ์ด ํ”„๋กœ์ ํŠธ๋ฅผ ํ†ตํ•ด ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ์™€ ์กฐ๊ธˆ ๋” ์นœํ•ด์ง€๋Š” ๊ฒƒ์ด ๋‘ ๋ฒˆ์งธ ๋ชฉํ‘œ์˜€์Šต๋‹ˆ๋‹ค.


์—ญํ•  ๋ถ„๋‹ด์€ planning-poker(ํ”Œ๋ž˜๋‹ ํฌ์ปค) ๋ฐฉ์‹์œผ๋กœ ์ง„ํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค.
ํ”Œ๋ž˜๋‹ ํฌ์ปค๋กœ ๋‹ด๋‹น์ž๋ฅผ ์ •ํ•ด ๊ฐ์ž ๋งก์€ ํŽ˜์ด์ง€๋ฅผ ์ง„ํ–‰ํ•˜์ง€๋งŒ blocking์ด ์˜ค๋ž˜ ์ง€์†๋˜๋Š” ๊ฒฝ์šฐ ํ•จ๊ป˜ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค.

ํ”Œ๋ž˜๋‹ ํฌ์ปค, ํ˜น์€ ์Šคํฌ๋Ÿผ ํฌ์ปค๋Š” ๊ทธ๋ฃน ๊ตฌ์„ฑ์›๋“ค์ด ํ…Œ์ด๋ธ” ์œ„์— ์ˆซ์ž๊ฐ€ ์ ํžŒ ์นด๋“œ๋ฅผ ๋’ค์ง‘์–ด ๋†“๊ณ  ๋™์‹œ์— ์นด๋“œ๋ฅผ ๋’ค์ง‘์–ด ๋…ธ๋™์‹œ๊ฐ„์„ ๊ณ„์‚ฐํ•˜๋Š” ๋…ธ๋™์‹œ๊ฐ„ ๊ณ„์‚ฐ๋ฒ• ์ค‘ ํ•˜๋‚˜ ์ž…๋‹ˆ๋‹ค. James Grenning์ด ์ฐฝ์•ˆํ–ˆ์œผ๋ฉฐ ์• ์ž์ผ ๊ฐœ๋ฐœ ์ด๋ก ์— ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

์ €ํฌ๋Š” ๊ฒ€์ƒ‰ํ–ˆ์„ ๋•Œ ๋‚˜์˜ค๋Š” ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜์—ด์˜ ์นด๋“œ๋ฅผ ๊ฐ€์ง€๊ณ  ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์•„๋‹Œ,
"๋‚ด๊ฐ€ ์ด ํŽ˜์ด์ง€๋ฅผ ์ง„ํ–‰ํ•œ๋‹ค๋ฉด ์–ด๋Š ์ •๋„์˜ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆด ๊ฒƒ์ธ๊ฐ€, ๋‚˜์—๊ฒ ์–ด๋–ค ๋‚œ์ด๋„์ธ๊ฐ€"๋ฅผ ๋‘๊ณ  ํฌ์ปค๋ฅผ ์ง„ํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค.
๋ฐฐํŒ…์€ 1~100๊นŒ์ง€ ๊ฐ€๋Šฅํ•˜๋ฉฐ ๊ฐ€์žฅ ์ ๊ฒŒ ๋ฐฐํŒ…ํ•œ ์‚ฌ๋žŒ์ด ํ•ด๋‹น ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๋‹จ, ๋‹ค์Œ ํ”„๋กœ์ ํŠธ์˜ ๋‹ด๋‹น์ž๋ฅผ ์ •ํ•  ๋•Œ๋Š” ๋ˆ„์ ์œผ๋กœ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค.

์–ผ๋งˆ๋‚˜ ๊ฑธ๋ฆด์ง€ TypeScript + tailwindCSS ๋ฅผ ์ฒ˜์Œ ์ ์šฉํ•ด๋ณด๋Š” ํ”„๋กœ์ ํŠธ์ด๊ธฐ์— ์ •ํ™•ํ•œ ๋ฐฐํŒ…์„ ํ•˜๊ธฐ ์–ด๋ ค์› ๊ธฐ์— ํŠน๋ณ„ํžˆ ๋งŽ์ด ์ฐจ์ด๊ฐ€ ๋‚˜์ง€ ์•Š๋Š” ๋ถ€๋ถ„์€ ํ•ด๋‹น ํŒŒํŠธ๋ฅผ ๊ฒฝํ—˜ํ•ด๋ณด์ง€ ์•Š์€ ํŒ€์›์—๊ฒŒ ๋ฐฐ๋‹นํ–ˆ์Šต๋‹ˆ๋‹ค.


Designing... ๐ŸŽจ

์•„๋ž˜์™€ ๊ฐ™์ด BDD(Given-When-Then)๋กœ ๊ธฐํš์„ ํ•œ ํ›„ ์ด๋ฅผ ํ† ๋Œ€๋กœ ๋””์ž์ธ์„ ์ง„ํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค.

์‹์š•์„ ๋‹์šธ ์ˆ˜ ์žˆ๋Š” ๋‚œ์ƒ‰๋“ค ์ค‘ ๋…ธ๋ž€์ƒ‰์„ main-color๋กœ ์„ค์ •ํ•ด ์ง„ํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค.
๋””์ž์ธ์€ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ์™€ ํ˜ธํ™˜์„ฑ์ด ์ข‹์€ tailwind-css๋ฅผ ์‚ฌ์šฉํ–ˆ๊ณ  ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์ ๊ทน ํ™œ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.

Auth ๊ด€๋ จ ๋กœ์ง์€ Kimi ๋‹˜์ด ๋งก์€ ํŒŒํŠธ์˜€์Šต๋‹ˆ๋‹ค. ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋ง‰ ๋ฐฐ์šฐ๊ณ  ์ฒ˜์Œ ์ œ๋Œ€๋กœ ํ™œ์šฉํ•˜๋Š” ์ƒํƒœ์—์„œ ๋ณต์žกํ•œ(๋‚œํ•ดํ•œ?) ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ํ•˜๊ฒŒ ๋˜์–ด ๋งŽ์€ ์–ด๋ ค์›€์„ ๊ฒช์—ˆ๋Š”๋ฐ ๋๊นŒ์ง€ ํฌ๊ธฐํ•˜์ง€ ์•Š๊ณ  ์ง„ํ–‰ํ•ด์ฃผ์…”์„œ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค :)

์•ฝ ์ดํ‹€๋™์•ˆ ํผ๋ธ”๋ฆฌ์‹ฑ ๊ณผ์ •์„ ๋๋‚ด๊ณ  ๊ฐœ๋ฐœ์— ๋“ค์–ด๊ฐ”์Šต๋‹ˆ๋‹ค.



Developing... ๐Ÿ’ป

์–ด๋–ป๊ฒŒ ํ•˜๋ฉด ์—์ž์ผํ•ด์งˆ ์ˆ˜ ์žˆ์„๊นŒ?

ํ˜‘์—…ํˆด ์‚ฌ์šฉํ•˜๊ธฐ : Linear

Linear๋ฅผ ์‚ฌ์šฉํ•ด backlog๋ฅผ ์ƒ์„ฑํ•ด ๋งก์€ ํŒŒํŠธ๋ฅผ ํ• ๋‹นํ–ˆ์Šต๋‹ˆ๋‹ค.
์•„๋ž˜์™€ ๊ฐ™์ด My issues๋ฅผ ํ†ตํ•ด ๋‚ด task๋“ค์„ ์ง„ํ–‰ ๊ณผ์ •์œผ๋กœ ๋‚˜๋ˆ  ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ํŒ€์›๋“ค์˜ ์ง„ํ–‰ ์ •๋„๋„ ๋ณผ ์ˆ˜ ์žˆ๊ณ  ์ „์ฒด ์ง„ํ–‰ ํผ์„ผํŠธ ํ™•์ธ๋„ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
๋ฌด์—‡๋ณด๋‹ค gitHub์˜ repository์™€ ์—ฐ๋™ํ•  ์ˆ˜ ์žˆ์–ด ์ž๋™์œผ๋กœ backlog์˜ ์ƒํƒœ๊ฐ€ ๋ณ€๊ฒฝ๋ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ ๋ธŒ๋žœ์น˜์˜ ์ด๋ฆ„์„ ์ •ํ•  ์‹œ๊ฐ„์„ ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค :)
MMM ๋•Œ ๋ฆฌํŒฉํ„ฐ๋ง๊นŒ์ง€ ์ง„ํ–‰ํ•˜๋‹ค๋ณด๋ฉด branch ์ด๋ฆ„์— '/'(์Šฌ๋ž˜์‹œ)๊ฐ€ ๋„ˆ๋ฌด ๋งŽ์ด ๋“ค์–ด๊ฐ€
๊ธธ์–ด์ง€๊ณ  ์ปจ๋ฒค์…˜์— ๋งž์ง€ ์•Š๊ฒŒ ์ƒ์„ฑ๋˜๋Š” ๊ฒฝ์šฐ๋„ ์žˆ์—ˆ๋Š”๋ฐ ์ด ๊ฒฝ์šฐ๋Š” ํ”„๋กœ์ ํŠธ ์ด๋ฆ„์„ ํ† ๋Œ€๋กœ ์ž๋™ ์ƒ์„ฑํ•ด์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ์œ„์™€ ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.


daily-scrum์€ git issue๋กœ

์ฒ˜์Œ์—๋Š” Jira๋กœ ๋ฐ์ผ๋ฆฌ์Šคํฌ๋Ÿผ์„ ์“ฐ๋ฉด์„œ ์ง„ํ–‰์„ ํ–ˆ๋Š”๋ฐ ์ข€ ๋ถˆํŽธํ–ˆ์Šต๋‹ˆ๋‹ค.

์ƒˆ๋กœ์šด ์‚ฌ์ดํŠธ๋ฅผ ๋“ค์–ด๊ฐ€ ์ž‘์„ฑํ•˜๊ณ  git์„ pull ๋ฐ›์•„ ์ง„ํ–‰ํ•˜๋Š” ๊ณผ์ •์ด ๋ฒˆ๊ฑฐ๋กญ๊ฒŒ ๋Š๊ปด์กŒ๊ณ , Jira๋Š” Linear์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ํˆด์ด๊ธฐ ๋•Œ๋ฌธ์— ๋‘ ๊ฐœ๋ฅผ ๋™์‹œ์— ์‚ฌ์šฉํ•˜๊ธฐ๋ณด๋‹ค๋Š” ๋‘˜ ์ค‘ ํ•˜๋‚˜๋ฅผ ํƒํ•ด ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ผ๋ฐ˜์ ์ด๋ผ๋Š” ํ”ผ๋“œ๋ฐฑ๋„ ๋ฐ›์•˜์Šต๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ git issue์— label์„ ํ™œ์šฉํ•ด ๋ฐ์ผ๋ฆฌ์Šคํฌ๋Ÿผ์„ ์“ฐ๊ธฐ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค.
์ด๋ ‡๊ฒŒ ์ง„ํ–‰ํ•˜๋‹ˆ ํ™•์‹คํžˆ ๋‹ค๋ฅธ ํŒ€์›์˜ todolist๋„ ๋ฐ”๋กœ๋ฐ”๋กœ ํ™•์ธํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

git issue์—์„œ ์•„๋ž˜์™€ ๊ฐ™์ด ๋‚˜๋ˆ„๊ณ  ์‹ถ์€ ์˜๊ฒฌ์ด๋‚˜ blocking๋œ ๋ถ€๋ถ„ ๊ณต์œ ๋„ ํ•˜๊ณ  ์žˆ์—ˆ๊ธฐ์— ์ด์ „๋ณด๋‹ค ๋น ๋ฅด๊ฒŒ follow-up์ด ๊ฐ€๋Šฅํ•ด์กŒ์Šต๋‹ˆ๋‹ค.

๋‚˜์•„๊ฐ€ blocking ๋˜์–ด PR์„ ๋ชปํ•˜๊ฒŒ ๋  ๊ฒฝ์šฐ 1์ผ 1commit ๊ทœ์น™์„ ์ง€ํ‚ค์ง€ ๋ชปํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๋ถ€๋‹ด์„ issue ๋“ฑ๋ก์„ ํ†ตํ•ด ์™„ํ™”ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์žฅ์ ๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

โœ”๏ธ issue ์ƒ์„ฑ ์‹œ commit ์ˆ˜๊ฐ€ ๋Š˜์–ด๋‚ฉ๋‹ˆ๋‹ค.


PR Template๋กœ ์ƒ์„ธํ•œ ์ฝ”๋“œ ์„ค๋ช…๊ณผ ๊ผผ๊ผผํ•œ ์ฝ”๋“œ ๋ฆฌ๋ทฐ

์ €ํฌ๋Š” ์•„๋ž˜์™€ ๊ฐ™์€ template์„ ์ ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.
๋จผ์ € ๊ฐ„๋žตํžˆ ์ „์ฒด์ ์ธ PR์˜ ๋‚ด์šฉ์„ ์š”์•ฝํ•˜๊ณ  ์œ ํ˜•์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

์ง์ ‘ ๋งŒ๋“  ํ•จ์ˆ˜์˜ ๊ฒฝ์šฐ ๋‹ค๋ฅธ ์‚ฌ๋žŒ์ด ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ์ดํ•ดํ•˜๊ธฐ ํŽธํ•˜๊ฒŒ
JS DOCs์™€ sample ๊ทธ๋ฆฌ๊ณ  PR์— ์„ค๋ช…์„ ํ†ตํ•ด ์„œ์ˆ ํ•˜๋„๋ก ํ–ˆ์Šต๋‹ˆ๋‹ค.

detail์—๋Š” ๋‚ด๊ฐ€ ๊ณต์œ ํ•˜๊ณ  ์‹ถ์€ ์ฝ”๋“œ์˜ ์ผ๋ถ€๋ฅผ ๋ฐœ์ทŒํ•ด ์„ค๋ช…ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ–ˆ์Šต๋‹ˆ๋‹ค.
์ฝ”๋“œ ์„ค๋ช… ํ›„์—๋Š” ์ง„ํ–‰ ์˜ˆ์ •์ธ ๋ถ€๋ถ„์„ ์ ์„ ์ˆ˜๋„ ์žˆ๊ณ  ๋ง‰ํžˆ๋Š” ๋ถ€๋ถ„์„ ์ ์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค :)

// PR template
## ๊ฐœ์š”

<!-- ํ•œ ์ค„ ์š”์•ฝ -->

## PR ์œ ํ˜•

์–ด๋–ค ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์žˆ๋‚˜์š”?

-   [ ] ๐ŸŸข feat : ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ ์ถ”๊ฐ€
-   [ ] ๐Ÿ”ด Remove : ํŒŒ์ผ์ด๋‚˜ ํด๋”๋ฅผ ์‚ญ์ œํ•˜๋Š” ์ž‘์—…๋งŒ ์ˆ˜ํ–‰ํ•œ ๊ฒฝ์šฐ
-   [ ] ๐Ÿ”ฅ HOTFIX : ๊ธ‰ํ•˜๊ฒŒ ์น˜๋ช…์ ์ธ ๋ฒ„๊ทธ๋ฅผ ๊ณ ์ณ์•ผํ•˜๋Š” ๊ฒฝ์šฐ
-   [ ] ๐Ÿž fix : ๋ฒ„๊ทธ์ˆ˜์ •
-   [ ] ๐ŸŽ style : CSS ๋“ฑ ์‚ฌ์šฉ์ž UI ๋””์ž์ธ ๋ณ€๊ฒฝ
-   [ ] ๐Ÿ’ฌ Comment : ํ•„์š”ํ•œ ์ฃผ์„ ์ถ”๊ฐ€ ๋ฐ ๋ณ€๊ฒฝ
-   [ ] ๐Ÿ’ก refactor : ๊ธฐ๋Šฅ, ์ฝ”๋“œ ๊ฐœ์„ 
-   [ ] ๐Ÿ”– Rename : ํŒŒ์ผ ํ˜น์€ ํด๋”๋ช…์„ ์ˆ˜์ •ํ•˜๊ฑฐ๋‚˜ ์˜ฎ๊ธฐ๋Š” ์ž‘์—…๋งŒ์ธ ๊ฒฝ์šฐ
-   [x] ๐Ÿ“‚ docs : ๋ฌธ์„œ ์ˆ˜์ •


## PR Checklist

PR์ด ๋‹ค์Œ ์š”๊ตฌ ์‚ฌํ•ญ์„ ์ถฉ์กฑํ•˜๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š”.

-   [ ] ์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€ ์ปจ๋ฒค์…˜์— ๋งž๊ฒŒ ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.
-   [ ] ์ง์ ‘ ๋งŒ๋“  ํ•จ์ˆ˜๊ฐ€ ์žˆ๋‹ค๋ฉด ์ด์— ๋Œ€ํ•œ ์„ค๋ช…์„ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค. (ex. JS DOCS)
-   [ ] ๋ณ€๊ฒฝ ์‚ฌํ•ญ์— ๋Œ€ํ•œ ํ…Œ์ŠคํŠธ๋ฅผ ํ–ˆ์Šต๋‹ˆ๋‹ค. (๋ฒ„๊ทธ ์ˆ˜์ •/๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ํ…Œ์ŠคํŠธ)


## PR details

<!-- ๋ณ€๊ฒฝ ์‚ฌํ•ญ ๋ฐ ๊ด€๋ จ ์ด์Šˆ์— ๋Œ€ํ•ด ๊ฐ„๋‹จํ•˜๊ฒŒ ์ž‘์„ฑํ•ด์ฃผ์„ธ์š”. ์–ด๋–ป๊ฒŒ๋ณด๋‹ค ๋ฌด์—‡์„ ์™œ ์ˆ˜์ •ํ–ˆ๋Š”์ง€ ์„ค๋ช…ํ•ด์ฃผ์„ธ์š”. -->
<!-- ์ง์ ‘ ๋งŒ๋“  ํ•จ์ˆ˜๊ฐ€ ์žˆ๋‹ค๋ฉด ์˜ˆ์ œ๋ฅผ ๋งŒ๋“ค์–ด ์ƒ์„ธํžˆ ์„ค๋ช…ํ•ด์ฃผ์„ธ์š”. (์ฝ”๋“œ ์บก์ณ) -->


ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋กœ ํ›…ํ•จ์ˆ˜ ๋งŒ๋“ค๊ธฐ

์ ์šฉํ•˜๊ธฐ ์‰ฝ๋„๋ก JS Docs๋„ ์ ์—ˆ์Šต๋‹ˆ๋‹ค.
sample์€ ์ œ๊ฐ€ ์ด๋ฏธ ๋งŒ๋“  ํ›„ ์ ์šฉํ•œ ํŽ˜์ด์ง€๊ฐ€ ์žˆ์–ด ์ƒ๋žตํ–ˆ์Šต๋‹ˆ๋‹ค.

/**
 * @function useGetRecipeInfinity ๋Š” recipe data๋ฅผ ๊ฐ€์ ธ์™€ ๋ฌดํ•œ ์Šคํฌ๋กค์„ ๊ตฌํ˜„ํ•ด์ฃผ๋Š” hook ํ•จ์ˆ˜
 * @param {recipeData} : ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋ฐ›์€ ๋ฐ์ดํ„ฐ๋“ค์„ ์Šคํ”„๋ ˆ๋“œ ํ˜•ํƒœ๋กœ ๋ณด๊ด€, api ์ฃผ์†Œ์— ์ €์žฅ
 * @param {fetchNextPage} : useInfiniteQuery์˜ options ์ค‘ ํ•˜๋‚˜
 * @return {recipeData, fetchNextPage}
 **/

export function useGetRecipeInfinity() {
  const {
    data: recipeData,
    fetchNextPage,
    hasNextPage,
    isFetching,
  } = useInfiniteQuery({
    queryKey: [QUERY_KEY.MORE_RECIPE_LIST],
    queryFn: ({ pageParam = { startIdx: 1, endIdx: 12 } }) =>
      getRecipe(pageParam),
    getNextPageParam: (lastPage, totalPages) => {
      const startIdx = totalPages.length * 12 + 1;
      let endIdx = (totalPages.length + 1) * 12;

      if (lastPage.COOKRCP01.total_count < endIdx) {
        endIdx = lastPage.COOKRCP01.total_count;
      }
      if (startIdx > lastPage.COOKRCP01.total_count) {
        return null;
      }
      return { startIdx, endIdx };
    },
  });
  return { recipeData, fetchNextPage, hasNextPage, isFetching };
}

์ถ”๊ฐ€์ ์œผ๋กœ hook ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“  ํ›„ PRํ•  ๋•Œ ์ƒ์„ธํ•œ ์„ค๋ช…์„ ์ฒจ๋ถ€ํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ผผ๊ผผํ•˜๊ฒŒ PR์„ ์ž‘์„ฑํ•˜๊ณ  ๋‹ค๋ฅธ ํŒ€์›์„ ์œ„ํ•ด JS Docs๋ฅผ ์ ๋‹ค๋ณด๋‹ˆ ์ด๊ฑด ์ €๋ฅผ ์œ„ํ•ด์„œ๋„ ์ข‹๋‹ค๋Š” ๊ฒƒ์„ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์•Œ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์ œ ์ฝ”๋“œ๋ฅผ ์ ์„ ๋•Œ ์„ค๋ช…์„ ์ ๋‹ค๋ณด๋‹ˆ ๋ฆฌํŒฉํ„ฐ๋งํ•  ๋ถ€๋ถ„๋„ ๋” ์ž˜ ๋ณด์—ฌ ๋‚ด ์ฝ”๋“œ์˜ ๋ฌธ์ œ๋ฅผ ๋น ๋ฅด๊ฒŒ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์„ค๋ช…๊ณผ ์ฃผ์„์„ ๋‹ฌ๋‹ค๋ณด๋ฉด ์ด๋ฆ„๋„ ๋” ์ง๊ด€์ ์œผ๋กœ ์ดํ•ด ๊ฐ€๋Šฅํ•˜๋„๋ก ๋ฐ”๊พธ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

infinite-query ๋ถ€๋ถ„์€ ์—ฌ๋Ÿฌ ํ”„๋กœ์ ํŠธ์—์„œ ์žฌ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๋‹ค์Œ ํ”„๋กœ์ ํŠธ์—์„œ ๋” ์žฌ์‚ฌ์šฉํ•˜๊ธฐ ์šฉ์ดํ•˜๋„๋ก ๋ฐ”๊ฟ”๋ณด๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค :)



figma ๐Ÿ‘‰ ๋” ์ž์„ธํ•œ ๋””์ž์ธ์€ ํ”ผ๊ทธ๋งˆ ๋งํฌ์—์„œ ํ™•์ธํ•˜๊ธฐ
vercel ๐Ÿ‘‰ ๊ตฌํ˜„๋œ ์‚ฌ์ดํŠธ์—์„œ ํŽธํ•˜๊ฒŒ ํ™•์ธํ•˜๊ธฐ

๋ณธ ์‚ฌ์ดํŠธ๋Š” 1920px ๊ธฐ์ค€์œผ๋กœ ๋””์ž์ธ๋˜์—ˆ์œผ๋ฉฐ ๋ฐ˜์‘ํ˜•์ด ์ ์šฉ๋˜์–ด ์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๐Ÿงช ํ…Œ์ŠคํŠธ ๊ณ„์ •

account info
ID chapchap
password chap1234

Memoirs ๐Ÿ’ฌ

| ์—์ž์ผ(Agile)ํ•ด์กŒ๋Š”๊ฐ€?

ํ˜‘์—…์„ ์œ„ํ•ด ์ €ํฌ ํŒ€ yeong-cha(์˜์ฐจ)๋Š” PR template์„ ์‚ฌ์šฉํ•ด ๊ผผ๊ผผํžˆ ๋‚ด๊ฐ€ ์ง  ์ฝ”๋“œ๋ฅผ ๋‹ค๋ฅธ ํŒ€์›๋“ค์ด ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋„๋ก ํ–ˆ์Šต๋‹ˆ๋‹ค. ํ…œํ”Œ๋ฆฟ์„ ํ†ตํ•ด ํ†ต์ผ์„ฑ ๋ถ€์—ฌ๋„ ํ•  ์ˆ˜ ์žˆ๊ณ  ์–ด๋–ค ๋‚ด์šฉ์ด ๋‹ด๊ฒจ ์žˆ์„์ง€ ๋ฏธ๋ฆฌ ํŒŒ์•…์ด ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค๋ฅธ ํŒ€์›์ด ์ง  ์ฝ”๋“œ๋ฅผ ์ดํ•ดํ•˜๋Š”๋ฐ ์ „๋ณด๋‹ค ํ›จ์”ฌ ์ˆ˜์›”ํ–ˆ์Šต๋‹ˆ๋‹ค.

์ง์ ‘ ๋งŒ๋“  ํ•จ์ˆ˜๊ฐ€ ์žˆ๋‹ค๋ฉด ๋ฐ˜๋“œ์‹œ ์„ค๋ช…๊ณผ ์˜ˆ์‹œ๋ฅผ ์ ์„ ์ˆ˜ ์žˆ๊ฒŒ ์ด์— ๋Œ€ํ•œ ์ฒดํฌ ์—ฌ๋ถ€๋„ PR template ๋‚ด์šฉ์— ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.

๋ง‰ํžˆ๋Š” ๋ถ€๋ถ„์ด๋‚˜ ๊ณ ๋ฏผ์ด ๋˜๋Š” ๋ถ€๋ถ„์€ github issue๋ฅผ ํ†ตํ•ด ์˜๊ฒฌ์„ ๋‚˜๋ˆด๊ณ  ๋ชจ๋“  ๊ฒŒ์‹œ๋œ ๊ธ€๋“ค(issue ๋ฐ PR)์˜ comment๋Š” ์ตœ๋Œ€ํ•œ ์„ฑ์‹ฌ์„ฑ์˜๊ป ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.

Linear๋ผ๋Š” ํ˜‘์—…ํˆด์„ ์‚ฌ์šฉํ•ด back-log๋„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋„๋ก ํ–ˆ๊ณ , daily scrum์€ github issue์— ์ ์–ด ๋‹ค๋ฅธ ์‚ฌ์ดํŠธ ๋ฐฉ๋ฌธ ์—†์ด ํŽธํ•˜๊ฒŒ ์„œ๋กœ์˜ ์ผ์ •์„ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ–ˆ์Šต๋‹ˆ๋‹ค.

์ง€๋‚œ ํ”„๋กœ์ ํŠธ์—์„œ ๋†“์นœ ๋ถ€๋ถ„์„ ๋ณด์™„ํ•ด ๋‚˜๊ฐ€๋ฉด์„œ ์—์ž์ผํ•˜๊ฒŒ ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๊ฒŒ ๋˜๋ฉด ์ƒ๋‹น ๋น„์šฉ์ด ๋“ ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ์•˜์Šต๋‹ˆ๋‹ค. ํ•˜๋‚˜์˜ PR์— review๋ฅผ ์‹œ์ž‘ํ•˜๋ฉด ์ตœ์†Œ 1์‹œ๊ฐ„์ด ๊ฑธ๋ ธ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.
ํ•˜์ง€๋งŒ ์ด๋Ÿฐ ๋น„์šฉ์„ ๋“ค์—ฌ์•ผ์ง€๋งŒ ์œ ์ง€๋ณด์ˆ˜ํ•˜๊ธฐ๋„ ์šฉ์ดํ•˜๊ณ  ์ฝ”๋“œ์— ๋Œ€ํ•œ ์ดํ•ด๋„ ๋†’์•„์ง„๋‹ค๋Š” ๊ฒƒ๋„ ํ•จ๊ป˜ ์•Œ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

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

code review๋ฅผ ํ†ตํ•ด ์ง€์ผœ์ง€์ง€ ์•Š์€ ๋ถ€๋ถ„๋“ค์„ ์ˆ˜์ •ํ•˜๊ณ  mergeํ•  ์ˆ˜ ์žˆ์—ˆ๊ณ ,
ํ”ผ๋“œ๋ฐฑ์„ ํ†ตํ•ด ์ฆ‰๊ฐ์ ์œผ๋กœ ์ฝ”๋“œ ๊ฐœ์„ ์ด ๊ฐ€๋Šฅํ–ˆ์Šต๋‹ˆ๋‹ค.

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

ํ˜‘์—…์„ ์‹ ๊ฒฝ์“ฐ๋‹ค๋ณด๋‹ˆ ๊ฐœ๋ฐœ ์‹œ๊ฐ„์ด ๋” ๊ฑธ๋ฆฌ๋Š” ๊ฒƒ ๊ฐ™์ง€๋งŒ ์œ ์ง€๋ณด์ˆ˜ ์ธก๋ฉด ๋“ฑ์„ ๊ณ ๋ คํ•ด ๋ฉ€๋ฆฌ ๋‚ด๋‹ค๋ณด๋ฉด ์˜คํžˆ๋ ค ์ƒ์‚ฐ์„ฑ์ด ์žˆ๋Š” ์ชฝ์€ ํ˜‘์—…์„ ์‹ ๊ฒฝ์“ฐ๋Š” ํ”„๋กœ์ ํŠธ์ž„์„ ํ™•์‹คํžˆ ์งš๊ณ  ๋„˜์–ด๊ฐˆ ์ˆ˜ ์žˆ๋Š” ๊ณ„๊ธฐ๊ฐ€ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.


| ์ด๋ฒˆ์— ์•„์‰ฌ์› ๋˜ ์ ์€ ?

๊ฐœ๋ฐœ์„ ํ•˜๋Š” ๊ณผ์ •์—์„œ API ๋ถ„์„์— ๋Œ€ํ•œ ์•„์‰ฌ์›€์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.
์ œ๋Œ€๋กœ ๋ถ„์„์„ ํ•˜์ง€ ์•Š์•„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์—†๋Š” ๊ธฐ๋Šฅ๋“ค์„ ๊ตฌํ˜„ํ•˜๋ ค๊ณ  ์‹œ๊ฐ„์„ ์Ÿ์•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ์ด๋ฒˆ ํ”„๋กœ์ ํŠธ์—์„œ scrap ๊ธฐ๋Šฅ๊ณผ filter ๊ธฐ๋Šฅ์ด ํ•ด๋‹น๋ฉ๋‹ˆ๋‹ค.
์Šคํฌ๋žฉ์€ mobithonAPI์—์„œ ๋‚ด๊ฐ€ ์Šคํฌ๋žฉํ•œ ๊ฒŒ์‹œ๊ธ€์ธ์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์ด ์—†์–ด ๊ตฌํ˜„ํ•  ์ˆ˜ ์—†์—ˆ๊ณ , filter๋Š” openAPI์—์„œ ๊ด€๋ จ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ด์ฃผ์ง€ ์•Š์•„ ํ”„๋ก ํŠธ ๋‹จ์—์„œ ํ•˜๋“œ์ฝ”๋”ฉ์„ ํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค.

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

์ „๋ฐ˜์ ์œผ๋กœ API ๋ถ„์„์ด ๋ฏธํกํ–ˆ๋˜ ํƒ“์— ์™„์„ฑ์„ ํ•˜์ง€ ๋ชปํ–ˆ์ง€๋งŒ ์ฒ˜์Œ๋ถ€ํ„ฐ ์ €ํฌ์˜ 1์ˆœ์œ„ ๋ชฉํ‘œ๋Š” ํ˜‘์—…๊ณผ ์„ฑ์žฅ์ด์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋‚˜๋ฆ„ ์„ฑ๊ณต์ ์ธ ํ”„๋กœ์ ํŠธ์˜€๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋ถ€์กฑํ•œ ๋ถ€๋ถ„์€ ๋‹ค์Œ ํ”„๋กœ์ ํŠธ์—์„œ ์ฑ„์šธ ์˜ˆ์ •์ด๊ธฐ ๋•Œ๋ฌธ์— ์•„์‰ฌ์›€๋ณด๋‹จ ๊ฐ™์ด์˜ ๊ฐ€์น˜๋ฅผ ์•Œ์ˆ˜ ์žˆ๋Š” ๊ธฐํšŒ๊ฐ€ ๋˜์—ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

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

profile
๐Ÿฅž Stack of Thoughts
post-custom-banner

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