1. TDD (Test Driven Development) λž€?

TDDλŠ” 'ν…ŒμŠ€νŠΈ 주도 개발'둜 μž‘μ€ λ‹¨μœ„μ˜ ν…ŒμŠ€νŠΈ μ½”λ“œλ₯Ό μž‘μ„±ν•΄ ν”„λ‘œκ·Έλž¨μ΄ 잘λͺ»λ˜μ—ˆμŒμ„ 증λͺ…ν•˜κ³ ,

이λ₯Ό μˆ˜μ •ν•˜λ©΄μ„œ λͺ©ν‘œμ— λΆ€ν•©ν•˜λŠ” μ½”λ“œλ₯Ό μΆ”κ°€ν•˜λŠ” 단계λ₯Ό 반볡 κ΅¬ν˜„ν•˜λŠ” μ†Œν”„νŠΈμ›¨μ–΄ 방법둠이닀.

 

일반적인 κ°œλ°œλ°©μ‹μ€ 'μš”κ΅¬μ‚¬ν•­ 뢄석 > 섀계 > 개발 > ν…ŒμŠ€νŠΈ > 배포'의 ν˜•νƒœ.

μ΄λŸ¬ν•œ 방식은 μ†Œν”„νŠΈμ›¨μ–΄ κ°œλ°œμ„ 느리게 ν•˜λŠ” 잠재적 μœ„ν—˜ 쑴재

μž‘μ€ λΆ€λΆ„μ˜ κΈ°λŠ₯ μˆ˜μ •μ—λ„ λͺ¨λ“  뢀뢄을 ν…ŒμŠ€νŠΈν•΄μ•Όν•˜λ―€λ‘œ 전체 버그 κ²€μΆœμ΄ μ–΄λ €μ›Œμ§

 

TDD의 λŒ€ν‘œμ μΈ Tool 'JUnit'은 κ°€μž₯ 널리 μ‚¬μš©λ˜λŠ” Java λ‹¨μœ„ ν…ŒμŠ€νŠΈ ν”„λ ˆμž„μ›Œν¬μ΄λ‹€.

μ΅œκ·Όμ—λŠ” λ™μž‘ ν…ŒμŠ€νŠΈ λΏλ§Œμ•„λ‹ˆλΌ jenkins(λΉŒλ“œμžλ™ν™”λ₯Ό μœ„ν•œ ) λ“±μ˜ ci 도ꡬλ₯Ό μ‚¬μš©ν•  λ•Œ

ν…ŒμŠ€νŠΈ μ½”λ“œμ˜ 성곡여뢀λ₯Ό 확인해 pr을 ν†΅κ³Όμ‹œν‚€κ±°λ‚˜ 운영브랜치둜 merge μ‹œν‚€λŠ” λ“±μ˜ μΆ”κ°€λ™μž‘μ—λ„ 많이 ν™œμš©λœλ‹€.

 

 

2. TDD 개발주기

- RED : μ‹€νŒ¨ν•˜λŠ” ν…ŒμŠ€νŠΈ μ½”λ“œλ₯Ό μž‘μ„±ν•œλ‹€.

- GREEN : ν…ŒμŠ€νŠΈ μ½”λ“œλ₯Ό μ„±κ³΅μ‹œν‚€κΈ° μœ„ν•œ μ‹€μ œ μ½”λ“œλ₯Ό μž‘μ„±

- BLUE : 쀑볡 μ½”λ“œ 제거, μΌλ°˜ν™” λ“±μ˜ λ¦¬νŒ©ν† λ§ μˆ˜ν–‰- 

 

- TDD μ„ΈλΆ€ν”„λ‘œμ„ΈμŠ€

λ‹¨μœ„ ν…ŒμŠ€νŠΈ μž‘μ„± > λ‹¨μœ„ ν…ŒμŠ€νŠΈ μ‹€ν–‰ > 운영 μ½”λ“œ μž‘μ„± > λ‹¨μœ„ ν…ŒμŠ€νŠΈ μ‹€ν–‰ > 섀계 κ°œμ„ (λ¦¬νŒ©ν† λ§) > λ‹¨μœ„ν…ŒμŠ€νŠΈ ...반볡

 

 

3. μ–΄λ–€ μƒν™©μ—μ„œ TDDλ₯Ό ν•΄μ•Όν• κΉŒ?

