Skip to content
This repository was archived by the owner on Dec 30, 2021. It is now read-only.

Chapter 09. Unit Tests Part.1

sponge edited this page Oct 30, 2021 · 6 revisions

2021.10.30 (SAT) 10:20-12:00 (100mins)
πŸš€ Lead by. 'Jeongyeol'

Part.1 - Basic

μ‹€μ œ ν…ŒμŠ€νŠΈ λΌμ΄λΈŒλŸ¬λ¦¬λ‚˜ κ·Έ κΈ°λŠ₯을 일뢀 μ–ΈκΈ‰ν•˜μ§€λ§Œ κ΅¬ν˜„ 기술이 쀑심이 μ•„λ‹ˆλ‹ˆ κ±±μ •ν•˜μ§€ 말자 :)


Section-A. ν…ŒμŠ€νŠΈ μ½”λ“œ(test code)λž€ 무엇인가?

μ‚¬μ „μ—μ„œ testλŠ” 'μ§ˆλ¬Έμ΄λ‚˜ μ‹€ν—˜ν™œλ™μœΌλ‘œ μ•Œκ³  μžˆκ±°λ‚˜ κ°€λŠ₯ν•˜κ±°λ‚˜ μΆ”μΈ‘ν•œ 것을 ν™•μΈν•˜λŠ” ν–‰μœ„ λ˜λŠ” μˆ˜λ‹¨'으둜 μ •μ˜ν•œλ‹€.

λˆ„κ΅¬λ‚˜ ν•œλ²ˆμ―€μ€ "μž‘μ„±λœ μ½”λ“œλ₯Ό ν…ŒμŠ€νŠΈ ν•΄ 봐야해"λΌλŠ” 말을 λ“€μ–΄ λ³Έ 적 μžˆμ„ 것이닀.
이 말은 개발된 μ½”λ“œλ‘œ μˆ˜ν–‰λ˜λŠ” ν”„λ‘œκ·Έλž¨μ˜ λ™μž‘μ΄ μ˜λ„μ™€ 같은지 ν™•μΈν•˜λΌλŠ” 것과 κ°™λ‹€.

warining-sign μ™œ ν…ŒμŠ€νŠΈ μ½”λ“œκ°€ ν•„μš”ν•˜λ‹€κ³  λ§ν•˜λŠ” 걸까?

(λ‹Ήμž₯ κΈ°λŠ₯ κ°œλ°œν•  μ‹œκ°„λ„ μ—†λŠ”λ°, 정말 ν•„μš”ν•œ 걸까?)

1997λ…„λ§Œ 해도 TDD(Test Driven Development)λΌλŠ” κ°œλ…μ„ 아무도 λͺ°λžλ‹€.
μš°λ¦¬λ“€ λŒ€λ‹€μˆ˜μ—κ²Œ λ‹¨μœ„ ν…ŒμŠ€νŠΈλž€, 자기 ν”„λ‘œκ·Έλž¨μ΄ λŒμ•„κ°„λ‹€λŠ” μ‚¬μ‹€λ§Œ ν™•μΈν•˜λŠ” μΌνšŒμ„± μ½”λ“œμ— λΆˆκ³Όν–ˆλ‹€.
ν΄λž˜μŠ€μ™€ λ©”μ„œλ“œλ₯Ό 곡듀여 κ΅¬ν˜„ν•œ ν›„ μž„μ‹œ μ½”λ“œλ₯Ό κΈ‰μ‘°ν•΄ ν…ŒμŠ€νŠΈλ₯Ό μˆ˜ν–‰ν–ˆλŠ”λ°,
λŒ€κ°œλŠ” κ°„λ‹¨ν•œ λ“œλΌμ΄λ²„ ν”„λ‘œκ·Έλž¨μ„ κ΅¬ν˜„ν•΄ μžμ‹ μ΄ μ§  ν”„λ‘œκ·Έλž¨μ„ μˆ˜λ™μœΌλ‘œ μ‹€ν–‰ν–ˆλ‹€.

(μ€‘λž΅.. μ‹€ν–‰λœ ν…ŒμŠ€νŠΈ μ½”λ“œκ°€ μ’…λ£Œλ˜κΈ°κΉŒμ§€μ˜ κ³Όμ • μ„€λͺ…)

그것이 λ‚΄κ°€ ν•œ ν…ŒμŠ€νŠΈμ˜€λ‹€!
λŒμ•„κ°„λ‹€λŠ” 사싀을 ν™•μΈν•˜κ³  λ™λ£Œλ“€μ—κ²Œλ„ 보여쀬닀.
그러고 λ‚˜μ„œλŠ” ν…ŒμŠ€νŠΈ μ½”λ“œλ₯Ό 버렸닀.

CleanCode <Robert C. Marti> 9μž₯. λ‹¨μœ„ ν…ŒμŠ€νŠΈ (λ„μž…λΆ€)

A-1) ν…ŒμŠ€νŠΈ μ½”λ“œλ₯Ό 버렸닀

λ²„λ Έλ‹€λŠ” 사싀은 μš°λ¦¬κ°€ μƒκ°ν•˜λŠ” 것보닀 영ν–₯을 μ£ΌλŠ” λ²”μœ„κ°€ 크닀.
이런 경우(νƒ€ν˜‘ν•˜μžλŠ” μ†μ‚­μž„)λ₯Ό μ˜ˆμ‹œλ‘œ λ“€ 수 μžˆμ§€ μ•Šμ„κΉŒ?

  1. UI ν…ŒμŠ€νŠΈ μ‹œκ°„μ΄ μ΄‰λ°•ν•œ λ‚˜λ¨Έμ§€, λ°μ΄ν„°λ§Œ μž„μ‹œλ‘œ μ €μž₯해두고 직접 μž…λ ₯ν•΄μ„œ ν™•μΈν–ˆλ‹€.
    그리고 μ‚¬μš©ν•œ ν…ŒμŠ€νŠΈ 파일이 μ§€κΈˆμ€ 어디에 μžˆλŠ”μ§€ λͺ¨λ₯΄κ² λ‹€.

    ???: λ°°ν¬ν•΄μ„œ 문제 μ—†μ—ˆκ³  μ§€κΈˆλ„ 잘 λŒμ•„κ°€μž–μ•„. 뭐가 문젠데?

  2. κ΅¬ν˜„ν•˜λŠ” λ™μ•ˆ μš”κ±΄(Spec)이 계속 λ³€κ²½λ˜μ–΄μ„œ νšŒμ˜ν•˜λ©΄μ„œ λ§Œλ“€λ©΄μ„œ μ—¬λŸ¬λ²ˆ 고치고 λ‘œμ§μ„ ν™•μΈν–ˆλ‹€.
    κ·Έλž˜μ„œ ν…ŒμŠ€νŠΈ μ½”λ“œ 싀행은 컀녕 μ •μ˜λ„ 없이 개발이 μ™„λ£Œλ˜μ—ˆλ‹€.

    ???: λ²„κ·ΈλŠ” λ‚˜μ˜€λ©΄ 고치면 λ˜λŠ”λ° 뭐 γ…‹γ…‹γ…‹ μ™„λ²½ν•œ μ½”λ“œ μ§œλ €ν•˜μ§€λ§ˆ μ‹œκ°„ μ•„κΉŒμ›Œ~

  3. ν…ŒμŠ€νŠΈκ°€ ν•„μš”ν•œ λΆ€λΆ„μ˜ 개발이 끝났고, 자꾸 변경이 μΌμ–΄λ‚˜κ³  μžˆμ–΄μ„œ
    더이상 κ·Έ ν…ŒμŠ€νŠΈ μ½”λ“œλ₯Ό κ³ λ―Όν•˜μ§€ μ•Šκ²Œ λ˜μ—ˆλ‹€.

    ???: 경둜, 이름 자꾸 λ°”κΎΈκ²Œ 기획 λ’€μ§‘μ–΄μ—ŽλŠ” μ € XX μ§„μ§œ ν•˜..


A-2) Give & Take?

(μžμ˜λ“  νƒ€μ˜λ“ ) λˆ„κ΅¬λ‚˜ ν…ŒμŠ€νŠΈ μ½”λ“œλ₯Ό 버린 κ²½ν—˜μ€ λˆ„κ΅¬λ‚˜ μžˆμ„ 것이닀. 기얡을 λ– μ˜¬λ¦¬λ©°, μŠ€μŠ€λ‘œμ—κ²Œ μ•„λž˜ μ§ˆλ¬Έμ„ 던져보자.

❓ μ½”λ“œ 리뷰λ₯Ό 포함해 μ—΄μ‹¬νžˆ λ§Œλ“  λΉ„μ§€λ‹ˆμŠ€ λ‘œμ§μ€ μ„œλΉ„μŠ€ 이용자의 λ§Œμ‘±λ„λ₯Ό 보μž₯ν•˜λŠ”κ°€?

πŸ™… No! 그럴수 μ—†λ‹€

UXλ₯Ό κ³ λ €ν•œ ν”„λ‘œκ·Έλž¨μ΄ μ½”λ“œ 리뷰가 λ°˜λ“œμ‹œ ν¬ν•¨λ˜μ–΄μ•Όν•˜λŠ” ν•„μš”μ‘°κ±΄μ€ μ•„λ‹ˆλ‹€.

Code Reviewλž€?
λ³Έλž˜λŠ” μž‘μ„±λœ μ½”λ“œμ˜ μƒνƒœλ₯Ό 타인이 μΆ”κ°€λ‘œ λ³΄λŠ” cross-checkλ₯Ό μœ„ν•˜ μ‹œμž‘λ˜μ—ˆλ‹€. ν˜„μž¬λŠ” 주둜 μ£Όλ‹ˆμ–΄ 개발자(Jr.Dev) 비쀑이 높은 νŒ€μ—μ„œ μ‹œλ‹ˆμ–΄ 개발자(Sr.Dev)듀이 쀑심이 λ˜μ–΄ μˆ˜ν–‰ν•œλ‹€.
개발 μ½”λ“œλ₯Ό ν™•μΈν•˜κ³  νŒ€μ˜ μ „λž΅κ³Ό 지침을 κ³΅μœ ν•΄μ„œ ν’ˆμ§ˆμ„ 높이기 μœ„ν•œ μ˜μ‚¬ μ†Œν†΅ μˆ˜λ‹¨ 쀑 ν•˜λ‚˜μ΄κ³ , μ˜¬λ°”λ₯΄μ§€ λͺ»ν•œ μ½”λ“œλ₯Ό ν¬ν•¨ν•œ 컀밋을 ν•©μ³μ Έμ„œ 더 큰 문제λ₯Ό μ•ΌκΈ°ν•˜μ§€ μ•Šλ„λ‘ PRμ—μ„œ 특히 많이 ν™œμš©λœλ‹€.

