BBAK-jun λ‹˜μ˜ μƒμ„ΈνŽ˜μ΄μ§€ > [3νŒ€ λ°•μ€€ν˜•] Chapter 🦍 3-1. ν”„λ‘ νŠΈμ—”λ“œ ν…ŒμŠ€νŠΈ μ½”λ“œ 🦍

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()λ₯Ό 톡해 기본값을 μ„ΈνŒ…ν•˜κ³  ν•„μš”ν•œ λΆ€λΆ„λ§Œ μ˜€λ²„λΌμ΄λ“œν•˜λŠ” 방식을 μΌμŠ΅λ‹ˆλ‹€. 그런데 κ²½μš°μ— 따라선 였히렀 ν˜Όλž€μŠ€λŸ½κΈ°λ„ ν–ˆμŠ΅λ‹ˆλ‹€. 맀번 μ™„μ „ν•œ 데이터λ₯Ό μƒˆλ‘œ λ§Œλ“œλŠ” 방식과 λΉ„κ΅ν–ˆμ„ λ•Œ μ–΄λ–€ 접근이 더 μœ μ§€λ³΄μˆ˜μ— μœ λ¦¬ν• κΉŒμš”?

과제 ν”Όλ“œλ°±

μ•ˆλ…•ν•˜μ„Έμš” μ€€ν˜•λ‹˜! 7μ£Όμ°¨ 과제 잘 μ§„ν–‰ν•΄μ£Όμ…¨λ„€μš” γ…Žγ…Ž

μ€€ν˜•λ‹˜κ»˜μ„œ μž‘μ„±ν•΄μ£Όμ‹  ν…ŒμŠ€νŠΈμ— λŒ€ν•œ 관점이 무척 μΈμƒμ μ΄μ—ˆμ–΄μš”. μ €λŠ” 이런 생각을 해본적이 λ”±νžˆ μ—†μ—ˆλŠ”λ°, 덕뢄에 쒋은 μΈμ‚¬μ΄νŠΈ μ–»μ–΄κ°‘λ‹ˆλ‹€!

ν”„λ‘ νŠΈλŠ” κ²°κ΅­ data의 ν‘œν˜„μ— 집쀑이 λ˜μ–΄μžˆλŠ” κ²½μš°κ°€ λ§Žλ‹€λ³΄λ‹ˆ.. ν…ŒμŠ€νŠΈμ˜ 효과λ₯Ό μ²΄κ°ν•˜κΈ° μ–΄λ €μš΄ 뢀뢄이 λΆ„λͺ… 있으리라 μƒκ°ν•΄μš”. λ‹€λ§Œ 이것도 μ–΄λ–€ μ„œλΉ„μŠ€ ν˜Ήμ€ 도ꡬλ₯Ό λ§Œλ“œλƒμ— 따라 λ‹¬λΌμ§ˆ 수 μžˆμ–΄μ„œ ν…ŒμŠ€νŠΈ μ•žμ—λŠ” "λΉ„μ¦ˆλ‹ˆμŠ€"에 λŒ€ν•œ λ‚΄μš©μ΄ μΆ”κ°€λ˜μ–΄μ•Ό ν•œλ‹€κ³  μƒκ°ν•œλ‹΅λ‹ˆλ‹€ γ…‹γ…‹

μ œκ°€ λ§Œλ“œλŠ” μ œν’ˆμ˜ 경우 ux보단 μ§„μ§œλ‘œ λ°±μ—”λ“œμ²˜λŸΌ 데이터에 λŒ€ν•œ input/output 이 무척 μ€‘μš”ν•˜λ‹€λ³΄λ‹ˆ..

EventTestStore νŒ¨ν„΄: Map 기반으둜 κ΅¬ν˜„ν–ˆλŠ”λ°, 이 방식이 λ‹€λ₯Έ ν”„λ‘œμ νŠΈμ—μ„œλ„ 일반적으둜 μ‚¬μš©ν•˜λŠ” 접근인지 κΆκΈˆν•©λ‹ˆλ‹€. factory νŒ¨ν„΄μ΄λ‚˜ builder νŒ¨ν„΄μœΌλ‘œ ν™•μž₯ν•˜λŠ” 게 더 μ μ ˆν• κΉŒμš”?

