๐Ÿช– [ํ์‹œ์ฆ˜] ๋ฐ‹์—… ํ”„๋กœ์ ํŠธ ํšŒ๊ณ 

์œค๋ณ‘ํ˜„ยท2025๋…„ 6์›” 3์ผ
10

ํ์‹œ์ฆ˜

๋ชฉ๋ก ๋ณด๊ธฐ
1/4
post-thumbnail

๐Ÿ’™ ํ์‹œ์ฆ˜์ด๋ž€?

๐Ÿ’กํ•œ๊ตญ๋Œ€ํ•™์ƒ IT ๊ฒฝ์˜ํ•™ํšŒ๋กœ, ๋งค ๊ธฐ์ˆ˜ 70-80๋ช…์˜ ๋Œ€ํ•™์ƒ๋“ค์ด ๋ชจ์—ฌ ๊ฐ๊ฐ ๊ธฐํš, ๋””์ž์ธ, ๊ฐœ๋ฐœ(ํ”„๋ก ํŠธ/๋ฐฑ์—”๋“œ) ํŒŒํŠธ๋ฅผ ๋งก์•„ IT ํ”„๋กœ๋•ํŠธ๋ฅผ ๋งŒ๋“œ๋Š” ํ•™ํšŒ

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

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


๐Ÿ’ก ์•„์ด๋””์–ด ๋ฐœ์ œ ๋ฐ ์ปคํ”ผ์ฑ—

์•„์ด๋””์–ด ๋ฐœ์ œ

์ปคํ”ผ์ฑ—

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

8๊ฐœ ์•„์ด๋””์–ด ์ „๋ถ€ ๋„ˆ๋ฌด ํ›Œ๋ฅญํ•œ ์•„์ด๋””์–ด์—ฌ์„œ ์„ ํƒ์„ ํ•˜๋Š” ๊ณผ์ •์—์„œ ์ •๋ง ๋งŽ์€ ๊ณ ๋ฏผ์„ ํ–ˆ์—ˆ์Šต๋‹ˆ๋‹ค.

์•„์ด๋””์–ด ์„ ํƒ ๊ธฐ์ค€

์•„์ด๋””์–ด๋ฅผ ์„ ์ •ํ•  ๋•Œ ์ €๋Š” ๋‹ค์Œ ์„ธ ๊ฐ€์ง€ ๊ธฐ์ค€์„ ์ค‘์‹ฌ์œผ๋กœ ๊ณ ๋ฏผํ–ˆ์Šต๋‹ˆ๋‹ค:

  1. ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์ž๋กœ์„œ ์ƒˆ๋กœ์šด ๊ธฐ์ˆ ์ด๋‚˜ ๋„์ „์„ ๊ฒฝํ—˜ํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€?

  2. ์ œํ•œ๋œ ๊ธฐ๊ฐ„ ๋‚ด์— MVP๋ฅผ ์™„์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ์ ์ • ๊ทœ๋ชจ์ธ๊ฐ€?

  3. ์‹ค์ œ ์‚ฌ์šฉ์ž ํ™•๋ณด๊ฐ€ ๋น„๊ต์  ์ˆ˜์›”ํ•œ ์ฃผ์ œ์ธ๊ฐ€?


๐Ÿช– ์‚ฌ๋ž‘๊พผ

์ด๋Ÿฐ ๊ธฐ์ค€์„ ์„ธ์šฐ๊ณ  ์•„์ด๋””์–ด๋ฅผ ๊ณ ๋ฅธ ๊ฒฐ๊ณผ ์‚ฌ๋ž‘๊พผ์ด๋ž€ ๊ณฐ์‹  ์ปคํ”Œ๋“ค์„ ์œ„ํ•œ ์„œ๋น„์Šค๋ฅผ ์„ ํƒํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

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

์‚ฌ๋ž‘๊พผ์€ ์ƒํ˜ธ ์ดํ•ด(๊ฐ์ •, ์ผ์ •)๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ํ‘œํ˜„์„ ๋„์™€์ฃผ์–ด ๊ตฐ์ธ๊ณผ ๊ณฐ์‹ ์˜ ๊ด€๊ณ„ ์œ ์ง€๋ฅผ ๋•๋Š” ์ปคํ”Œ ๊ณต์œ  ์บ˜๋ฆฐ๋” ์„œ๋น„์Šค์ž…๋‹ˆ๋‹ค.