λ”°λΌμ„œ λΉ„μ§€λ‹ˆμŠ€ 둜직의 μ½”λ“œ ν’ˆμ§ˆμ€ ν”„λ‘œκ·Έλž¨μ΄ UX와 μ•ˆμ •μ„±μ„ λ§Œμ‘±ν•˜λ„λ‘ 점차 μŒ“μ•„κ°€λ©΄μ„œ μ™„μ„±ν•˜λŠ” κ²ƒμ΄λ―€λ‘œ
μ½”λ“œ 리뷰가 UX와 같은 μ„œλΉ„μŠ€μ˜ ν’ˆμ§ˆμ„ 보μž₯ν•˜μ§€ λͺ»ν•œλ‹€.

(μ°Έκ³ ) ν”„λ‘œκ·Έλž¨ κ΅¬ν˜„ μ™Έμ£Ό 계약과 같은 κ°‘μ„κ΄€κ³„μ—μ„œμ˜ μ½”λ“œ κ²€μˆ˜μ™€λŠ” λ§₯락이 λ‹€λ₯΄λ‹€.
μ„μ‚¬μ—μ„œ μž‘μ„±ν•œ μ½”λ“œλ₯Ό 갑사가 μ œμΆœλ°›κ³  직접 κ²€μˆ˜(review)ν•˜κ±°λ‚˜ 제3μžκ°€ μˆ˜ν–‰ν•˜λŠ” 경우λ₯Ό μ˜λ―Έν•˜λŠ” 것은 μ•„λ‹ˆλ‹€.


❓ ν…ŒμŠ€νŠΈ μ½”λ“œ μž‘μ„±κ³Ό μ‹€ν–‰ 확인에 μ‹œκ°„μ„ μ†ŒλΉ„ν•˜μ§€ μ•Šμ•˜μœΌλ―€λ‘œ, 개발 μ‹œκ°„μ„ μ•„λ‚„ 수 μžˆμ—ˆλ‚˜?

πŸ€” Maybe..?

κ°œλ°œνŒ€μ€ μ•½μ†λœ λ§ˆκ°μΌμ„ μ§€μΌ°κ³ , 업무λ₯Ό 마치고 λ³΅κ·€ν–ˆμœΌλ‹ˆ μ‹œκ°„μ„ μ•„κΌˆλ‹€.

λ§Œμ•½ 방금 **κ·Έλ ‡μ§€ μ•Šλ‚˜? λΌλŠ” 생각이 λ“€μ—ˆλ‹€λ©΄,ν•œμ •λœ 기간에 λŒ€ν•œ μ±…μž„λ§Œμ„ μƒκ°ν–ˆκΈ° λ•Œλ¬Έμ΄λ¦¬λΌ.

λͺ¨λ“  ν”„λ‘œκ·Έλž¨μ€ λ°˜λ³΅λ˜λŠ” λ™μž‘μ— μž₯μ• λ‚˜ 버그 없이 κ³„μ†λœ μ‚¬μš©μ΄ κ°€λŠ₯ν•  λ•Œ 생λͺ…을 κ°€μ§„λ‹€.
즉, ν”„λ‘œμ νŠΈ 기간이 λλ‚˜μ„œ κ°œλ°œνŒ€μ€ μ² μˆ˜ν•˜λ”λΌλ„, ν”„λ‘œκ·Έλž¨μ€ λΉ„μ§€λ‹ˆμŠ€λ₯Ό μ§€νƒ±ν•΄μ•Όν•œλ‹€.

πŸ™… No! λ‹€μ‹œ λ‹΅ν•˜μžλ©΄

μ™„λ²½ν•œ ν”„λ‘œκ·Έλž¨μ΄λž€ μ‘΄μž¬ν•  수 μ—†λ‹€. λͺ¨λ“  μ½”λ“œλŠ” 잠재적으둜 버그가 될 수 μžˆλ‹€.

μ‹€ν—˜μ„ μ •κ΅ν•˜κ³  λ‹€μ–‘ν•˜κ²Œ ν• μˆ˜λ‘ 더 쒋은 μ œν’ˆμ΄ λ‚˜μ˜¨λ‹€λŠ” 것은 자λͺ…ν•œ 사싀이닀.
(ν•œκ°€ν•œ μ‹œκ°„μ— λ†€λ©΄μ„œ λ§Œλ“œλŠ” μ°½μž‘ν™œλ™μ΄ μ•„λ‹Œ) κΈ°μ—…μ˜ 이윀 좔ꡬλ₯Ό μ‹€ν–‰ν•  μ„œλΉ„μŠ€λ₯Ό κ°œλ°œν•˜λŠ” ν™œλ™μ€
μ‹œκ°„, μžμ›, λ…Έλ ₯ λ“± λΉ„μš©κ³Ό μ œν’ˆμ˜ ν’ˆμ§ˆ μ‚¬μ΄μ—μ„œ λΉ„μ§€λ‹ˆμŠ€μ™€ 고객 μ‹ λ’°λ₯Ό μ„±μ‚¬μ‹œμΌœμ•Ό ν•œλ‹€.

μ•„λž˜λŠ” μ˜ˆμ‹œλ₯Ό μ‚΄ν‘œλ³΄μž.
λ§Žμ€ λΉ„μš©μ΄ 투자된 μ„œλΉ„μŠ€κ°€ λ ˆκ±°μ‹œ μ½”λ“œ(legacy)μ—μ„œ μ•…λͺ½(nightmare)둜 κ°€λŠ” 과정을 μΆ•μ•½ν–ˆλ‹€.

  • [ꡬ좕 단계] 🀭
    κ°œλ°œμ‚¬κ°€ μ°©μˆ˜ν•˜κ³  μ„œλΉ„μŠ€ κ°œμ‹œ(launching)을 μ€€λΉ„ν•˜κ³  μžˆλ‹€.

  • [μ˜€ν”ˆ 직전] πŸ€”
    μš΄μ˜μ‚¬κ°€ ν•¨κ»˜ κ·Έκ°„ 개발된 λ‚΄μš©μ„ 인계 λ°›κ³ , Play book & Run book 등을 보고 운영 μ „λž΅μ„ μ€€λΉ„ν•œλ‹€.

  • [μ˜€ν”ˆ 직후] 😩
    μ˜€ν”ˆ 초창기 κ°œλ°œμ‚¬κ°€ κ΄€μ—¬ν•˜λ©° μ‘°μ†νžˆ 버그λ₯Ό μˆ˜μ •ν•˜κ³  배포해 μ•ˆμ •ν™”λ₯Ό κ±°μΉœλ‹€.

  • [운영 단계] 🀐
    μ•ˆμ •ν™”λœ μ„œλΉ„μŠ€μ˜ μ½”λ“œλ₯Ό λ³΄λŠ” 일은 적어지며 민원이 μ—†μœΌλ©΄ μ„œλ²„ 둜그만 보고 λ¬Έμ„œλ₯Ό μž‘μ„±ν•œλ‹€.

  • [보수 단계] 😱
    μ–΄λŠ μ‹œμ μ— μ„œλΉ„μŠ€μ˜ λ³€κ²½μ΄λ‚˜ λŒ€μ‘μ΄ ν•„μš”ν•œ μ‹œμ μ— 좔적이 μ–΄λ ΅κ³ , μž‘μ€ λ³€κ²½μœΌλ‘œ λŒ€κ·œλͺ¨ μž₯μ• κ°€ λ°œμƒν•œλ‹€.


❓ ν…ŒμŠ€νŠΈ μ½”λ“œλ₯Ό 버린 κ²°κ³ΌλŠ”? (Give & Take)

😩 이득 착각 λ­‰μΉ˜

  • 개발 μ‹œκ°„ μ ˆμ•½ ν˜Ήμ€ 단좕 (ν–ˆλ‹€κ³  착각) : λ³΄μˆ˜κ°€ μ–΄λ ΅κ±°λ‚˜ μž₯μ•  원인을 νŒŒμ•…ν•˜κΈ° μ–΄λ ΅λ‹€λ©΄?
  • μ½”λ“œ ν’ˆμ§ˆμ„ 높이기 μœ„ν•΄ 더 λ§Žμ€ μ‹œκ°„μœΌλ‘œ ν’ˆμ§ˆ 확보 (λ˜μ—ˆλ‹€κ³  착각) : μ–΄λ–»κ²Œ ν’ˆμ§ˆμ„ 보증?

🀐 ν˜Ήμ‹œ?

'λ‚΄κ°€ 더 빨리 개발 ν•˜λ €λ©΄ ν…ŒμŠ€νŠΈ μ½”λ“œλ₯Ό λ²„λ¦¬λŠ” 선택이 합리적이닀' 라고 μƒκ°ν•˜λŠ” μ‚¬λžŒμ΄λΌλ©΄,
수백, 수천개의 QA Check listλ₯Ό λ§Œλ‚œ κ²½ν—˜λ„ 없을 것이닀. 그렇기에 ν…ŒμŠ€νŠΈ μ½”λ“œ 생산은 μ—¬μ „νžˆ 낭비라고 μƒκ°ν•œλ‹€.
μ–΄μ©Œλ©΄, ν™•μΈν•˜μ§€ λͺ»ν•œ λ¦¬μŠ€ν¬λŠ” κ·Έλƒ₯ μ•ˆκ³  κ°€λŠ” 도박사..? (농담)


A-3) ν…ŒμŠ€νŠΈ μ½”λ“œλ₯Ό 버렸닀 = μ½”λ“œμ˜ ν’ˆμ§ˆκ³Ό 좔적을 ν¬κΈ°ν•œλ‹€

