Skip to content

Latest commit

Β 

History

History
74 lines (61 loc) Β· 3.53 KB

File metadata and controls

74 lines (61 loc) Β· 3.53 KB

Swift둜 TDD, RxSwift, MVVMλ₯Ό μ΄μš©ν•΄μ„œ μ•± κ°œλ°œν•˜κΈ°

TDD, RxSwift, MVVM을 μ΄μš©ν•΄μ„œ κ°„λ‹¨ν•œ μ•± κ°œλ°œμ„ ν•΄λ³΄κ² μŠ΅λ‹ˆλ‹€.

TDD

TDD(Test Driven Development)λ₯Ό ν•œλ‹€κ³  ν•˜λŠ” 것은 기본적으둜 둜직 μ½”λ“œλ₯Ό μž‘μ„±ν•˜κΈ° 전에 ν…ŒμŠ€νŠΈ μ½”λ“œλ₯Ό λ¨Όμ € μž‘μ„±ν•œλ‹€λŠ” 것을 μ˜λ―Έν•©λ‹ˆλ‹€. 그런데 둜직 μ½”λ“œλ₯Ό μž‘μ„±ν•˜κΈ° 전에 ν…ŒμŠ€νŠΈ μ½”λ“œλ₯Ό μž‘μ„±ν•œλ‹€λŠ” 것은 무엇을 μ˜λ―Έν• κΉŒμš”? 무슨 이점이 μžˆμ„κΉŒμš”?

예λ₯Ό λ“€μ–΄ add λΌλŠ” λ§μ…ˆμ„ ν•˜λŠ” ν•¨μˆ˜λ₯Ό μž‘μ„±ν•œλ‹€κ³  κ°€μ •ν•΄ λ΄…μ‹œλ‹€. TDDλ₯Ό ν•œλ‹€κ³  ν–ˆμœΌλ‹ˆ, λ¨Όμ € add에 λŒ€ν•œ ν…ŒμŠ€νŠΈ μ½”λ“œλ₯Ό μž‘μ„±ν•©μ‹œλ‹€.

μ½”λ“œλ₯Ό ν…ŒμŠ€νŠΈν•œλ‹€λŠ” 것은 무엇을 μ˜λ―Έν• κΉŒμš”? ν•΄λ‹Ή μ½”λ“œκ°€ μ›ν•˜λŠ” λŒ€λ‘œ μž‘λ™ν•˜λŠ”μ§€ ν™•μΈν•œλ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€. 그러면 ν•΄λ‹Ή μ½”λ“œκ°€ μ›ν•˜λŠ” λŒ€λ‘œ μž‘λ™ν•˜λŠ”μ§€ μ–΄λ–»κ²Œ 확인할 수 μžˆμ„κΉŒμš”?

μ—¬κΈ°μ—μ„œλŠ” addλ₯Ό μž‘μ„±ν•œλ‹€κ³  ν–ˆμœΌλ‹ˆ, add에 λŒ€ν•΄ "μž…λ ₯이 a, b μΌλ•Œ, 좜λ ₯이 a + b 인 값이면 μ œλŒ€λ‘œ μž‘λ™ν•œλ‹€"κ³  ν•  수 μžˆμ„ κ²λ‹ˆλ‹€. κ·Έλž˜μ„œ add에 λŒ€ν•œ ν…ŒμŠ€νŠΈ μ½”λ“œλŠ” μ•„λž˜μ™€ 같은 ν˜•νƒœλ‘œ μž‘μ„±ν•  수 μžˆμ„ κ²λ‹ˆλ‹€.

if(3 == add(a: 1,b: 2)) {
  print("성곡")
}
else {
  print("μ‹€νŒ¨")
}

XCTAssertλ₯Ό μ΄μš©ν•΄μ„œ μ½”λ“œλ₯Ό μ’€ 더 κ°„λ‹¨ν•˜κ²Œ ν‘œμ‹œν•˜λ©΄, μ•„λž˜μ™€ 같이 μž‘μ„±ν•  수 μžˆμ„ κ²λ‹ˆλ‹€.

XCTAssert(3 == add(a: 1,b: 2))

이 μ½”λ“œλ₯Ό μ‹€ν–‰ μ‹œν‚€λ©΄, addλΌλŠ” ν•¨μˆ˜κ°€ μ—†μœΌλ‹ˆ λ‹Ήμ—°νžˆ μ—λŸ¬κ°€ λ‚˜κ²Œ λ©λ‹ˆλ‹€. 이제 add ν•¨μˆ˜λ₯Ό μ•„λž˜μ™€ 같이 μž‘μ„±ν•©λ‹ˆλ‹€.

func add(a:Int, b:Int) -> Int {
    return a + b
}

그리고 ν…ŒμŠ€νŠΈλ₯Ό μ‹€ν–‰μ‹œν‚€λ©΄ μ •μƒμ μœΌλ‘œ ν…ŒμŠ€νŠΈκ°€ ν†΅κ³Όλ©λ‹ˆλ‹€.

