회고에 앞서...
실제로 다른 사람들의 회고록은 많이 읽어봤지만 내가 직접 작성해본적은 없었다. 프리코스가 끝나고 프리코스 미션들을 재구현해보는 스터디를 진행하면서 회고록 작성도 해보자는 의견이 나왔다. 그래서 이번 기회에 회고록을 작성하면서 글 쓰기 실력을 늘려나가보려고 한다.
나의 코드
https://github.com/ChiwooKim/java-baseball-6
1주차
구현하기 전 나의 고민
이 때의 나는 첫 미션을 받았을 때 어떻게 시작을 해야할지 고민이 정말 많았다. 그 이유는 순수하게 자바로 무엇인가를 만들어 본 적이 없었기 때문이다. 이때 나는 취준을 핑계로 제대로 공부하지 않은 것과 잘못된 방향으로 공부를 하고 있었다는 것을 알게되었다. 그리고 커뮤니티에서 MVC 패턴, 클린 코드, TDD 등 많은 내용들이 오가는 것을 보고 더욱 고민이 깊어지면서 시작조차 하지못하고 '어떻게 해야 잘하지?'하면서 시간을 보냈기 때문이다. 나는 프로그래밍을 처음 시작했다는 생각으로 일단 구현이 되는 쓰레기라도 만들어보자는 마인드로 냅다 코드를 작성하기 시작했다.
구현
- 입출력을 담당하는 view를 제외하고 나머지 로직을 controller의 하나의 메소드에 전체 로직을 모두 작성했다. 이 때 필요한 domain객체는 따로 작성하긴했지만 그래도 controller자체에 많은 역할을 맡게 되었다.
- 구현과정에서 테스트 코드가 거의 없다시피 작성된 코드였다. 제대로 된 테스트 코드 없이 모든 코드 작성이 끝났고 원하는 결과가 나오는지 테스트를 해보았다. 다행히 이상은 없었다.
- 모든 구현이 끝나고 결과 확인 후 리팩토링 과정에서 최대한 역할별로 메소드를 분리하려고 했다.
재구현
재구현 하기전 고민사항
- InputView는 어디까지 해줘야 하는 것 일까?
- 사실 프리코스를 진행하면서 여러 사람들의 코드를 봤지만 이 부분에 대한 것은 명확한 정답이 있는 것은 아니었다. 사람들마다 차이가 있었고 이에 대한 생각들도 모두 다르게 가지고 있었기 때문이다. 나는 프리코스 4주동안 view를 객체로서 사용해보기도 하고 정적메소드를 통해 작성해보기도했다. 또한 InputView에서 모든 검증을 진행한 후 타입 변환 후 controller에 반환하기도 했고, 아니면 도메인에서 검증을 진행한 적도 있다. 이것저것 시도해본 것들을 스터디원들과 이야기를 나눠보기도 했다. (회고 작성 전 코드리뷰를 마친 상태) 명확한 해답은 없었지만 내가 내린 결론은 자기만의 기준을 세우며 타당한 이유를 가지고 있으면 될 것 같다는 생각이 들었다.
- 나의 경우 InputView에서 입력값에 대한 최소한의 타입 검증을 진행한 뒤 controller에 타입 변환한 값을 전달 하는 것이다. 그리고 각 domain에서 해당 domain에 적절한 값인지 한번 더 검증을 하는 것이다. 이와 같은 생각을 가지게 된 것은 향로님의 글을 읽고 나서이다. 마찬가지로 나도 프론트엔드, 백엔드 모두 유효성 검사를하는 것이 좋다고 생각했다. 그 이유는 확실하게 검증해서 오류를 줄이기 위함이다. 이를 내가 하는 과제에 적용한다면 프론트엔드에 해당하는 view에서 타입과 같은 입력값에 대한 검증이 이루어지고, 백엔드 역할인 domain에서 해당 값들이 domain에서 사용하기 적합한 값들인지 2차검증을 진행하는 것이다.
- 프론트엔드에서"만" 유효성 검사가 문제인 이유 (tistory.com)
- 메시지와 같은 상수는 어떻게 관리해야 할까?
- 메시지를 단순히 private static final을 이용해 상수로 이용할 것인가? 해당 클래스 내에서 enum을 이용하여 작성할 것인가?에 대한 고민도 해보았다. 이것도 사실 취향차이긴 하지만 확장성이 없다면 enum으로 작성할 필요는 없다고 생각이 들었다.
구현
- 이전과는 다르게 어떤식으로 코드를 작성할지 구조를 그려보고 코드를 작성하기 시작했다. view, controller, 필요한 domain class 등을 고려해서 작성하기 시작했다. 확실하게 구조를 확립한 후 작성하는 것이 좋지만 아직 이러한 점들이 미흡해 중간에 수정하는 부분도 있었다.
- 또한 최대한 객체를 객체스럽게 사용하고자 했다. 이전에는 무작정 getter를 이용해서 사용했었다면 지금은 최대한 객체 내의 메소드를 이용해 getter 사용은 지양하도록 했다.
- domain에 대한 테스트를 꼭 작성하도록 했다.
느낀점
재구현해서 처음보다 빠르게 구현할 수 있었지만, 아직도 부족한 점이 많았다. 객체를 객체스럽게 사용하는 것, 역할과 책임을 어떻게 분리할 것인지 말이다. 자바에 대한 사용도 조금 미숙하니 자바에 대한 기초를 다시 공부해야 겠다는 생각이 많이 들었다. 그리고 프리코스기간 떄는 다른 사람들의 코드를 보고 무지성으로 나도 써봐야지라고 생각하고 적용했다면 이번에는 확실한 이유를 가지고 했다는 점이다. 무지성이 아닌 왜? 라는 생각을 꼭 할 수 있도록 습관을 고쳐나갈 것이다.