μ• μžμΌμ΄λ‚˜ TDD, CI/CD의 λͺ©ν‘œλŠ” 우리 IT λΆ„μ•Όμ˜ λˆˆλΆ€μ‹  μ„±μž₯을 μœ„ν•œ λ°©ν–₯에 찾은 방법듀이닀.
이 방법듀을 μ μš©ν•΄μ„œ 더 높은 μˆ˜μ€€μ˜ 개발 λŠ₯λ ₯(developer's performance)을 κ°–μΆ”λŠ” 것은
μžλ™ν™”ν•  수 μžˆλŠ” ν…ŒμŠ€νŠΈ μ½”λ“œλ₯Ό λ§Œλ“€κ³  λ™μž‘ μ‹œν‚¬ 수 μžˆλŠ”κ°€λΌλŠ” μ§€μ μ—μ„œ μ‹œμž‘λ  수 μžˆλ‹€.

(μ•ˆνƒ€κΉμ§€λ§Œ) ν…ŒμŠ€νŠΈ ν†΅κ³ΌλŠ” 'ν…ŒμŠ€νŠΈ λ‹Ήμ‹œ 컀밋(commit)'μ—μ„œ ν†΅κ³Όλ˜μ—ˆλ‹€λŠ” 사싀에 λΆˆκ³Όν•˜κΈ° λ•Œλ¬Έμ—,
(λ‹Ήμ—°ν•˜κ²Œλ„) λ³€κ²½λœ λ‹€μŒ 컀밋(commit)μ—μ„œλŠ” 이λ₯Ό 보μž₯ν•  수 μ—†λ‹€.
κ·Έλž˜μ„œ μš°λ¦¬λŠ” ν…ŒμŠ€νŠΈ μ½”λ“œλ₯Ό μž‘μ„±ν•˜κ³  κ²€μˆ˜ν•΄μ„œ μžλ™μœΌλ‘œ 확인해주길 λ°”λΌλŠ” μžλ™ν™”λ₯Ό κΏˆκΎΌλ‹€.

???:
"확인도 μ•ˆν•΄λ³΄κ³  λ°°ν¬ν–ˆμ–΄? λ„λŒ€μ²΄ 뭘 κ°œλ°œν•˜κ³  μžˆλŠ”κ±°λƒ?" (인성..)

λˆ„κ΅¬λ‚˜ 이런 말을 λ“£κΈ° μ‹«λ‹€.

(λ‹€ν–‰νžˆλ„) 이번 9μž₯ λ‹¨μœ„ν…ŒμŠ€νŠΈ 챕터λ₯Ό 톡해 TDD와 μ‹€μŠ΅μ„ κ²½ν—˜ν•œλ‹€λ©΄,
μ €λŸ° 사후 지적듀은 'νŒ€μ΄ 무λŠ₯ν•œ ν˜‘μ—… μ‹œμŠ€ν…œμ„ κ°€μ‘Œλ‹€'λŠ” 반증 μ΄λΌλŠ” 사싀을 μ΄ν•΄ν•˜κ³ 
μ•„λž˜μ™€ 같이 ν…ŒμŠ€νŠΈ μ½”λ“œκ°€ ν˜•μƒ 관리에 ν¬ν•¨λ˜μ–΄μ•Ό ν•œλ‹€λŠ” μ κΉŒμ§€ μ΄ν•΄ν•˜κ²Œ 될 것이닀.

ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€λ₯Ό λͺ¨λ‘ κ΅¬ν˜„ν•˜κ³  ν†΅κ³Όν•œ ν›„ λ‚΄ μ½”λ“œλ₯Ό μ‚¬μš©ν•  μ‚¬λžŒλ“€μ—κ²Œλ„ κ³΅κ°œν•  λ•Œ,
νƒœμŠ€νŠΈ μ½”λ“œμ™€ λ‚΄ μ½”λ“œλ₯Ό 같은 μ†ŒμŠ€ νŒ¨ν‚€μ§€λ‘œ ν™•μ‹€νžˆ λ¬Άμ–΄μ„œ 체크인(checkin)ν•΄μ•Όν•œλ‹€.

μ΄μ–΄μ§€λŠ” μ„Ήμ…˜Bμ—μ„œ μ–΄λ–»κ²Œ ν…ŒμŠ€νŠΈ 기반 개발(TDD)둜 κ΅¬μ„±ν•˜λŠ”μ§€ 사고 원리λ₯Ό μ‚΄νŽ΄λ³΄μž.


Section-B. TDD Cycle

B-1) TDD의 3κ°€μ§€ 법칙

사싀 TDDκ°€ μ‹€μ œ μ½”λ“œλ₯Ό μž‘μ„±ν•˜κΈ° 전에 λ‹¨μœ„ ν…ŒμŠ€νŠΈ μ½”κ·Έλ₯Ό 짜라고 μš”κ΅¬ν•œλ‹€.
그것은 μ•„λž˜μ˜ 법칙에 따라 κ°œλ°œμ„ μ§„ν–‰ν•˜λ„λ‘ μœ λ„λœ κ·œμΉ™μ΄λ‹€.

  • 첫째 법칙
    μ‹€νŒ¨ν•˜λŠ” λ‹¨μœ„ ν…ŒμŠ€νŠΈλ₯Ό μž‘μ„±ν•  λ•Œ κΉŒμ§€, μ‹€μ œ μ½”λ“œλ₯Ό μž‘μ„±ν•˜μ§€ μ•ŠλŠ”λ‹€.

  • λ‘˜μ§Έ 법칙
    μ»΄νŒŒμΌμ€ ν†΅κ³Όν•˜λ©΄μ„œ, ν…ŒμŠ€νŠΈ μ‹€ν–‰ κ²°κ³Όκ°€ μ‹€νŒ¨ν•˜λŠ” μˆ˜μ€€μ˜ λ‹¨μœ„ ν…ŒμŠ€νŠΈλ₯Ό μž‘μ„±ν•œλ‹€.

  • μ…‹μ§Έ 법칙
    ν˜„μž¬ μ‹€νŒ¨ν•˜λŠ” ν…ŒμŠ€νŠΈλ₯Ό 톡과할 μ •λ„λ‘œλ§Œ μ‹€μ œ μ½”λ“œλ₯Ό μž‘μ„±ν•œλ‹€.

(이쯀 되면 이런 μ˜λ¬Έμ„ κ°€μ§€λŠ” μ‚¬λžŒλ„ 있으리라.)
ν…ŒμŠ€νŠΈ μ½”λ“œκΉŒμ§€ μ½”λ“œ μž‘μ—…μ„ 더 많이 ν•΄μ•Όν•˜λŠ” 데, μ–΄λ–»κ²Œ 생산성이 ν–₯μƒλ˜λŠ”κ°€?

μœ„ μ„Έ κ°€μ§€ κ·œμΉ™μ„ μ€€μˆ˜ν•  λ•Œ, 개발과 ν…ŒμŠ€νŠΈλŠ” λŒ€λž΅ 30초 주기둜 묢인닀.
ν…ŒμŠ€νŠΈ μ½”λ“œκ°€ μ‹€μ œ μ½”λ“œλ³΄λ‹€ 뢈과 λͺ‡μ΄ˆ 전에 λ‚˜μ™€μ„œ, 주기의 끝에 ν…ŒμŠ€νŠΈ μ½”λ“œμ™€ μ‹€μ œ μ½”λ“œκ°€ ν•¨κ»˜ λ‚˜μ˜¨λ‹€.


B-2) 이런 생각도 ν•΄λ³΄μž

Q. 처음 ν™˜κ²½μ„ μ€€λΉ„κ±Έλ‘œ λ²…μ°¨μ„œ 30μ΄ˆλŠ” λ„˜λ˜λ°..?

λ¬Όλ‘  ν”„λ‘œμ νŠΈλ₯Ό κ΅¬μΆ•ν•œ μ΄ˆμ°½κΈ°λ‚˜ λ‹¨μœ„ ν…ŒμŠ€νŠΈλ₯Ό 처음 λ„μž…ν•˜λŠ” μ‹œμ μ—λŠ”
ν…ŒμŠ€νŠΈμ— ν•„μš”ν•œ λ‹€μ–‘ν•œ 라이브러리λ₯Ό κ΅¬μΆ•ν•˜κ³  예제λ₯Ό μž‘μ„±ν•˜λŠ” 일은 더 걸릴 수 μžˆλ‹€.
κ·ΈλŸ¬λ‹ˆ 각 언어와 ν”„λ ˆμž„μ›Œν¬ μ§„μ˜μ˜ ν‘œμ€€ ν…ŒμŠ€νŠΈ 라이브러리λ₯Ό μ‚¬μš©ν•˜κ³  곡식 λ„νλ¨ΌνŠΈλ₯Ό ν™œμš©ν•˜μž!


Q. ν…ŒμŠ€νŠΈ μ½”λ“œκ°€ ν•¨κ»˜ λ‚˜μ˜¨λ‹€λŠ” 것이 μ™œ μž₯점이 될까?

