Skip to content

[3ํŒ€ ๋ฐ•์ค€ํ˜•] Chapter ๐Ÿฆ 3-1. ํ”„๋ก ํŠธ์—”๋“œ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ๐Ÿฆ#4

Open
BBAK-jun wants to merge 32 commits intohanghae-plus:hardfrom
BBAK-jun:hard
Open

[3ํŒ€ ๋ฐ•์ค€ํ˜•] Chapter ๐Ÿฆ 3-1. ํ”„๋ก ํŠธ์—”๋“œ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ๐Ÿฆ#4
BBAK-jun wants to merge 32 commits intohanghae-plus:hardfrom
BBAK-jun:hard

Conversation

@BBAK-jun
Copy link

@BBAK-jun BBAK-jun commented Aug 16, 2025

HARD

PR ์ฒดํฌํฌ์ธํŠธ ๋ฐ ๊ตฌํ˜„ ๋‚ด์šฉ

7์ฃผ์ฐจ ๊ณผ์ œ ์ฒดํฌํฌ์ธํŠธ

๊ธฐ๋ณธ๊ณผ์ œ

  • ์ด 11๊ฐœ์˜ ํŒŒ์ผ, 115๊ฐœ์˜ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•˜๊ณ  ๋ชจ๋‘ ํ†ต๊ณผ

์งˆ๋ฌธ ๋‹ต๋ณ€

Q1. handlersUtils์— ๋‚จ๊ธด ์งˆ๋ฌธ์— ๋‹ต๋ณ€ํ•ด์ฃผ์„ธ์š”.

์ด๋ฒคํŠธ๋Š” ์ƒ์„ฑ, ์ˆ˜์ •๋˜๋ฉด fetch๋ฅผ ๋‹ค์‹œ ํ•ด ์ƒํƒœ๋ฅผ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค. ํ…Œ์ŠคํŠธ๊ฐ€ ๋ณ‘๋ ฌ๋กœ ๋Œ์•„๋„ ์•ˆ์ •์ ์ด๊ฒŒ ๋™์ž‘ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์€?

์ฒ˜์Œ์—๋Š” ๊ทธ๋ƒฅ handlers.ts ์•ˆ์˜ ์ „์—ญ events ๋ฐฐ์—ด์„ ๊ฐ ํ…Œ์ŠคํŠธ๋งˆ๋‹ค ์ดˆ๊ธฐํ™”ํ•˜๋ฉด ๋˜๊ฒ ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์‹คํ–‰ํ•ด๋ณด๋‹ˆ ํ•œ ํ…Œ์ŠคํŠธ์—์„œ ์ถ”๊ฐ€ํ•œ ์ด๋ฒคํŠธ๊ฐ€ ๋‹ค๋ฅธ ํ…Œ์ŠคํŠธ์— ๋‚˜ํƒ€๋‚˜๊ณ , ์‚ญ์ œ ํ…Œ์ŠคํŠธ๋ฅผ ๋Œ๋ ธ๋”๋‹ˆ ์—‰๋šฑํ•œ ํ…Œ์ŠคํŠธ๊ฐ€ ๊นจ์ง€๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด EventTestStore ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค๊ณ , ๊ฐ ํ…Œ์ŠคํŠธ๋งˆ๋‹ค ๋…๋ฆฝ์ ์ธ ์ €์žฅ์†Œ๋ฅผ ์ƒ์„ฑํ•˜๋„๋ก ๋ฐ”๊ฟจ์Šต๋‹ˆ๋‹ค. Map ์ž๋ฃŒ๊ตฌ์กฐ๋กœ CRUD๋ฅผ ๊ตฌํ˜„ํ•˜๊ณ , setupMockEvents()์—์„œ ๋งค๋ฒˆ ์ƒˆ๋กœ์šด ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๊ฒŒ ํ•˜๋‹ˆ ๋ณ‘๋ ฌ ์‹คํ–‰์—์„œ๋„ ์•ˆ์ •์ ์œผ๋กœ ๋™์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค.

Q2. ํ…Œ์ŠคํŠธ๋ฅผ ๋…๋ฆฝ์ ์œผ๋กœ ๊ตฌ๋™์‹œํ‚ค๊ธฐ ์œ„ํ•ด ์ž‘์„ฑํ–ˆ๋˜ ์„ค์ •๋“ค์„ ์†Œ๊ฐœํ•ด์ฃผ์„ธ์š”.

