우아한 테크코스 6기 프리코스 2주차 회고

지송·2023년 12월 6일
0

안녕하세요!
1주차를 무사히 끝내고 2주차로 넘어왔습니다
이번 주차에는 테스트 코드를 작성해야 되네요
다소 조건이 한번에 이해하기 어렵기도 하고 놓칠 수 있는 것도 있어서
꼼꼼히 읽고 시작하려고 합니다
주말동안에 좀 바빴어서 월요일부터 작성하기 시작했어요
이번 주에도 열심히 작성하고! 자바 공부 특히 여러 구조들 공부를 진행하려 합니다

https://github.com/woowacourse-precourse/java-racingcar-6

과제는 위 링크에서 볼 수 있듯 자동자 경주 게임인데요
전진하는 조건은 0에서 9 사이에서 무작위 값을 구한 후 무작위 값이 4 이상일 경우이다.
해당 구문이 헷갈려서 여러 번 읽었어요
각 자동차들의 무작위 값을 구한 뒤 4 이상이면 이번 게임에 전진을 하는 조건입니다!
이름은 5자 이하여야 하며 쉼표로 구분해야 해요!
한 번 게임이 진행되고 끝나는 구조입니다

< 2023.10.30 월요일 >

오늘과 내일 모두 끝내야 하는데
오늘 되도록이면 다 끝내고 싶어서 빠르게 진행해 보도록 할게요

  • 과제 Fork하여 로컬에서 체크하기
  • 플로우 차트 그리기
  • 조건 파트 작성하기
  • 구현 파트 작성하기

이렇게 진행하고 바로 개발로 넘어가면 될 것 같습니다!
지난 주에 진행한 게 있어서 어느정도 루틴은 정해진 듯해요

1. 과제 Fork하여 로컬에서 체크하기

브랜치까지 생성하여 퍼플리시 후 인텔리제이에서 정상적으로 열었어요!
브랜치는 꼭 제 깃허브 주소 이름으로 한 브랜치여야 합니다

2. 플로우 차트 그리기

플로우 차트의 최대 이점은 아무래도
분기점에서 내가 무슨 처리를 해야 되는지 파악할 수 있는 것 같아요

보통 코드를 짜다 보면 성공 시나리오만을 위해 작성하게 되는데
유저는 아주 기상천외한 방법으로 프로그램을 쓸 수도 있고
악의적인 유저가 프로그램의 성공 루트를 피해가며 사용할 수 있다!
생각하며 코드를 짜야 된다~
라고 소프트웨어 설계 강의에서 배웠었죠 ㅎㅎ

각종 조건들도 간단하게 기입해 줬습니다!

3. 조건 파트 작성하기

규칙의 경우 게임 흐름에 따라 작성해 주었고 조건을 하단에 작성해 주었습니다
입출력 케이스를 작성해서 후에 구현 파트 작성할 때 용이하도록 작성했습니다!

4. 구현 파트 작성하기

개발과 가장 밀접한 부분인데 class로 나뉠 것들을 상단에
그 밑에 기능과 attribute로 들어갈 것들을 하단에 작성해 주었습니다
전진 여부 결정을 race에 작성할까 car에 작성할까 고민했는데
전진 여부를 결정한 후 전진 회수를 바로 반영해 주는 게 깔끔한 로직이라 판단하였고
각 차의 전진 여부를 결정하는 것이니 Car class 하단에 있는 게 맞는 것 같아 해당 구조로 작성했습니다

race의 경우 시도 회수를 체크하여 계속 수행하여야 되는지 묻는 함수를 여기에 넣을 예정이며 Car 모델들을 리스트로 만들어 race가 관리할 예정입니다

외에 구조는 기본적인 뷰와 컨트롤러 예외 사항 처리 로직입니다


  • Car 구현하기
  • Race 구현하기
  • OutputView 구현하기

이제 개발에 돌입해 보겠습니다!
각 하단 세부 기능을 하고 커밋하는 것을 잊지 않도록... 해야 해요
지난번에도 유의하여 한 항목이기 때문에 문제는 없겠지만!
이번에는 조건에도 있는만큼 주의해서 해야 합니다

5. Car 구현하기

커밋 메시지를 올바르게 작성한 건지 계속 고민이 되기도 하고
getter을 사용하는 로직을 짜면서 getter에 대한 다양한 논의가 있어서
사용해도 될까 고민하다가 최대한 사용하지 않는 로직으로 가 보기로!

6. Race 구현하기

getter를 사용하지 않으려니 너무너무 어려웠습니다...
중간중간 접근 권한을 변경해 줄 수 있는 것이 보인다면 최대한 안전하게 사용할 수 있도록 닫아 주었고!
getter를 사용하면 쉽게 작성할 수 있는 로직이겠지만 최대한 안전하고 클린 코드를 유지하기 위해 stream을 사용하여 getter을 사용을 지양하고자 노력했습니다 ㅠㅠ
저의 고민 결과는 이랬는데 다른 분들 코드도 마감 후에 보고 싶은 생각이 가득가득해요... ㅎㅎ
과연 어떤 로직으로 이 난관을 해결하셨을지 너무나도 궁금합니다

7. OutputView 구현하기