λ°˜λŒ€λ‘œ 개발이 λλ‚œ 뒀에 ν…ŒμŠ€νŠΈ μ½”λ“œλ₯Ό μž‘μ„±ν•˜λŠ” 경우λ₯Ό μƒκ°ν•΄λ³΄μž.
μš°λ¦¬λŠ” μƒˆλ‘œμš΄ ν”„λ‘œκ·Έλž¨μ„ μ„œλΉ„μŠ€λ‘œμ„œ μΆœμ‹œν•  λ•Œ, 이상이 μ—†λŠ”μ§€ 확인을 ν•œλ‹€.

  • μš°λ¦¬κ°€ κ°œλ°œν•œ ν”„λ‘œκ·Έλž¨μ„ 검사할 λ•Œ, ν˜Ήμ€ λ³„λ„μ˜ ν…ŒμŠ€νŠΈ μš”μ›μ΄ μžˆλŠ” κ²½μš°κΉŒμ§€ ν¬ν•¨ν•˜λ”λΌλ„
    ν…ŒμŠ€νŠΈ λŒ€μƒμ€ μΈμ§€ν•˜κ³  μžˆλŠ” κΈ°λŠ₯을 λŒ€μƒμœΌλ‘œ ν•œλ‹€. (know known things)

    know known: 이해 κ°€λŠ₯ν•œ λ²”μœ„μ—μ„œ ν•΄κ²°ν•΄μ•Ό ν•œλ‹€λŠ” 사싀을 μΈμ§€ν•œ μ˜μ—­

  • μ•ˆνƒ€κΉκ²Œλ„, μ‹œκ°„μ΄λ‚˜ μžμ›, λΉ„μš© λ“±μ˜ 이유둜 μ§„ν–‰λ˜μ§€ λͺ»ν•˜λŠ” ν˜„μ‹€μ μΈ κ²½μš°λ„ μžˆλ‹€.
    μΈμ§€ν–ˆμ§€λ§Œ ν™•μΈλ˜μ§€ λͺ»ν–ˆλ‹€λŠ” 사싀을 μ΄ν•΄ν•˜κ³ , μž₯μ• μœ„ν—˜ κ°μˆ˜ν•˜λŠ” 것이닀.

    know unknown: ν™•μΈν•˜μ§€ λͺ»ν–ˆκ³  μΆ”ν›„ ν•΄κ²°ν•΄μ•Ό ν•œλ‹€λŠ” 사싀을 μΈμ§€ν•œ μ˜μ—­

  • ν•œνŽΈ, 개발 κΈ°κ°„λ™μ•ˆ κΈ°νšμ΄λ‚˜ 섀계, νŒ€μ›, 쑰직 λ“± 변경도 λ§Žμ•˜κ³ ,
    μƒˆλ‘œμš΄ λΉ„μ§€λ‹ˆμŠ€μΈ 경우 λŒ€μ‘ μš”κ΅¬μ‚¬ν•­λ„ λ‹€μ–‘ν•΄μ§ˆ λΏλ”λŸ¬ 점점더 λ³΅μž‘ν•΄μ Έκ°„λ‹€λ©΄,
    우리 νŒ€μ΄ κ°œλ°œν•œ κΈ°λŠ₯이 μ–΄λ–€ λ™μž‘μ„ μˆ˜ν–‰ν•΄μ•Όν•˜λŠ”μ§€ μ •ν™•νžˆ νŒŒμ•…ν•˜μ§€ λͺ»ν•˜λŠ” μƒνƒœμ— 이λ₯Έλ‹€.
    심지어 μ™ΈλΆ€ ν˜‘λ ₯업체와 μ—°κ³„λœ API ν˜Ήμ€ λͺ¨λ“ˆ, λΌμ΄λΈŒλŸ¬λ¦¬κΉŒμ§€, 이 λͺ¨λ‘λŠ” _λΈ”λž™λ°•μŠ€(Black-box)_κ°€ λœλ‹€.

    λ³΄ν†΅μ˜ 경우 개발 λ‹΄λ‹Ήμžκ°€ κΈ°λŠ₯ κ΅¬ν˜„μ— λŒ€ν•œ μ±…μž„μ„ λ‹€ν–ˆμ„ 것이라 μ˜ˆμƒν•˜λ―€λ‘œ,
    이 μ˜μ—­λ“€μ€ 인지 μ˜μ—­ 밖에 μœ„μΉ˜ν•˜κ³ , λ¬Έμ œκ°€ λ°œμƒν•˜λ©΄ μ•Œ 수 μžˆλŠ” μ˜μ—­μ΄ λœλ‹€.

    unknown known: μ΄ν•΄ν–ˆλ‹€κ³  νŒλ‹¨ν•˜κΈ°μ—, 문제 λ°œμƒ μœ„ν—˜μ„ λͺ¨λ₯΄λŠ” λ―Έμ§€μ˜ μ˜μ—­

  • μ‹œκ°„μ΄ μ§€λ‚˜ μƒˆ λ²„μ „μœΌλ‘œ κ°œμ„ (upgrade)ν•˜κ±°λ‚˜ μ–‘λ¦½ν•˜κΈ° μ–΄λ €μš΄ μƒˆ ꡬ쑰둜 λ³€κ²½(migration)ν•˜λ©΄
    μ „ν˜€ μƒˆλ‘œμš΄ μœ ν˜•μ˜ λ¬Έμ œλ“€μ΄ λ°œμƒν•˜κ±°λ‚˜, μ›μΈμ΄λ‚˜ 이λ ₯을 μ•Œ 수 μ—†λŠ” λ³€κ²½ 지점듀도 λ°œμƒν•œλ‹€.
    λ”μ°ν•˜κ²Œλ„ μ΄ν•΄ν•˜λŠ” λ²”μœ„λ₯Ό λ„˜μ–΄μ„œμ„œ μ‘΄μž¬ν•˜λŠ”μ§€λ„ λͺ°λžλ˜ 잠재적인 버그듀이닀.: unknown unknown (λͺ¨λ₯Έλ‹€λŠ” 사싀도 λͺ¨λ₯΄λŠ” μ˜μ—­)

    know unknown: μš°λ¦¬κ°€ λͺ¨λ₯Έλ‹€λŠ” 사싀 쑰차도 λͺ¨λ₯΄λŠ” λ―Έμ§€μ˜ μ˜μ—­

λ¬Όλ‘ , μ € μ˜μ—­λ“€μ€ λͺ¨λ‘ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ 개발(application development)만 고렀된 것은 μ•„λ‹ˆλ‹€.
κ΅¬μΆ•ν•˜λŠ” νŒ¨ν‚€μ§€ λ‚΄λΆ€μ˜ λ¬Έμ œμΌμˆ˜λ„, λͺ¨λ“ˆμ΄λ‚˜ ν†΅μ‹ μ˜ 문제일수고 있고, μΈν”„λΌμŠ€νŠΈλŸ­μ²˜(Infrastructure)일 μˆ˜λ„ μžˆλ‹€.
λΉ„μ§€λ‹ˆμŠ€ λ‘œμ§μ„ μˆ˜ν–‰ν•˜λŠ” μ„œλΉ„μŠ€λ₯Ό κ΅¬μ„±ν•˜λŠ” μ˜μ—­ μ „λ°˜μ— κ±Έμ³μ„œ 잠재적 버그에 λŒ€ν•œ κ³ μ°°μ΄λΌλŠ” 점을 μ΄ν•΄ν•˜κΈΈ λ°”λž€λ‹€.

이쯀되면 λΆ„λͺ… 이런 생각이 λ“€ 것이닀

μ•„.. κ°œλ°œμ— 직접 κ΄€μ—¬ν•œ λ‹Ήμ‚¬μž 외에 λ‹€λ₯Έ μ‚¬λžŒμ΄ κ°œλ°œν•œ λ‚΄μš©κΉŒμ§€ μ±™κΈ°κ³ 
μ•ˆμ „ν•œ ν”„λ‘œκ·Έλž¨μ„ κ°œλ°œν•˜κ³  μš΄μ˜ν•˜λŠ” 건 쉽지 μ•Šκ² λŠ”λ°..?

이제 ν…ŒμŠ€νŠΈ μ½”λ“œκ°€ 같이 λ‚˜μ˜¨λ‹€λŠ” 것이 정말 μ™œ μž₯점이 λ˜λŠ”μ§€ μ΄ν•΄ν•˜κΈ° μœ„ν•΄ B-3으둜 λ„˜μ–΄κ°€μž.


B-3) 개발과 ν…ŒμŠ€νŠΈ, 그리고 μ½”λ“œ(code)

CleanCode 1μž₯의 μ½”λ“œλŠ” μš”κ΅¬μ‚¬ν•­μ„ ν‘œν˜„ν•˜λŠ” μ–Έμ–΄λΌλŠ” 사싀을 μ΄ν•΄ν•˜λΌ λ₯Ό κΈ°μ–΅ν•˜λŠ”κ°€?
κΉ¨λ—ν•œ μ½”λ“œμ˜ μ½”λ“œλ₯΄ 자체λ₯Ό μ„€λͺ…ν•˜λŠ” 제일 처음의 λ„μž…λΆ€μ—μ„œ μ–ΈκΈ‰λ˜λŠ” 이 μ±…μ˜ κ°€μž₯ μ€‘μš”ν•œ λ‚΄μš© 쀑 ν•˜λ‚˜μ΄λ‹€.

ν…ŒμŠ€νŠΈ μ½”λ“œλ„ 'μ½”λ“œ(code)': 'ν…ŒμŠ€νŠΈ μ½”λ“œκ°€ μ •μ˜ν•œ μš”κ΅¬μ‚¬ν•­'을 'μ‹€μ œ μ½”λ“œκ°€ κΈ°λŠ₯μœΌλ‘œμ„œ 보μž₯ν•˜λΌ'λŠ” 의미

πŸ” κ±°μ‹œμ μœΌλ‘œ ν…ŒμŠ€νŠΈ μ½”λ“œλŠ”

μž₯μ• κ°€ λ‚˜μ„œ λ‹€μ‹œ μ½”λ“œλ₯Ό λ³΅κΈ°ν•˜λŠ” 사후 처리λ₯Ό μ œμ™Έν•˜λ©΄
μ½”λ“œλ₯Ό μž‘μ„±ν•˜λŠ” κ·Έ μˆœκ°„ 만큼 ν•΄λ‹Ή κΈ°λŠ₯에 λŒ€ν•΄ 이해도가 높은 μˆœκ°„μ€ μ—†λ‹€.

κ²°κ΅­, 이해도가 κ°€μž₯ 높은 μˆœκ°„μ— μž‘μ„±λœ 개발 μ½”λ“œμ™€ ν…ŒμŠ€νŠΈ μ½”λ“œλŠ” ν•¨κ»˜ λ‚˜μ˜¨λ‹€λŠ” 것은
κΈ°λŠ₯κ³Ό ν…ŒμŠ€νŠΈμ˜ λͺ…μ„Έκ°€ ν•¨κ»˜ μž‘μ„±λ˜λ―€λ‘œ 개발과 검증을 유기적으둜 μˆ˜ν–‰ν•  수 있게 λœλ‹€.

πŸ” μΆ”κ°€μ μœΌλ‘œ ν…ŒμŠ€νŠΈ μ½”λ“œλŠ”

개발된 μ‹€μ œ μ½”λ“œλ₯Ό μ „λΆ€ 읽지 μ•Šκ³ , ν…ŒμŠ€νŠΈ 결과와 ν…ŒμŠ€νŠΈ μ½”λ“œλ§Œ 읽더라도
νŒ€μ›μ—κ²Œ ν•΄λ‹Ή APIλ₯Ό μ‚¬μš©ν•˜λŠ” κ°€μž₯ μ˜¬λ°”λ₯Έ 방법을 μ†Œκ°œν•˜λŠ” 방법이 λ˜κΈ°λ„ ν•œλ‹€.

μ΄λŠ” μ—¬λŸ¬ κ°œλ°œμžκ°€ λ™μ‹œμ— ν˜‘μ—…ν•  λ•Œ μ˜μ‚¬μ†Œν†΅μ˜ νš¨μœ¨μ„±μ„ λ†’μ—¬μ£ΌλŠ” 방법 쀑 ν•˜λ‚˜κ°€ 되고,
과거의 λˆ„κ΅°κ°€μ˜ μ‚¬μš©λ°©λ²•μ„ ν˜„μž¬μ˜ λ…μžκ°€ 보고 μ΄ν•΄ν•˜λŠ” μ†Œν†΅μ΄λ‹€.


Section-C. Keep test code clean

일회용 ν…ŒμŠ€νŠΈ μ½”λ“œλ₯Ό μ§œμ˜€λ‹€κ°€ μƒˆμ‚ΌμŠ€λ ˆ μžλ™ν™”λœ λ‹¨μœ„ ν…ŒμŠ€νŠΈ 슈트λ₯Ό μ§ λ‹€λŠ” 것은 쉽지 μ•Šλ‹€.
λ‘˜ μ‚¬μ΄λŠ” 간극이 μ•„μ£Ό 크닀.

CleanCode <Robert C. Marti> 9μž₯. λ‹¨μœ„ ν…ŒμŠ€νŠΈ (κΉ¨λ—ν•œ ν…ŒμŠ€νŠΈ μ½”λ“œ μœ μ§€ν•˜κΈ°)


C-1) ν…ŒμŠ€νŠΈ μ½”λ“œλ₯Ό κΉ¨λ—ν•˜κ²Œ

