오늘은 2주차 과제의 마지막 날이다.
오늘 한 것은
1. 리팩토링
2. 생성자 주입
3. 단위, 통합 테스트 코드 작성
이었다.
코드 작성량이 1주차보다 더 많은데도 1주차에 비해 조오금 더 여유롭게 과제를 끝내게 되었다...!
어제 밤에 과제 제출 사이트에 테스트 통과를 확인하려고 예제 테스트를 실행했는데, 몇 번이나 해도 계속 에러가 발생했다. '예기치 못한 오류로 인하여 실행에 실패하였습니다.'
엄청 당황했다. 분명 코드는 문제가 없고, 실행도 잘 됐기 때문에 더 그랬다. 심지어 오류 이유도 알 수 없었기 때문에 더 그랬다.
오류의 원인은 바로 테스트 파일들의 위치에 있었다. TDD 과정에서 작성한 파일들이 racingcar 폴더 내에 위치해서, 테스트 시 뭔가 충돌이 발생해서 그런 것으로 추측했다.
이렇게 패키지를 racingcar 바깥으로 꺼내주니 단번에 해결됐다. 까딱 잘못하면 이유를 알아내지 못하고 애꿎은 코드만 주구장창 고칠 뻔했다. 정말 다행이다!
많은 리팩토링을 진행했다.
모든 클래스를 하나씩 살펴보며 공통된 코드는 메서드로 분리하고, 다른 클래스로 책임을 옮기면 좋을 것 같은 메서드는 분리하거나 새로 클래스를 만들어주고, 가독성을 향상시켜주고... 일일이 다 남기기가 힘들어 커밋 기록으로 대체한다.
생성자 주입은 최종 리팩토링 후 마지막에 했다. 미리 생성자 주입을 적용해놓으면 혹여나 인스턴스 메서드를 static으로 선언하거나 하는 상황이 발생하면 다시 수정해야 되기 때문이다. 생성자 주입은 애플리케이션 최상단의 Apllication
클래스에서 진행하며, 애플리케이션 최상단에 RacingFactory
클래스를 만들어 생성자 주입을 위한 객체를 만들어주게 했다.
| ⬆️ 게임 결과에 대한 통합 테스트
일단 우선적으로 해야할 것들을 마치고 (아마도) 마지막으로 최종 테스트를 진행하는데, 최종 통합 테스트에서 알 수 없는 이유로 계속 테스트가 실패했다. 알고 보니 테스트 문자열 첫 줄의 \nking :"
의 마지막에 공백 한 자를 넣지 않아서 실패한 거였다... 이 공백 하나 때문에 2시간을 고민하고 결국 성공했을 땐 진짜 일어서서 박수쳤다...
과제 소요 시간 : 목~수 7일간 약 65시간
wakatime 으로 봤을 때, 7일간 IDE에 커서가 머무른 시간이 약 41시간이다.
과제를 받은 목요일+다음날인 금요일엔 설계를 한다고 코드 작성은 많이 못했고, 일요일에는 몰아서 잠을 자느라 시간이 절반으로 뚝 떨어졌다.
나머지 25시간은 학습과 서칭, 회고글 작성을 위주로 사용했다.
1주차에 비해 IDE에 머무른 시간이 10시간 정도 늘어났는데, 회고글에 쓴 것처럼 그 만큼 새로 배운게 적다는 의미이면서도 검색하지 않고도 해결할 수 있는 상황이 더 많아졌다는 것을 의미한다고 생각한다!
기능 요구 사항, 프로그래밍 요구 사항, 과제 진행 요구 사항 전부를 만족했고, 테스트를 통과했다. 1주차 과제에서 좀 더 발전해서 요구 사항에는 없지만 필요할 것 같은 기능들도 추가했다. (예 : 틀린 자동차 이름 알려주기)
내가 작성한 전체 코드의 클래스 다이어그램이다.
1주차보다는 뭔가 흐트러져있는데, 팩토리 메서드와 인터페이스의 사용 때문이라고 생각한다.
단위 테스트 (1주차 때 했던건 엄밀히 말하면 단위 테스트라기 보다는 TDD 였다.)
통합 테스트
싱글톤 패턴의 지양(사용할 때의 단점이 더 큰 상황에서)
유연한 원칙 적용(무조건적으로 SRP를 지키기 보다는, 트레이드 오프를 생각하며..)
인터페이스 (실전)
정적 팩토리 메서드 패턴
옵저버 패턴
Runnable 인터페이스
애플리케이션 전체의 의존성 주입
올바른 DTO 사용
레코드로 DTO 만들기
도메인 객체의 캡슐화 최대로 지키기
...
1주차보다는 배운게 적지만, 그래도 큼직큼직한 것들을 학습해 적용할 수 있었다. 특히 패턴 2개를 (내 생각에는) 적절한 곳에 사용할 수 있었던 게 좋았다!
1주차 과제에 비해 아주 조금 더 여유롭게 완성하긴 했지만, 구현하고 싶었지만 하지 못한것도 있었다.
1. web 환경에서의 출력을 고려
CLI 환경 말고 web 환경에서의 출력도 고려하라는 코드 리뷰를 해주신 고수분이 계셨는데, 이를 적용해보고 싶었지만 전혀 모르는 분야라 학습에는 시간이 부족했다.
진짜 1,2,3번 모두 적용해보고 싶은 거였는데, 우선순위에서 떨어져 시간 문제상 학습과 적용을 하기 어려웠다.. 다음 과제때는 학습해서 꼭 적용해보고 싶다...!
1일단위 회고 대단하시네요 !! 👍👍
잘보고갑니다~