일반적인 접근은 μ•„λ‹ˆλΌκ³  λŠκΌˆμ–΄μš”. 이게 ν•„μš”ν•œ μ΄μœ κ°€ 각 ν…ŒμŠ€νŠΈκ°€ λ‹€λ£¨λŠ” 데이터λ₯Ό λ…λ¦½μ μœΌλ‘œ 닀루기 μœ„ν•¨μΈλ° 보톡 beforeEach, beforeAll, afterEach, afterAll λ“±μ—μ„œ μ΄ˆκΈ°ν™”λ₯Ό ν•΄μ£Όκ³ , μ΄ˆκΈ°ν™”κ³Ό μ™„λ£Œλœ μ‹œμ μ— ν…ŒμŠ€νŠΈλ₯Ό μ§„ν–‰ν•œλ‹€κ±°λ‚˜ ν•˜λ‹ˆκΉŒμš” γ…Žγ…Ž

μ€€ν˜•λ‹˜κ»˜μ„œ λ§Œλ“€μ–΄μ£Όμ‹ κ±΄ 데이터λ₯Ό μ΄ˆκΈ°ν™”ν•œλ‹€κΈ°λ³΄λ‹¨ 데이터λ₯Ό μ•„μ˜ˆ λ…λ¦½μ μœΌλ‘œ λΆ„λ¦¬ν•΄μ„œ κ΄€λ¦¬ν•˜λ©΄ μ’‹μ§€ μ•Šμ„κΉŒ!? λΌλŠ” μ˜λ„λ‘œ λ³΄μ˜€μŠ΅λ‹ˆλ‹€. 쒋은 아이디어라고 μƒκ°ν•΄μš”!

그리고 이걸 λ§Œλ“€μ–΄κ°€λŠ” 방식은.. builderλŠ” 잘 λͺ¨λ₯΄κ² κ³  factory (createData 같은...?) λ°©μ‹μœΌλ‘œ λ§Œλ“€λ©΄ λ‚˜μ˜μ§€ μ•Šμ„ 것 κ°™λ„€μš”!

잘 μƒκ°ν•΄λ³΄λ‹ˆ, 저희 νŒ€μ€ create~~~ λ°©μ‹μœΌλ‘œ ν…ŒμŠ€νŠΈ 데이터λ₯Ό 각 ν…ŒμŠ€νŠΈλ§ˆλ‹€ λ§Œλ“€μ–΄μ„œ μ‚¬μš©ν•˜κ³  μžˆλ„€μš” γ…‹γ…‹

톡합 ν…ŒμŠ€νŠΈ λ²”μœ„: medium.integration.spec.tsx 같은 경우, "일정 μΆ”κ°€" ν…ŒμŠ€νŠΈμ—μ„œ 폼 μž…λ ₯ β†’ μ €μž₯ β†’ λͺ©λ‘ ν™•μΈκΉŒμ§€ μ „ 과정을 ν•œ ν…ŒμŠ€νŠΈλ‘œ λ‘μ—ˆλŠ”λ°μš”. μ΄λ ‡κ²Œ κΈ΄ μ‹œλ‚˜λ¦¬μ˜€λ₯Ό κ·ΈλŒ€λ‘œ λ‘λŠ” 게 λ§žλŠ”μ§€, μ•„λ‹ˆλ©΄ μͺΌκ°œλŠ” 게 더 λ°”λžŒμ§ν•œμ§€ κ³ λ―Όμž…λ‹ˆλ‹€. λ§Œμ•½ μͺΌκ° λ‹€λ©΄ μ–΄λ–€ 기쀀이 μ μ ˆν• κΉŒμš”?