μ•žμ„œ λ§ν•œ ν…ŒμŠ€νŠΈ μ½”λ“œ 슈트 μž‘μ„±μ— λŒ€ν•œ λ‚œμ΄λ„λ₯Ό κ°€μž₯ λΉ λ₯΄κ²Œ ν•΄κ²°(λ˜μ—ˆλ‹€κ³  착각)ν•˜λŠ” 방법은
ν…ŒμŠ€νŠΈ μ½”λ“œμ™€ μ‹€μ œ μ½”λ“œμ˜ ν’ˆμ§ˆ 기쀀을 λ‹€λ₯΄κ²Œ μ μš©ν•˜λŠ” 것이닀.
이λ₯Έλ°” '지저뢄해도 빨리' λ™μž‘μ„ ν™•μΈλ§Œ ν•˜λŠ” ν…ŒμŠ€νŠΈ μ½”λ“œλ₯Ό λ§Œλ“œλŠ” 것이닀.

λ³€μˆ˜ 이름은 μ‹ κ²½ μ“Έ ν•„μš” μ—†μ–΄μ§ˆν…Œκ³ , ν…ŒμŠ€νŠΈλ₯Ό κ°„κ²°ν•˜κ²Œ μ„œμˆ μ μœΌλ‘œ μž‘μ„±ν•  ν•„μš”λ„ μ—†μœΌλ©°,
ν…ŒμŠ€νŠΈ μ½”λ“œλ₯Ό μ„€κ³„ν•˜κ³  뢄리할 ν•„μš”μ‘°μ°¨ 없이 자유둭고 λŠμŠ¨ν•œ ν…ŒμŠ€νŠΈ μ½”λ“œμ™€ ν•¨κ»˜ κΈ°λŠ₯이 μΆœμ‹œλœλ‹€.

❓ 정말 μ΄λ ‡κ²Œ μ μš©ν•΄λ„ λ˜λŠ” 걸까? λ¬Έμ œκ°€ μ—†μ„κΉŒ?

κ·ΈλŸ΄λ¦¬κ°€

πŸ€” λ¬Έμ œκ°€ 보이기 μ‹œμž‘ν•˜λ‹€

λ”λŸ¬μš΄ λŒ€μƒ

'ν…ŒμŠ€νŠΈλ₯Ό μ•ˆν•˜λŠλ‹ˆ μ§€μ €λΆ„ν•œ μ½”λ“œλΌλ„ μžˆλŠ” 편이 μ’‹μ•„μ„œ' λ§Œλ“€μ—ˆλ˜ ν…ŒμŠ€νŠΈ μ½”λ“œκ°€
κ³Όμ—° μ‹€μ œ μ½”λ“œμ˜ 변경을 λ”°λΌκ°€λ©΄μ„œ μœ μ§€λ³΄μˆ˜λ₯Ό ν•¨κ»˜ ν•  수 μžˆμ„κΉŒ?

(ν…ŒμŠ€νŠΈ μ½”λ“œλ„ μ‹€μ œ μ½”λ“œμ™€ λ§ˆμ°¬κ°€μ§€λ‘œ) λ³΅μž‘ν•΄μ§ˆμˆ˜λ‘ 변경이 μ–΄λ €μš΄ 것은 λ‹Ήμ—°ν•˜λ‹€.
ν…ŒμŠ€νŠΈ μ½”λ“œκ°€ μ§€μ €λΆ„ν•˜λ©΄ μ‹€μ œ μ½”λ“œλ₯Ό μ§œλŠ” μ‹œκ°„λ³΄λ‹€ κΈ°μ‘΄ ν…ŒμŠ€νŠΈ μ½”λ“œλ₯Ό νŒŒμ•…ν•˜κ³  고치고
μƒˆλ‘œμš΄ μΌ€μ΄μŠ€λ₯Ό μΆ”κ°€ν•˜λŠ” μ‹œκ°„μ€ 훨씬 더 걸리게 λœλ‹€.
κ²°κ΅­, μ§€μ €λΆ„ν•œ ν…ŒμŠ€νŠΈ μ½”λ“œλ‘œ μΈν•΄μ„œ ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€λ₯Ό ν†΅κ³Όμ‹œν‚€λŠ” 것은 점점 더 μ–΄λ ΅κ²Œ λœλ‹€.


🀐 λ¬Έμ œκ°€ 컀지기 μ‹œμž‘ν•˜λ‹€

뢈만의 λŒ€μƒ

점차 ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€λŠ” κ°œλ°œμžλ“€ μ‚¬μ΄μ—μ„œλŠ” κ°€μž₯ 큰 뢈만이 λœλ‹€.
κ΄€λ¦¬μžλŠ” ν†΅κ³Όλœ ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€μ˜ 섀정값듀이 μ™œ μ΄λ ‡κ²Œ 크고 의미 μ—†λŠ”μ§€ μ§€μ ν•˜λ©΄,
κ°œλ°œμžλŠ” ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€λ₯Ό λΉ„λ‚œν•˜κ²Œ λœλ‹€. λͺ¨λ‘κ°€ ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€λ₯Ό λ“±μ§€κ³  ν¬κΈ°ν•˜κ²Œ λœλ‹€.

ν…ŒμŠ€νŠΈ μŠˆνŠΈκ°€ μ—†μ–΄μ Έμ„œ 일이 쀄어든 κ²ƒμ²˜λŸΌ λŠκ»΄μ§„λ‹€. (λˆ„κ΅°κ°€λŠ” μ•ˆ λ§žλŠ” μ‹ λ°œμ„ 벗은 λŠλ‚Œμ΄λΌκ³ λ„..) 이제 κ°œλ°œμžλŠ” μžμ‹ μ΄ μˆ˜μ •ν•œ μ½”λ“œκ°€ μ œλŒ€λ‘œ λ„λŠ”μ§€ 확인할 방법이 μ—†μœΌλ‹ˆ μˆ˜μ •μ΄ 더이상 μ•ˆμ „ν•˜λ‹€λŠ” 사싀을 κ²€μ¦ν•˜μ§€ λͺ»ν•œλ‹€.
κ²°ν•¨μœ¨μ΄ λ†’μ•„μ§€κΈ° μ‹œμž‘ν•œλ‹€.


😱 λ¬Έμ œκ°€ 낳은 것듀

곡포의 λŒ€μƒ

μ˜λ„ν•˜μ§€ μ•Šμ€ κ²°ν•¨μˆ˜κ°€ λŠ˜μ–΄μžμž κ°œλ°œμžλŠ” 변경을 μ£Όμ €ν•œλ‹€.
λ³€κ²½ν•˜λ©΄ κ°œμ„ μœΌλ‘œ μ–»λŠ” 것보닀 μž₯애와 λ²„κ·Έλ‘œ μžƒλŠ” 것이 더 λ§Žλ‹€κ³  μƒκ°ν•˜κ²Œ λœλ‹€.
더이상 μ½”λ“œλ₯Ό κ³ μΉ˜μ§€ μ•ŠλŠ”λ‹€.

κ²°κ΅­ λΉ„μ§€λ‹ˆμŠ€μ—λŠ” ν…ŒμŠ€νŠΈ μŠˆνŠΈλ„ μ—†κ³  μ–ΌκΈ°μ„€κΈ° λ’€μ„žμΈ μ½”λ“œμ™€ μ’Œμ ˆν•œ 고객만 λ‚¨λŠ”λ‹€._ ν…ŒμŠ€νŠΈμ— μŸμ•„ 뢀은 λ…Έλ ₯이 ν—ˆμ‚¬μ˜€λ‹€λŠ” 싀망감이 κ°œλ°œμžμ—κ²Œ λ‚¨λŠ”λ‹€._

ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€κ°€ μžˆμ—ˆλ‹€λ©΄

  • 변경에 λ°œμƒν•˜λŠ” 문제λ₯Ό 미리 νŒŒμ•…ν•  수 μžˆλ‹€.
  • μ•„ν‚€ν…μ²˜κ°€ λΆ€μ‹€ν•˜κ±°λ‚˜ 섀계가 λͺ¨ν˜Έν•˜κ³  엉망이더라도 별닀λ₯Έ 우렀 없이 λ²„κ·Έμ˜ 원인을 찾을 수 μžˆλ‹€.
  • ν…ŒμŠ€νŠΈ 컀버리지(Test coverage)κ°€ 높을 수둝 κ³΅ν¬λŠ” 점점 쀄어든닀. 였히렀 μ•ˆμ‹¬ν•˜κ³  μ•„ν‚€ν…μ²˜μ™€ 섀계λ₯Ό κ°œμ„ ν•  수 μžˆλ‹€.

😩 문제의 원인은..?

사라진 λŒ€μƒ

ν…ŒμŠ€νŠΈ μ½”λ“œλ₯Ό κΉ¨λ—ν•˜κ²Œ μœ μ§€ν•˜μ§€ μ•Šμ•„μ„œ ν¬κΈ°ν•˜κ²Œ λ˜μ—ˆλ‹€.
ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€κ°€ μ—†μ–΄μ„œ μ‹€μ œ μ½”λ“œλ₯Ό μœ μ—°ν•˜κ²Œ λ§Œλ“œλŠ” λ²„νŒ€λͺ©μ„ μžƒμ—ˆλ‹€.

ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€ 없이 μ΄λ£¨μ–΄μ§€λŠ” λͺ¨λ“  변경은 μž μ •μ μΈ 버그이닀.

λΉ„μ•½μΌκΉŒ?

μ§€μ €λΆ„ν•œ μ½”λ“œλ₯Ό κ²½ν—˜ν•΄λ³Έ μ‚¬λžŒμ€ μ•Œ 것이닀. 보톡은 ν•œ 곳만 μ§€μ €λΆ„ν•˜μ§€ μ•Šλ‹€. μž¬μ‚¬μš©μ„±κ³Ό μ—­ν• , 경계, μžμ›, νš¨μœ¨μ„± λͺ¨λ“  면이 λΆ€μ‘±ν•˜λ‹€.

(λ‹Ήμ—°ν•˜κ²Œλ„) ν…ŒμŠ€νŠΈ μ½”λ“œκ°€ μ§€μ €λΆ„ν•˜λ©΄ μ‹€μ œ μ½”λ“œλ„ μ§€μ €λΆ„ν•΄μ§„λ‹€.
κ²°κ΅­ ν…ŒμŠ€νŠΈμ½”λ“œλ„ μžƒμ–΄λ²„λ¦¬κ³  μ‹€μ œ μ½”λ“œλ„ 망가진닀.


πŸš€ 결둠적으둜

꿈이 된 λŒ€μƒ

μš°λ¦¬λŠ” 이 문제λ₯Ό ν†΅μ‹œμ μœΌλ‘œ λ³Ό 일이 μ—†μ—ˆμ„μ§€ λͺ¨λ₯Έλ‹€. κ·ΈλŸ¬λ‚˜ μš°λ¦¬λŠ” μ•Œ 수 μžˆλ‹€.
CleanCode 1μž₯ κΉ¨λ—ν•œ μ½”λ“œ - 'λ‚˜μœ μ½”λ“œλ‘œ 치λ₯΄λŠ” λŒ€κ°€'κ°€ 뢈러 μΌμœΌν‚¨ 것이닀.