TDDλŠ” μ‚¬μš©μ„€λͺ…μ„œμ΄μž μ˜μ‚¬μ†Œν†΅μ˜ μˆ˜λ‹¨μ΄ λ˜λ―€λ‘œ ν”Όλ“œλ°±κ³Ό ν˜‘λ ₯이 μ¦μ§„λ˜μ–΄, λΆˆν™•μ‹€μ„±μ— λŒ€λΉ„κ°€ κ°€λŠ₯ν•΄μ§„λ‹€.

처음 ν•΄λ³΄λŠ” ν”„λ‘œκ·Έλž¨ μ£Όμ œμ΄κ±°λ‚˜(λ‚΄λΆ€μ˜ λΆˆν™•μ‹€μ„±), 고객 μš”κ΅¬μ‘°κ±΄μ΄ λ°”λ€” 수 μžˆλŠ” ν”„λ‘œμ νŠΈ(μ™ΈλΆ€μ˜ λΆˆν™•μ‹€μ„±),

λˆ„κ°€ μœ μ§€λ³΄μˆ˜ν•  μ§€ λͺ¨λ₯΄λŠ” 경우 λ“±μ˜ 상황에 μ μš©ν•˜λ©΄ μ’‹λ‹€.

 

 

4. TDD μž₯점

- 개발자의 μ˜λ„λŒ€λ‘œ 둜직이 λ™μž‘ν•˜λŠ”μ§€ λͺ…ν™•νžˆ μ•Œ 수 μžˆλ‹€. (개발의 λ°©ν–₯성을 μžƒμ§€ μ•Šκ²Œ μœ μ§€)

- 잠재적 였λ₯˜λ₯Ό λ°©μ–΄ν•˜μ—¬ 디버깅 μ‹œκ°„κ³Ό μž¬μ„€κ³„ μ‹œκ°„μ„ 단좕할 수 μžˆλ‹€.

- 둜직 변경에 λŒ€ν•œ 영ν–₯도λ₯Ό λͺ…ν™•νžˆ μ•Œ 수 있고, μΆ”κ°€ κ΅¬ν˜„μ΄ μš©μ΄ν•˜λ‹€.

 

 

5. TDD 단점

- μƒμ‚°μ„±μ˜ μ €ν•˜

(SI ν”„λ‘œμ νŠΈμ—μ„œλŠ” μ†Œν”„νŠΈμ›¨μ–΄ ν’ˆμ§ˆλ³΄λ‹€ 납기일 μ€€μˆ˜κ°€ μ€‘μš”ν•˜λ―€λ‘œ TDD 방식을 잘 μ‚¬μš©ν•˜μ§€ μ•ŠμŒ)

- 기쑴의 κ°œλ°œλ°©μ‹μ„ 많이 바꾸어야함

- ꡬ쑰에 얽맀인닀.

1. ν”„λ‘œκ·Έλž˜λ° νŒ¨λŸ¬λ‹€μž„

- ν”„λ‘œκ·Έλž˜λ° μŠ€νƒ€μΌμ„ μ˜λ―Έν•˜λ©°, 전체적인 ν”„λ‘œκ·Έλž˜λ° 방식을 말함

- λŒ€ν‘œμ μœΌλ‘œ 절차적, 객체지ν–₯, ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°μ΄ μ‘΄μž¬ν•œλ‹€.

- 크게 λΆ„λ₯˜ν•˜λ©΄ λͺ…λ Ήν˜• / μ„ μ–Έν˜• ν”„λ‘œκ·Έλž˜λ°μœΌλ‘œ λ‚˜λˆŒ 수 μžˆλ‹€.

 

1-1. λͺ…λ Ήν˜•(Imperative)ν”„λ‘œκ·Έλž˜λ°

: ν”„λ‘œκ·Έλž˜λ° μƒνƒœμ™€ μƒνƒœλ₯Ό λ³€κ²½μ‹œν‚€λŠ” ꡬ문의 κ΄€μ μ—μ„œμ˜ 연산을 μ„€λͺ…

(컴퓨터가 μˆ˜ν–‰ν•  λͺ…령듀을 μˆœμ„œλŒ€λ‘œ 써놓은것)

- 절차적 ν”„λ‘œκ·Έλž˜λ°, κ°μ²΄μ§€ν–₯ ν”„λ‘œκ·Έλž˜λ°

- λͺ…λ Ήν˜• ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄: C, C++, Java, Pascal, Ruby 

 

1-2. μ„ μ–Έν˜•(Declarative)ν”„λ‘œκ·Έλž˜λ°

: ν•„μš”ν•œ 것을 λ‹¬μ„±ν•˜λŠ” 과정을 κΈ°μˆ ν•˜κΈ°λ³΄λ‹€ ν•„μš”ν•œ 것이 μ–΄λ–€ 것인지λ₯Ό κΈ°μˆ ν•˜λŠ” 것에 μ΄ˆμ μ„ λ§žμΆ”λŠ” ν”„λ‘œκ·Έλž˜λ° ꡬ쑰