์—ฌ๋Ÿฌ ์‹œํ–‰์ฐฉ์˜ค ๋์— ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฐฉ๋ฒ•์„ ์ ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.

  1. ID ์ถฉ๋Œ ๋ฐฉ์ง€: ๋‹จ์ˆœ ์ˆซ์ž ID๋Š” ์ถฉ๋Œ์ด ์žฆ์•„ crypto.randomUUID()์™€ Date.now()๋ฅผ ์กฐํ•ฉํ•ด ์‚ฌ์šฉ
  2. MSW ํ•ธ๋“ค๋Ÿฌ ๊ฒฉ๋ฆฌ: ๊ฐ ํ…Œ์ŠคํŠธ์—์„œ server.use(...setupMockEvents([]))๋กœ ์ดˆ๊ธฐ ๋ฐ์ดํ„ฐ ์ง€์ •
  3. ํƒ€์ด๋จธ ๊ฒฉ๋ฆฌ: ์•Œ๋ฆผ ํ…Œ์ŠคํŠธ์—์„œ ์‹œ๊ฐ„ ๋ฌธ์ œ๋กœ ๊ณ ์ƒํ–ˆ๋Š”๋ฐ, ๊ฒฐ๊ตญ ๊ฐ ํ…Œ์ŠคํŠธ๋ฅผ vi.useFakeTimers() / vi.useRealTimers()๋กœ ๊ฐ์‹ธ ํ•ด๊ฒฐ

์‹ฌํ™” ๊ณผ์ œ

  • App ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ ์ ˆํžˆ ๋ถ„๋ฆฌ (์ปดํฌ๋„ŒํŠธ, ํ›…, ์œ ํ‹ธ ํ•จ์ˆ˜)
  • ๋ถ„๋ฆฌ๋œ ๋ชจ๋“ˆ๋“ค์— ๋Œ€ํ•ด 5๊ฐœ ์ด์ƒ ํ…Œ์ŠคํŠธ ์ž‘์„ฑ

์ฃผ์š” ๊ตฌํ˜„ ๋‚ด์šฉ

1. ํ…Œ์ŠคํŠธ ์•ˆ์ •์„ฑ ๊ฐœ์„ 

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

2. ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ ๊ฐœ์„ 

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

3. ์œ ํ‹ธ๋ฆฌํ‹ฐ ํ•จ์ˆ˜ ํ…Œ์ŠคํŠธ ๊ฐ•ํ™”

์ˆœ์ˆ˜ ํ•จ์ˆ˜๋ผ ์ž‘์„ฑ์€ ๋น„๊ต์  ์ˆ˜์›”ํ–ˆ์ง€๋งŒ, ๋‚ ์งœ ๊ด€๋ จ ์—ฃ์ง€ ์ผ€์ด์Šค(์œค๋…„, ์›”๋ง ๋“ฑ)๋ฅผ ๊ณ ๋ คํ•˜๋Š” ๊ณผ์ •์ด ๊นŒ๋‹ค๋กœ์› ์Šต๋‹ˆ๋‹ค.


๊ณผ์ œ ์…€ํ”„ํšŒ๊ณ 

๊ธฐ์ˆ ์  ์„ฑ์žฅ

ํ”„๋ก ํŠธ์—”๋“œ์™€ ๋ฐฑ์—”๋“œ์—์„œ์˜ ํ…Œ์ŠคํŒ… ๊ด€์  ์ฐจ์ด

๋ฐฑ์—”๋“œ์—์„œ๋Š” ๋„๋ฉ”์ธ ๊ฐ์ฒด์™€ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์ด ์ค‘์‹ฌ์ž…๋‹ˆ๋‹ค.

  • ํ•จ์ˆ˜ ๋‹จ์œ„, ๋กœ์ง ๋‹จ์œ„์—์„œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ์‚ฌ์ด๋“œ ์ดํŽ™ํŠธ ์ตœ์†Œํ™”์— ์ง‘์ค‘ํ–ˆ์Šต๋‹ˆ๋‹ค.
  • ์œ ๋‹› ํ…Œ์ŠคํŠธ๋Š” ์ž…๋ ฅ๊ณผ ์ถœ๋ ฅ๋งŒ ๋ช…ํ™•ํžˆ ์ •์˜ํ•˜๋ฉด ๋˜์—ˆ๊ณ , ๋ฆฌํŒฉํ„ฐ๋ง ์‹œ ์•ˆ์ •๋ง ์—ญํ• ์„ ์ถฉ์‹คํžˆ ํ–ˆ์Šต๋‹ˆ๋‹ค.
  • ์˜ˆ๋ฅผ ๋“ค์–ด, OAS๋กœ API ์ŠคํŽ™์„ ์ •์˜ํ•œ ๋’ค, ์ž…๋ ฅ/์ถœ๋ ฅ ๊ฐ’์ด ๋ฐ”๋€Œ์ง€ ์•Š๋Š” ํ•œ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋„ ์•ˆ์ •์ ์œผ๋กœ ์œ ์ง€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๋ฐ˜๋ฉด ํ”„๋ก ํŠธ์—”๋“œ์—์„œ๋Š” ํ›จ์”ฌ ๋‹ค๋ฅธ ์„ฑ๊ฒฉ์˜ ์–ด๋ ค์›€์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

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