printDrive 코드가 상당히 깔끔하지 않은 느낌이라 아쉽지만
사용하기 전 미리 변수를 다 선언하고
함수 내부에서 또 함수를 호출하는 코드는 지양하고자 했어서
이러한 규직을 다 지키니 마음에는 안 들지만 최선인 코드를 작성하였습니다...
더 아름답게 작성할 수 있을 것 같은데 아무리 고민해도 리팩토링이 더 이상 되지 않고 최선인 듯합니다
사실 for문에서 i를 지양하고 최대한 의미가 있는 변수들만을 담은 코드를 만들어내고 싶었는데 아예 안 쓰는 건 불가능한가 봅니다 ㅠㅠ

오늘은 여기까지 작업하고 내일 이어서 하도록!

< 2023.10.31 화요일 >

오늘도 열심히 달려 보겠습니다!

  • InputView 구현하기
  • InputException 구현하기
  • GameController 구현하기
  • application 연결하고 확인하기

1. InputView 구현하기

어제 자기 전에 생각해 보니 race 모델 파트에서 빠트린 로직이 있는 것 같아서 추가해 주고
input 로직을 작성하면서 또 예외사항을 다시 고민하다 정리해 줬습니다
원래는 공백을 받지 않는 걸로 작성해 주었으나 최소 이름 길이 제한이 없으므로
공백 또한 하나의 이름이 되는 것으로 작성하였습니다
더불어 고유 조건도 없었기 때문에 이름이 겹쳐도 괜찮은 걸로 판단했습니다!

2. InputException 구현하기

input exception이 원래 4가지 정도 되었는데 작성하며 죄다 쳐내니 두가지밖에 안 남았어요 ㅎㅎ
원래 횟수가 공백인 경우와 숫자가 아닌 경우를 나눴는데 생각해 보니 로직상으로 한번에 처리가 되더라고요! 그래서 0 이상의 정수가 아닌 경우로 한번에 처리해 주었습니다
어쨌든 확실히 예외 처리도 한 것 같아서 뿌듯합니다!
드디어 연결 단계네요~

3. GameController 구현하기

이 단계가 진짜 재미있는데
제가 설계하고 만든 함수들이 딱딱 제자리를 찾아가고
적재적소에 필요한 게 있으면 쾌감이 들어요!

4. application 연결하고 확인하기

사소한 view 규격 안 맞음부터 exception 처리가 안 된 것까지 다 fix 해 줬습니다 ㅎㅎ
코드 다 짰니?
그럼 이제 울지 말고 테스트 코드 짜렴

  • Car 테스트 코드 짜기
  • Race 테스트 코드 짜기
  • InputException 테스트 코드 짜기

5. Car 테스트 코드 짜기

자동차 하나 생성
자동차 여러 개 생성
자동자 4 미만에서는 안 움직이는지
자동차 4 이상에서는 움직이는지
이렇게 테스트 해 보았습니다!

6. Race 테스트 코드 짜기

레이스가 끝나지 않을 상황
레이스가 끝날 상황
이름 만들어 보고 확인
드라이브 카운트 확인
우승자 제대로 뽑는지 확인

이렇게 코드를 짜 보았습니다!

레이스 진행의 경우 private 처리로 직접 확인이 불가하여 레이스 finish를 통해 같이 확인해 주었습니다

7. InputException 테스트 코드 짜기

이름이 5 글자가 넘어설 때
시도 횟수가 음수일 때
시도 횟수를 숫자가 아닌 것으로 입력했을 때 테스트 해보았습니다

inputview와 outview, controller는 테스트를 필요로 하는 것들은 아닌 것 같아 테스트하지 않았습니다!

  • 규칙 준수 확인하기
  • PR 넣고 1차 제출
  • 지원서에 2차 제출
지난 코드를 작성하며 저만의 루틴을 찾아내서 플로우 차트를 그리고 조건 파트를 작성하고 
기능 구현 목록을 작성한 후 순서를 정하여 하나씩 개발하는 방식을 취하고 있습니다 
단계적으로 개발할 수 있어 좋은 듯합니다 
마지막 컨트롤러에 조립을 하는 기분이 들어 뿌듯함을 느낍니다! 
지난 코드 리뷰에서 getter 사용을 지양하는 것이 좋다는 리뷰를 보고 
해당 함수의 사용을 지양하도록 최대한 노력하였는데 
그것으로 인해 코드가 복잡해진 듯한 느낌이 들어
저의 설계상 문제인 것 같아 최대한 리팩토링하여
깔끔한 구조를 유지할 수 있도록 노력했습니다
저의 고민 결과를 코드로 녹였는데
다른 분들도 같은 지점에서 고민하셨을 거라 생각되어
미션이 끝난 후 다른 분들의 코드를 참고하고 싶습니다!
for문에서 i를 지양하고 최대한 의미 있는 변수만을 담은 코드를 만들고 싶은데
해당 부분이 불가능한가 더 고민해 보고 싶습니다
테스트 코드의 경우 새로 도입된 것이었는데
테스트 코드를 짜며 좀 더 세심하게 주요 부분을 테스팅할 수 있도록 고심하였습니다 
다만 단위 테스트 범위 내에서 진행해야 할지 고민이 되어
다음에는 해당 부분을 좀 더 고민하고 코드를 작성하고 싶습니다 
테스트 코드를 짠다는 것은 개발만큼이나 중요한 것을 인지하고 있고 
그렇기에 모두를 커버할 수는 없을지라도 
프로그램 구동하는 데 문제가 없는 범위를 커버하고 싶습니다!

겨우 마감하고 운동하러 갑니다~

profile
💻 늘 공부하고 발전하는 개발자

0개의 댓글