[3ํ ๋ฐ์คํ] Chapter ๐ฆ 3-1. ํ๋ก ํธ์๋ ํ ์คํธ ์ฝ๋ ๐ฆ#4
[3ํ ๋ฐ์คํ] Chapter ๐ฆ 3-1. ํ๋ก ํธ์๋ ํ
์คํธ ์ฝ๋ ๐ฆ#4BBAK-jun wants to merge 32 commits intohanghae-plus:hardfrom
Conversation
- 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๋ฅผ ์ง์ ํธ์ถํ์ฌ ํ ์คํธ ๊ฐ๋ ์ฑ์ ๊ฐ์ - ๊ฐ ํ ์คํธ์ ์๋๋ฅผ ๋ช ํํ ๋๋ฌ๋ด์ด ์ ์ง๋ณด์ ์ฉ์ด์ฑ ์ฆ๊ฐ
|
ใ ใ ใ ใ ใ ใ ใ ใ ใ ใ ใ ใ ใ ใ ใ ใ 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 ๊ตฌ์กฐ๋ฅผ ๋ฐ๋ฅด๋ฉฐ, ํผ ์์์ ๋ ๋๋ง ๋ฐ ์ฌ์ฉ์ ์ ๋ ฅ์ ๋ํ ๊ฒ์ฆ์ ํฌํจ - ์ฃผ๋ณ ๋ฐ ์๋ณ ๋ทฐ์์ ์ผ์ ํ์ ์ฌ๋ถ์ ๋ํ ํ ์คํธ ์ถ๊ฐ - ์ผ์ ๊ฒ์ ๊ธฐ๋ฅ ๋ฐ ์ถฉ๋ ๊ฒ์ฌ์ ๋ํ ํ ์คํธ ์ผ์ด์ค๋ฅผ ํฌํจํ์ฌ ์ ์ฒด์ ์ธ ํ ์คํธ ์ปค๋ฒ๋ฆฌ์ง ํฅ์
|
"TDD๋ ์๊ฐ๋ญ๋น๋ค" - ๋ฐ์คํ์ด ํญ๋กํ ์ถฉ๊ฒฉ์ ์ง์ค |
|
"TDD๋ ๊ฐ๋ฐ์์ ์ธ์์ ๊ฐ์๋จน๋๋ค" - ๋ฐ์คํ์ ํต๋ ฌํ ์ผ์นจ |
HARD
PR ์ฒดํฌํฌ์ธํธ ๋ฐ ๊ตฌํ ๋ด์ฉ
7์ฃผ์ฐจ ๊ณผ์ ์ฒดํฌํฌ์ธํธ
๊ธฐ๋ณธ๊ณผ์
์ง๋ฌธ ๋ต๋ณ
Q1. handlersUtils์ ๋จ๊ธด ์ง๋ฌธ์ ๋ต๋ณํด์ฃผ์ธ์.
์ฒ์์๋ ๊ทธ๋ฅ
handlers.ts์์ ์ ์ญ events ๋ฐฐ์ด์ ๊ฐ ํ ์คํธ๋ง๋ค ์ด๊ธฐํํ๋ฉด ๋๊ฒ ๋ค๊ณ ์๊ฐํ์ต๋๋ค. ๊ทธ๋ฐ๋ฐ ์คํํด๋ณด๋ ํ ํ ์คํธ์์ ์ถ๊ฐํ ์ด๋ฒคํธ๊ฐ ๋ค๋ฅธ ํ ์คํธ์ ๋ํ๋๊ณ , ์ญ์ ํ ์คํธ๋ฅผ ๋๋ ธ๋๋ ์๋ฑํ ํ ์คํธ๊ฐ ๊นจ์ง๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ต๋๋ค.์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด
EventTestStoreํด๋์ค๋ฅผ ๋ง๋ค๊ณ , ๊ฐ ํ ์คํธ๋ง๋ค ๋ ๋ฆฝ์ ์ธ ์ ์ฅ์๋ฅผ ์์ฑํ๋๋ก ๋ฐ๊ฟจ์ต๋๋ค. Map ์๋ฃ๊ตฌ์กฐ๋ก CRUD๋ฅผ ๊ตฌํํ๊ณ ,setupMockEvents()์์ ๋งค๋ฒ ์๋ก์ด ์ธ์คํด์ค๋ฅผ ์์ฑํ๊ฒ ํ๋ ๋ณ๋ ฌ ์คํ์์๋ ์์ ์ ์ผ๋ก ๋์ํ์ต๋๋ค.Q2. ํ ์คํธ๋ฅผ ๋ ๋ฆฝ์ ์ผ๋ก ๊ตฌ๋์ํค๊ธฐ ์ํด ์์ฑํ๋ ์ค์ ๋ค์ ์๊ฐํด์ฃผ์ธ์.
์ฌ๋ฌ ์ํ์ฐฉ์ค ๋์ ๋ค์๊ณผ ๊ฐ์ ๋ฐฉ๋ฒ์ ์ ์ฉํ์ต๋๋ค.
crypto.randomUUID()์Date.now()๋ฅผ ์กฐํฉํด ์ฌ์ฉserver.use(...setupMockEvents([]))๋ก ์ด๊ธฐ ๋ฐ์ดํฐ ์ง์ vi.useFakeTimers()/vi.useRealTimers()๋ก ๊ฐ์ธ ํด๊ฒฐ์ฌํ ๊ณผ์
์ฃผ์ ๊ตฌํ ๋ด์ฉ
1. ํ ์คํธ ์์ ์ฑ ๊ฐ์
์ฒ์์ ํ๋์ฉ ์คํํ ๋๋ ํต๊ณผํ์ง๋ง ์ ์ฒด๋ฅผ ๋๋ฆฌ๋ฉด ์ ๋ฐ ์ด์์ด ๊นจ์ก์ต๋๋ค. ์์ธ์ด ์ ์ญ ๋ฐฐ์ด์ด๋ผ๋ ๊ฑธ ์์๋ด๊ธฐ๊น์ง ์๊ฐ์ด ๊ฝค ๊ฑธ๋ ธ์ต๋๋ค.
EventTestStore๋ฅผ ๋์ ํ ๋ค์๋ ์์ ๋ฌธ์ ๋ค์ด ์ด์ด์ก์ง๋ง, ๊ฒฐ๊ตญ ํต์ฌ์ "๊ฐ ํ ์คํธ๊ฐ ์์ ํ ๋ ๋ฆฝ๋ ํ๊ฒฝ์์ ๋์์ผ ํ๋ค"๋ ์ ์ด์์ต๋๋ค.2. ํตํฉ ํ ์คํธ ๊ฐ์
์ฌ์ฉ์ ์๋๋ฆฌ์ค๋๋ก ํ ์คํธ๋ฅผ ์ง๋ ๊ฒ ์๊ฐ๋ณด๋ค ์ฝ์ง ์์์ต๋๋ค. ์๋ฅผ ๋ค์ด "์ผ์ ์ถ๊ฐ"๋ง ํด๋ ์ ๋ ฅ โ ์ ์ฅ ๋ฒํผ ํด๋ฆญ โ ์๋ฒ ์์ฒญ โ ๋ชฉ๋ก ์ ๋ฐ์ดํธ๊น์ง ๋จ๊ณ๊ฐ ๋ง๊ณ , ๋น๋๊ธฐ ์ฒ๋ฆฌ ๋๋ฌธ์
waitFor,findBy๋ฅผ ์์ฃผ ์ธ ์๋ฐ์ ์์์ต๋๋ค.3. ์ ํธ๋ฆฌํฐ ํจ์ ํ ์คํธ ๊ฐํ
์์ ํจ์๋ผ ์์ฑ์ ๋น๊ต์ ์์ํ์ง๋ง, ๋ ์ง ๊ด๋ จ ์ฃ์ง ์ผ์ด์ค(์ค๋ , ์๋ง ๋ฑ)๋ฅผ ๊ณ ๋ คํ๋ ๊ณผ์ ์ด ๊น๋ค๋ก์ ์ต๋๋ค.
๊ณผ์ ์ ํํ๊ณ
๊ธฐ์ ์ ์ฑ์ฅ
ํ๋ก ํธ์๋์ ๋ฐฑ์๋์์์ ํ ์คํ ๊ด์ ์ฐจ์ด
๋ฐฑ์๋์์๋ ๋๋ฉ์ธ ๊ฐ์ฒด์ ๋น์ฆ๋์ค ๋ก์ง์ด ์ค์ฌ์ ๋๋ค.
์ ๋ ํ ์คํธ๋ ์ ๋ ฅ๊ณผ ์ถ๋ ฅ๋ง ๋ช ํํ ์ ์ํ๋ฉด ๋์๊ณ , ๋ฆฌํฉํฐ๋ง ์ ์์ ๋ง ์ญํ ์ ์ถฉ์คํ ํ์ต๋๋ค.๋ฐ๋ฉด ํ๋ก ํธ์๋์์๋ ํจ์ฌ ๋ค๋ฅธ ์ฑ๊ฒฉ์ ์ด๋ ค์์ด ์์์ต๋๋ค.
EventTestStore๊ฐ์ ๋ณ๋์ ๊ตฌ์กฐ๋ฅผ ์ค๊ณํด์ผ๋ง ๋ณ๋ ฌ ์คํ ํ๊ฒฝ์์๋ ์์ ์ฑ์ ํ๋ณดํ ์ ์์์ต๋๋ค.์ฆ,
๊ณผ๊ฑฐ ๋ธ๋ก๊ทธ ๊ฒฝํ๊ณผ์ ์ฐ๊ฒฐ
๊ณผ๊ฑฐ์ ๋ธ๋ก๊ทธ ํฌ์คํ ์์,
๋ผ๋ ๊ฒฝํ์ ์ด ์ ์ด ์์ต๋๋ค. ๊ทธ๋๋ ๋ฆฌํฉํฐ๋ง์ ํ๋ฉฐ ๋๋ ์ ์ด์๋๋ฐ, ์ด๋ฒ ๊ณผ์ ๋ฅผ ํ๋ฉฐ ๋๊ฐ์ ๊นจ๋ฌ์์ ๋ค์ ํ์ต๋๋ค.
ํ๋ก ํธ์๋์์๋ ํ ์คํธ๊ฐ ์์ผ๋ ์ปดํฌ๋ํธ๋ฅผ ๋ถ๋ฆฌํ๊ณ , ํ ์ผ๋ก ๋ก์ง์ ์ถ์ถํ๊ณ , ๊ตฌ์กฐ๋ฅผ ๊ณผ๊ฐํ ๋ฐ๊พธ๋ ๊ณผ์ ์ด ๋๋ ต์ง ์์์ต๋๋ค. ์ด๋ฒ ๊ฒฝํ์ โํ ์คํธ๋ ๋ฐฑ์๋/ํ๋ก ํธ์๋๋ฅผ ๊ฐ๋ฆฌ์ง ์๊ณ ๊ฐ๋ฐ์์ ์์ ๊ฐ์ ๋์ฌ์ฃผ๋ ๊ฐ์ฅ ๊ฐ๋ ฅํ ๋๊ตฌโ๋ผ๋ ๊ฑธ ๋ค์ ํ๋ฒ ํ์ธํ ์๊ฐ์ด์์ต๋๋ค.
ํ์ด๋จธ ๊ด๋ จ ํ ์คํธ ์ด์
fake timer๋ฅผ ์ฐ๋ฉด์ ์๊ฐ์ด ์ง๋๋ ์๋ฆผ์ด ๋จ์ง ์๋ ๋ฌธ์ ๊ฐ ์์์ต๋๋ค. ์์ธ์ fake timer๋ ์๊ฐ์ ๊ฐ์ง๋ก ์งํ์ํค๋ ๋ฐ๋ฉด, React์ ์ํ ์ ๋ฐ์ดํธ๋
waitFor๋ ์ค์ ์๊ฐ์ ์ฐธ์กฐํ๋ค๋ ์ ์ด์์ต๋๋ค.(ํ๋ ์๋์ ์์๋๊ป ์ด๊ฑฐ ๋ญ๋? ์ฌ์ญค๋ณด๋ ๋๋ธ ์๋์ ๋งํฌ๋ฅผ ๋ณด๋ด์ฃผ๋๋ผ๊ณ ์. ํญ์ ๊ณ ๋ง์ด ์์๋ ใ ใ )
dom-testing-library #1218
ํด๊ฒฐ ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ์์ต๋๋ค.
shouldAdvanceTime์ต์ ์ ์๊ฒ ๋ ํ์์์ผ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์์์ต๋๋ค. ๋ฌธ์์์ ์ฐพ๊ธฐ ํ๋ค์ด ์ ๋ฅผ ๋ง์ด ๋จน์๋ ๋ถ๋ถ์ ๋๋ค.์ฝ๋ ํ์ง
EventTestStore์ค๊ณ. ๋จ์ํ Map๋ง์ผ๋ก๋ ๋ณต์กํ ๋ฌธ์ ๋ฅผ ๊น๋ํ๊ฒ ์ ๋ฆฌํ ์ ์์์ต๋๋ค.ํ์ต ํจ๊ณผ
ํ ์คํธ๊ฐ ๋ฆฌํฉํฐ๋ง ๊ณผ์ ์์ ์ผ๋ง๋ ํฐ ํ์ด ๋๋์ง ์ฒด๊ฐํ์ต๋๋ค. ๊ตฌ์กฐ๋ฅผ ๊ณผ๊ฐํ๊ฒ ๋ฐ๊ฟ ์ ์์๋ ๊ฑด, ํ ์คํธ๊ฐ ๊ธฐ๋ฅ์ด ์ ์ง๋๊ณ ์์์ ๋ณด์ฅํด์คฌ๊ธฐ ๋๋ฌธ์ ๋๋ค.
์์ง์ ์๊ฐ์ ํ ์คํธ๋ ์ค๋ ์ท ํ ์คํธ ํ์ฉ ์์ ์ด ์ ๋งคํ๊ฒ ๋๊ปด์ง๋๋ค. ์ด ๋ถ๋ถ์ ๋ ํ์ต์ด ํ์ํ ๊ฒ ๊ฐ์ต๋๋ค.
๊ณผ์ ํผ๋๋ฐฑ
๋ฆฌ๋ทฐ ๋ฐ๊ณ ์ถ์ ๋ด์ฉ
EventTestStore ํจํด
Map ๊ธฐ๋ฐ์ผ๋ก ๊ตฌํํ๋๋ฐ, ์ด ๋ฐฉ์์ด ๋ค๋ฅธ ํ๋ก์ ํธ์์๋ ์ผ๋ฐ์ ์ผ๋ก ์ฌ์ฉํ๋ ์ ๊ทผ์ธ์ง ๊ถ๊ธํฉ๋๋ค. factory ํจํด์ด๋ builder ํจํด์ผ๋ก ํ์ฅํ๋ ๊ฒ ๋ ์ ์ ํ ๊น์?
ํตํฉ ํ ์คํธ ๋ฒ์
medium.integration.spec.tsx๊ฐ์ ๊ฒฝ์ฐ, "์ผ์ ์ถ๊ฐ" ํ ์คํธ์์ ํผ ์ ๋ ฅ โ ์ ์ฅ โ ๋ชฉ๋ก ํ์ธ๊น์ง ์ ๊ณผ์ ์ ํ ํ ์คํธ๋ก ๋์๋๋ฐ์. ์ด๋ ๊ฒ ๊ธด ์๋๋ฆฌ์ค๋ฅผ ๊ทธ๋๋ก ๋๋ ๊ฒ ๋ง๋์ง, ์๋๋ฉด ์ชผ๊ฐ๋ ๊ฒ ๋ ๋ฐ๋์งํ์ง ๊ณ ๋ฏผ์ ๋๋ค. ๋ง์ฝ ์ชผ๊ฐ ๋ค๋ฉด ์ด๋ค ๊ธฐ์ค์ด ์ ์ ํ ๊น์?ํ ์คํธ ๋ฐ์ดํฐ ๊ด๋ฆฌ
createTestEvent()๋ฅผ ํตํด ๊ธฐ๋ณธ๊ฐ์ ์ธํ ํ๊ณ ํ์ํ ๋ถ๋ถ๋ง ์ค๋ฒ๋ผ์ด๋ํ๋ ๋ฐฉ์์ ์ผ์ต๋๋ค. ๊ทธ๋ฐ๋ฐ ๊ฒฝ์ฐ์ ๋ฐ๋ผ์ ์คํ๋ ค ํผ๋์ค๋ฝ๊ธฐ๋ ํ์ต๋๋ค. ๋งค๋ฒ ์์ ํ ๋ฐ์ดํฐ๋ฅผ ์๋ก ๋ง๋๋ ๋ฐฉ์๊ณผ ๋น๊ตํ์ ๋ ์ด๋ค ์ ๊ทผ์ด ๋ ์ ์ง๋ณด์์ ์ ๋ฆฌํ ๊น์?