2주차 미션 : 자동차 경주
미션 보기 ( 7기 레포에는 설명이 없어 6기 레포로 대체합니다)
https://github.com/woowacourse-precourse/java-racingcar-6
GitHub - woowacourse-precourse/java-racingcar-6
Contribute to woowacourse-precourse/java-racingcar-6 development by creating an account on GitHub.
github.com
2주차는 나에게 있어 상당히 아쉬웠다.1주차 미션에 대해 사람들과 리뷰를 진행하였고,
아래와 같은 문제점을 발견할 수 있었다.
- private 메서드의 네이밍이 불명확하다.
- 일부 메서드에서 snake-case를 사용하고, 일부 메서드에서는 camel-case를 사용했다.
- 에러에 메시지를 넣으면 좋을 것 같다.
- 내가 작성한 코드임에도 불구하고 의도를 명확히 설명하지 못했다.
- service 레이어가 존재하지만, controller에서 도메인이 노출되고 있다.
1,2 번의 경우 명확한 나의 실수였다. 이 부분에서 가장 뜨끔한 부분은 4번이다.
우선 1주차에서 나는 service와 serviceImpl을 분리해서 작성했다. 하지만 리뷰어 한 분 께서 이런 리뷰를 달아주셨다.
Service 인터페이스와 ServiceImpl 구현체 클래스를 나누신 이유가 궁금합니다! 이렇게 나누면 어떤 이점이 있나요?
미래의 확장 가능성을 대비하신 거라면 어떤 확장을 염두에 두고 구현하셨는지 궁금합니다!
이 질문에 대해 대답하지 못 했다.
미래의 확장 가능성을 생각해 인터페이스와 구현체를 분리한 것이 아니었다. 단순히 나누면 가독성도 좋고,
뭐 좋은점이 있지 않을까? 라는 생각으로 분리를 진행했었다.
분명 내가 작성한 코드였지만, 나눈 이유를 내가 모른다. 이 부분에 대해 굉장히 반성하고 깊게 생각을 했다...
2주차 부터는, 코드 한 줄 한 줄에 명확한 의도를 가지고 작성을 해야겠다고 다짐했다.
5번의 경우에는 service와 controller의 역할과 책임에 대한 이해도 부족으로 발생한 문제였다.
이전까지 service는 '비즈니스 로직'을 담당하는 곳이라고 생각하고 있었고, controller는 '비즈니스 로직과 view를
연결하는 곳' 이라고 생각했다.
문제가 되는 부분의 코드다.
public void start() {
String userInput = inputView.getUserInput();
List<String> validNumber = calculatorService.findValidNumber(userInput);
double calculateResult = calculator.calculatePlusNumber(validNumber);
Object determineResultType = calculator.determine_type(calculateResult);
outputView.printResult(determineResultType);
}
start 코드는 controller의 메서드 중 일부 메서드다.
controller지만, calculatorService가 아닌, calculator.calculatorPlusNumber(validNumber)와 같은 코드가 있다.
'controller의 장점은 도메인에 대해 몰라도, service에 대한 결과값을 통해 view로 출력할 수 있다.'
인데, 이렇게 controller에서 도메인이 노출됨으로서 장점이 사라진 것이다ㅜ
이 부분을 1주차 코드리뷰를 통해 배웠고, 위의 개선사항을 전부 반영해 2주차 미션에 녹여내야겠다고 생각했다.
또한, 다른 사람들의 코드를 보며 아래와 같은 부분을 배웠다.
- static 메서드의 사용
- Enum 클래스를 통한 에러 메세지 관리
- 의존성 주입
- 일급컬렉션
- Factory 패턴
- Stream이란?
위 부분도 공부 후 2주차 미션에 전부 적용하려고 했다.
결과부터 말하자면, 실패했다.
일주일만에 적용하는것은 무리였던 것 같다. 어떻게 하면 이 모든걸 다 지키면서 코드를 짤 수 있을까? 라는 생각을 계속했고, service 계층을 도입했다가, 삭제했다가를 수없이 반복하며 시간이 지나갔다. 그 결과, 적용하면서 어느정도 이해한 부분도 있고, 아직까지 완벽히 이해를 못 한 부분도 존재한다. 일주일이라는 시간은 나에게 있어 너무 짧은 시간이였던 것 같다.
미션은 일주일이 주어진다.
그 중 최소 이틀은 사람들과의 코드리뷰를 통해 내가 적용한 부분에 대해 피드백을 받고, 다른 사람들의 관점에서 코드를 바라보고, 내가 맞닥뜨린 문제를 다른 사람들은 어떻게 풀어나갈까? 에 대한 생각하는 시간이 필요하기 때문이다.
여기서 정리한 내용을 토대로, 다음 주차 미션에 적용한다. 5일 동안에 위의 내용을 전부 습득하기에는 벅찼던 것 같다.
그 결과, 단위 테스트를 작성하고 싶었지만, random값 설정 관련해 어려움을 겪었고, 시간이 부족해 결국 몇몇 메서드는
테스트를 하지 못 했다.
5일동안 더 열심히 하면 됐잖아! 라는 질문에 최선을 다했어. 라는 말을 자신있게 할 수 있다.
2주차 미션은 아무쪼록 아쉬움이 많이 남았다.앞으로 갈 길이 멀다. 배워야할 내용도 많다.
이 모든걸 갑자기 다 적용하려면 어려움을 겪는게 당연하다. 그래서 앞으로는 다음 미션에 적용해야 할
우선순위를 정하고, 하나씩 지켜나가려고 한다.
TIL (Today I Learn)
확실하게 이해한 부분:
- private 메서드의 네이밍 신경쓰기
- 자바 표기 형식 통일 (메서드의 경우 카멜 표기법)
- exception에 메세지 추가
- controller에서 도메인 노출 방지
- Enum
아직 연습이 필요한 부분:
- Dependency Injection
- 일급 컬렉션
- Factory 패턴
- static 메서드의 사용처
- Stream
다음 미션에서 해결해야 할 부분:
- 연습이 필요한 부분 익숙해지기 (1순위)
- 단위테스트를 하기 쉽게 코드를 짜기 (2순위)
- 정적 팩토리 메서드 도입해보기 (3순위)
https://github.com/CodingMasterLSW/java-racingcar-7
GitHub - CodingMasterLSW/java-racingcar-7
Contribute to CodingMasterLSW/java-racingcar-7 development by creating an account on GitHub.
github.com
branch - CodingMasterLSW
'우아한테크코스' 카테고리의 다른 글
| 우테코 Level1 1주차 회고 (5) | 2025.02.16 |
|---|---|
| 우테코[BE 7기] 최종 합격 후기 (22) | 2024.12.28 |
| 우테코 프리코스[BE 7기] 4주차 회고 및 종료 (4) | 2024.12.28 |
| 우테코 프리코스[BE 7기] 3주차 회고 (4) | 2024.12.27 |
| 우테코 프리코스[BE 7기] 1주차 회고 (6) | 2024.12.27 |