놓아버린 ν…ŒμŠ€νŠΈ μ½”λ“œμ— 'μ›λŒ€ν•œ μž¬μ„€κ³„μ˜ 꿈'을 λ˜λ‹€μ‹œ 꿀텐가?

μ½”λ“œλ₯Ό λ§κ°€λœ¨λ¦¬μ§€κ³  μ‹Άμ§€ μ•Šλ‹€λ©΄

μ½”λ“œμ˜ μœ μ—°μ„±, μœ μ§€λ³΄μˆ˜μ„±, μž¬μ‚¬μš©μ„±μ„ μ œκ³΅ν•˜λŠ” λ²„νŒ€λͺ©μΈ ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€λ₯Ό κΉ¨λ—ν•˜κ²Œ μœ μ§€ν•΄μ•Όν•œλ‹€.


C-2) κΉ¨λ—ν•œ ν…ŒμŠ€νŠΈ μ½”λ“œ

βœ”οΈ κΉ¨λ—ν•œ ν…ŒμŠ€νŠΈ μ½”λ“œλ₯Ό λ§Œλ“œλ €λ©΄ λ‹€μŒ 3κ°€μ§€κ°€ ν•„μš”ν•˜λ‹€
  • 가독성
  • 가독성
  • 가독성

μ˜€νƒ€κ°€ μ•„λ‹ˆλ‹€. μ–΄μ©Œλ©΄ 가독성은 μ‹€μ œ μ½”λ“œλ‚˜ ν…ŒμŠ€νŠΈ μ½”λ“œλ³΄λ‹€ 훨씬 더 μ€‘μš”ν•˜λ‹€.
μ΄λ ‡κ²Œ μ€‘μš”ν•œ 가독성은 μ–΄λ–»κ²Œ ν•΄μ•Ό 높일 수 μžˆμ„κΉŒ?

μ—¬λŠ μ½”λ“œ(code)와 κ°™λ‹€. λͺ…λ£Œμ„±, λ‹¨μˆœμ„±, ν’λΆ€ν•œ ν‘œν˜„λ ₯이 ν•„μš”ν•˜λ‹€.

CleanCode 예제 참쑰

158 νŽ˜μ΄μ§€μ˜ λͺ©λ‘ 9-1μ—μ„œ 160 νŽ˜μ΄μ§€μ˜ λͺ©λ‘ 9-2둜 과정은 μ•„λž˜μ™€ 같이 μš”μ•½ν•  수 μžˆλ‹€.

  • 각 μ½”λ“œ 라인을 λ©”μ„œλ“œλ‘œ λ¬Άμ–΄μ„œ ν…ŒμŠ€νŠΈ μ½”λ“œλ₯Ό λ‹¨μˆœν•˜κ²Œ λ§Œλ“€μ—ˆλ‹€.
  • λ©”μ„œλ“œμ˜ 이름을 μ΄ν•΄ν•˜κΈ° μ‰¬μš΄ 이름을 λΆ™μ—¬ λͺ…λ£Œν•˜κ²Œ λ§Œλ“€μ—ˆλ‹€.
  • λ©”μ„œλ“œκ°€ λ‹€μ–‘ν•œ 인자λ₯Ό λ°›μ•„μ„œ μž¬μ‚¬μš©μ„±μ„ λ†’μ˜€κ³ ,
    μ–΄λ–€ 정보λ₯Ό λ°›μ•„μ„œ μˆ˜ν–‰λ˜λŠ”μ§€λ₯Ό ν‘œν˜„ν•˜λ„λ‘ κ°œμ„ ν–ˆλ‹€.

기쑴에 있던 κΈ°λŠ₯을 μœ μ§€ν•œ 채 μ½”λ“œλ₯Ό κ°œμ„ ν•˜λŠ” 것을 **λ¦¬νŒ©ν„°λ§(Refactoring)**이라고 ν•œλ‹€.
μ΄λ ‡κ²Œ 기쑴의 μ½”λ“œλ₯Ό λ¦¬νŒ©ν„°λ§ν•˜λŠ” 과정에 μ‹œκ°„μ„ νˆ¬μžν•΄μ„œ 가독성을 λ†’μ˜€λ‹€.

❓ κ·Έλ ‡λ‹€λ©΄ κΉ¨λ—ν•œ ν…ŒμŠ€νŠΈ μ½”λ“œλ‘œ 무엇을 μ–»μ—ˆμ„κΉŒ?

ν…ŒμŠ€νŠΈ μ½”λ“œμ˜ μž‘λ‹€ν•˜κ³  μ„Έμ„Έν•œ μ½”λ“œλ₯Ό 거의 μ—†μ•΄λ‹€λŠ” 사싀에 μ£Όλͺ©ν•˜λΌ.

  1. ν…ŒμŠ€νŠΈμ˜ λ³Έμ§ˆμ„ λ°”λ‘œ ν‘œν˜„ν•˜λ„λ‘, μ§„μ§œ ν•„μš”ν•œ 자료 μœ ν˜•κ³Ό ν•¨μˆ˜λ§Œ μ‚¬μš©ν•œλ‹€.

  2. μ½”λ“œλ₯Ό μ½λŠ” μ‚¬λžŒμ΄ λ°”λ‘œ 읽을 수 μžˆλ„λ‘ μ‰½κ²Œ κΈ°μˆ ν•˜κ³ , μ½”λ“œκ°€ μˆ˜ν–‰ν•˜λŠ” κΈ°λŠ₯을 재빨리 μ΄ν•΄ν•œλ‹€.

  3. μ„Έμ„Έν•œ μ½”λ“œκ°€ μ—†κΈ° λ•Œλ¬Έμ— ν…ŒμŠ€νŠΈ μ½”λ“œλ₯Ό λ³΄λŠ”λ° μ£Όλˆ…λ“€μ§€ μ•ŠκΈ° λ•Œλ¬Έμ—,
    ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€λ₯Ό λ³΄λŠ” λͺ¨λ‘κ°€ 적극적으둜 κ°œμž…ν•  수 μžˆλ„λ‘ λ°°λ €ν•œλ‹€.


μ•žμ„œ 봀던 λͺ©λ‘ 9-2와 같이, λˆ„κ΅¬λ‚˜ 읽을 수 μžˆλ‹€λŠ” 것은 '도메인(domain)에 λŒ€ν•œ 이해'λ₯Ό μ „μ œλ‘œ ν•œλ‹€.
μ—¬κΈ°μ„œ λ§ν•˜λŠ” 도메인은 'ν…ŒμŠ€νŠΈμ— κ΄€λ ¨λœ κΈ°λŠ₯을 μˆ˜ν–‰ν•˜λŠ”λ° ν•„μš”ν•œ 지식 μ˜μ—­'에 λŒ€ν•œ 뢀뢄을 μ˜λ―Έν•œλ‹€.

도메인(domain)μ΄λž€, μ˜μ—­μ΄λ‚˜ λΆ„μ•Ό μ „λ°˜μ„ μ§€μΉ­ν•˜λŠ” λ‹¨μ–΄λ‘œ, ITμ—μ„œλŠ” DNS μ‹œμŠ€ν…œμ˜ 인터넷 μ£Όμ†Œλ₯Ό μ˜λ―Έν•˜κΈ°λ„ ν•œλ‹€.
특히, MSA와 같은 μ˜μ—­μ—μ„œλŠ” λΉ„μ§€λ‹ˆμŠ€λ₯Ό μ§€νƒ±ν•˜λŠ” μ€‘μš”κ°œλ…μ„ 'λΉ„μ§€λ‹ˆμŠ€ 도메인(business domain)'이라 μ§€μΉ­ν•œλ‹€.

보톡 μ‹œμŠ€ν…œμ€ 내뢀에 μ‘°μž‘ν•˜λŠ” μ„ΈλΆ€ APIλ₯Ό μ‘°ν•©ν•˜μ—¬ μƒμœ„ APIλ₯Ό κ΅¬μ„±ν•˜κ³  ν•¨μˆ˜μ™€ μœ ν‹Έλ¦¬ν‹°λ₯Ό 톡해 λ™μž‘ν•˜λ„λ‘ μ„€κ³„ν•œλ‹€.
이런 μ„€κ³„λ‘œ κ΅¬ν˜„λœ μƒμœ„ API의 ν•¨μˆ˜λ‚˜ μœ ν‹Έλ¦¬ν‹°λ₯Ό ν…ŒμŠ€νŠΈ μ½”λ“œμ—μ„œ λŒ€μƒμ΄ λ˜λŠ” νŠΉμˆ˜ν•œ APIκ°€ λœλ‹€.
즉, ν…ŒμŠ€νŠΈλ₯Ό κ΅¬ν˜„ν•˜λŠ” λ‹Ήμ‚¬μžμ™€ ν…ŒμŠ€νŠΈ μ½”λ“œλ₯Ό λ³΄λŠ” λ…μžλ₯Ό λ„μ™€μ£ΌλŠ” 것이 도메인에 μ§‘μ€‘ν•˜λŠ” ν…ŒμŠ€νŠΈ 언이이닀.

μ²˜μŒλΆ€ν„° 특수 APIλ₯Ό μ„€κ³„ν•΄μ„œ μ‹œμž‘ν•˜μ§€ μ•ŠλŠ”λ‹€. (ν•˜κΈ°λ„ νž˜λ“€λ‹€.)
κ³„μ†λ˜λŠ” λ¦¬νŒ©ν„°λ§μ„ 톡해 κ°œμ„ ν•˜κ³  ν’λΆ€ν•˜κ²Œ ν‘œν˜„ν•˜λ„λ‘ λ°œμ „μ‹œν‚€λŠ” 것이닀.

μΈν…”λ¦¬μ œμ΄(IntelliJ)와 μ½”ν‹€λ¦°(Kotlin)으둜 유λͺ…ν•œ JetBrain μ‚¬μ˜ MPSλŠ” 이 DSL을 μœ„ν•˜ κ³ μ•ˆλœ IDE이닀.
(μƒμš©νˆ΄μ΄λ‹ˆ μ•„λž˜ μ†Œκ°œλ₯Ό 톡해 μ‘΄μž¬μ—¬λΆ€ μ •λ„λŠ” μ•Œμ•„λ‘μž.)

jetbrain-mps-intro(https://www.youtube.com/watch?v=9JipsZTclsw)


C-4) 이쀑 ν‘œμ€€

