본문으로 바로가기

우아한테크캠프 PRO 2기

1주차 - 로또

우테캠 PRO 2기의 1주차 미션은 로또, TDD
로또 프로그램을 만드는 데 그냥 무작정 막 개발하는 것이 아닌 TDD로 개발하는 미션이다. TDD는 Test Driven Development 의 약자이며, 테스트 주도 개발을 뜻한다.
먼저 실패하는 Test Code를 작성한 뒤에 Test Code의 보호를 받으며(?) 비즈니스 로직을 구현해 나간다.

TDD의 아이러니 중 하나는 테스트 기술이 아니라는 점이다. TDD는 분석 기술이며, 설계 기술이기도 하다. - 켄트벡, Test Driven Development by Example 중

위의 인용구와 같이 TDD는 테스트 기술이라기 보다는 방법론?에 좀 더 가까운 것 같다.

TDD를 하는 이유

1. 디버깅 시간을 줄여준다.
2. 동작하는 문서 역할을 한다.
3. 변화에 대한 두려움을 줄여준다.

TDD 사이클

위에 말한 것과 같이 TDD는 먼저 실패하는 테스트를 구현하고 테스트가 성곡하도록 프로덕션 코드를 구현한 뒤에 리펙토링을 거친다.

1단계 - 학습 테스트 실습

TDD 기반의 로또 프로그래밍 구현의 1단계는 학습테스트 실습이다. 우테캠 수강을 하면서 미션을 어떻게 진행하고 코드리뷰는 어떻게 하며 Pull Request는 어떻게 할지? 에 대한 전반적인 연습을 하는 단계였다.
코드를 작성을 하지만 로또를 구현하는 것보다는 String 클래스로 테스트 코드를 작성하고 프로덕션 코드를 작성해서 PR을 진행하는 연습을 하는 단계다.

나의 1주차 첫 리뷰어님이 신 kyucumber 님😀😀
리뷰는 저런식으로 PR을 요청하고 리뷰어님께서 피드백을 주시거나 next-step의 내 brunch로 merge를 해주시면 다음단계를 진행하면 된다.
모든 주차에서 공통적으로 1단계 미션이 끝나면 내 local에 next-step의 내 bruch를 가져오고 merge가 될때마다 가져온 원격 브런치에 fetch와 rebase를 거쳐 새 단계의 brunch를 만들어서 진행한다.
이 과정은 다음에 다시 다루도록 하겠다!

2단계 - 문자열 덧셈 계산기

2단계도 로또 관련 프로그래밍보다는 아직 연습단계이다. 연습단계지만 indent depth 라던가 메소드의 크기, else 사용하지 않기 등의 java convention 을 지키면서 코드를 작성해 나가야 한다.
2단계에서는 피드백을 주셨다.
  • 이건 몰랐던 내용인데 작업 마지막에 항상 newline을 넣어주는 것을 규칙으로 해야겠다.

  • 아직 메서드명이 명확하지가 않아 피드백을 주셨다,, checkNullAndEmpty로 바꾼 것 같다.

  • RuntimeException 을 사용하면 어떤 error인지 정확히 구분이 어려우니 IllegalArgumentException("err desc") 로 명확하게 어떤 에러인지 표현해주자.

  • 메서드명,,;;ㅎㅎ 예전에는 메서드나 변수를 줄였지만 지금은 메서드명이 길어지는 한이 있더라도 어떤 메서드이며 어떤 변수인지 명확하게 전달해야 한다

  • 사실 java convention을 지키려고 엄청난 노력을 기울이다가 사실상 기능의 순서가 바뀐 것 같다,,

  • 모든 예외 경우에 대해 테스트코드를 작성하고 예외처리를 하자!!

아래 로직을 추가해주었다

  • 테스트 코드는 여러가지 방법으로 작성할 수 있도록 annotation을 제공한다.

이런 식으로 Parameter 를 추가하여 테스트 코드를 작성할 수 있따.

3단계 - 로또(자동)

3단계 부터는 로또프로그래밍!! 처음에 TDD를 잘 이해하고 개발했다고 생각했는데 정말 한참 잘 못 생각했었고 결과도 엉망으로 나왔기 때문에 Step3을 뒤엎고 Step3-1 브런치로 처음부터 다시 개발했다,,,

이렇게 지금까지 한 코드를 엎고 다시 개발해보는 것도 좋은 방법인 것 같다는 생각을 했다.
3단계는 피드백 양이 꽤 된다..... 아마 정말 엉망이라는 뜻이겠지..
  • 추가 적으로 생길 상태에 대해 if 조건을 추가하는 것은 생산성이 낮은 코드이다,, if문을 줄일 방법을 생각하자.

enum도 사실 처음 써봤다,, 그리고 저 if문은 당첨 갯수를 구하기 위해 조건을 걸어 주었었는데 map을 만들어 value값을 증가시켜주는 것으로 바꿔 if문을 제거했다.

  • 메서드명... ㅎㅎ 메서드 명, 클래스 명, 변수 명 등 네이밍에 시간을 쏟자,,

  • is는 boolean 값을 리턴해줄 것이라는 의도로 보인다! 난 코멘트에 작성한 대로 0 , 1을 true, false로 생각을 해서 is로 붙였었다,,

  • business 로직이 변경 되면 그에 따라 Test code가 오류가 발생할 텐데 그 Test Code는 어떻게 할지? 를 여쭤봤다,.

  • 나머지는 테스트 코드에 관한 이야기


  • 이 때 부터 getter에 대한 고민을 많이,, 쭈욱 한 것 같다,,

  • Stream 메서드의 사용

4단계 - 로또(보너스볼)

4단계 부터 뭔가 TDD에 대한 흥미와 재미가 붙었었던 것 같다ㅎㅎ
  • 해당 메서드를 가지고 있어야할 class 를 정하는 것도 굉장히 중요한 부분인 것 같다.

  • 원시값 포장을 잘하자!

  • 이미 우리가 생각하는 모든 기능은 메서드로 다 구현이 되어 있는 듯,,

5단계 - 로또 (자동)

1주차의 마지막 단계!! 받은 피드백에 대해서는 반영을 한 뒤에 같은 피드백을 받지 않으려고 노력했고, 같은 피드백은 거의 받지 않았다 ㅎㅎ 이 것도 정말 성장하고 있는 과정이라고 생각이 든다
마지막 5단계는 하나의 피드백만 받았다.

마치며

내가 구현한 코드에 대한 리뷰를 받는다는 것은 어떻게 보면 개발자로서의 내 모든 것을 보여주는 것과 같다는 생각이 든다. 하지만 이렇게 리뷰를 받으며 개선하고 성장해 나가는 과정이 정말 재밌고 급속도로 성장할 수 있도록 해주는 것 같다. 이렇게 1주차가 끝났고 우아한테크캠프PRO 에 지원한 것을 정말 잘했다는 생각이 들었다.
1주차 코드리뷰해주시느라 고생해주신 리뷰어님께도 정말 감사드리고 TDD에 대해 많은 것을 배울 수 있었던 한 주였다!!

테스트코드의 보호를 받으며 개발하자!!