์ฆ‰,

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

๊ณผ๊ฑฐ ๋ธ”๋กœ๊ทธ ๊ฒฝํ—˜๊ณผ์˜ ์—ฐ๊ฒฐ

๊ณผ๊ฑฐ์— ๋ธ”๋กœ๊ทธ ํฌ์ŠคํŒ…์—์„œ,

โ€œ์œ ๋‹› ํ…Œ์ŠคํŠธ๊ฐ€ ์žˆ์œผ๋ฉด ๋ฆฌํŒฉํ„ฐ๋ง์ด ๋‘๋ ต์ง€ ์•Š์•˜๋‹คโ€

๋ผ๋Š” ๊ฒฝํ—˜์„ ์“ด ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋•Œ๋Š” ๋ฆฌํŒฉํ„ฐ๋ง์„ ํ•˜๋ฉฐ ๋А๋‚€ ์ ์ด์—ˆ๋Š”๋ฐ, ์ด๋ฒˆ ๊ณผ์ œ๋ฅผ ํ•˜๋ฉฐ ๋˜‘๊ฐ™์€ ๊นจ๋‹ฌ์Œ์„ ๋‹ค์‹œ ํ–ˆ์Šต๋‹ˆ๋‹ค.

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

ํƒ€์ด๋จธ ๊ด€๋ จ ํ…Œ์ŠคํŠธ ์ด์Šˆ

fake timer๋ฅผ ์“ฐ๋ฉด์„œ ์‹œ๊ฐ„์ด ์ง€๋‚˜๋„ ์•Œ๋ฆผ์ด ๋œจ์ง€ ์•Š๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์›์ธ์€ fake timer๋Š” ์‹œ๊ฐ„์„ ๊ฐ€์งœ๋กœ ์ง„ํ–‰์‹œํ‚ค๋Š” ๋ฐ˜๋ฉด, React์˜ ์ƒํƒœ ์—…๋ฐ์ดํŠธ๋‚˜ waitFor๋Š” ์‹ค์ œ ์‹œ๊ฐ„์„ ์ฐธ์กฐํ•œ๋‹ค๋Š” ์ ์ด์—ˆ์Šต๋‹ˆ๋‹ค.

(ํ•˜๋„ ์•ˆ๋˜์„œ ์˜์„œ๋‹˜๊ป˜ ์ด๊ฑฐ ๋ญ๋ƒ? ์—ฌ์ญค๋ณด๋‹ˆ ๋Œ€๋œธ ์•„๋ž˜์˜ ๋งํฌ๋ฅผ ๋ณด๋‚ด์ฃผ๋”๋ผ๊ณ ์š”. ํ•ญ์ƒ ๊ณ ๋งˆ์šด ์˜์„œ๋‹˜ ใ…Žใ…Ž)

dom-testing-library #1218

  • fake timer๋Š” ๊ฐ€์งœ๋กœ ์‹œ๊ฐ„์„ ์ง„ํ–‰์‹œํ‚ค๋Š”๋ฐ
  • React์˜ ์ƒํƒœ ์—…๋ฐ์ดํŠธ๋‚˜ waitFor๋Š” ์‹ค์ œ ์‹œ๊ฐ„์„ ์“ฐ๋”๋ผ๊ตฌ์š”
  • ๊ทธ๋ž˜์„œ ๋‘˜์ด ์‹ฑํฌ๊ฐ€ ์•ˆ ๋งž์•„์„œ ํ…Œ์ŠคํŠธ๊ฐ€ ์ œ๋Œ€๋กœ ์•ˆ ๋Œ์•„๊ฐ

ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์•˜์Šต๋‹ˆ๋‹ค.

vi.useFakeTimers({ shouldAdvanceTime: true });
await act(async () => {
  vi.advanceTimersByTime(1000);
});

