본문 바로가기

(자바 플레이그라운드 with TDD, 클린코드) 숫자 야구 게임, 자동차 경주 회고

2022. 7. 15.

 

Next Step 교육 과정을 통해 TDD를 배웠던 경험을 작성하는 글이다. 내가 해당 교육에서 어떤것을 배웠고 어떤 것을 얻었는지 또 어떤 생각을 하고 있었는지 회고 하여 나중에 내가 왜 이런식으로 생각했었고, 어떤 것을 했었는지 기록하기 위해 작성하는 목적의 글이다.

 

숫자 야구 게임

미션 진행 전 String에 대한 학습 테스트를 실습했고, 문자열 계산기 기능을 구현하면서 TDD를 체험을 했다. TDD를 익히기 위해서 철저하게 클래스를 만들기전 테스트 클래스 부터 생성하였고, 내가 기능을 구현할 메서드들을 계획하면서 테스트를 먼저 작성하였다. TDD의 기본적인 경험을 할 수 있는 미션이었다.

 

자동차 경주 게임

랜덤한 응답을 내는 기능은 테스트 하기가 까다롭다. 기능 설계 할 때, 기능의 종속성을 최상위로 만들어서 다른 기능들이 랜덤한 기능에 대해 종속적이지 않게 만든다면 다른 기능들을 테스트하기 편하게 될것이다. 기능 설계의 중요성과 TDD 능력을 키울 수 있었다.

 

학습 내용들

- indent(인덴트, 들여쓰기) depth를 2가 넘지 않도록 구현한다. 1까지만 허용한다.

미션을 진행 조건중 하나다. 개발을 하다보면 조건들이 많아질 수도 있고 조건이 많아지다보면 if문 안에 if에 넣어 문제를 쉽게 해결하곤 했다. 하지만 미션에서는 indent depth가 2를 넘으면 안되다 보니 개발했던 방식으로 진행하면 요구사항에 맞지 않는 코드가 되어 버린다.

불편하더라도 해당 조건을 만족시키면서 개발을 진행하니 자연스럽게 한 메서드의 코드를 읽기가 굉장히 쉬워졌다는 것을 느낄 수 있었다. 클린코드 작성하는 방법의 한 가지를 깨달은 경험이었다.

 

미흡했던 부분

미션을 진행하기 위해 도메인 설계를 먼저 해야한다. 원래 내가 기능을 구현했던 방식은 도메인 설계는 나중에 기능을 구현 다하고 진행했었는데 도메인 설계를 먼저 하려니 낮설기만 했고, 답답한 느낌이 들었다. 나중에 설계했던 이유는 기능을 구현하다보면 생각하지 못했던 부분이 존재했었고, 결국에는 설계를 수정하는 작업이 필요했다. 기능을 구현 다하고 설계해 놓으면 수정하는 부분은 최소가 되기 때문에 이런식으로 진행했었는데, 치명적인 단점은 기능을 구현하다가 산으로 가는 경우가 발생해 다시 갈아 엎고 코드를 작성하는 경우가 발생해 많은 시간이 소모됐던 경험이 있다. 결론은 나는 도메인 설계에 익숙하지 못해 발생했던 문제였고, 해당 교육을 통해서 TDD 개발 능력과 도메인 설계 능력을 함께 키울 수 있도록 노력했다.

 

얻은 것

직접 실습을 통해 TDD 개념 을 알 수 있었다. 실패하는 테스트를 작성하고, 테스트를 통과 시키는 코드를 작성하고, 작성한 코드들을 리펙토링하는 과정을 거친다. 굉장히 재미있는 경험이었다. 매서드 하나를 만들때 마다 미션을 수행하는 느낌이었고 테스트를 통과하는 결과가 나오면 소소한 성취감을 느낄 수 있었다. 또한 어떤 기능 메서드를 만들때 머릿속으로 구상을 끝낸 뒤에 진행할 수 있는 과정이라 좀 더 내가 원하는 기능이 무엇인지 확실하게 짚고 넘어갈 수 있어서 생각나는대로 기능을 만드는 일이 없어졌다. 확실하게 짚고 넘어간다는 것은 코드가 산으로 가는일이 줄어들 것이고 실수를 예방하는 방법도 될것같다. 앞으로 코드를 하나 개발할 때도 테스트를 먼저 작성하는 습관을 길들일 것이다.

 

학습 테스트 개념

업무를 진행하다가 List 나 Set와 같은 함수를 이용할 때 생각이 함수가 가끔 존재했다. 이 때 테스트 코드로 작성하여 혼자 테스트 해보고 삭제 하는 식으로 진행 했었다. 숫자 야구 게임 미션을 진행하면서 학습 테스트라는 것이 존재한다는 사실을 알게 되었다. 학습 테스트를 통해 API를 테스트할 수 있고, 버전이 바뀔때 마다 이용했던 API 함수 기능 변경 사항이 없는지 자동으로 확인이 가능하다는 장점이 있다는 것을 깨닫게 되었다. 앞으로 간단한 함수 동작이더라도 테스트 파일을 삭제하지 않고 유지 해야겠다.

 

객체지향 생활 체조 (기본 요구 사항)

일급 컬렉션

컬렉션을 하나의 도메인 객체로만들어서 그 도메인을 관리하는 로직들을 한곳에서 관리 할 수있다. 객체지행적으로 설계가 될 것이고 더 깔끔한 코드가 작성될 것이다.

 

원시값을 포장해라

원시값을 포장하기 위해 클래스를 만들어 관리하게 되면 equals를 재구현 해줘야한다. 이퀄스 사용에 대해 쓸일이 없다고 생각해서 많이 사용하지 않았는데 객체지향적인 설계를 제대로 하지 않아서 많이 사용을 안했던 것이었다.

댓글