κ°•μ˜ 정리/TDD, 클린 μ½”λ“œ with Java

TDD, 클린 μ½”λ“œ with Java (λ―Έμ…˜ 2. 둜또 - TDD)

주발2 2023. 5. 13. 16:02
λ°˜μ‘ν˜•

μ§€λ‚œλ²ˆ λ―Έμ…˜ 1. μžλ™μ°¨ κ²½μ£Ό - λ‹¨μœ„ ν…ŒμŠ€νŠΈλ₯Ό μ§„ν–‰ν•˜κ³ , μ΄μ–΄μ„œ λ―Έμ…˜ 2. 둜또λ₯Ό μ§„ν–‰ν–ˆμŠ΅λ‹ˆλ‹€.

 

λ―Έμ…˜ 1λ³΄λ‹€λŠ” λΉ λ₯΄κ²Œ μ§„ν–‰ν–ˆμ§€λ§Œ, λͺ¨λ“  λ―Έμ…˜μ„ 끝내기 μœ„ν•΄μ„œλŠ” 쑰금 더 속도λ₯Ό λ‚΄μ•Όκ² λ„€μš”... 😭

 

 

1단계 - λ¬Έμžμ—΄ μ‹€μŠ΅

1λ‹¨κ³„λŠ” κ°„λ‹¨ν•œ λ¬Έμžμ—΄ 사칙 μ—°μ‚° 계산기λ₯Ό κ΅¬ν˜„ν•˜λŠ” λ―Έμ…˜μž…λ‹ˆλ‹€.

  • 예λ₯Ό λ“€μ–΄ 2 + 3 * 4 / 2와 같은 λ¬Έμžμ—΄μ„ μž…λ ₯ν•  경우 2 + 3 * 4 / 2 μ‹€ν–‰ 결과인 10을 좜λ ₯ν•΄μ•Ό ν•©λ‹ˆλ‹€.

 

파일 λμ—λŠ” κ°œν–‰μ„ μΆ”κ°€ν•˜μž

Github - νŒŒμΌ 끝에 κ°œν–‰μ΄ μ—†λŠ” 경우
Github - 파일 끝에 κ°œν–‰μ΄ μ‘΄μž¬ν•˜λŠ” 경우

μ•„λž˜ 링크λ₯Ό μ°Έκ³ ν•΄ 보면 κ°œν–‰μ€ ν•˜λ‚˜μ˜ 행을 μ •μ˜ν•˜λŠ” ν‘œμ€€μœΌλ‘œ κ°œν–‰μ΄ μ—†λ‹€λ©΄ λλ‚˜μ§€ μ•Šμ€ ν–‰μœΌλ‘œ κ°„μ£Όν•˜κΈ° λ•Œλ¬Έμ— 파일의 λμ—λŠ” κ°œν–‰μ„ μΆ”κ°€ν•˜λŠ” 것이 μ’‹λ‹€κ³  ν•©λ‹ˆλ‹€.

κ·Έλ™μ•ˆ 파일 끝에 κ°œν–‰μ„ μΆ”κ°€ν•˜λŠ” 것을 무심코 ν–ˆμ—ˆλŠ”λ°, 이번 κΈ°νšŒμ— μ •ν™•ν•œ 원인을 μ•Œ 수 μžˆμ—ˆμŠ΅λ‹ˆλ‹€.

 

전체 λ¬Έμžμ—΄μ„ μž…λ ₯λ°›μ•„μ„œ 계산

ν…ŒμŠ€νŠΈν•˜λ €λŠ” μˆ˜μ‹μ΄ 길어지면 ν•΄λ‹Ή ν…ŒμŠ€νŠΈ 클래슀의 라인도 점점 κΈΈμ–΄μ§ˆ 것 κ°™μ€λ°μš”, 2 + 3 * 4 / 2λ₯Ό μ „λ‹¬ν–ˆμ„ λ•Œ 10이 잘 λ‚˜μ˜€λŠ”μ§€ ν•œ λˆˆμ— λ³Ό 수 μžˆλ„λ‘ κ°œμ„ ν•΄λ³΄λ©΄ μ–΄λ–¨κΉŒμš”?