์„ ํƒ ์ด์œ 

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

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

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

๊ธฐ์ˆ ์Šคํƒ

๊ธฐ์ˆ ์„ค๋ช…
TypeScriptํƒ€์ž… ์•ˆ์ •์„ฑ์„ ํ†ตํ•ด ์œ ์ง€๋ณด์ˆ˜์„ฑ๊ณผ ๋ฆฌํŒฉํ„ฐ๋ง ํšจ์œจ ํ–ฅ์ƒ
React + Vite์ปดํฌ๋„ŒํŠธ ๊ธฐ๋ฐ˜ ๊ตฌ์กฐ + ๋น ๋ฅธ ๋ฒˆ๋“ค๋ง๊ณผ HMR ์ œ๊ณต
PWA๋ชจ๋ฐ”์ผ ์„ค์น˜ ๊ฐ€๋Šฅ, ์›น ํ‘ธ์‹œ ์•Œ๋ฆผ ๋“ฑ ๊ธฐ๋Šฅ ์ œ๊ณต
Tailwind CSS์œ ํ‹ธ๋ฆฌํ‹ฐ ๊ธฐ๋ฐ˜ CSS๋กœ ๋น ๋ฅด๊ณ  ์ผ๊ด€๋œ ์Šคํƒ€์ผ๋ง
shadcn/ui์ ‘๊ทผ์„ฑ๊ณผ ์ปค์Šคํ„ฐ๋งˆ์ด์ง•์ด ๊ฐ•๋ ฅํ•œ UI ์ปดํฌ๋„ŒํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
Zustand๊ฐ„๋‹จํ•˜๊ณ  ๊ฐ€๋ฒผ์šด ์ „์—ญ ์ƒํƒœ ๊ด€๋ฆฌ
React Query (@tanstack/react-query)์„œ๋ฒ„ ์ƒํƒœ ๊ด€๋ฆฌ, ์บ์‹ฑ, ๋ฆฌํŽ˜์นญ ์ž๋™ํ™”
AxiosHTTP ์š”์ฒญ/์‘๋‹ต ์ฒ˜๋ฆฌ ๋ฐ ์ธํ„ฐ์…‰ํ„ฐ ์„ค์ •
MSWAPI mocking์œผ๋กœ ํ”„๋ก ํŠธ ๊ฐœ๋ฐœ ๋ณ‘๋ ฌํ™” ์ง€์›
VitestVite์™€ ํ†ตํ•ฉ๋œ ๋น ๋ฅธ ํ…Œ์ŠคํŠธ ์‹คํ–‰ ํ™˜๊ฒฝ

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

โšก๏ธ Vite + PWA

๊ณต์‹๋ฌธ์„œ ๋งํฌ

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

๐Ÿงฉ MSW (Mock Service Worker)

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

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

๐Ÿงช Vitest

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

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

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

โœ… ํ…Œ์ŠคํŠธ ์ฝ”๋“œ (formatDate.test.ts)

import { describe, it, expect } from 'vitest'
import { formatDate } from './formatDate'

describe('formatDate ํ•จ์ˆ˜', () => {
  it('Date ๊ฐ์ฒด๋ฅผ "YYYY-MM-DD" ํ˜•์‹์˜ ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜ํ•œ๋‹ค', () => {
    const input = new Date('2025-12-12T00:00:00Z')
    const result = formatDate(input)
    expect(result).toBe('2025-12-12')
  })

  it('ํ•œ ์ž๋ฆฌ ์ˆ˜ ์›”๊ณผ ์ผ์„ 0์œผ๋กœ ์ฑ„์›Œ์„œ ๋ฐ˜ํ™˜ํ•œ๋‹ค', () => {
    const input = new Date('2025-01-05T00:00:00Z')
    const result = formatDate(input)
    expect(result).toBe('2025-01-05')
  })
})

๐Ÿ”ฅ ๊ฐœ๋ฐœ ๊ณผ์ •


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

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

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


๐Ÿš€ ๋ฐ‹์—… ๋ฐ์ด

๋ฐœํ‘œ



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