μ•žμ„œ ν…ŒμŠ€νŠΈλ₯Ό ν¬κΈ°ν•˜κ²Œλœ νŒ€μ€ μ–΄λ–€λ©΄μ—μ„œλŠ” μ˜¬λ°”λ₯Έ νŒλ‹¨μ„ λ‚΄λ¦° 점도 μ‘΄μž¬ν•œλ‹€.
ν…ŒμŠ€νŠΈ API에 μ μš©ν•˜λŠ” ν‘œμ€€μ€ μ‹€μ œ μ½”λ“œμ— μ μš©ν•˜λŠ” ν‘œμ€€κ³Ό ν™•μ‹€νžˆ λ‹€λ₯΄λ‹€.
λ‹¨μˆœν•˜κ³ , κ°„κ²°ν•˜κ³ , ν‘œν˜„λ ₯이 풍뢀해야 ν•˜μ§€λ§Œ, μ‹€μ œ μ½”λ“œλ§ŒνΌ 효율적일 ν•„μš”λŠ” μ—†λ‹€.

λ¬Όλ‘  ν…ŒμŠ€νŠΈ μ’…λ₯˜κ°€ 많고 λ‹€μ–‘ν•΄μ§€λ©΄, ν…ŒμŠ€νŠΈ μ„±λŠ₯도 νš¨μœ¨μ„±μ„ μ°Ύμ•„μ•Ό ν•œλ‹€. κ·ΈλŸ¬λ‚˜ 이 λ¬Έμž₯의 μ˜λ„λŠ” κ·Έλž˜λ„ μ‹€μ œ μ½”λ“œλ³΄λ‹€λŠ” νš¨μœ¨μ„±μ„ μΆ”κ΅¬ν•˜μ§„ μ•ŠλŠ”λ‹€ λΌλŠ” λ‰˜μ•™μŠ€μ΄λ‹€.

162 νŽ˜μ΄μ§€μ˜ λͺ©λ‘ 9-3μ—μ„œ λͺ©λ‘ 9-4, λͺ©λ‘ 9-5둜 λ¦¬νŽ™ν„°λ§λœ λ³€ν™”λ₯Ό 보자.

  • κΈ°μ‘΄ ν…ŒμŠ€νŠΈ μ½”λ“œλŠ” νš¨μœ¨μ„±μ„ μ˜μ‹ν•œ λ‚˜λ¨Έμ§€ ν•˜λ‚˜μ˜ ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€μ— λͺ¨λ“  λ‚΄μš©μ΄ 담겨져 μžˆλ‹€.
    μ•ˆνƒ€κΉμ§€λ§Œ ν…ŒμŠ€νŠΈκ°€ ν•˜λŠ” 일이 ν•œ λˆˆμ— λ“€μ–΄μ˜€μ§€ μ•ŠλŠ”λ‹€.

  • λ¦¬νŒ©ν„°λ§λœ ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€λ₯Ό λΆ„λ¦¬ν•΄μ„œ μ‹€ν–‰ν•œ 탓에 νš¨μœ¨μ„±μ€ λ–¨μ–΄μ‘Œμ„μ§€λΌλ„, 덕뢄에 ν…ŒμŠ€νŠΈ λ‚΄μš©μ΄ λͺ…λ£Œν•΄μ‘Œλ‹€.
    (였히렀 ν…ŒμŠ€νŠΈ μ½”λ“œλ₯Ό μ½λŠ” 과정이 사뭇 μž¬λ°ŒκΈ°λ„ ν•˜λ‹€.)
    ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€κ°€ μ΄ν•΄ν•˜κΈ° λ„ˆλ¬΄λ‚˜ μ‰½λ‹€λŠ” 사싀이 λΆ„λͺ…νžˆ λ“œλŸ¬λ‚˜κΈ° λ•Œλ¬Έμ΄λ‹€.

  • κ΅¬λ™λ˜λŠ” ν”„λ‘œκ·Έλž¨μ€ 일반적으둜 ν•œμ •λœ μžμ›μ„ 곡급 λ°›μ•„μ„œ λ™μž‘ν•œλ‹€.
    κ·ΈλŸ¬λ‚˜ ν…ŒμŠ€νŠΈ ν™˜κ²½μ€ 검증을 μœ„ν•΄μ„œλΌλ„ μžμ›μ— λŒ€ν•œ μ œμ•½μ΄ μ—†κ±°λ‚˜ μƒλŒ€μ μœΌλ‘œ μ•½ν•  κ°€λŠ₯성이 λ†’λ‹€.

  • CPU νš¨μœ¨μ„±κ³Ό λ©”λͺ¨λ¦¬ 관리 등은 μ‹€μ œ ν™˜κ²½μ—μ„œλŠ” μ ˆλŒ€λ‘œ λ°œμƒν•΄μ„  μ•ˆλ˜μ§€λ§Œ,
    ν…ŒμŠ€νŠΈ ν™˜κ²½μ—μ„œλ§ŒνΌμ€ μ „ν˜€ 문제 μ—†λŠ” 방식이닀.
    (였히렀 ν…ŒμŠ€νŠΈ μžμ›μ„ 더 νˆ¬μ—¬ν•΄μ„œ λΉ λ₯Έ 결과둜 결정을 ν•˜λŠ” κ²½μš°λ„ μ‘΄μž¬ν•œλ‹€.)

즉, μ½”λ“œμ˜ 깨끗함과 이쀑 ν‘œμ€€μ€ μ„œλ‘œ μ² μ €νžˆ λ¬΄κ΄€ν•˜λ‹€
μ‹€μ œ μ½”λ“œμ™€ ν…ŒμŠ€νŠΈ μ½”λ“œμ˜ ν’ˆμ§ˆμ΄ λ‹€λ₯΄λ”라도, μ½”λ“œμ˜ κΉ¨λ—ν•œ ν’ˆμ§ˆμ΄ μ €ν•΄ν•˜λŠ” μ΄μœ κ°€ 될 수 μ—†λ‹€.


Section-D. Concentration-point on each test case


D-1) ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€μ— '단 ν•˜λ‚˜λ§Œ' μžˆμ–΄μ•Ό ν•˜λŠ” 것?

ν…ŒμŠ€νŠΈ μ½”λ“œ μž‘μ„±μ‹œ ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€μ— assert 문을 단 ν•˜λ‚˜λ§Œ μ‚¬μš©ν•΄μ•Ό ν•œλ‹€κ³  μ£Όμž₯ν•˜λŠ” ν•™νŒŒκ°€ μžˆλ‹€.
κ°€ν˜Ήν•œ κ·œμΉ™μ΄μ§€λ§Œ, ν™•μ‹€ν•œ μž₯점이 μžˆλ‹€.
ν•˜λ‚˜μ˜ ν•¨μˆ˜μ— ν•˜λ‚˜μ˜ assert 문이 ν•˜λ‚˜μ˜ 결둠으둜 μ •μ˜ν•œ 덕뢄에 μ½”λ“œλ₯Ό μ΄ν•΄ν•˜κΈ° 쉽고 λΉ λ₯΄κ²Œ λ™μž‘ν•œλ‹€.
κ·ΈλŸ¬λ‚˜ λΆˆν–‰ν•˜κ²Œλ„, ν…ŒμŠ€νŠΈλ₯Ό λΆ„λ¦¬ν•˜λ©΄ μ€‘λ³΅λ˜λŠ” μ½”λ“œκ°€ λ§Žμ•„μ Έμ„œ ν…ŒμŠ€νŠΈ μŠˆνŠΈκ°€ λΉ„λŒ€ν•΄μ§„λ‹€.

λ¬Όλ‘ , Template Method Pattern을 μ‚¬μš©ν•˜λ©΄ 쀑볡은 μ œκ±°ν•  수 있고,
@Before와 같이 λͺ¨λ“  @Test 전에 λ™μž‘ν•˜λ„λ‘ 쀑볡을 μ„ μ–Έν•  μˆ˜λ„ μžˆμ§€λ§Œ μ—¬μ „νžˆ μŠˆνŠΈλŠ” λΉ„λŒ€ν•˜λ‹€

λ”°λΌμ„œ, ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€λŠ” ν•˜λ‚˜μ˜ assert 문으둜 μ •μ˜λœ ν•˜λ‚˜μ˜ 결둠에 μ§‘μ€‘ν•˜κΈ° 보닀
ν•˜λ‚˜μ˜ κ°œλ…μ— μ§‘μ€‘ν•΄μ„œ μ΅œλŒ€ν•œ assert 문을 쀄이고 κ°„κ²°ν•˜κ²Œ μ •μ˜ν•˜λŠ” 것이 λ°”λžŒμ§ν•˜λ‹€.


D-2) F.I.R.S.T

κΉ¨λ—ν•œ ν…ŒμŠ€νŠΈλŠ” λ‹€μŒ λ‹€μ„― κ°€μ§€ κ·œμΉ™μ„ λ”°λ₯΄κ²Œ λ˜λŠ”λ°, μ΄λ‹ˆμ…œμ„ λͺ¨μœΌλ©΄ FIRSTκ°€ λœλ‹€.

  • F (fast)
    λΉ¨λΌμ•Όν•œλ‹€. 빨라야 자주 ν™•μΈν•œλ‹€.
    느리면 마음껏 μ •λ¦¬ν•˜μ§€ λͺ»ν•˜λ―€λ‘œ μ½”λ“œ ν’ˆμ§ˆμ΄ λ–¨μ–΄μ§€κΈ° μ‹œμž‘ν•œλ‹€.

  • I (independent)
    ν…ŒμŠ€νŠΈλŠ” μ„œλ‘œ μ˜μ‘΄ν•΄μ„  μ•ˆλœλ‹€. ν•˜λ‚˜μ˜ ν…ŒμŠ€νŠΈκ°€ λ‹€μŒ ν…ŒμŠ€νŠΈ μ‹€ν–‰ ν™˜κ²½μ„ μ€€λΉ„ν•΄μ„œλ„ κ΄€μ—¬ν•΄μ„œλ„ μ•ˆλœλ‹€.
    ν…ŒμŠ€νŠΈκ°€ μ˜μ‘΄ν•˜λ©΄ ν•˜λ‚˜μ˜ μ‹€νŒ¨κ°€ μ—°μ‡„λ˜λ―€λ‘œ 원인 진단이 μ–΄λ €μ›Œ μ§€κ³  결함이 μˆ¨μ–΄λ“ λ‹€.

  • R (repeatable)
    μ–΄λ–€ ν™˜κ²½μ—μ„œλ“  반볡적으둜 λ™μž‘ν•  수 μžˆλ„λ‘ ꡬ성해야 ν•œλ‹€.
    ν…ŒμŠ€νŠΈκ°€ λŒμ•„κ°€μ§€ μ•ŠλŠ” ν™˜κ²½μ΄λΌμ„œ ν…ŒμŠ€νŠΈλ₯Ό μ‹€νŒ¨ν–ˆλ‹€λŠ” λ³€λͺ…이 생긴닀.
    ν™˜κ²½μ΄ μ§€μ›λ˜μ§€ μ•ŠλŠ” 경우 ν…ŒμŠ€νŠΈλ₯Ό μˆ˜ν–‰ν•  수 μ—†κ³  검증 κ²°κ³Όλ₯Ό 확인할 수 μ—†λ‹€.

  • S (self-validating)
    ν…ŒμŠ€νŠΈ κ²°κ³ΌλŠ” λ°˜λ“œμ‹œ Boolean κ°’μœΌλ‘œ λ°˜ν™˜ν•΄μ•Όλ§Œ ν•œλ‹€.
    톡과 μ—¬λΆ€λ₯Ό μ•Œλ¦¬λ €κ³  둜그 νŒŒμΌμ„ 읽게 λ§Œλ“€μ–΄μ„œλ„ μ•ˆλœλ‹€. νŒŒμΌμ„ 읽어 κ²°κ³Όλ₯Ό λΉ„κ΅ν•˜λ„λ‘ ν•΄μ„œλ„ μ•ˆλœλ‹€.
    톡과/μ‹€νŒ¨ 2κ°€μ§€λ‘œλ§Œ κ°€λŠ ν•˜μ§€ μ•Šκ³  주관이 κ°œμž…λ˜λ©΄ μˆ˜μž‘μ—… ν‰κ°€λ‘œ 이어진닀. (λ²Œμ¨λΆ€ν„° μ§€λ£¨ν•˜λ‹€)

  • T (timeply)
    ν…ŒμŠ€νŠΈλŠ” μ μ‹œμ— μž‘μ„±ν•˜κ³  λ™μž‘ν•΄μ•Ό ν•œλ‹€.
    λ‹¨μœ„ ν…ŒμŠ€νŠΈλŠ” ν…ŒμŠ€νŠΈ ν•˜λ €λŠ” μ‹€μ œ μ½”λ“œλ₯Ό κ΅¬ν˜„ν•˜κΈ° 직전에 κ΅¬ν˜„ν•΄μ•Ό ν•˜κ³ ,
    μ‹€νŒ¨ν•˜λŠ” μ½”λ“œλ₯Ό μ„±κ³΅μœΌλ‘œ λ§Œλ“€κΈ° μœ„ν•œ κ°œλ°œμ„ μˆ˜ν–‰ λ°˜λ³΅λ˜λ„λ‘ μ μ ˆν•œ μ‹œμ μ— λ°˜λ³΅ν•΄μ•Ό ν•œλ‹€.