졜초 주어진 λ¬Έμžμ—΄μΈ 2 + 3 * 4 / 2 을 κ²€μ¦ν•˜κΈ° μœ„ν•΄ ν…ŒμŠ€νŠΈ μ½”λ“œμ—μ„œ ν•˜λ‚˜μ”© κ³„μ‚°ν•˜μ—¬ κ²€μ¦ν•˜λŠ” μ½”λ“œλ₯Ό μž‘μ„±μ„ ν–ˆμ—ˆμŠ΅λ‹ˆλ‹€.

ν•˜μ§€λ§Œ, μœ„ 리뷰처럼 μˆ˜μ‹μ΄ 길어진닀면 ν…ŒμŠ€νŠΈ μ½”λ“œ λ˜ν•œ κΈΈμ–΄μ§ˆ 수 μžˆκΈ°μ— μž…λ ₯받은 λ¬Έμžμ—΄ 자체λ₯Ό 계산할 수 μžˆλŠ” λ°©μ‹μœΌλ‘œ κ°œμ„ ν•΄λ„ 쒋을 것 κ°™μŠ΅λ‹ˆλ‹€.

 

 

2단계 - 둜또(μžλ™)

2λ‹¨κ³„μ˜ μš”κ΅¬μ‚¬ν•­μ€ 본격적으둜 둜또λ₯Ό κ΅¬ν˜„ν•˜λŠ” κ³Όμ •μœΌλ‘œ 둜또 κ΅¬μž… κΈˆμ•‘μ„ μž…λ ₯λ°›κ³ , μžλ™μœΌλ‘œ κ΅¬λ§€ν•˜λ©°, λ‘œλ˜ 당첨 번호λ₯Ό μž…λ ₯받은 ν›„ 당첨 톡계λ₯Ό 좜λ ₯ν•˜κΈ°μž…λ‹ˆλ‹€.

 

둜또 λ‹Ήμ²¨μ˜ μƒνƒœλ₯Ό κ°€μ Έμ•Ό ν• κΉŒ? μƒνƒœλ₯Ό λ³€κ²½ν•  수 μžˆλŠ” 게 λ§žμ„κΉŒ?

클래슀 λ‹€μ΄μ–΄κ·Έλž¨

λ―Έμ…˜μ„ μ§„ν–‰ν•˜λ©΄μ„œ μ΅œμ΄ˆμ— κ³ λ €ν–ˆλ˜ 방식은 μœ„ μ΄λ―Έμ§€μ²˜λŸΌ LottoTicket이 Lotto, LottoPrizeλ₯Ό ν•„λ“œλ‘œ κ°€μ§€λŠ” λ°©μ‹μ΄μ—ˆμŠ΅λ‹ˆλ‹€.

 

LottoPrizeλ₯Ό μƒνƒœλ‘œ μœ μ§€ν•΄μ•Ό ν•  ν•„μš”κ°€ μžˆμ„μ§€ κ³ λ―Όν•΄λ³΄μ‹œλ©΄ 쒋을 것 κ°™μ•„μš”. κ΅¬λ§€ν•œ λ‘œλ˜μ™€ 당첨 번호λ₯Ό κ°–λŠ” 둜또λ₯Ό λΉ„κ΅ν•΄μ„œ μ–»μ–΄μ§€λŠ” 결과물둜 μƒμ„±λ˜μ–΄λ„ μΆ©λΆ„ν•˜μ§€ μ•Šμ„κΉŒμš”? λ˜ν•œ changeLottoPrizeStatus()와 같은 setter λ©”μ„œλ“œκ°€ public으둜 μ—΄λ € μžˆλŠ” μƒνƒœλΌλ©΄ μ™ΈλΆ€μ—μ„œ μ‰½κ²Œ 당첨 μƒνƒœλ₯Ό λ³€κ²½ν•  수 μžˆλŠ” λ¬Έμ œμ λ„ μžˆμ„ 것 κ°™λ„€μš”.

ν•˜μ§€λ§Œ μœ„ μ½”λ“œμ²˜λŸΌ LottoTicketμ—λŠ” μƒνƒœλ₯Ό λ³€κ²½ν•˜λŠ”(setter) λ©”μ„œλ“œκ°€ μ‘΄μž¬ν•˜κ³ , κ²°κ΅­ μ΄λŸ¬ν•œ λ©”μ„œλ“œκ°€ public 이면 (리뷰처럼) μ™ΈλΆ€μ—μ„œ 당첨 μƒνƒœλ₯Ό μ‘°μž‘ν•  수 μžˆλŠ” 문제점이 μ‘΄μž¬ν•©λ‹ˆλ‹€.

 