shouldAdvanceTime ์˜ต์…˜์„ ์•Œ๊ฒŒ ๋œ ํ›„์—์„œ์•ผ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๋ฌธ์„œ์—์„œ ์ฐพ๊ธฐ ํž˜๋“ค์–ด ์• ๋ฅผ ๋งŽ์ด ๋จน์—ˆ๋˜ ๋ถ€๋ถ„์ž…๋‹ˆ๋‹ค.

์ฝ”๋“œ ํ’ˆ์งˆ

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

ํ•™์Šต ํšจ๊ณผ

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

์•„์ง์€ ์‹œ๊ฐ์  ํ…Œ์ŠคํŠธ๋‚˜ ์Šค๋ƒ…์ƒท ํ…Œ์ŠคํŠธ ํ™œ์šฉ ์‹œ์ ์ด ์• ๋งคํ•˜๊ฒŒ ๋А๊ปด์ง‘๋‹ˆ๋‹ค. ์ด ๋ถ€๋ถ„์€ ๋” ํ•™์Šต์ด ํ•„์š”ํ•  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๊ณผ์ œ ํ”ผ๋“œ๋ฐฑ

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

๋ฆฌ๋ทฐ ๋ฐ›๊ณ  ์‹ถ์€ ๋‚ด์šฉ

  1. EventTestStore ํŒจํ„ด
    Map ๊ธฐ๋ฐ˜์œผ๋กœ ๊ตฌํ˜„ํ–ˆ๋Š”๋ฐ, ์ด ๋ฐฉ์‹์ด ๋‹ค๋ฅธ ํ”„๋กœ์ ํŠธ์—์„œ๋„ ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ์ ‘๊ทผ์ธ์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค. factory ํŒจํ„ด์ด๋‚˜ builder ํŒจํ„ด์œผ๋กœ ํ™•์žฅํ•˜๋Š” ๊ฒŒ ๋” ์ ์ ˆํ• ๊นŒ์š”?

  2. ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ ๋ฒ”์œ„
    medium.integration.spec.tsx ๊ฐ™์€ ๊ฒฝ์šฐ, "์ผ์ • ์ถ”๊ฐ€" ํ…Œ์ŠคํŠธ์—์„œ ํผ ์ž…๋ ฅ โ†’ ์ €์žฅ โ†’ ๋ชฉ๋ก ํ™•์ธ๊นŒ์ง€ ์ „ ๊ณผ์ •์„ ํ•œ ํ…Œ์ŠคํŠธ๋กœ ๋‘์—ˆ๋Š”๋ฐ์š”. ์ด๋ ‡๊ฒŒ ๊ธด ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ๊ทธ๋Œ€๋กœ ๋‘๋Š” ๊ฒŒ ๋งž๋Š”์ง€, ์•„๋‹ˆ๋ฉด ์ชผ๊ฐœ๋Š” ๊ฒŒ ๋” ๋ฐ”๋žŒ์งํ•œ์ง€ ๊ณ ๋ฏผ์ž…๋‹ˆ๋‹ค. ๋งŒ์•ฝ ์ชผ๊ฐ ๋‹ค๋ฉด ์–ด๋–ค ๊ธฐ์ค€์ด ์ ์ ˆํ• ๊นŒ์š”?

  3. ํ…Œ์ŠคํŠธ ๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ
    createTestEvent()๋ฅผ ํ†ตํ•ด ๊ธฐ๋ณธ๊ฐ’์„ ์„ธํŒ…ํ•˜๊ณ  ํ•„์š”ํ•œ ๋ถ€๋ถ„๋งŒ ์˜ค๋ฒ„๋ผ์ด๋“œํ•˜๋Š” ๋ฐฉ์‹์„ ์ผ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ๊ฒฝ์šฐ์— ๋”ฐ๋ผ์„  ์˜คํžˆ๋ ค ํ˜ผ๋ž€์Šค๋Ÿฝ๊ธฐ๋„ ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋งค๋ฒˆ ์™„์ „ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์ƒˆ๋กœ ๋งŒ๋“œ๋Š” ๋ฐฉ์‹๊ณผ ๋น„๊ตํ–ˆ์„ ๋•Œ ์–ด๋–ค ์ ‘๊ทผ์ด ๋” ์œ ์ง€๋ณด์ˆ˜์— ์œ ๋ฆฌํ• ๊นŒ์š”?