๋˜ํ•œ, ์œ ํŠœ๋ธŒ ๋ผ์ด๋ธŒ๋กœ ํ–‰์‚ฌ ์ „์ฒด๊ฐ€ ์‹ค์‹œ๊ฐ„ ์†ก์ถœ๋˜๋ฉฐ ๋…นํ™”๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ํ์‹œ์ฆ˜์—์„œ ํƒ„์ƒํ•œ ๋ฉ‹์ง„ ์„œ๋น„์Šค๋“ค์„ ๋” ๋„๋ฆฌ ์•Œ๋ฆด ์ˆ˜ ์žˆ๋Š” ์†Œ์ค‘ํ•œ ๊ธฐํšŒ๊ฐ€ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.


๋ถ€์Šค ์šด์˜


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

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


๐Ÿƒ๐Ÿฟ ๋์ด ์•„๋‹ˆ๋ผ ์‹œ์ž‘


2์›”์— ์‹œ์ž‘๋œ ํ์‹œ์ฆ˜ ์—ฌ์ •์ด ์–ด๋А๋ง ๋ง‰์„ ๋‚ด๋ ธ์Šต๋‹ˆ๋‹ค.
ํ•˜์ง€๋งŒ ์šฐ๋ฆฌ ํŒ€์—๊ฒŒ ์ด ๋์€ ์ง„์งœ ์‹œ์ž‘์— ๋ถˆ๊ณผํ•ฉ๋‹ˆ๋‹ค.

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

์•„์ง ํ•ด๊ฒฐํ•ด์•ผ ํ•  ๋ฌธ์ œ๋“ค์ด ๋งŽ์ง€๋งŒ, ํ•˜๋‚˜์”ฉ ํ’€์–ด๋‚˜๊ฐ€๋ฉฐ ์•ฑ์Šคํ† ์–ด์™€ ํ”Œ๋ ˆ์ด์Šคํ† ์–ด์— ์ •์‹ ์ถœ์‹œํ•˜๊ณ , ์‹ค์ œ ์‚ฌ์šฉ์ž๋“ค๊ณผ ํ•จ๊ป˜ ์„œ๋น„์Šค ์šด์˜์„ ๊ฒฝํ—˜ํ•ด๋ณด๋ ค ํ•ฉ๋‹ˆ๋‹ค.

์•ž์œผ๋กœ์˜ ์—ฌ์ •๋„ ํ•จ๊ป˜ ์ง€์ผœ๋ด ์ฃผ์‹ ๋‹ค๋ฉด ์ •๋ง ๊ฐ์‚ฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๋ฐฉ์‚ฐ์†Œ๋…„๋‹จ ๋‹ค๋“ค ํž˜๋“ค๊ฒ ์ง€๋งŒ ํ•ญ์ƒ ์›ƒ์œผ๋ฉด์„œ ์ง€๊ธˆ์ฒ˜๋Ÿผ ์ญ‰ ๊ณ„์†ํ•ด๋ณด์ž ํ™”์ดํŒ… ๐Ÿซก

๊นƒํ—ˆ๋ธŒ ์ฃผ์†Œ
https://github.com/Gomushim/frontend

์„œ๋น„์Šค ์ฃผ์†Œ (์•„๋งˆ ์ž˜ ์•ˆ๋ ๊ฑฐ์ž„ ๋นจ๋ฆฌ ๊ณ ์ณ๋ณผ๊ฒŒ์œ  ใ… )
https://www.sarangkkun.site/

profile
ํ”„๋ก ๋“œ์—”๋“œ ๊ฐœ๋ฐœ์ž

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

comment-user-thumbnail
2025๋…„ 6์›” 4์ผ

amazing !

1๊ฐœ์˜ ๋‹ต๊ธ€
comment-user-thumbnail
2025๋…„ 6์›” 5์ผ

์งง์€ ๊ธฐํ•œ ๋™์•ˆ ํ‘ธ์‹œ ์•Œ๋ฆผ๊นŒ์ง€ ๊ตฌํ˜„ํ•˜์‹  ๊ฑฐ ๋ณด๊ณ  ๋„˜ ๋ฉ‹์กŒ์Šต๋‹ˆ๋‹ค!!
๋์ด ์•„๋‹Œ ์‹œ์ž‘์ธ ๊ฒƒ๋„ ๋„˜ ์ข‹๋„ค์šฉ
์‚ฌ๋ž‘๊พผ ๋ฆด๋ฆฌ์ฆˆ๊นŒ์ง€ ํŒŒ์ดํŒ…์ž…๋‹ˆ๋‹ค!!

1๊ฐœ์˜ ๋‹ต๊ธ€