둜또λ₯Ό κ΅¬λ§€ν•œ ν›„ 당첨 번호λ₯Ό μž…λ ₯λ°›κΈ° λ•Œλ¬Έμ— 둜또λ₯Ό λ°œκΈ‰λ°›μ•˜μ„ λ•Œ 당첨 μƒνƒœλ₯Ό λ°”λ‘œ λΉ„κ΅ν•˜λŠ” 건 λΆˆκ°€λŠ₯ν•©λ‹ˆλ‹€.

당첨 μƒνƒœλ₯Ό λΉ„κ΅ν•˜λŠ” λ©”μ„œλ“œμ—μ„œ κΈ°μ‘΄μ—λŠ” setterλ₯Ό 톡해 값을 λ³€κ²½ν–ˆλ‹€λ©΄, κ°œμ„ λœ μ½”λ“œμ—μ„œλŠ” 당첨 μƒνƒœλ₯Ό λ‚˜νƒ€λ‚΄λŠ” List<LottoPrize>λ₯Ό λ§Œλ“€μ–΄μ„œ λ°˜ν™˜ν•˜λ„λ‘ μˆ˜μ •ν–ˆμŠ΅λ‹ˆλ‹€. 

 

μœ„ μ½”λ“œλ„ λ¬΄λΆ„λ³„ν•œ getter μ‚¬μš©, κ°μ²΄μ—κ²Œ λ©”μ‹œμ§€ 전달, 일급 μ»¬λ ‰μ…˜ μ‚¬μš© λ“± κ°œμ„  여지가 λ§Žμ§€λ§Œ 1μ°¨μ μœΌλ‘œλŠ” μœ„μ™€ 같이 κ°œμ„ μ„ ν–ˆμŠ΅λ‹ˆλ‹€.

 

κ°μ²΄μ—κ²Œ λ©”μ‹œμ§€ 전달

(μ•„λ§ˆλ„..?) 이번 λ¦¬λ·°μ—μ„œ κ°€μž₯ 많이 받은 ν”Όλ“œλ°±μΈ λ“― ν•©λ‹ˆλ‹€.. πŸ˜‚

κ°μ²΄μ—κ²Œ λ©”μ‹œμ§€λ₯Ό μ „λ‹¬ν•˜λ„λ‘ μ½”λ“œλ₯Ό κ΅¬ν˜„ν•˜λŠ” μ—°μŠ΅μ΄ 잘 μ•ˆλ˜μ–΄ μžˆμ–΄μ„œ κ΄€λ ¨ ν”Όλ“œλ°±μ„ 많이 λ°›μ•˜κ³ , μ½”λ“œλ₯Ό κ΅¬ν˜„ν•˜λ©΄μ„œ 둜직의 μ±…μž„μ΄ μ–΄λŠ 객체에 μžˆλŠ”μ§€λ₯Ό νŒλ‹¨ν•˜λŠ” 것도 μ–΄λ €μ›Œμ„œ λ†“μΉœ 것 κ°™μŠ΅λ‹ˆλ‹€.

getter둜 값을 κΊΌλ‚΄λŠ” λŒ€μ‹ μ—, κ°μ²΄μ—κ²Œ λ©”μ‹œμ§€λ₯Ό λ³΄λ‚΄λŠ” λ°©μ‹μœΌλ‘œ κ΅¬ν˜„ν•΄λ³΄λ©΄ μ–΄λ–¨κΉŒμš”? μœ ν‹Έλ¦¬ν‹° 클래슀 μ‚¬μš©λ„ μ’‹μ§€λ§Œ, getterλ₯Ό 자주 ν˜ΈμΆœν•˜λŠ” μ ˆμ°¨μ§€ν–₯적인 μ½”λ“œκ°€ λ˜λŠ” κ²½μš°κ°€ μ’…μ’… μžˆμŠ΅λ‹ˆλ‹€. Controllerλ₯Ό λ‹΄λ‹Ήν•˜λŠ” Applicationμ—μ„œ 객체 간에 λ©”μ‹œμ§€λ₯Ό μ£Όκ³  λ°›λŠ” ꡬ쑰도 κ³ λ―Όν•΄λ³΄μ‹œλ©΄ 쒋을 것 κ°™μ•„μš”.