그럼 μ—¬κΈ°μ„œ, μ•žμ— ν…ŒμŠ€νŠΈ μ½”λ“œλ₯Ό μž‘μ„±ν•˜κΈ° 전에 μ •μ˜ν–ˆλ˜ "μž…λ ₯이 a, bμΌλ•Œ, 좜λ ₯이 a + b인 값이면 μ œλŒ€λ‘œ μž‘λ™ν•œλ‹€"λŠ” 무엇을 μ˜λ―Έν• κΉŒμš”?

이것은 둜직 μ½”λ“œκ°€ μ–΄λ–»κ²Œ λ™μž‘ν•΄μ•Ό ν•˜λŠ”μ§€λ₯Ό μ •μ˜ν•œ λ¬Έμž₯이 λ©λ‹ˆλ‹€. (즉, ν•¨μˆ˜μ— λŒ€ν•œ μŠ€νŽ™(Specification)이죠) 그리고 XCTAssert(3 == add(1,2)) λŠ” μŠ€νŽ™μ„ μ½”λ“œλ‘œ κΈ°μˆ ν•œ κ²ƒμž…λ‹ˆλ‹€.

즉, TDDμ—μ„œλŠ” ν…ŒμŠ€νŠΈ μ½”λ“œλ₯Ό λ¨Όμ € μž‘μ„±ν•œλ‹€λŠ” μž‘μ„±ν•  둜직 μ½”λ“œμ— λŒ€ν•œ μŠ€νŽ™μ„ λ¨Όμ € μ½”λ“œλ‘œ μ •μ˜ν•œλ‹€λŠ” 것을 μ˜λ―Έν•©λ‹ˆλ‹€. 그러면 μŠ€νŽ™μ„ μ½”λ“œλ‘œ λ¨Όμ € μ •μ˜ν•˜κ³  둜직 μ½”λ“œλ₯Ό μž‘μ„±ν•˜κ²Œ 되면 μ–΄λ–€ 이점이 μžˆμ„κΉŒμš”?

ν˜„μž¬λ‘œμ„œλŠ” 예λ₯Ό λ“  μ½”λ“œλŠ” λ„ˆλ¬΄ κ°„λ‹¨ν•΄μ„œ λ³„λ‘œ 이점이 μ—†μŠ΅λ‹ˆλ‹€. μŠ€νŽ™μ„ μ½”λ“œλ‘œ μ •μ˜ν•΄μ•Ό ν•˜λ‹ˆ, 였히렀 더 ν”Όκ³€ν•΄ 보이기만 ν•©λ‹ˆλ‹€. ν•˜μ§€λ§Œ 둜직 μ½”λ“œμ˜ 양이 많고, λ³΅μž‘ν•˜λ‹€λ©΄ μ–΄λ–€ 일이 μ–΄λ–»κ²Œ λ κΉŒμš”?

예λ₯Ό λ“€μ–΄ ν•¨μˆ˜ strangeAdd λΌλŠ” ν•¨μˆ˜λ₯Ό μž‘μ„±ν•œλ‹€κ³  κ°€μ •ν•©μ‹œλ‹€. stringAddλŠ” a, bλΌλŠ” λ‘κ°œμ˜ νŒŒλΌλ―Έν„°λ₯Ό λ°›λŠ”λ°, aκ°€ 3이 μ•„λ‹ˆκ³  7이 μ•„λ‹ˆλ©°, μ§μˆ˜κ°€ 아닐 λ•ŒλŠ” a + b인 값을 λ¦¬ν„΄ν•˜κ³ , aκ°€ 짝수일 λ•ŒλŠ” a * b인 값을 λ¦¬ν„΄ν•œλ‹€κ³  ν•©μ‹œλ‹€. 그리고 aκ°€ 3의 배수일 λ•ŒλŠ” 3 + a * b 인 값을 λ¦¬ν„΄ν•œλ‹€κ³  ν•˜κ³ , aκ°€ 7의 λ°°μˆ˜μ΄λ©΄μ„œ, bκ°€ 8의 배수이면 7 * a + 8 * b 인 값을 λ¦¬ν„΄ν•œλ‹€κ³  ν•©μ‹œλ‹€. 그리고 μœ„μ˜ 쑰건이 λͺ¨λ‘ ν•΄λ‹Ήλ˜μ§€ μ•ŠμœΌλ©΄, a + b + 5 인 값을 λ¦¬ν„΄ν•œλ‹€κ³  ν•©μ‹œλ‹€.

인단 TDDκ°€ μ•„λ‹Œ λ°©μ‹μœΌλ‘œ μ½”λ“œλ₯Ό μž‘μ„±ν•΄λ΄…μ‹œλ‹€.

func stringAdd(a:Int, b:Int) -> Int {
  if(0 != a % 2 && 3 != a && 7 != a) {
    return a + b
  }
  else if(0 == a % 2) {
    return a * b
  }
  else if(0 == a % 3) {
    return 3 + a * b
  }
  else if(0 == a % 7 && 0 == b % 8) {
    return 7 * a + 8 * b
  }

  return a + b + 5
}
```