문제λ₯Ό 잘 λ°œκ²¬ν•  수 μžˆλ‹€λ©΄ μ–΄λ–€ 방식이든 μ€‘μš”ν• κΉŒ? 라고 μƒκ°ν•΄μš”. λ¬Όλ‘  ν…ŒμŠ€νŠΈλ₯Ό 더 잘 μž‘μ„±ν•˜κ³  관리할 수 μžˆλŠ” 방법이 μžˆκ² μ§€λ§Œ μ€‘μš”ν•œκ±΄ ν…ŒμŠ€νŠΈλ₯Ό 톡해 μ‚¬μ΄λ“œ μ΄νŽ™νŠΈλ₯Ό μ°Ύμ•„μ„œ 쑰기쑰치 ν•  수 μžˆλŠ”κ²Œ ν…ŒμŠ€νŠΈμ˜ 첫 번째 원칙이라고 슀슀둜 μƒκ°ν•˜κ³  μžˆμ–΄μš”.

κ·Έλž˜μ„œ 말씀해주신 것 처럼 해도 λ¬΄λ°©ν•˜κ³ , 이걸 μͺΌκ° λ‹€λ©΄ μ•„λ§ˆ κ·Έλƒ₯ 일뢀 과정을 μœ ν‹Έ ν•¨μˆ˜ κ°™μ€κ±Έλ‘œ λΆ„λ¦¬ν•΄μ„œ λ‹€λ£° 수 μžˆμ§€ μ•Šμ„κΉŒ!? λΌλŠ” 생각이 λ“€μ–΄μš” γ…Žγ…Ž

이런 λŠλ‚Œμ΄μ£ .

test('일정 μΆ”κ°€ ν…ŒμŠ€νŠΈ', () => {
  νΌμž…λ ₯_검증();
  폼저μž₯_검증();
  λͺ©λ‘ν™•인_검증();
})

근데.. λ”±νžˆ 정닡은 μ—†λ‹€κ³  μƒκ°ν•΄μš” γ…‹γ…‹

ν…ŒμŠ€νŠΈ 데이터 관리: createTestEvent()λ₯Ό 톡해 기본값을 μ„ΈνŒ…ν•˜κ³  ν•„μš”ν•œ λΆ€λΆ„λ§Œ μ˜€λ²„λΌμ΄λ“œν•˜λŠ” 방식을 μΌμŠ΅λ‹ˆλ‹€. 그런데 κ²½μš°μ— 따라선 였히렀 ν˜Όλž€μŠ€λŸ½κΈ°λ„ ν–ˆμŠ΅λ‹ˆλ‹€. 맀번 μ™„μ „ν•œ 데이터λ₯Ό μƒˆλ‘œ λ§Œλ“œλŠ” 방식과 λΉ„κ΅ν–ˆμ„ λ•Œ μ–΄λ–€ 접근이 더 μœ μ§€λ³΄μˆ˜μ— μœ λ¦¬ν• κΉŒμš”?

μ–΄λ–€ 뢀뢄이 ν˜Όλž€μŠ€λŸ½κ²Œ λŠκ»΄μ‘Œμ„κΉŒμš”!? μœ μ§€λ³΄μˆ˜μ— 쒋은 방식이 뭘까 κ³ λ―Όν•΄λ³΄μžλ©΄, ν…ŒμŠ€νŠΈλ₯Ό 보고 μ–΄λ–€ 값이 ν‘œν˜„λ˜κ³  μžˆλŠ”μ§€ μ–΄λ–€ 값을 μˆ˜μ •ν–ˆλŠ”μ§€ ν•œ λˆˆμ— λ³Ό 수 있으면 μ’‹λ‹€κ³  μƒκ°ν•΄μš”. μž¬ν™œμš©μ˜ 츑면보닀 읽기가 μˆ˜μ›”ν•œκ°€? 에 λŒ€ν•œ 츑면이 ν…ŒμŠ€νŠΈμ—μ„œλŠ” 더 μ€‘μš”ν•˜λ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€!

κ·Έλž˜μ„œ μ§€κΈˆ 방식도 λ‚˜μ˜μ§€ μ•Šλ‹€κ³  μƒκ°ν•΄μš” γ…Žγ…Ž