한동안 포스팅에는 자바지기 박재성님이 운영하시는 NextStep 교육 웹사이트에서 수강한 자바 플레이 그라운드 with TDD, 클린코드에 대한 공부 기록을 남기려고 합니다. 이번 포스팅은 제일 기초 부분인 단위 테스트를 이용한 숫자야구게임에 관한 포스팅입니다.
강의를 수강하게 된 계기
본인은 어렸을 때 부터 눈팅하는 것을 좋아했다.
인터넷 카페에서도 눈팅을 많이 했고, 같이 게임하는 사람들 톡방에서도 종종 눈팅을 했다.
현재 진행하고 있는 연합 동아리 수다방에서도 꽤나 눈팅을 자주 하는 편이다.
필자는 흥미로운 얘기를 보는 것을 좋아하지만, 참여하는 것은 조금 부끄럽다.ㅎㅎ
개발에 대한 흥미도 가지면서 코딩에 몰입하다보니 자연스럽게 개발 커뮤니티도 많이 살펴보고 개발 관련 오픈 톡방에서도 눈팅을 많이 하게 되었다. 그러던 와중에 유쾌한 스프링이라는 좋은 오픈 톡방에 들어갈 수 있었고, 매일 선배님들의 좋은 개발 얘기와 다양한 썰을 눈팅하고 있었다. 그러던 어느 날, 부방장님이 올려주신 자바 TDD 영상을 보았고, 그 영상을 계기로 TDD와 좋은 코드에 대해 더 알고 싶고, 흔히 말하는 우아한 코드를 짜고 싶다는 욕심이 생겼다.
그런 코드에 대한 욕심을 가지고 있는 상태에서 커뮤니티에서 NextStep이라는 교육기관에서 운영하는 자바 플레이 그라운드 강의를 추천받게 되었고 좋은 기회가 될 거 같아 강의를 수강하게 되었다.
현재 1단원인 단위테스트를 통한 숫자야구 파트를 복습 중인데 매우 만족스럽다.
이제 본격적으로 1단원을 듣고 배운 점과 느낀 점을 남겨보겠다.
강의를 통해 느낀 점 (피드백 영상 보기 이전)
먼저 첫 번째로 재밌었던 점은 요구사항이다. 여기서 요구사항이란 어떠한 기능적 요구사항이 아닌, 코드의 제약이다.
해당 단원에서 제시한 요구사항은 다음과 같다.
- 자바 코드 컨벤션을 지키면서 프로그래밍한다.
- indent(인덴트, 들여쓰기) depth를 2가 넘지 않도록 구현한다. 1까지만 허용한다.
- else 예약어를 쓰지 않는다.
- 모든 로직에 단위 테스트를 구현한다. 단, UI(System.out, System.in) 로직은 제외
- 3항 연산자를 쓰지 않는다.
- 함수(또는 메소드)가 한 가지 일만 하도록 최대한 작게 만들어라.
이를 지키면서 구현하려고 하는데 역시나 처음에는 힘들었다.
특히 depth를 줄이려고 하니 자연스럽게 모듈화가 진행되고 작은 단위의 메서드들이 깔끔하게 만들어졌다.
뭔가 단일 책임 원칙을 잘 구현한 것 같아 뿌듯함을 느꼈다. 물론 피드백 영상을 보기 전 까지는..
두 번째로 재밌었던 부분은 TDD이다.
TDD 사이클은 다음과 같다.
- 실패하는 테스트를 최대한 빠르게 성공하는 테스트로 만든다.
- 리팩토링한다.
- 다시 실패하는 테스트를 만든다.
이 부분이 굉장히 처음에는 어려웠다. 그리고 조금은 귀찮기도.. 하지만 결국 TDD를 진행하니까 클래스가 잘 쪼개지고 모듈화 된 모습을 확인할 수 있었다. 이것도 물론 피드백 영상을 보기 전까지는...ㅎㅎ
그리고 테스트가 통과될 때 초록불이 보이는 그 쾌감이 정말 좋았다.
처음에 피드백 영상을 보기 전에는 최대한 스스로의 힘으로 진행했고, 이는 꽤 재밌었다.
피드백 영상을 시청한 후
피드백 영상을 시청한 후 역시 나는 부족한 부분이 많다고 느꼈다.
처음에 강의를 보면서 '우와..'라는 뱉은 것 같다. 몇 가지 기억에 남는 부분을 적어보겠다.
- 알고리즘 같은 문제는 입출력이 확실하기 때문에 TDD를 연습하기 굉장히 좋다. 입출력이 확실한 것부터 TDD로 시작하자
(Utils 관련 클래스). - TDD가 너무 어렵다면 우선 개발을 해보고 도메인에 관한 지식을 쌓은 후, 싹 다 지우고 TDD로 다시 도전하자.
- 리팩토링이란 활동이 정말 중요하다. 또한 TDD와 단위 테스트는 별개다.
- 도메인을 다이어그램으로 설계해보고 , TO DO LIST(구현할 목록)를 작성해 TDD 순서를 정하자.
- 경계 값에서 예외가 많이 발생하므로, 경계 값 테스트에 주의하자.
- 도메인을 설계할 때 최대한 작은 부분마다 쪼개면서 설계하자.
- 필드를 다루지 말고 객체에게 메시지를 보내라.
- 그밖에도 선생님의 코드에서 많은 것을 배울 수 있었다. 특히 리팩토링 분에서. 최고!!
제일 인상 깊었던 코드는 아래와 같은 코드인데 아래는 필자가 다시 작성한 코드다.
play() 메서드가 인상 깊었는데 물론 null 체크를 해야겠지만,
저렇게까지 객체에게 메시지를 보낼 수 있다는 방식에서 뭔가 머리를 얻어맞은 듯한 느낌이었다.
public class Ball {
private int value;
private int position;
//다른 코드는 생략
public BallStatus play(Ball ball){
if(ball.strike(value, position)){
return BallStatus.STRIKE;
}
else if(ball.ball(value)){
return BallStatus.BALL;
}
return BallStatus.OUT;
}
public boolean strike(int value, int position ){
return (this.value == value & this.position == position );
}
public boolean ball(int value){
return this.value == value;
}
}
이렇게 피드백 영상 청취를 마무리했다. 보면서 코딩하지 말라고 하셔서 영상을 보면서 진행하지는 않았다.
영상은 그냥 아무 때나 총 3번 정도 본 것 같다.
피드백 영상을 보고 난 후 TDD
확실히 영상을 보고 난 후 더 많은 것을 배운 것 같다. 또한 코드도 더 깔끔하고 예뻐진 것이 보인다.
물론 기억에 의존해 강의를 따라간 부분이 있겠지만, 시야가 넓어진 것 같아서 기분이 매우 좋았다.
다시 도전한 코드는 아래와 같다.
https://github.com/happysubin/java-baseball-playground/tree/my-challenge/src/main/java/challenge
굉장히 즐거웠고 재밌었다. 다음 파트 포스팅도 빨리 올리고 싶은 기분이다.
다른 사람들도 들었으면 좋겠다..! 강력 추천합니다 ㅎㅎ
이상으로 포스팅을 마칩니다. 감사합니다.
댓글