: λͺ©ν‘œλ₯Ό λͺ…μ‹œν•˜κ³ , μ•Œκ³ λ¦¬μ¦˜μ„ λͺ…μ‹œν•˜μ§€ μ•ŠλŠ” κ²ƒμœΌλ‘œ '무엇'에 μ§‘μ€‘ν•˜λŠ” ν”„λ‘œκ·Έλž˜λ°('μ–΄λ–»κ²Œ'에 λŒ€ν•œ 뢀뢄은 좔상화)

- ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ° : 

- μ„ μ–Έν˜• ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄ : HTML, Lisp, Haskell, Prolog, SQL, XML 


2. ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°

- 자료처리λ₯Ό μˆ˜ν•™μ  ν•¨μˆ˜μ˜ κ³„μ‚°μœΌλ‘œ μ·¨κΈ‰ν•˜κ³ , μƒνƒœμ™€ 가변데이터λ₯Ό λ©€λ¦¬ν•˜λŠ” ν”„λ‘œκ·Έλž˜λ° νŒ¨λŸ¬λ‹€μž„.

- μˆœμˆ˜ν•¨μˆ˜λ₯Ό μ‘°ν•©ν•˜κ³  ν”„λ‘œκ·Έλž¨μ„ λ§Œλ“œλŠ” 방법이닀.

- ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄ 3λŒ€μž₯ : Clojure, Scala(싀무에 λ„μž…ν•˜κΈ° μ’‹μŒ), Haskell(학계 μ •ν†΅νŒŒ 순수 ν•¨μˆ˜ν˜• μ–Έμ–΄) 

- μžλ°”μŠ€ν¬λ¦½νŠΈ, μ½”ν‹€λ¦°, 파이썬 등에도 졜근 ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ° 문법이 μΆ”κ°€λ˜μ—ˆλ‹€.

- μ™ΈλΆ€ν™˜κ²½μœΌλ‘œλΆ€ν„° 독립적. μ£Όμ–΄μ§„ μž‘μ—…λ§Œ ν•œλ‹€.

 

μˆ˜ν•™μ˜ 원리와 λ°€μ ‘ν•˜κ²Œ μ—°κ΄€. λ§€μš°λŠ”λ° μ‹œκ°„μ΄ 였래걸리고 λ‚œν•΄..

κ·Έλž˜μ„œ μ‚¬λžŒμ˜ 사고방식과 κ°€κΉŒμš΄ μ ˆμ°¨μ§€ν–₯, 객체지ν–₯ ν”„λ‘œκ·Έλž˜λ°μ΄ 더 보편적으둜 많이 μ“°μ—¬μ§€κ³  있음.

 

λ°©λŒ€ν•œ 데이터λ₯Ό λΉ λ₯΄κ²Œ κ³„μ‚°ν•΄μ„œ λ³‘λ ¬μ μœΌλ‘œ μ•ˆμ •μ μœΌλ‘œ μ²˜λ¦¬ν•˜λŠ” κ²ƒμ˜ μ€‘μš”μ„±μ΄ λΆ€κ°λ˜λ©΄μ„œ

ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄κ°€ λ‹€μ‹œ μ£Όλͺ©μ„ λ°›κΈ° μ‹œμž‘ν•œκ²ƒ.


3. ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°μ˜ νŠΉμ§•

3-1. μˆœμˆ˜ν•¨μˆ˜ Pure function

- ν•¨μˆ˜μ˜ 싀행이 ν”„λ‘œκ·Έλž¨ 싀행에 영ν–₯을 λ―ΈμΉ˜μ§€ μ•Šμ•„μ•Ό ν•˜λŠ” ν•¨μˆ˜

- ν•¨μˆ˜ λ‚΄λΆ€μ—μ„œ 인자의 값을 λ³€κ²½ν•˜κ±°λ‚˜ ν”„λ‘œκ·Έλž¨ μƒνƒœλ₯Ό λ³€κ²½ν•˜λŠ” side effect κ°€ μ—†λŠ” 것.

- ν•¨μˆ˜μ—μ„œ μ™ΈλΆ€μ˜ μƒνƒœκ°’μ„ μ°Έμ‘°ν•˜κ±°λ‚˜ λ˜λŠ” μ™ΈλΆ€μ˜ μƒνƒœλ₯Ό λ³€κ²½ν•˜λŠ” 것은 μˆœμˆ˜ν•¨μˆ˜λΌ λ³Ό 수 μ—†λ‹€!