Section-E. Conclusion

사싀 본질적인 TDDλŠ” 닀루지 μ•Šμ•˜λ‹€. ν…ŒμŠ€νŠΈ μ½”λ“œκ°€ ν•„μš”ν•œ 이유λ₯Ό μ΄ν•΄ν•˜κ³  ν…ŒμŠ€νŠΈλ₯Ό 겉ν•₯기둜 ν›‘μ—ˆλ‹€.
μ‹€μ œλ‘œ κΉ¨λ—ν•œ ν…ŒμŠ€νŠΈλŠ” λ³„λ„μ˜ μ±…μœΌλ‘œ 닀뀄도 될 만큼 μ‹¬λ„μžˆλŠ” μ£Όμ œμ΄λ‹€.
μ‹€μ œ μ½”λ“œλ§ŒνΌ ν…ŒμŠ€νŠΈ μ½”λ“œλ„ μ€‘μš”ν•˜κ³ , 반볡적으둜 ν”„λ‘œμ νŠΈ 건강에도 영ν–₯을 λ―ΈμΉœλ‹€.

λΆ„λͺ… 처음 ν…ŒμŠ€νŠΈ μ½”λ“œλ₯Ό 짜고, DSL에 νŠΉν™”λœ ν…ŒμŠ€νŠΈ APIλ₯Ό κ³ λ―Όν•˜κ³  κ΅¬μΆ•ν•˜λŠ” 것은 λŒ€λ‹¨νžˆ νž˜λ“€λ‹€.
κ·ΈλŸ¬λ‚˜ κ°„κ²°ν•˜κ²Œ μ •λ¦¬ν•˜κ³  반볡될 λ•Œ λ§ˆλ‹€ 그만큼 ν…ŒμŠ€νŠΈ μ½”λ“œλ₯Ό μž‘μ„±ν•˜κΈ° μ‰¬μ›Œμ§„λ‹€.

반면, TDDλ₯Ό λ„μž…ν•˜λŠ” μž₯μ μ—μ„œ μ΄λŸ¬ν•œ μ‹œκ°„κ³Ό λ…Έλ ₯을 κ°μˆ˜ν•˜μ§€ λͺ»ν•˜λ©΄
μ–΄μ„€ν”ˆ ν…ŒμŠ€νŠΈ μ½”λ“œμ™€ ν•¨κ»˜ λ°©μΉ˜ν•˜κ²Œ 되고 κ²°κ΅­ ν”„λ‘œμ νŠΈμ˜ μ‹€μ œ μ½”λ“œλŠ” λ§κ°€μ§€κ²Œ λœλ‹€.

ν…ŒμŠ€νŠΈ μ½”λ“œλ„ κΉ¨λ—ν•˜κ²Œ μœ μ§€ν•˜μž.


TDD, κ³ λ €ν•΄μ•Όν•˜λŠ” 것듀, (μ–΄μ©Œλ©΄ 단점)

  1. λŸ¬λ‹ 컀브 (Learning curve)
    각 언어와 ν”„λ ˆμž„μ›Œν¬μ—μ„œλŠ” 효율적인 ν…ŒμŠ€νŠΈλ₯Ό μœ„ν•΄ TDDλ₯Ό μœ„ν•œ ν‘œμ€€ ν…ŒμŠ€νŠΈ 도ꡬλ₯Ό ꢌμž₯ν•œλ‹€.
    개발자 κ°μžλŠ” ν…ŒμŠ€νŠΈ 도ꡬ ν˜Ήμ€ 언어적인 여건에 λ”°λΌμ„œ, μ„€μ •κ³Ό μ‚¬μš©λ²•μ„ 읡히기 μœ„ν•œ ν•™μŠ΅ 과정이 μˆ˜λ°˜λœλ‹€.

  2. λž¨ν”„μ—… (Ramp-up)
    μ–Έλœ» λ³΄κΈ°μ—λŠ” λŸ¬λ‹ μ»€λΈŒμ™€ μœ μ‚¬ν•΄λ³΄μ΄μ§€λ§Œ, TDDλ₯Ό μœ„ν•œ λž¨ν”„μ—…μ€ νŒ€ μ°¨μ›μ—μ„œ μ•„λž˜ 2κ°€μ§€λ₯Ό λͺ¨λ‘ ν¬ν•¨ν•œλ‹€.

    • λΉ„μ§€λ‹ˆμŠ€ 도메인 및 μ„œλΉ„μŠ€ 둜직 이해 ν›„, ν…ŒμŠ€νŠΈ μ½”λ“œ μž‘μ„±ν•  수 μžˆλŠ” μˆ˜μ€€μœΌλ‘œμ˜ λž¨ν”„μ—…
    • ν˜‘μ—…μ„ μœ„ν•΄
  3. μ „λ°˜μ μΈ 개발자 μˆ™λ ¨λ„ (Developer's Performance)
    ν…ŒμŠ€νŠΈλ₯Ό ν†΅ν•΄μ„œ μ½”λ“œ ν’ˆμ§ˆμ΄ μ˜¬λΌκ°€λŠ” 만큼, 개발자의 μˆ™λ ¨λ„κ°€ μ˜¬λΌκ°€μ•Ό ν•œλ‹€λŠ” μ˜λ―Έμ΄λ‹€.

    • (투자자 μž…μž₯μ—μ„œ μš”κ΅¬μ‚¬ν•­ κ°œλ°œμ— 진척이 μ—†μ–΄λ³΄μ΄λ‹ˆ) κ°€μ„±λΉ„λ₯Ό κ³ λ €ν•œ ν…ŒμŠ€νŠΈ λ„κ΅¬μ˜ 선택과 κ·Έ λ²”μœ„, 깊이 선택
    • ν…ŒμŠ€νŠΈμ™€ μžμ²΄μ— μ§‘μ€‘ν•˜κΈ° μœ„ν•΄ setting-lessλ₯Ό μœ„ν•œ λ¦¬λ“œ κ°œλ°œμžλ“€μ˜ λ…Έλ ₯, λ‚΄λΆ€ 곡유, 그리고 관리
  4. ν…ŒμŠ€νŠΈ μžλ™ν™”κ°€ λΆˆκ°€λŠ₯ν•œ μ˜μ—­λ„ μžˆλ‹€.
    도메인 ν˜Ήμ€ μ–Έμ–΄, ν™˜κ²½μ΄λ‚˜ 여건에 λ”°λΌμ„œ λͺ¨λ“  상황을 μƒμ •ν•˜κ³  ν…ŒμŠ€νŠΈν•  수 없기도 ν•˜λ‹€.

    κ°€λ Ή, λ©€ν‹° μŠ€λ ˆλ“œ ν™˜κ²½μ—μ„œ λ™μ‹œμ„±μ— μ—°κ΄€λ˜μ–΄ κ°„ν—μ μœΌλ‘œ λ°œμƒν•˜λŠ” λ©”λͺ¨λ¦¬ λˆ„μˆ˜λ‚˜ 치λͺ…적인 버그에 κ΄€λ ¨λœ ν…ŒμŠ€νŠΈλŠ”
    μ™ λ§Œν•œ λ…Έλ ₯κ³Ό μ‹œκ°„, 그리고 κ²½ν—˜μΉ˜λ₯Ό κ°€μ§„ μ‚¬λžŒμ΄ λͺ¨μ—¬μ„œ 집쀑할 수 μžˆλŠ” 투자λ ₯을 κ°€μ§„ νŒ€μ΄ μ•„λ‹ˆλΌλ©΄
    ν˜„μ‹€μ μœΌλ‘œ μž¬ν˜„ μžμ²΄κ°€ μ–΄λ ΅κ±°λ‚˜ μžλ™ν™”λœ 루틴을 λ§Œλ“€λ„λ‘ μ„ νƒν•˜κΈ° μ–΄λ €μš΄ 뢀뢄도 μžˆλ‹€.


Go to Part 2

Suite-up

πŸ“” Prerequisites

πŸ“” How to use

Artifacts

πŸ“Œ Clean Code

πŸ“Œ Meaningful Names + Extra

πŸ“Œ Functions

πŸ“Œ Comments

πŸ“Œ Formatting

πŸ“Œ Objects and Data Structures

Remains

ongoing! πŸ€

πŸ“Œ Error Handling

πŸ“Œ Boundaries

πŸ“Œ Unit Tests

πŸ“Œ Classes

πŸ“Œ Systems

πŸ“Œ Emergence

up-to-here! πŸš€

🧷 Concurrency

🧷 Successive Refinement

🧷 JUnit Internals

🧷 Refactoring SerialDate

Clone this wiki locally