🗓이번주 목표
수요일에 코수타가 끝나자마자 피드백을 확인하고 2주차 미션을 진행하면서 내가 달성하고 싶은 목표를 생각해봤다.
지난 주 부족했던 기능 목록 작성과 함수의 역할 분리를 연습해보는 것이 목표였다.
또한, 시간을 잘 놔누어서 계획을 짜고 시작해보려고 했다.
기능 목록 작성(~수요일)
전체적인 기능 목록을 작성 한다.
세부적으로 추가할 부분이 있거나 생각하지 못한 예외사항이 있으면 추후에 추가한다.
구현(~금요일)
일단 처음부터 모든 구조를 신경써서 깔끔하게 짜려고 하지 않고 전체적으로 기능이 동작하도록 작성한다.
리팩토링(~일요일)
세부적으로 함수가 하나의 일을 하는지, 해당 메서드 또는 변수명은 올바른 지 등을 체크하고 구조상 바꿔야 하면 리팩토링을 한다
회고(~화요일)
미션을 진행하면서 시도했던 것, 궁금했던 것, 느낀점이 생길 때마다 노션에 작성을 해두고 리팩토링을 마무리하고 상세하게 글을 작성한다.
먼저 이렇게 계획을 세우고 시작을 했다…..
근데 이번주 문제점,,,🚨🚨🚨
2주차 코수타가 시작하기 3시간 전에 갑자기 2017년부터 나랑 동고동락했던 노트북이 갑자기 키보드가 자동으로 눌리더니…클릭을 해도 반응이 없어지며….크롬창도 안켜지고……….😭😭😭😭😭😭
노트북이 그렇게 갔다….
새로운 노트북을 부랴부랴 알아봐서 새로 샀지만 눈떠보니 토요일이더라…
따라서 토요일부터 미션을 시작할 수 밖에 없었다...그래도 맥북샀어요!!!!!!~! 소문내주세요
📖 기능 목록 작성
먼저 숫자 야구 게임 기능 요구사항을 읽어보고 기능 목록 작성을 작성했다.
전체적인 기능을 크게 3가지로 분류해서 작성하고 해당 흐름을 토대로 각 기능 목록들을 작성해봤다.
전체 기능 요약
컴퓨터는 1~9 서로 다른 임의의 수 3개 선택을 한다
게임 플레이어는 서로 다른 숫자 3개의 숫자를 입력한다
컴퓨터는 입력한 숫자에 대한 결과 출력
## 각 기능 목록컴퓨터가 랜덤으로 숫자 뽑기
- 랜덤으로 숫자를 뽑아야 함
- a를 3번 반복해야 함
- 중복이 있는 지 확인하기
유효성 검사(Validator)
- 플레이어 입력의 예외처리 진행
- 게임 중 입력하는 값이 3자리인지 확인
- 게임 중 입력하는 값이 숫자인지 확인
- 게임이 종료된 후 입력하는 값이 1 또는 2인지 확인
- 플레이어 입력의 예외처리 진행
게임 (BaseBallGame)
- 게임 메세지를 관리하는 객체 만들기
- 게임 시작하기
- 사용자의 입력인 숫자 3자리를 받기
- 입력 값 에러 검사 진행
- 입력값을 정답이랑 비교해 결과 만들기
- 볼, 스트라이크 갯수 세기
- 결과 메세지 보여주기
- 다 맞추면 게임 진행할 지 말지 결정하기
- 입력 값 에러 검사 진행
- 입력 값 에러 검사 진행
🧐 고려한 부분
클래스의 분리
이번주 미션은 지난주와 다르게 클래스로 기본 코드가 주어졌다.
1주차 회고 때도 클래스의 필요성을 느끼고 있었기에 클래스를 잘 활용하지 못하는 나에게 학습할 수 있는 좋은 기회였다. 😆
먼저 처음에 생각했던 클래스 구조는
다음과 같이 5개의 클래스로 구조를 설계 했다.
- Computer - 랜덤 숫자를 가진다.
- User - 사용자가 게임 중 입력하는 모든 인풋을 가진다.
- BaseBallGame - 게임을 진행하는 로직을 가진다.
- RandomNumber - 랜덤으로 숫자를 생성한다.
- App
하지만 User라는 클래스는 상태를 저장하고 관리할 필요가 없는 클래스라고 생각이 들었다.
또한, 사용자의 입력값을 검증하는 클래스가 필요해보였다.
따라서 다음과 같이 최종적으로 클래스를 정했다.
각 클래스는 다음과 같은 메서드를 가지고 있다.
객체 동결
숫자 야구 게임에 안내 문구와, 사용자 입력 길이, 랜덤 숫자 야구 숫자 갯수 등 많은 데이터들이 상수로 만들 필요가 있었다.
처음에는 클래스 외부에 변수를 작성해 사용했지만 리팩토링 과정에서 변수를 한 곳에 모아둘 필요성을 느껴 Utils
폴더를 만들고 내부에 Constant
파일을 만들어 모았다.
다음과 같이 야구 숫자 게임을 진행할 때 필요한 상수값들은 각 의미에 맞는 객체에 담아 관리를 진행했다.
또한, 위 객체들은 값들이 변경되지 않게 방지 하기 위해 Object.freeze()
를 사용해 객체를 동결했다.
책에서 읽고 개념으로만 알고 있던 것을 실제로 적용해보니 언제 사용하고 어떻게 사용하는 지 이해할 수 있었다.😎
💡 새로 알게 된 부분
TDD와 단위 테스트
이전에는 테스트 주도 개발과 단위 테스트가 동일한 개념으로 알고 있었다.
하지만 이번 미션이 끝나고 TDD와 단위 테스트의 차이점을 알게되었다.
테스트 주도 개발은 테스트 코드를 미리 작성하는 것이고 단위 테스트는 하나의 모듈을 기준으로 진행되는 테스트이다.
테스트 주도 개발은 테스트를 작성하고 코드를 통과하면 그 코드를 다시 리팩토링 하는 사이클을 도는 개발 방식이다.
이번에는 미리 테스트 코드가 주어졌으니 동작하는 기능을 만들고 그 추후에 리팩토링을 하면서 단위 테스트를 진행했다. (근데 이번에는 전부 다 코딩을 하고 마지막에 테스트 코드를 작성해 검증을 진행했다,,,,,,,,,시간,,,이없어서 마음이 급했다)
내가 진행하면서 느낀 테스트 코드의 필요성
- 단위 테스트를 진행하게 되면 추후에 생기는 문제를 미리 방지할 수 있다.
- 내가 현재 진행하는 방식이 옳은 방향인가?에 대한 확인을 받을 수 있다.
반대로 아쉬웠던 점
테스트 코드를 작성하는 jest 관련 메서드를 이해하는 데 시간이 걸렸다
⇒ 하지만 이 부분은 한 번 학습을 진행했으니 다음번에는 시간이 단축될 거라고 생각한다!
테스트하기 좋은 코드는?
먼저, 테스트 코드를 작성하다보니 테스트 코드를 위한 구현을 하고 있는 내 자신을 발견했다.
그렇다면 과연 테스를 하기 좋은 코드란 무엇인가에 대한 생각을 해봤다.
일단, 이번주에 테스트 코드를 작성하면서 느낀 바로는
다른 값들이 너무 연결되어 있지 않으며 다른 메서드나 변수에 의존도가 높지 않은 코드
가 테스트하기 좋은 코드인 것 같다.
테스트 코드를 작성하다보니 다른 메서드와 연결되어 있는 코드이기에 오류를 많이 만났다.
테스트를 하기 위해서는 테스트로 입력한 값들을 바로 가지고 결과를 반환받을 수 있는 코드의 필요성을 느꼈다.
💊 스스로 회고
git commit convention
위 commit들 2개 중 먼저 한 커밋 메세지는 add로 시작을 하고 그 뒤에 있는 커밋들에는 아차 싶어서 Add로 대문자로 변경했다.
미리 커밋 컨벤션을 제대로 작성하지 않았기에 이런일이 일어났다고 생각했다…..
반드시,,,,,반드시,,,!!!!! 템플릿을 정하고 진행을 해야겠다.
기능 목록 작성
기능 목록을 작성할 때 상세하게 작성하라는 피드백이 1주차에 있었다.
하지만 내가 작성한 기능목록은 너무 큰 단위로 작성이 되어있는 것 같다. 다른 사람이 기능 목록을 봤을 때 한 눈에 읽기 쉽도록 흐름에 맞춰서 작성이 부족했던 것 같다.
기능 목록을 자세히 작성하는 방법이 무엇일까에 대한 고민을 했다.🧐
내가 생각하기에 기능 목록을 잘 작성하는 방법
기능 목록을 보고 코드를 구현할 수 있어야 한다
너무 큰 기능 단위, 요약식으로 작성하는 것이 아닌 기능 목록을 상세하게 작성해야 한다. 기능 목록만 보고도 구현해야 하는 기능이 무엇인지 , 각 기능에 필요한 데이터는 무엇인지, 어떠 기능과 이어지는 지 등 상세하게 작성해야 구현함에 있어서 헷갈리지 않는다
하나의 행동 단위로 기능을 분류해라
하나의 기능을 구현하기 위해 필요한 행동인 메서드를 기준으로 기능 목록을 작성하면 커밋 단위도 분명해지고 절차적으로 기능 구현 및 테스트 코드를 작성할 수 있다.
클래스
이번 미션을 클래스로 진행하면서 정적 메서드와 private변수, 메서드를 제대로 구분하지 못했다.
시간이 없어 긴급한 마음에 먼저 구현을 시작하다보니 발생한 일인것 같다.
미션을 수행하기 이전에 설계를 꼼꼼하게 해야한다는 것을 다시 한 번 느꼈고 오랜만에 딥다이브 책을 다시 정독하면서 클래스에 대한 학습을 할 수 있었고 다음 미션에는 완벽하게 클래스를 분리해보는 것을 목표로 진행해야겠다.
요구사항
먼저 메서드를 분리할 때 하나의 역할을 하는 메서드를 만들기 위해 최대한 신경을 썼다.
진행을 하면서 if문을 만나면 자동으로 깊이가 1 늘어나기 때문에 이를 해결하고 싶어 시간을 많이 소모했다.
그렇지만,, 과연 내가 메서드들을 하나의 역할을 가지게 구현하지 못한 것 같다.
🔍 소소하게 궁금한 점,,ㅎㅎ
커밋 메세지
=> 영어로 작성하는 것이 좋은가 한글로 작성하는 것이 좋은가?하나의 커밋 단위
=> 하나의 기능 당 분리되는 메서드들이 있는데 메서드들 단위로 커밋을 하는 것이 맞을까 혹은 하나의 기능을 다 구현하고 커밋을 하는 것이 맞을까?🔥 다음주 계획 및 고려 사항
- 기능 목록을 상세히 작성하고 친절하게 작성하자
- 테스트를 기능 단위로 진행하자
- 커밋 컨벤션을 미리 정하고 시작하자
- 클래스에서 정적 메서드와 private변수 사용에 대한 설계를 하고 진행하자
- 메서드는 하나의 역할을 하도록 분리하기
- 1주일이라는 시간을 잘 나눠서 계획대로 진행하기!
- 내가 만났던 오류들 정리해두기
☄️ 마지막으로 이번주 소감
작성한 테스트 코드가 작동을 잘 하지 않아서 많은 시간을 소모했지만 테스트 코드를 작성하고 기능 구현에 있어서 시간도 부족했지만 기능을 하나하나 구현해내고 테스트 코드를 통과했을 때 성취감이 매우 컸다.휴우~
그리고 이번주에는 노트북이 없어서 많은 시간을 방황하면서 다녔지만...다음주 미션에는 1주일을 다 쓸 수 있기 때문에 매우매우매우 기대가 된다 !!!
오늘 코수타에서 포비님이 말씀하신대로 오래 코드를 볼 수록 더 다른 방식이 떠오르게 되고 그때 배움이 생기는 것이다! 이번주에는 피어리뷰도 남기고 나의 부족한 점을 동료로부터 채워나가는 시간을 매일 일정하게 가져야겠다!
'우아한테크코스 5기' 카테고리의 다른 글
[우테코 5기 프리코스] 우테코 5기 4주차 회고 (0) | 2022.11.25 |
---|---|
[우테코 5기 프리코스] 우테코 5기 3주차 회고 (1) | 2022.11.22 |
[우테코 5기 프리코스] 우테코 5기 1주차 회고 (0) | 2022.11.04 |
nvm으로 node 버전 변경하기 (0) | 2022.11.04 |