@BBAK-jun BBAK-jun changed the title Hard [3ํŒ€ ์—ฌ์ง„์„] Chapter ๐Ÿฆ 3-1. ํ”„๋ก ํŠธ์—”๋“œ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ๐Ÿฆ Aug 16, 2025
@realstone2 realstone2 changed the title [3ํŒ€ ์—ฌ์ง„์„] Chapter ๐Ÿฆ 3-1. ํ”„๋ก ํŠธ์—”๋“œ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ๐Ÿฆ [3ํŒ€ ์—ฌ์ง„์„] Chapter ๐Ÿฆ 3-1. ํ”„๋ก ํŠธ์—”๋“œ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ Aug 16, 2025
@BBAK-jun BBAK-jun changed the title [3ํŒ€ ์—ฌ์ง„์„] Chapter ๐Ÿฆ 3-1. ํ”„๋ก ํŠธ์—”๋“œ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ [3ํŒ€ ๋ฐ•์ค€ํ˜•] Chapter ๐Ÿฆ 3-1. ํ”„๋ก ํŠธ์—”๋“œ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ๐Ÿฆ Aug 16, 2025
@realstone2 realstone2 changed the title [3ํŒ€ ๋ฐ•์ค€ํ˜•] Chapter ๐Ÿฆ 3-1. ํ”„๋ก ํŠธ์—”๋“œ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ๐Ÿฆ [3ํŒ€ ์—ฌ์ง„์„] Chapter ๐Ÿฆ 3-1. ํ”„๋ก ํŠธ์—”๋“œ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ Aug 16, 2025
@BBAK-jun BBAK-jun changed the title [3ํŒ€ ์—ฌ์ง„์„] Chapter ๐Ÿฆ 3-1. ํ”„๋ก ํŠธ์—”๋“œ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ [3ํŒ€ ์—ฌ์ง„์„] Chapter ๐Ÿฆ 3-1. ํ”„๋ก ํŠธ์—”๋“œ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ๐Ÿฆ Aug 16, 2025
@realstone2 realstone2 changed the title [3ํŒ€ ์—ฌ์ง„์„] Chapter ๐Ÿฆ 3-1. ํ”„๋ก ํŠธ์—”๋“œ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ๐Ÿฆ [3ํŒ€ ์—ฌ์ง„์„] Chapter ๐Ÿฆ 3-1. ํ”„๋ก ํŠธ์—”๋“œ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ Aug 16, 2025
@BBAK-jun BBAK-jun changed the title [3ํŒ€ ์—ฌ์ง„์„] Chapter ๐Ÿฆ 3-1. ํ”„๋ก ํŠธ์—”๋“œ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ [3ํŒ€ ๋ฐ•์ค€ํ˜•] Chapter ๐Ÿฆ 3-1. ํ”„๋ก ํŠธ์—”๋“œ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ๐Ÿฆ Aug 16, 2025
@lieblichoi lieblichoi changed the title [3ํŒ€ ๋ฐ•์ค€ํ˜•] Chapter ๐Ÿฆ 3-1. ํ”„๋ก ํŠธ์—”๋“œ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ๐Ÿฆ [3ํŒ€ ๋ฐ•์ค€ํ˜•] Chapter ๐Ÿฆ 3-1. ํ”„๋ก ํŠธ์—”๋“œ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ Aug 16, 2025
@BBAK-jun BBAK-jun changed the title [3ํŒ€ ๋ฐ•์ค€ํ˜•] Chapter ๐Ÿฆ 3-1. ํ”„๋ก ํŠธ์—”๋“œ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ๐Ÿฆ [3ํŒ€ ๋ฐ•์ค€ํ˜•] Chapter ๐Ÿฆ 3-1. ํ”„๋ก ํŠธ์—”๋“œ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ๐Ÿฆ Aug 16, 2025
@BBAK-jun BBAK-jun changed the base branch from main to hard August 16, 2025 08:26
- add documentation for getWeeksAtMonth function
- add documentation for getEventsForDay function
- add documentation for formatWeek function
- add documentation for stripTime helper function
- add documentation for fillZero function
- add documentation for formatDate function
- add documentation for filterEventsByDateRange function
- add documentation for containsTerm function
- add documentation for searchEvents function
- add documentation for filterEventsByDateRangeAtWeek function
- add documentation for filterEventsByDateRangeAtMonth function
โ€ฆction

- add comprehensive documentation for getTimeErrorMessage function
- include parameter descriptions and validation logic
- add usage examples for different validation scenarios
โ€ฆ functions