- λ™μΌν•œ 인자λ₯Ό λ„£μ—ˆμ„ λ•Œ 항상 λ™μΌν•œ 결과값을 λ°˜ν™˜ν•˜κ³ , μ–Έμ œ μ„ μ–Έλ˜μ—ˆλŠ”μ§€ 외뢀에 영ν–₯λ°›μ§€ μ•Šλ„λ‘ μž‘μ„±ν•΄μ•Όν•œ.

 

3-2. λΉ„μƒνƒœ Stateless , λΆˆλ³€μ„± Immutability

- ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°μ—μ„œμ˜ λ°μ΄ν„°λŠ” λ³€ν•˜μ§€ μ•ŠλŠ” λΆˆλ³€μ„±μ„ μœ μ§€ν•΄μ•Όν•œλ‹€.

- λ°μ΄ν„°μ˜ 변경이 ν•„μš”ν•œ 경우 원본 데이터 ꡬ쑰λ₯Ό λ³€κ²½ν•˜μ§€ μ•Šκ³ ,

κ·Έ 볡사본을 λ§Œλ“€μ–΄ κ·Έ 일뢀λ₯Ό λ³€κ²½ν•˜κ³  λ³€κ²½ν•œ 볡사본을 μ‚¬μš©ν•΄ μž‘μ—…μ„ μ§„ν–‰

(μ „λ‹¬λœ 데이터λ₯Ό λ³€κ²½ν•˜λŠ”κ²Œ μ•„λ‹ˆλΌ μƒˆλ‘œμš΄ λ²„μ „μ˜ μƒˆλ‘œμš΄ 였브젝트λ₯Ό λ§Œλ“€μ–΄μ„œ κ²°κ³Όκ°’μœΌλ‘œ 전달해야함)

- λ³€κ²½ν•˜μ§€ μ•ŠμŒμœΌλ‘œμ„œ λΆ€μž‘μš©(ν•¨μˆ˜ν˜ΈμΆœμ‹œ μ™ΈλΆ€μƒνƒœλ³€κ²½, μ˜ˆμƒμΉ˜λͺ»ν•œ μ—λŸ¬λ°œμƒ λ“±)을 λ§Œλ“€μ§€ μ•ŠμŒ

- λ©€μ“°λ ˆλ”© ν™˜κ²½(μ—¬λŸ¬ μŠ€λ ˆλ“œκ°€ λ™μ‹œμ— ν•˜λ‚˜μ˜ μžμ›μ„ κ³΅μœ ν•˜κ³  μžˆκΈ°λ•Œλ¬Έμ— 같은 μžμ›μ„ 두고 κ²½μŸμƒνƒœμ™€ 같은 λ¬Έμ œκ°€ λ°œμƒ)μ—μ„œλ„ μ•ˆμ •μ μœΌλ‘œ λ™μž‘ν•œλ‹€.

 

3-3. μ„ μ–Έν˜• ν•¨μˆ˜ Expressions

- μ„ μ–Έν˜•μ€ "무엇"을 ν•  것인가에 μ£Όλͺ© / λͺ…λ Ήν˜•μ€ 무엇을 "μ–΄λ–»κ²Œ"ν•  것인가에 μ£Όλͺ© 

- if, for, switch와 같은 λͺ…령문을 μ‚¬μš©ν•˜μ§€ μ•Šκ³  ν”„λ‘œκ·Έλž˜λ°ν•œλ‹€.

 

3-4. 1κΈ‰ 객체와 κ³ μ°¨ν•¨μˆ˜ First-class, Higher-order functions

- 1κΈ‰κ°μ²΄μ˜ νŠΉμ§• : λ³€μˆ˜λ‚˜ 데이터 ꡬ쑰 μ•ˆμ— 담을 수 μžˆλ‹€. νŒŒλΌλ―Έν„°λ‘œ 전달할 수 μžˆλ‹€. λ°˜ν™˜κ°’μœΌλ‘œ μ‚¬μš©ν•  수 μžˆλ‹€.

ν• λ‹Ήλœ 이름과 관계없이 κ³ μœ ν•œ ꡬ별이 κ°€λŠ₯, λ™μ μœΌλ‘œ ν”„λ‘œνΌν‹° ν• λ‹Ή κ°€λŠ₯.

- κ³ μ°¨ν•¨μˆ˜μ˜ νŠΉμ§• : ν•¨μˆ˜λ₯Ό 인자둜써 전달할 수 μžˆμ–΄μ•Όν•œλ‹€. ν•¨μˆ˜μ˜ λ°˜ν™˜κ°’μœΌλ‘œ 또 λ‹€λ₯Έ ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•  수 μžˆλ‹€.


4. ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°μ˜ μž₯점

- 높은 μˆ˜μ€€μ˜ 좔상화 제곡(λ³΅μž‘ν•œ 자료, λͺ¨λ“ˆ, μ‹œμŠ€ν…œ λ“±μœΌλ‘œλΆ€ν„° 핡심 κ°œλ…, κΈ°λŠ₯을 간좔렀냄)

  * ν•¨μˆ˜μ˜ 기본원칙 'ν•¨μˆ˜λŠ” ν•œκ°€μ§€ λ™μž‘λ§Œ 해야함' => μ—¬λŸ¬ λ™μž‘μ„ λ™μ‹œμ— μˆ˜ν–‰ν•˜λ©΄, λ‹€λ₯Έ ν•¨μˆ˜, λͺ¨λ“ˆκ³Όμ˜ 쒅속성이 컀져        μœ μ§€λ³΄μˆ˜κ°€ μ–΄λ €μ›Œμ§.

- ν•¨μˆ˜ λ‹¨μœ„μ˜ μ½”λ“œ μž¬μ‚¬μš© μˆ˜μ›”

-. λΆˆλ³€μ„±μ„ μ§€ν–₯ν•˜λ―€λ‘œ ν”„λ‘œκ·Έλž¨ λ™μž‘ 예츑이 쉽닀

 

5. ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°μ˜ λ‹¨μ 

- μ½”λ“œμ˜ 가독성이 μ’‹μ§€ μ•Šμ„ 수 있음

- λ°˜λ³΅μ„ for문이 μ•„λ‹Œ μž¬κ·€ν•¨μˆ˜λ₯Ό 톡해 μ΄λ£¨μ–΄μ§€λŠ”λ°(deep copy), μž¬κ·€μ  μ½”λ“œμŠ€νƒ€μΌμ€ λ¬΄ν•œλ£¨ν”„μ— 빠질 수 μžˆλ‹€.

* μž¬κ·€ν•¨μˆ˜ : ν•¨μˆ˜ μ•ˆμ— μžμ‹ μ˜ ν•¨μˆ˜λ₯Ό λ‹€μ‹œ ν˜ΈμΆœν•˜λŠ” ν•¨μˆ˜. μžμ‹ μ˜ λ‘œμ§μ„ λ‚΄λΆ€μ μœΌλ‘œ λ°˜λ³΅ν•˜λ‹€κ°€ 일정 쑰건이 만쑱되면

ν•¨μˆ˜λ₯Ό μ΄νƒˆν•˜μ—¬ κ²°κ³Όλ₯Ό λ„μΆœν•œλ‹€.

- μˆœμˆ˜ν•¨μˆ˜μ˜ μ‚¬μš©μ€ μ‰¬μšΈ 수 μžˆμœΌλ‚˜, 쑰합은 쉽지 μ•Šλ‹€.


6. 정리

ui μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜μ€ νŠΉμ„±μƒ λ§Žμ€ μƒνƒœλ³€ν™”κ°€ μΌμ–΄λ‚˜λ―€λ‘œ μˆœμˆ˜ν•¨μˆ˜ν˜•ν”„λ‘œκ·Έλž˜λ°λ§Œμ„ μ΄μš©ν•΄μ„œλŠ” 무리가 μžˆλ‹€κ³ ν•¨.

λ”°λΌμ„œ 'ν•¨μˆ˜ν˜• λ°˜μ‘ν˜• ν”„λ‘œκ·Έλž˜λ°'을 μ΄μš©ν•˜κ±°λ‚˜, 객체지ν–₯ν”„λ‘œκ·Έλž˜λ°μ—μ„œ ν•¨μˆ˜ν˜•ν”„λ‘œκ·Έλž˜λ°μ˜ νŠΉμ§•μ„

κ²°ν•©ν•΄ μ•ˆμ •μ μΈ ν”„λ‘œκ·Έλž¨μ„ ν•˜λŠ” μ‹μœΌλ‘œ ν™œμš©. 

μ›ν•˜λŠ” λͺ©ν‘œμ— 따라 μ μ ˆν•œ 것을 잘 골라 μ‚¬μš©ν•΄ν•˜κ³ , μ—¬λŸ¬ νŒ¨λŸ¬λ‹€μž„μ„ 잘 μ΄ν•΄ν•˜κ³  두루 μ•Œμ•„μ•Ό ν•œλ‹€.

+ Recent posts