TDD란 되게 번거롭고 시간이 많이 소요되며 겉멋이 든 개발 방법이라고 생각 했지만, 이번 미션을 통해 TDD에 대한 생각이 완전 바뀌었습니다.
실패하는 테스트 코드를 작성하는 과정에서 시간을 지체하는것 처럼 느껴질 수도 있지만, 이로인해 불필요한 설계를 피할 수 있고 정확한 요구사항에 집중할 수 있게 되었습니다.
또한 점점 쌓여가는 테스트 코드 덕분에 특정 버그도 손 쉽게 찾아낼 수 있었습니다.
왜 TDD를 해야 하는지 깨닫게 되었고, 과제를 구현하면서 어떻게 하면 테스트 하기 좋은 코드를 작성할 수 있을지 깊이 고민하는 시간을 가졌습니다.
프리코스 커뮤니티를 통해 지난 주차 과제에 대해 코드 리뷰를 주고 받았습니다.
코드 리뷰를 받으며 내가 놓친 실수와 여러 개선점들을 발견
할 수 있었고, 코드 리뷰를 해줄때는 잘 만들어진 코드를 보며 이런 방식으로도 코드를 작성할 수도 있구나?
느끼면서 클린코드 작성에 대해 배울 수 있는 기회가 되었습니다.
언젠가 취업을 하게 된다면, 꼭 코드리뷰 문화가 있는 회사에 취업을 해야겠다 라는 생각이 들었습니다.
2주차 미션에서 주어진 테스트 코드에서는 assertRandomNumberInRangeTest()
등 camp.nextstep.edu.missionutils
라이브러리의 여러 API를 사용합니다.
메소드들이 어떻게 만들어졌는지 궁금해서 라이브러리를 파고파고 들어가서 확인해보니, 낯선 자바 문법에 숨이 턱 막혔습니다.
미션을 진행하면서 시간이 남는다면, 라이브러리를 읽는 연습을 할 겸 camp.nextstep.edu.missionutils
API가 어떻게 만들었는지 공부해 보려고 합니다.
1부터 9까지 서로 다른 수로 이루어진 3자리의 수를 맞추는 숫자야구게임을 구현해야 합니다.
구현한 내용은 Git Hub에 업로드 했습니다.
camp.nextstep.edu.missionutils.Console
API를 사용을 하는 도중, illegal reflective access 관련 경고가 발생했습니다.
자바 9버전 부터 생긴 모듈 시스템에서는 자바의 핵심 클래스에 대한 접근 제어를 막도록 제어하는데, 해당 라이브러리는 이를 고려하지 않아서 발생한 경고문 이었습니다.
11버전이 아닌 8버전에서 실행시키면 경고문이 발생하지 않는것을 확인할 수 있었습니다.
참고 : https://kth990303.tistory.com/219
테스트를 먼저 만들고 테스트를 통과하기 위한 코드를 구현함으로써, 테스트를 주축으로 개발을 이끌어 가는 개발 방법론을 의미 합니다.
TDD를 시도 함으로써, 코드의 결함을 줄이고 깨끗하고 유지보수 비용이 낮은 코드를 작성할 수 있게 되었습니다.
참고 : https://gmlwjd9405.github.io/2018/06/03/agile-tdd.html
TDD는 Red - Green - Refactor
라고 불리는 짧은 개발 주기의 반복에 의존하는 개발 프로세스 입니다.
- Red : 실패하는 테스트 코드를 먼저 작성합니다.
- Green : 테스트 코드를 성공시키기 위한 실제 코드를 작성합니다.
- Refactor : 중복 코드 제거, 일반화 등의 리팩토링을 수행합니다.
중요한 것은 Red - Green - Refactor
프로세스를 통해, 실패하는 테스트를 통과할 정도의 최소한의 코드를 작성하는 점 입니다.
이를 통해 코드에 기대하는 바를 명확하게 정의하여 불필요한 설계를 피할 수 있고, 정확한 요구 사항에 집중할 수 있게 되었습니다.
참고 : https://www.samsungsds.com/kr/insights/test-driven-development.html
단위 테스트는 하나의 모듈을 기준으로 독립적으로 진행되는 가장 작은 단위의 테스트를 의미 합니다.
해당 부분만 독립적으로 테스트 하기 때문에 어떤 코드를 리팩토링하여도 빠르게 문제 여부를 확인할 수 있게 되었습니다.
참고 : https://mangkyu.tistory.com/143
JUnit은 자바의 단위테스트를 수행해주는 대표적인 테스트 프레임워크 입니다.
Jupiter : JUnit이 공식적으로 제공하는 테스트를 위한 API 입니다.
AssertJ : 오픈 라이브러리로 테스트를 위한 API 입니다.
AssertJ는 Jupiter에 비해 표현력이 풍부하고, 메서드 체이닝 덕분에 더 편리하게 코드를 작성할 수 있어서 Jupiter 보다는 AssertJ를 사용하고 있습니다.
TDD를 시도할때 AssertJ의 다양한 API를 이용함으로써, 테스트 코드를 편리하게 작성할 수 있게 되었습니다.
참고 : https://loopstudy.tistory.com/287
애플리케이션을 Model - View - Controller
이렇게 세 가지 역할로 구분한 개발 방법론을 의미 합니다.
Model : 비즈니스 영역의 로직을 처리 합니다.
View : 비즈니스 영역에 대한 프레젠테이션 뷰를 담당합니다.
Controller : 사용자의 입력 처리와 흐름 제어를 담당합니다.
입력과 관련된 로직을 분리하여 InputView
클래스를 만들었습니다.
출력과 관련된 로직을 분리하여 OutputView
클래스를 만들었습니다.
MVC 패턴을 사용함으로써, 비즈니스 로직과 UI로직이 분리되어 유지보수가 쉬운 클린코드를 작성할 수 있게 되었습니다.
스트라이크인지 확인하는 로직을 분리하여 isStrike
메소드를 만들었습니다.
이러한 방식으로 두번 이상 반복되는 코드는 메소드로 만들어, 재사용성과 가독성이 높은 코드로 만들었습니다.