- add documentation for parseDateTime function
- add documentation for convertEventToDateRange function
- add documentation for isOverlapping function
- add documentation for findOverlappingEvents function
- include overlap detection algorithm details and usage examples
- add comprehensive documentation for fetchHolidays function
- include parameter and return value descriptions
- add usage examples for different months and scenarios
- document 2025 holiday data filtering logic
- include updated notification utility functions
- add test file updates for comprehensive coverage
- improve test readability with descriptive and meaningful test cases
- apply Given-When-Then structure for better test organization
- ensure tests focus on observable behavior rather than implementation details
- add comprehensive test coverage for edge cases and boundary conditions
- expect ๋ฌธ์„ ์ œ๊ฑฐํ•˜๊ณ  assertDate๋ฅผ ์ง์ ‘ ํ˜ธ์ถœํ•˜์—ฌ ํ…Œ์ŠคํŠธ ๊ฐ€๋…์„ฑ์„ ๊ฐœ์„ 
- ๊ฐ ํ…Œ์ŠคํŠธ์˜ ์˜๋„๋ฅผ ๋ช…ํ™•ํžˆ ๋“œ๋Ÿฌ๋‚ด์–ด ์œ ์ง€๋ณด์ˆ˜ ์šฉ์ด์„ฑ ์ฆ๊ฐ€
@tooth-is-silver
Copy link

ใ…‹ใ…‹ใ…‹ใ…‹ใ…‹ใ…‹ใ…‹ใ…‹ใ…‹ใ…‹ใ…‹ใ…‹ใ…‹ใ…‹ใ…‹ใ…‹ PR ์ˆ˜์ • ๋‚ด์—ญ ๊ณ ๋ฆด๋ผ ํŒŒ๋คผ~~

