우아한테크코스 회고의 목적?
이 회고를 통해, 내가 우아한테크코스 6기에서 겪은 다양한 미션과 경험을 통해 어떻게 성장해 나아가며, 1주차와 마지막 주차의 회고를 보면서 내가 이러한 경험을 통해 어떻게 성장해 나갔는지를 공유하고자 합니다.
드디어 우아한테크코스 6기가 시작되었습니다. 우아한테크코스는 총 4주동안 공통 피드백만 있는 상태에서 나 자신이 주도적으로 학습하고, 미션을 진행하고 이를 통해 구현한 결과물을 제출해야 합니다.
https://github.com/woowacourse-precourse/javascript-baseball-6
1주차 미션
요구 사항을 분석 해보자
저는 기능 구현을 하기전 어떤식으로 게임 흐름이 진행되는지 먼저 생각했습니다.
1. 시작멘트를 알려준다.
2. 시작과 동시에 중복되지 않은 랜덤한 숫자3 개를 만든다.
3. 유저가 숫자 3개를 입력한다.
4. 유저의 숫자가 3개가맞는지, 모든게 숫자인지 1~9 까지의 숫자인지 확인한다.
5. 랜덤으로 뽑힌 3개의 숫자와 유저의 숫자를 비교한다.
6. 랜덤으로 뽑힌 3개의 숫자와 유저의 숫자의 각 자릿수의 숫자가 일치하는지 확인한다 ( 스트라이크 )
7. 랜덤으로 뽑힌 3개의 숫자와 유저의 숫자의 각 자릿수는 일치하지 않지만 같은 숫자가 포함되어있는지 확인한다 ( 볼 )
8. 스트라이크, 볼 의 개수를 결과창으로 보여준다.
9. 스트라이크가 3 개이면 정답창을 출력한다.
10. 정답창 출력이후 게임을 재시작할지 , 종료할지 정한다. ( 재시작 : 1 , 종료 : 2 )
11 종료시 종료, 재시작시 다시 두번째로 돌아간다.
게임의 전체적인 흐름과 프로그래밍 요구 사항을 기반으로 클래스 구조를 생각해볼 수 있었습니다.
- Console.readLineAsync : 입력받는 부분 (InputView)
- Console.print : 어떠한 결과를 출력하는 부분 (OutputView)
App 클래스
예시를 보아하니 App.js에서 프로그램을 실행시킬수 있어야하는것 같습니다. 그래서 App.js는 게임을 시작하는 클래스로 두었습니다.
하지만 App.js에선 게임을 시작만하지 전반적인 게임 흐름을 알지 못하게 해야합니다.
BaseballGame 클래스
BaseballGame 클래스에서는 게임 전체의 흐름을 파악하고 관리하는 클래스가 되어야합니다.
User 클래스
User 클래스에서는 사용자의 입력을 관리해야 합니다. 사용자로부터 3개의 숫자를 입력받고 해당 입력이 유효한지 유효성검사 또한 필요합니다.
RandomNumberGenerator 클래스
RandomNumberGenerator 클래스에서는 랜덤한 3개의 숫자를 생성해야합니다. 프로그래밍 요구 사항을 기반으로 우아한테크코스에서 자체적으로 만든 라이브러리를 사용해야 합니다.
StrikeAndBallCalculator 함수
StrikeAndBallCalculator 는 클래스가 아닌 함수로 만듭니다. 그 이유는 이 기능이 상태를 유지할 필요가 없고, 입력을 받아 처리 후 결과를 반환하는 단순한 연산에 가까워서 클래스가아닌 함수로 만들었습니다.
GameDisplay 클래스
GameDisplay 클래스는 게임내에서 전체적인 UI(입•출력) 부분을 담당합니다. 숫자야구 게임을 시작할때 멘트, 스트라이크와 볼 카운트의 결과를 출력, 3스트라이크일때 정답 멘트 출력등 전체적인 UI부분을 담당합니다.
InputValidator 클래스
InputValidator 클래스에서는 전체적인 유효성검사를 실행하는 곳입니다. 예를들어 입력값이 3자리의 숫자인지 1부터9까지의 숫자로 이루어져 있는지 게임이 종료 되었을때 1또는2인 숫자인지 등 게임의 전체적인 유효성검사를 실행 하는곳 입니다.
상수를 모아둔 폴더/파일
매직 넘버나 문자열을 그대로 사용하면 코드를 읽는 다른 사람들이 그 값이 어떤 의미를 가지는지 이해하지 어려울 수도 있습니다.
상수를 사용하면 그 의미를 명확하게 알수 있기 때문에 상수들을 모아둔 파일을 만듭니다.
또한 상수를 모아두면 유지보수를 간편하게 해주고, 오타같은 오류를 줄일 뿐더러 상수는 코드 자체의 문서 역할을 할 수 있습니다. 상수 이름만 봐도 어떤 값이고 왜 사용되는지 파악이 가능하기 때문입니다.
이후 위의 내용들을 토대로 클래스와 메서드명을 생각하며 기능 구현 목록을 작성합니다.
기본적인 폴더구조는 다음과 같습니다.
+ src
+ constants
└ GameConstants.js ------ 게임 종료 후 시작값 1과 종료값 2를 담은 상수를 정의
└ MessageConstants.js ------ 게임 중 모든 메시지와 검증 에러 메시지가 담긴 상수를 정의
└ NumberConstants.js ------ 게임 중 모든 숫자들이 담긴 상수를 정의
+ utils
└ InputValidator.js ------ 게임에 전체적인 값을 검증하는 클래스
└ App.js --------- BaseballGame의 인스턴스 객체를 만들어내는 곳 ( 게임 스타트 )
└ BaseballGame.js --- 게임의 전체적인 진행과 흐름을 관리하는 곳
└ GameDisplay.js -------- 게임중 입력 및 출력을 담당하는 곳
└ RandomNumberGenerator.js ---- 중복되지 않는 1~9까지의 숫자를 3개 만드는 곳
└ StrikeAndBallCalculator.js ---- 사용자의 값과 랜덤숫자를 비교하여 계산하는 곳
└ User.js ---- 유저의 입력을 관리하는 곳
( 1주차 미션 코드 전체보기 )
start(): 게임을 시작하며, 필요한 객체를 초기화하고 게임의 메인 로직을 실행한다.
playGame(): 게임의 주 로직을 처리한다. 사용자의 입력을 받고, 스트라이크와 볼을 계산하여 결과를 출력한다.
getUserInput(): 사용자로부터 입력을 받아 반환한다.
calculateResult(): 사용자와 컴퓨터의 숫자를 비교하여 스트라이크와 볼을 계산한다.
showGameResult(): 계산된 스트라이크와 볼의 결과를 출력한다.
isGameWon(): 스트라이크 개수를 확인하여 게임이 이겨졌는지 판단한다.
showGameEnd(): 게임이 끝난 후, 사용자에게 게임을 재시작할지 물어보고 그에 따라 게임을 재시작하거나 종료한다.
기본적으로 Jest 테스크도구를 사용하여 모든 메소드가 정상적으로 작동하는지 확인하였습니다.
1주차 미션을 통해 배운점
- 객체지향 프로그래밍(OOP)에 대한 지식이 전반적으로 좀 부족한면이 있었지만, 1주차 미션과 우아한테크코스에서 토론하기와 함께나누기 채널에 있는 자료들을 보면서 미션을보고 흐름도를 작성할 수 있었으며 또한 각 클래스마다 구조와 메서드를 만들수 있는 이해도가 향상되었습니다.
- Jest라는 테스트 도구를 기존에 얕은 지식만 있어 많이 사용하지 않았었습니다. 하지만 이번 단위 테스트를 작성하려고 Jest의 공식문서와 영상 자료 등을 통해 단위 테스트를 작성하는 방법을 배웠고, 이를 Jest를 사용해서 실제로 적용해 보았습니다.
- 상수와 매직 넘버 관리의 중요성을 이해하고, 이를 적용해 이해도를 한층더 높였습니다.
- 이로 인해 기능 요구 사항과 프로그래밍 요구 사항을 분석하는 능력이 어느정도 향상되었습니다.
1주차 미션을 통해 아쉬운점
- MVC 패턴에 대한 이해도가 아직 부족해 적용하지 못했습니다.
- 여전히 객체지향 프로그래밍에 부족한 이해도를 보이고 있습니다.
- 다양한 프로그래밍 용어와 패러다임에 대한 지식이 부족해, 초기에 많이 헤맸습니다.
- Jest로 단위 테스트를 작성했지만, 세부적인 테스트 케이스나 예외 상황에 대한 테스트가 부족했습니다.
앞으로 나의 계획 및 방향성
- 다음 2주차 미션에서부터 MVC 패턴을 꼭 적용해보려고 합니다.
- 객체지향 프로그래밍에대해 조금더 공부할 필요가 있습니다.
- OOP,TDD,DDD 등의 개념을 더 깊게 공부하려고 합니다.
- Jest 단위 테스트에서 좀더 세부적이고 깊게 테스트 케이스를 작성해보려고 합니다.
마무리
토론하기 채널에 이러한 글이 있었습니다.
이처럼 저도 MVC,TDD,헥사고날 등 전부 처음 들어보는 용어들이였고 어떻게 적용을 해야하는지 막막했었습니다.
하지만 당장 모르는 것이 많다고 해서 당황하고 포기할 필요는 없다고 생각합니다. 모두가 처음부터 잘하는 것이 아니고, 지금 이 순간의 내가 얼마나 노력하고 성장하려는지가 중요하다고 생각합니다. 최종적으로 이번 1주차 에서 얻은 가장 큰 교훈은 "항상 배울 준비가 되어 있어야 한다"는 것 입니다. "합격"보다 "학습"에 중점을 두어 내가 1주차부터 4주차사이에 얼마나 학습하고 성장했는지 끊임없이 노력한 나의 모습을 이 우아한테크코스의 최종 코스에서 얼마나 성장했는지 보고싶은 마음입니다.
어제의 나와 1주차미션을 제출한 나의 모습을 비교하면 지금의 나는 어제보단 확실히 성장했다고 느껴집니다. 1주차 미션 시작 당시에는 생소했던 용어나 개념들도 이제는 어느 정도 이해하고 적용할 수 있게 되었고, 코드를 작성하는 방식 또한 점점 개선되고 있습니다.
물론 아직도 부족한 점이 많고, 앞으로 해야 할 일도 산더미 입니다. 특히, 객체지향 프로그래밍과 클래스의 활용에 대한 깊은 이해가 필요합니다. 프론트엔드 개발에서는 React와 같은 라이브러리나 프레임워크를 사용하면서 클래스를 별로 사용하지 않았었기 때문에, 이 부분에 대한 이해도가 아직 부족하다고 느낍니다. 이를 위해 좀 더 다양한 예제와 실습을 통해 객체지향프로그래밍에 대한 깊은 이해를 높이고 싶습니다.
'우아한테크코스' 카테고리의 다른 글
우아한테크코스 6기 프리코스 4주차 마지막 회고 (1) | 2023.11.16 |
---|---|
우아한테크코스 6기 프리코스 3주차 회고 (3) | 2023.11.09 |
우아한테크코스 6기 프리코스 2주차 회고 (0) | 2023.11.02 |
JEST 테스트결과를 HTML로 보여주자! (0) | 2023.11.02 |