μœ„ getter처럼 값을 κΊΌλ‚΄λŠ” 방식이 μ•„λ‹Œ ν•΄λ‹Ή κ°μ²΄μ—κ²Œ λ©”μ‹œμ§€λ₯Ό μ „λ‹¬ν•˜λŠ” λ°©μ‹μœΌλ‘œ κ°œμ„ ν•˜λ €κ³  λ³΄λ‹ˆ 둜또 λ²ˆν˜Έμ™€ 당첨 번호λ₯Ό λΉ„κ΅ν•˜λŠ” 역할을 Lottoκ°€ 슀슀둜 ν•˜λŠ” 것이 λ§žμ„κΉŒ? λΌλŠ” 생각이 많이 λ“€μ—ˆμŠ΅λ‹ˆλ‹€.

κ΄€λ ¨ν•΄μ„œλŠ” μ•„λž˜ ν¬μŠ€νŒ…μ„ 보며 많이 도움이 λ˜μ–΄ μ²¨λΆ€ν•©λ‹ˆλ‹€. (두 λ²ˆμ§ΈλŠ” 저와 λ™μΌν•œ 생각을 가지신 λΆ„μ˜ 질문 및 ν† λ‘ μž…λ‹ˆλ‹€.)

ꡐ윑 과정이 μ’…λ£Œλ˜λ©΄ 객체 지ν–₯의 사싀과 μ˜€ν•΄ 및 였브젝트λ₯Ό μ½μ–΄λ³΄λ©΄μ„œ λ‹€μ‹œ μ •λ¦¬ν•˜λŠ” μ‹œκ°„μ„ κ°€μ Έμ•Όκ² λ„€μš”. 

 

좜λ ₯에 λŒ€ν•œ ν•˜λ“œ μ½”λ”© 제거

ν•˜λ“œ μ½”λ”©ν•˜λŠ” λŒ€μ‹  LottoPrize λ₯Ό ν™œμš©ν•΄λ³΄λŠ” 건 μ–΄λ–¨κΉŒμš”?

당첨 톡계λ₯Ό 좜λ ₯ν•˜κΈ° μœ„ν•΄ λͺ¨λ“  당첨 개수λ₯Ό ν•˜λ‚˜μ”© 좜λ ₯ν•˜λŠ” 뢀뢄이 μ‘΄μž¬ν–ˆμ—ˆλŠ”λ° enum ν΄λž˜μŠ€μ— 좜λ ₯κ³Ό κ΄€λ ¨λœ λ¬Έμž₯을 μΆ”κ°€ν•˜μ—¬ 반볡 ν•˜λ“œ μ½”λ”© 뢀뢄을 μ œκ±°ν•  수 μžˆμ—ˆμŠ΅λ‹ˆλ‹€.

 

ν…ŒμŠ€νŠΈ μ½”λ“œ 쀑볡 제거

@ParameterizedTest λ₯Ό ν™œμš©ν•˜μ—¬ μ½”λ“œ 쀑볡을 쀄여보면 μ–΄λ–¨κΉŒμš”?

둜또 λ²ˆν˜Έκ°€ ν•œλ‘ κ°œμ”© 달라지고, 이에 따라 당첨 μƒνƒœκ°€ λ‹¬λΌμ§€λŠ” ν…ŒμŠ€νŠΈλ₯Ό μ „λΆ€ μž‘μ„±ν•˜λ‹€ λ³΄λ‹ˆ 쀑볡 뢀뢄이 많이 μ‘΄μž¬ν•˜μ—¬ @ParameterizedTest, @MethodSource μ–΄λ…Έν…Œμ΄μ…˜μ„ ν™œμš©ν•˜μ—¬ 쀑볡 μ½”λ“œλ₯Ό μ œκ±°ν–ˆμŠ΅λ‹ˆλ‹€.

 

μ‹œμŠ€ν…œμ— 독립적인 κ°œν–‰ 문자 μ‚¬μš©

https://www.baeldung.com/java-string-newline#3-using-platform-independent-newline-characters

 

 

3단계 - 둜또(2λ“±)

