post-custom-banner

7일차

오늘은 많은 결과물을 내지는 않았다. 커밋은 3가지만 추가했다.
숫자를 검증하는 부분에서 '0' 을 입력하는 경우를 고려하지 못해서 관련 로직을 추가했다.
테스트 케이스를 좀 더 꼼꼼히 만들었어야 했는데, 아무래도 첫 실전 테스트 코드 작성이었다 보니 정신이 없었기도 했다. 2주차 과제부터는 경우의 수를 전부 생각해보려는 노력을 해야겠다. 체크 리스트를 만드는게 좋을지도...?

그리고 싱글톤 패턴을 적용해봤다. 싱글톤 패턴은 과제를 시작하기 전부터 알고 있던 유일한 디자인 패턴이었는데, 그 이유 때문에 써먹어보고 싶었다.| 싱글톤 패턴을 공부하고 기록해놨던 것

사실 다른 클래스에도 싱글톤 패턴을 적용할 수 있었지만, 아직은 쓰는게 더 좋은지, 좋지 않은지 상황에 대한 판단이 확실치가 않았다. 이런 패턴 사용에는 장단점이 동시에 존재하니까. 공부가 더 필요하다.

그리고 Service 클래스가 게임 전반의 흐름과 상태를 관리하는 역할을 부여받긴 했지만, DTO와 소통하는 책임 정도는 분리해줘도 될 것 같아서 DtoManager로 분리해줬다. 6일차 회고에 DtoManager 를 사용하는 부분을 올렸는데 오늘 또 커밋한 이유는, DtoManager 를 사용 할지 안 할지, 그리고 사용한다면 DtoManager 에서도 각각의 담당하는 DTO 마다 클래스 분리가 일어나야 하는지에 대해 계속 고민하고 코드를 쓰고 지우고 했기 때문이다. 결론은 이번에는 한 DtoManager 객체에서 역할을 수행하는 걸로 했다. DtoManager에서 DTO 마다 클래스 분리가 일어나면 Service 에서 결국 직접 DTO 클래스와 소통하는 것과 가독성이 똑같기 때문이었다(역할의 분리는 얻지만).

1주차 과제를 돌아보며

야구 게임 깃허브

시간

과제 소요 시간 : 목~수 7일간 약 70시간
wakatime 으로 봤을 때, 6일간 IDE에 커서가 머무른 시간이 약 30시간이다.
wakatime을 금요일부터 사용해서 과제를 시작한 목요일에는 기록이 되어있지 않다. 근데 첫 날에는 설계 위주로 진행해서 30시간에서 큰 변화는 없을 거다.

나머지 40시간은 학습과 서칭, 회고글 작성을 위주로 사용했다.

구현 정도

기능 요구 사항, 프로그래밍 요구 사항, 과제 진행 요구 사항 전부를 만족했고, 테스트를 통과했다.

클래스 다이어그램


내가 작성한 전체 코드의 클래스 다이어그램이다.

  1. Controller 계층은 View 계층과 Service 계층(+Util, 사실상 Service Support) 하고만 소통하고 있다.
  2. Service 계층은 게임 전반 흐름을 관리하고 있다. Service 계층은 Model 계층과 Util (사실상 Service Support) 하고만 소통하고 있다.
  3. DTO의 관리를 돕는 Util은 DTO와 Service 계층하고만 소통하고 있다.
  4. Service, Model <-> View 계층은 서로 알지 못하고 소통하지도 않는다.

etc : 공통된 재시작 옵션을 포함한 Enum, 게임 결과의 타입을 담은 Enum이 있다.

이 정도면 처음치고 계층간 분리가 명확하다고 생각한다.

과제에 사용해보거나 적용한 것들

처음엔 mvc 패턴, 싱글톤 패턴, indent depth 가능한 1로 유지하기, 메서드 분리 잘하기 이것만 하려고 했다. 이 중 그나마 싱글톤 패턴만 이전에 학습을 했었고 나머지는 다 처음 시도하는 것이었다. 그런데 리팩토링을 계속 하면서 결과적으로는 처음 계획보다 훨씬 많은 것들을 사용하게 되었다.

  1. 흐름도 작성
  2. 유스케이스 작성
  3. 단위 테스트 (실전)
  4. assertThat()
  5. 테스트 코드에서 콘솔 입력 받기
  6. Supplier, Predicate 인터페이스
  7. 좋은 네이밍
  8. SRP 준수
  9. 내부 클래스, 불변 객체
  10. 캡슐화 높이기
  11. 상황에 따른 접근 제어자 사용법
  12. else 예약어 지양
  13. 객체의 재생성에 관한 고민
  14. record
  15. mvc 패턴
  16. DTO, Service
  17. enum, 상수 (하드 코딩 제거)
  18. 객체지향 생활체조 9가지 원칙
  19. 의존성 주입
  20. 람다식
  21. 싱글톤 패턴
  22. 클래스, 메서드 분리
    ...

당장에 생각나는 것만 적어도 이만큼이다. 일주일 만에 엄청 많은 것들을 배웠다.

소감

일단은, 너무 재밌는 일주일이였다. 그리고 너무 빠르게 흘러간 일주일이였다. 특히 리팩토링은 시간 순삭이었다.

처음에는 '설계랑 메서드 분리만이라도 잘 해봐야겠다' 라고 생각했었는데, 구현을 하고 끊임없는 리팩토링을 하면서 mvc 패턴, dto와 service 계층, SRP 지키기, enum, 싱글톤 패턴까지 사용해보게 되었다. 더 나은 코드 작성, 더 예쁜 프로그램(사용자에게 보이지는 않지만)에 대한 갈망이 점점 커져간 것 같다.

좋은 객체지향, 깔끔한 코드에 대해서 정말 끊임없이 고민했다. 버스를 타고 이동할 때도, 밥을 먹을때도 계속 '내 코드에서 개선할 부분이 없을까?' '이걸 어떻게 개선해야할까?' 라는 생각만 했다. 꿈에서도 생성자 주입이 나오는 신기한 경험을 했다.

처음으로 객체지향에 대해 진지한 고민을 하며 만든 이 애플리케이션은 이제 내겐 아끼는 작품처럼 여겨진다. 미숙하고 울퉁불퉁하고 거친 작품이지만, 내게는 큰 의미가 생긴 것 같다. 절대 완벽하지 않지만, 일주일 동안의 내 모든 시간과 노력이 이 애플리케이션 하나에 담겨 있으니 애착이 갈 수 밖에 없는 것 같다.

다만 아쉬운 점은, 과제를 빨리 끝내고 SOLID 에 대해서 배우고 싶었는데, 리팩토링을 끊임없이 하다보니 시간이 도통 나지 않았다. 그래도 이번에 많은 시행착오를 하며 감을 잡아서 다음 주 과제부터는 리팩토링 10번 할거를 5번 정도로 줄이지 않을까 기대해본다.

profile
자바 백엔드 개발자
post-custom-banner

0개의 댓글