- useCalendarView ํ…Œ์ŠคํŠธ์—์„œ ์—ฌ๋Ÿฌ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋ฅผ skip ์ฒ˜๋ฆฌํ•˜์—ฌ ํ–ฅํ›„ ๊ตฌํ˜„์„ ์œ„ํ•œ ์ค€๋น„
- useSearch ํ…Œ์ŠคํŠธ์—์„œ ๊ฒ€์ƒ‰์–ด ์ฒ˜๋ฆฌ ๊ด€๋ จ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋ฅผ skip ์ฒ˜๋ฆฌํ•˜์—ฌ ๊ฐ€๋…์„ฑ ํ–ฅ์ƒ
- ๊ฐ ํ…Œ์ŠคํŠธ์˜ ์˜๋„๋ฅผ ๋ช…ํ™•ํžˆ ๋“œ๋Ÿฌ๋‚ด์–ด ์œ ์ง€๋ณด์ˆ˜ ์šฉ์ด์„ฑ ์ฆ๊ฐ€
- package.json์— @eslint/js ํŒจํ‚ค์ง€๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ESLint ๊ด€๋ จ ๊ธฐ๋Šฅ์„ ๊ฐ•ํ™”
- pnpm-lock.yaml ํŒŒ์ผ์„ ์—…๋ฐ์ดํŠธํ•˜์—ฌ ์ƒˆ๋กœ์šด ์˜์กด์„ฑ์˜ ๋ฒ„์ „ ๋ฐ ๋ฌด๊ฒฐ์„ฑ ์ •๋ณด ๋ฐ˜์˜
- App.tsx์—์„œ ์ด๋ฒคํŠธ ๊ด€๋ฆฌ UI๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ถ„๋ฆฌํ•˜์—ฌ EventFormSection, CalendarViewSection, EventListSection์œผ๋กœ ๋‚˜๋ˆ„์–ด ๊ฐ€๋…์„ฑ์„ ํ–ฅ์ƒ
- ๊ฐ ์ปดํฌ๋„ŒํŠธ๋Š” ์ด๋ฒคํŠธ ์ถ”๊ฐ€/์ˆ˜์ •, ๋‹ฌ๋ ฅ ๋ทฐ, ์ด๋ฒคํŠธ ๋ชฉ๋ก ํ‘œ์‹œ ๊ธฐ๋Šฅ์„ ๋‹ด๋‹น
- ๋ถˆํ•„์š”ํ•œ ์ฝ”๋“œ ์ œ๊ฑฐ ๋ฐ ๊ตฌ์กฐ ๊ฐœ์„ ์œผ๋กœ ์œ ์ง€๋ณด์ˆ˜ ์šฉ์ด์„ฑ ์ฆ๊ฐ€
- useEventOperations ํ›…์˜ ์ดˆ๊ธฐ ๋ฐ์ดํ„ฐ ๋กœ๋”ฉ, ์ƒˆ ์ด๋ฒคํŠธ ์ƒ์„ฑ, ๊ธฐ์กด ์ด๋ฒคํŠธ ์ˆ˜์ •, ์ด๋ฒคํŠธ ์‚ญ์ œ ๋ฐ ์—๋Ÿฌ ์ฒ˜๋ฆฌ์— ๋Œ€ํ•œ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋ฅผ ์ถ”๊ฐ€
- ๊ฐ ํ…Œ์ŠคํŠธ๋Š” Given-When-Then ๊ตฌ์กฐ๋ฅผ ๋”ฐ๋ฅด๋ฉฐ, ์˜๋„๋ฅผ ๋ช…ํ™•ํžˆ ๋“œ๋Ÿฌ๋‚ด์–ด ๊ฐ€๋…์„ฑ์„ ํ–ฅ์ƒ
- ์ด๋ฒคํŠธ ๋ชฉ๋ก ๋ณ€๊ฒฝ์— ๋Œ€ํ•œ ์•Œ๋ฆผ ์ƒ์„ฑ ๋ฐ ์ค‘๋ณต ์•Œ๋ฆผ ๋ฐฉ์ง€ ๋กœ์ง์— ๋Œ€ํ•œ ํ…Œ์ŠคํŠธ๋ฅผ ํฌํ•จ
- ํ…Œ์ŠคํŠธ์˜ ์•ˆ์ •์„ฑ์„ ๋†’์ด๊ธฐ ์œ„ํ•ด ๋น„๋™๊ธฐ ์ž‘์—…์— ๋Œ€ํ•œ ๋Œ€๊ธฐ ๋ฐ ์ƒํƒœ ๊ฒ€์ฆ ์ถ”๊ฐ€
- MSW ํ•ธ๋“ค๋Ÿฌ๋ฅผ ํ†ตํ•ด ์ด๋ฒคํŠธ์˜ ์ƒ์„ฑ, ์ˆ˜์ •, ์‚ญ์ œ ๋ฐ ์กฐํšŒ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€
- ์ด๋ฒคํŠธ ๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•œ EventTestStore ํด๋ž˜์Šค๋ฅผ ์ƒˆ๋กœ ์ƒ์„ฑํ•˜์—ฌ ํ…Œ์ŠคํŠธ์˜ ๋…๋ฆฝ์„ฑ๊ณผ ์•ˆ์ •์„ฑ ํ–ฅ์ƒ
- ๊ฐ ํ•ธ๋“ค๋Ÿฌ๋Š” HTTP ์š”์ฒญ์— ๋Œ€ํ•œ ์ ์ ˆํ•œ ์‘๋‹ต์„ ๋ฐ˜ํ™˜ํ•˜๋ฉฐ, ์ด๋ฒคํŠธ ๋ชฉ๋ก์„ ๊ด€๋ฆฌํ•˜๋Š” ๋กœ์ง์„ ํฌํ•จ
- ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•œ ๊ฐ„๋‹จํ•œ ์ด๋ฒคํŠธ ์ƒ์„ฑ ํ•จ์ˆ˜ ๋ฐ ํ•ธ๋“ค๋Ÿฌ ์„ค์ • ํ•จ์ˆ˜ ์ถ”๊ฐ€๋กœ ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ ๊ฐœ์„ 
- ์ผ์ • ์ถ”๊ฐ€, ์ˆ˜์ •, ์‚ญ์ œ ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ๋‹ค์–‘ํ•œ ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ํฌํ•จํ•œ ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑ
- ๊ฐ ํ…Œ์ŠคํŠธ๋Š” Given-When-Then ๊ตฌ์กฐ๋ฅผ ๋”ฐ๋ฅด๋ฉฐ, ํผ ์š”์†Œ์˜ ๋ Œ๋”๋ง ๋ฐ ์‚ฌ์šฉ์ž ์ž…๋ ฅ์— ๋Œ€ํ•œ ๊ฒ€์ฆ์„ ํฌํ•จ
- ์ฃผ๋ณ„ ๋ฐ ์›”๋ณ„ ๋ทฐ์—์„œ ์ผ์ • ํ‘œ์‹œ ์—ฌ๋ถ€์— ๋Œ€ํ•œ ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€
- ์ผ์ • ๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ ๋ฐ ์ถฉ๋Œ ๊ฒ€์‚ฌ์— ๋Œ€ํ•œ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋ฅผ ํฌํ•จํ•˜์—ฌ ์ „์ฒด์ ์ธ ํ…Œ์ŠคํŠธ ์ปค๋ฒ„๋ฆฌ์ง€ ํ–ฅ์ƒ
@YeongseoYoon-hanghae
Copy link