3λ‹¨κ³„μ˜ μš”κ΅¬ 사항은 2등을 μœ„ν•œ λ³΄λ„ˆμŠ€ λ²ˆν˜Έκ°€ μΆ”κ°€λ˜κ³ , 당첨 톡계에도 2등이 μΆ”κ°€λ˜μ–΄μ•Ό ν•©λ‹ˆλ‹€.

λ³΄λ„ˆμŠ€ 번호 ν•˜λ‚˜ μΆ”κ°€ν•˜λŠ” μš”κ΅¬μ‚¬ν•­μ΄ 뭐가 μ–΄λ ΅κ² μ–΄?라고 μƒκ°ν–ˆμ§€λ§Œ, κΈ°μ‘΄ μ½”λ“œλ₯Ό λ¦¬νŒ©ν„°λ§ ν•˜λ©΄μ„œ λ‹¨μˆœνžˆ κΈ°λŠ₯ μΆ”κ°€ν•˜λŠ” μž‘μ—…λ„ μ‰¬μš΄ 일이 μ•„λ‹ˆλΌλŠ” 것을 κΉ¨λ‹«κ²Œ λ˜μ—ˆμŠ΅λ‹ˆλ‹€.. 😭

 

도메인 객체λ₯Ό μΆ”κ°€ν•˜μž

As-Is) 당첨 λ²ˆν˜Έμ™€ λ³΄λ„ˆμŠ€ 번호λ₯Ό κ°–λŠ” 도메인 객체λ₯Ό μΆ”κ°€ν•΄λ³΄λŠ” 건 μ–΄λ–¨κΉŒμš”?

κΈ°μ‘΄ λ‘œμ§μ—μ„œ 당첨 번호λ₯Ό μ˜λ―Έν•˜λŠ” WinnerLotto 객체λ₯Ό μΆ”κ°€ν•˜μ—¬ λ‹€μŒκ³Ό 같은 이점을 κ°€μ§ˆ 수 μžˆμ—ˆμŠ΅λ‹ˆλ‹€.

  • λ©”μ„œλ“œ 인수의 갯수 κ°μ†Œ
  • 객체의 μ±…μž„ 및 μ—­ν•  뢄리

β€» 참고둜 ꡐ윑자료의 κ°€μ΄λ“œλŠ” λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

- ν•¨μˆ˜μ—μ„œ 이상적인 인수 κ°œμˆ˜λŠ” 0개(무항)이닀. λ‹€μŒμ€ 1개이고, λ‹€μŒμ€ 2κ°œμ΄λ‹€.
- 3κ°œλŠ” κ°€λŠ₯ν•œ ν”Όν•˜λŠ” 편이 μ’‹λ‹€.
- 4개 이상은 νŠΉλ³„ν•œ μ΄μœ κ°€ μžˆμ–΄λ„ μ‚¬μš©ν•˜λ©΄ μ•ˆλœλ‹€
- μΈμˆ˜κ°€ 2 ~ 3개 ν•„μš”ν•œ κ²½μš°κ°€ 생긴닀면 인수λ₯Ό λ…μžμ μΈ 클래슀λ₯Ό 생성할 수 μžˆλŠ”μ§€ κ²€ν† ν•΄ λ³Έλ‹€.

 

 

4단계 - 둜또(μˆ˜λ™)

κ°μ²΄μ—κ²Œ λ©”μ‹œμ§€ 전달

κ°μ²΄μ—κ²Œ λ©”μ‹œμ§€λ₯Ό μ „λ‹¬ν•˜λŠ” 것은 κ²°κ΅­ 객체λ₯Ό 객체슀럽게 μ‚¬μš©ν•œλ‹€λŠ” λœ»μ΄κΈ°λ„ ν•˜κ³ , μ΄λŠ” 객체의 μ±…μž„κ³Ό 역할이 잘 λΆ„λ¦¬λ˜μ–΄ μ½”λ“œμ˜ 가독성 ν–₯μƒμ΄λ‚˜ ν…ŒμŠ€νŠΈ μ½”λ“œ μž‘μ„±μ˜ μš©μ΄ν•¨, μœ μ§€ 보수 편의 λ“± λ‹€λ°©λ©΄μœΌλ‘œ 이점이 μžˆμ„ λ“― ν•©λ‹ˆλ‹€.

 

 

λ°˜μ‘ν˜•