
이번에 우아한테크코스에 참여하게 되면서 프리코스를 진행하게 되었다.
1주차 미션을 진행하면서 느꼈던점들을 회고해보고자 한다!!
사실 이전까지 개발을 진행하거나 프로젝트를 진행할 때 기능들을 구체적으로 문서화 했던 적은 없었다.
학과 졸업 작품 설계때 문서화를 진행하긴 했지만 구체적으로 작성하지는 않았었다. 그냥 무작정 노트북을 켜고 코드를 작성했었다. 이렇게 코드를 짜다보니 다음에 어떤 기능들을 구현해야할지 혼란스럽기도 했고 뒤에 기능들을 구현할때 다시 이전에 구현했던 기능들을 새로 작성하는등 문제점이 많았던 것 같다.
이번 프리코스 미션들은 먼저 기능들을 문서화로 작성한 뒤 실제 구현을 시작하는 방식이었다. 요구사항에는 구현 기능들은 docs/README.md 에 정리하여 추가한 뒤 코드를 작성하라고 나와있었다.
프리코스 미션을 먼저 받았을 때 원래 내가 코드를 작성했었던 방법으로 해보았다. 즉, 그냥 머리부터 박아보기... 🤦🏻🤦🏻
그렇게 코드를 작성하고 보니 가독성도 떨어지는 것 같고 그냥 생각나는걸 그대로 코드로 작성하였기 때문인지 구조 자체가 너무 혼잡스러운 느낌이었다. 그래서 다시 작성한 코드를 싹 다 엎어버렸다.. 스스로 너무 마음에 들지 않았다.
그래서 "아 역시 이래서 문서화를 하고 구현을 시작해야하나?" 라는 생각이 들었고 미션이 제시하는 방향으로 먼저 구현 기능을 문서화한 해보자라고 생각이들게 되었다.
기능 요구 사항을 보고 스스로 구현 기능 목록을 정리해보았다.
- 1부터 9까지 서로 다른 수 랜덤의 3자리 수를 생성한다.
- 사용자로부터 숫자를 입력받는다.
- 입력받은 값이 3자리 초과: 예외처리
- 입력받은 값이 3자리 미만: 예외처리
- 입력받은 값이 숫자가 아닌 다른 문자: 예외처리
- 입력받은 수와 컴퓨터의 수를 비교하여 볼과 스트라이크의 수를 계산 후 반환한다.
- 반환받은 볼과 스트라이크의 숫자를 통해 출력할 메세지를 결정한다.
- 스트라이크 0개: 낫싱
- 스트라이크 n개 볼 n개: n볼 n스트라이크
- 스트라이크 3개: 3스트라이크
- 게임 종료 문구 출력: 3개의 숫자를 모두 맞히셨습니다! 게임 종료
- 게임 재시작 여부 출력: 게임을 새로 시작하려면 1, 종료하려면 2를 입력하세요.
- 1 입력: 게임 재시작
- 2 입력: 게임 종료를 출력하고 프로그램을 종료한다.
구현 기능을 정리한 기준은 흐름과 주요 기능의 동작 방식 세부화였다. 게임 흐름의 관점으로 볼때 먼저 1. 1~9사이의 랜덤 수 3자리를 생성하고 2. 사용자로부터 숫자를 입력받아야 했다. 그리고 사용자의 입력에서 예외처리를 진행한 뒤 3.사용자의 숫자를 바탕으로 볼과 스트라이크의 숫자를 계산하여 메세지를 출력하여야 했다. 모두 맞히게 되면 4. 게임 종료 문구를 출력하고 5. 게임 재시작 여부를 출력 하는것을 기능의 흐름으로 파악하였다.
기능 구현 목록을 작성하고 난 뒤 코드를 작성하고자 하니 아키텍처를 어떻게 설계해야할까 라는 고민이 있었다. 그냥 클래스별로 나눠서 해당 클래스와 관련있는 메서드로 설계하는 방법을 선택할까 하였지만 평소 스프링으로 웹 개발을 하였기에 이번 미션들도 MVC 패턴으로 구현 해보자라는 생각이 들었다.
먼저 숫자 야구 게임에서 Game, User 도메인을 생성하고, Controller는 domain, view사이를 중재해주며 Service계층은 domain과 controller 사이에서 비즈니스 로직을 처리한다. 그리고 view 계층을 통해 사용자에게 보여줄 콘솔 창을 관리하도록 설계하였다.

기본적으로 제시된 기능 요구사항이다. 단순히 기능 요구사항만을 만족하기에는 딱히 어려운 점은 보이지 않았지만 그 외에 요구사항이 다양했다.

프로그래밍 요구사항이다.
여기서 중요한건 Java 코드 컨벤션 가이드를 준수하는거라고 생각하였다.
https://google.github.io/styleguide/javaguide.html
위 사이트를 참고하여 컨벤션을 최대한 지킬려고 노력하였다. 클래스명과 변수 명 선언과 관련된 규칙을 참고하였으며 인텔리제이에서 제공하는 자동정렬 기능을 활용하며 들여쓰기를 최대한 신경썼다.
또한 indent depth를 3이 넘지 않도록 구현하였는데, 처음에 depth를 신경쓰느라 구현하는게 힘들었다. 하지만 depth가 3이 넘어간다는건 해당 메서드의역할이 많아 진다는 것을 깨닫고 한개의 메서드는 한개의 역할만을 하도록 구현하였다. 최대한 메서드를 짧게 잘라서 구현해주었다!
또한 라이브러리를 주어졌는데 camp.nextstep.edu.missionutils에서 제공하는 Randoms 와 Console API를 사용하여 구현하였다.
처음에는 문서화의 중요성을 깨닫지 못하였기 때문에 그냥 무작정 코드를 작성하였고 이 방법이 매우 비효율적이고 완성된 코드를 보니 너무 난장판이었다... 그래서 다시 완성한 코드를 지우고 차근차근 처음부터 구현 기능들에 대해 문서화를 진행하였고, 코드를 작성하니 이전보다 훨씬 깔끔해지고 있다는것을 느꼈다.
따라서 1주차 미션을 하면서 느꼈던 가장 큰 점은 바로 문서화의 중요성인것 같다!! 다음 주차 미션들도 무작정 코드작성말고 더 자세하게 문서화를 해야겠다고 생각이 들었다.. 프리코스를 하면서 정말 너무 많은것들을 배워가는 것 같다. 그래서 뿌듯하다~