"TDD๋Š” ์‹œ๊ฐ„๋‚ญ๋น„๋‹ค" - ๋ฐ•์ค€ํ˜•์ด ํญ๋กœํ•œ ์ถฉ๊ฒฉ์  ์ง„์‹ค
"Uncle Bob ํ‹€๋ ธ๋‹ค!" ์˜ˆ๋น„ 10๋…„์ฐจ ๊ฐœ๋ฐœ์ž ๋ฐ•์ค€ํ˜•์ด ๊นŒ๋ฐœ๋ฆฐ TDD์˜ ๋ฏผ๋‚ฏ
"TDD ํ•˜๋‹ค๊ฐ€ ํšŒ์‚ฌ ๋งํ–ˆ์Šต๋‹ˆ๋‹ค" - ๋ฐ•์ค€ํ˜•์˜ ๋ผˆ์•„ํ”ˆ ๊ณ ๋ฐฑ
"TDD ์‹ ๋ด‰์ž๋“ค์ด ์ˆจ๊ธฐ๋Š” ๋”๋Ÿฌ์šด ๋น„๋ฐ€" - ํ˜„์ง ๊ฐœ๋ฐœ์ž ๋ฐ•์ค€ํ˜• ํญ๋กœ์ „
"๋ฐ•์ค€ํ˜• vs ํ˜„์‹ค: TDD๊ฐ€ ํ”„๋กœ์ ํŠธ ์ฃฝ์ด๋Š” ๋ฐฉ๋ฒ•"
"TDD ๊ฐ•์š”ํ•˜๋Š” ํšŒ์‚ฌ = ๋ธ”๋ž™๊ธฐ์—…" ๋ฐ•์ค€ํ˜• ๋ถ„๋…ธ ํญ๋ฐœ

@chan9yu
Copy link
Member

chan9yu commented Aug 22, 2025

"TDD๋Š” ๊ฐœ๋ฐœ์ž์˜ ์ธ์ƒ์„ ๊ฐ‰์•„๋จน๋Š”๋‹ค" - ๋ฐ•์ค€ํ˜•์˜ ํ†ต๋ ฌํ•œ ์ผ์นจ
"Uncle Bob์˜ ๊ฑฐ์ง“๋ง? TDD ํ™˜์ƒ ๋ฐ•์‚ด๋‚ธ ๋ฐ•์ค€ํ˜•"
"TDD ๋•Œ๋ฌธ์— ํ”„๋กœ์ ํŠธ ์ง€์˜ฅํ–‰" - 10๋…„์ฐจ ๊ฐœ๋ฐœ์ž ์˜ˆ๋น„ ๋ฐ•์ค€ํ˜•์˜ ํญ๋กœ
"TDD? ์‹œ๊ฐ„๋งŒ ํƒœ์šฐ๋Š” ๊ฐœ๋ฐœ์ž ๊ตด๋ ˆ" ๋ฐ•์ค€ํ˜•์˜ ๋ถ„๋…ธ ์ธํ„ฐ๋ทฐ
"TDD ์‹ ํ™”๋Š” ๋๋‚ฌ๋‹ค" - ๋ฐ•์ค€ํ˜•, ํ˜„์‹ค ํญ๊ฒฉ
"TDD ๊ฐ•์š”ํ•˜๋Š” ์ˆœ๊ฐ„ ํšŒ์‚ฌ๋Š” ๋งํ•œ๋‹ค" ๋ฐ•์ค€ํ˜•์˜ ๋…์„ค
"์‹ค๋ฆฌ์ฝ˜๋ฐธ๋ฆฌ์˜ ์†์ž„์ˆ˜? TDD์— ์†์€ ํ•œ๊ตญ ๊ฐœ๋ฐœ์ž๋“ค์˜ ๋น„๊ทน"
"TDD ์ข…๊ต ์ง‘๋‹จ, ๊ทธ๋“ค์˜ ์ถ”์•…ํ•œ ์‹ค์ฒด" ๋ฐ•์ค€ํ˜• ์ง๊ฒฉํƒ„
"๋ฐ•์ค€ํ˜•์˜ ์ตœํ›„ํ†ต์ฒฉ: TDD๋Š” ๋” ์ด์ƒ ๊ฐœ๋ฐœ์˜ ๋ฏธ๋ž˜๊ฐ€ ์•„๋‹ˆ๋‹ค"
"TDD ๋•Œ๋ฌธ์— ํ‡ด์‚ฌํ–ˆ๋‹ค" - ํ•œ ๊ฐœ๋ฐœ์ž์˜ ๋ฆฌ์–ผ ๊ณ ๋ฐฑ

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants