안녕하세요 공공돌🧸 입니다!!
프리코스 2주차 회고록을 이제야 작성하네요 🥹
다시 열심히 달려보겠습니다.
미션 진행 전 공부
미션을 진행 전 지난 미션에 대한 코드 리뷰 피드백과 공통 피드백을 중점으로 공부를 했습니다.
코드 리뷰 피드백 개선
1. 클래스별 파일을 분리하고 기능을 나누자.
지난 개인 피드백 중 클래스 별 파일을 분리하고 기능을 나누면 좋겠다 라는 피드백이 있었습니다.
이를 개선하기 위해 우아한테크의 가브리엘 님이 설명하신 클래스와 객체 를 보면서 먼저 부족한 개념을 잡기 위한 공부를 진행했습니다.
2. 중복되는 기능을 하나의 함수로 통일하고 코드의 Depth를 줄이자.
지난 미션에서 구현한 함수 중, 사용자에게 입력받는 부분이 2개의 함수로 중복되어 들어가 “하나의 함수로 통일하면 좋겠다”는 피드백을 받았습니다. 그리고 이번 미션에서 추가된 요구 사항이면서 이전 미션에 코드 리뷰로 받았던 피드백인 Depth의 수를 줄이기 위해 기능별로 하나의 기능만 할 수 있게 지난 주차 코드를 재구현 했습니다.
3. 하나의 if 문으로 모든 조건을 검사하는 것도 좋지만 조건을 분리하여 메시지와 함께 출력해보자.
예외 처리에 있어서 지난 미션 땐, 하나의 조건문에 모든 조건을 검사할 수 있게 구현했었습니다. 그러나 이러한 구현은 코드의 길이를 줄일 수 있겠지만 예외가 발생할 경우 어떤 조건에서 입력 문제가 발생했는지 사용자가 인지할 수 없다는 걸 깨달았습니다. 따라서 예외를 처리하는 일에 있어 각각의 조건들을 분리했으며, 메시지를 함께 출력하여 사용자가 어떠한 부분에서 오류가 발생하였는지 알 수 있게 재구현 했습니다.
공통 피드백 1
지난 미션에서 지저분한 저의 커밋 메세지..💬
해당 부분을 고치기 위해 커밋 컨벤션을 공부하고 아래와 같이 정리해 사용해봤습니다.
# 제목 최대 50글자까지 작성: ex) Feat: Add README.md
# 본문
# 꼬릿말 작성: ex) Github issue #23
----------------------
# <타입> 리스트
# feat : 기능 (새로운 기능)
# fix : 버그 (버그 수정)
# refactor : 리팩토링
# design : CSS 등 사용자 UI 디자인 변경
# comment : 필요한 주석 추가 및 변경
# style : 스타일 (코드 형식, 세미콜론 추가: 비즈니스 로직에 변경 없음)
# docs : 문서 수정 (문서 추가, 수정, 삭제, README)
# test : 테스트 (테스트 코드 추가, 수정, 삭제: 비즈니스 로직에 변경 없음)
# chore : 기타 변경사항 (빌드 스크립트 수정, assets, 패키지 매니저 등)
# init : 초기 생성
# rename : 파일 혹은 폴더명을 수정하거나 옮기는 작업만 한 경우
# remove : 파일을 삭제하는 작업만 수행한 경우
-----------------------
# 제목 첫 글자를 대문자
# 제목은 명령문
# 제목 끝에 마침표(.) ❌
# 제목과 본문을 한 줄 띄워 분리
# 본문은 "어떻게" 보다 "무엇을", "왜"를 설명
# 본문에 여러줄의 메시지를 작성할 땐 "-"로 구분
공통 피드백 2
클래스, 메서드, 변수의 이름을 줄여서 쓰는것이 아닌 아래와 같이 함수의 목적과 의도를 잘 들어낼 수 있는 변수명을 사용하려고 했습니다.
private fun generateRandomNumber(): Int {
return Randoms.pickNumberInRange(MIN_NUMBER, MAX_NUMBER)
}
공통 피드백 3
코드를 작성하면서 Space와 Tab을 번갈아 가면서 쓰던 기억이 올라오네요...😱😱
2주차 미션에는 IDE의 코드 자동 정렬 기능을 적극적으로 활용했습니다 💡
미션 진행
2주차 미션은 자동차 경주 게임 이였습니다.
위 기능 요구 사항과 실행 결과를 정리해보면 아래와 같습니다.
- 자동차의 이름을 받습니다. 이때 자동차의 이름은 쉼표로 구분하여 5자 이하의 이름만 받습니다.
- 시도할 횟수를 입력 받습니다.
- 각각의 자동차에 0 ~ 9 사이의 무작위 값을 부여합니다.
- 무작위 값이 4 이상일 경우 자동차 이름과 함께 전진 여부 "-"를 출력합니다.
- 시도 횟수만큼 반복 후 우승자를 출력합니다. 이때 우승자가 여러명일 경우 쉼표","로 구분하여 출력합니다.
여기서 세부적으로 나눠 구현했습니다.
- 자동차의 이름을 입력 받는다.
자동차의 이름이 5자 이하인지 검증 후 오류 반환
자동차 이름에 공백이 포함되어 있는지 검증 후 오류 반환 ( ex : po bi )
자동차의 이름이 문자로만 구성되어 있는지 ( 자동차의 이름에 숫자가 포함되어 있으면 이름으로 파악하지 않았습니다. )
자동차 이름이 공백인지 검증 후 오류 반환
자동차 이름을 입력 안 했을 때 오류 반환 - 시도 횟수를 입력 받는다.
시도 횟수가 정수인지 검증 후 오류 반환 ( ex : -5 )
시도 횟수에 문자가 포함되어 있는지 검증 후 오류 반환 ( ex : 5번 ) - 각각의 자동차에 0 ~ 9 사이의 무작위 값을 부여합니다.
- 전진 여부를 출력합니다.
무작위 값이 4 이상인지 확인합니다.
4 이상일 경우 자동차 이름과 함께 전진 여부 "-"를 출력합니다. - 우승자를 출력합니다.
만약 우승자가 2명 이상이면 쉼표","로 구분하여 우승자를 출력합니다. ( ex : pobi, jun )
구현
아래 링크를 통해 확인할 수 있습니다.
GitHub - Sheep1sik/kotlin-racingcar-6: 자동차 경주 미션을 진행하는 저장소
자동차 경주 미션을 진행하는 저장소. Contribute to Sheep1sik/kotlin-racingcar-6 development by creating an account on GitHub.
github.com
개인 피드백
1. 깃허브 커밋 컨벤션 적용하기
이번 미션에서 과제 진행 요구 사항 중 하나인 ‘깃허브 커밋 컨벤션 가이드를 참고하여 커밋의 단위를 README.md 파일에 정리한 기능 목록 단위로 보내’는 과정에서 커밋 컨벤션 메시지를 일관되게 적지 못했다는 점이 아쉬웠습니다.
아래와 같이 커밋 컨벤션에 대해 지키려고 노력을 했지만 한 가지 기능을 구현할 때마다 올리는 것이 아닌 여러 개를 같이 올리는 커밋도 볼 수 있어 일관적이지 못한 커밋을 작성한 것 같아 커밋 컨벤션을 생활화하는 습관을 들여야 할 것 같습니다..✏️
2. 테스트 코드 구현하기
이번에 추가된 요구 사항인 ‘테스트 코드를 통해 구현을 확인한다’를 지키기 위해 테스트 코드란 무엇인지, 왜 필요한지 등을 알아보려고 ‘피카’님의 TDD와 단위테스트를 봤습니다. ‘TDD란 테스트 코드를 먼저 만들고, 실제 프로덕션 코드를 나중에 만드는 개발 방법’이라고 설명해주셨는데, 자세히 설명해주셨음에도 불구하고 한 번도 시도해 본 적이 없는 방식이었기에 이를 바로 적용하기엔 TDD에 대한 저의 이해가 부족하다는 생각이 들었습니다. 그리고 이로 인해 요구 사항과 같은 개발 방법이 아닌 구현이 끝난 후 테스트를 진행한 점에서 아쉬움을 느꼈습니다. 따라서 다음엔 TDD에 대해 추가적으로 공부하며, 테스트 코드를 통해 구현할 수 있도록 노력할 것입니다.
3. 요구 조건 파악 및 입출력 확인하기
모든 테스트를 통과한 후 우아한테크코스 홈페이지에 있는 예제 테스트를 실행해봤습니다. 그러나 테스트 실행 결과는 ‘예기치 못한 오류로 인하여 실행에 실패하였습니다.’였습니다. 처음엔 문제를 파악하는 데 있어 ‘나는 테스트를 통과했는데 왜 통과가 안 되는 거지?’란 생각이 들었으나, 계속해서 오류의 이유를 찾아보니 입·출력 결과에 출력 부분을 보면 시도할 횟수를 입력받은 후 줄 바꿈이 일어나고 ‘실행 결과’가 표기되어야 하지만, 제가 구현한 코드에는 줄 바꿈이 일어나지 않고 표기되어 오류가 난 것이었습니다. 이를 통해 구현하는 데 있어 요구 조건을 확인하고, 입·출력 시에 정확한 구현을 했는지 혹은 내가 잘 지켰는지를 점검하는 과정이 미흡했다는 점에서 아쉬움을 느꼈으며, 이러한 점을 보완해 다음 미션 진행에 있어 차질이 없도록 해야겠다는 생각이 들었습니다.
여러분... 확인 또 확인 하세요... 이거 때문에 멘탈이 왔다갔다..🤯🤯
4. 각각의 클래스를 기능별로 관리하기
이번 미션에서 클래스별로 나누어 구현해보는 것을 아래와 같이 시도하긴 했으나, 이를 더 세분화시켜 구현하지 못했다는 점이 아쉬웠습니다. 따라서 다음 미션 때는 각각의 기능별로 더욱 세분화하여 구현하는 것이 목표입니다.
코드 리뷰
이번 미션에서 추가된 요구사항이 아래와 같습니다.
요구사항에 만족하기 위해 코드를 작성했지만 코드 리뷰를 받아보면서 만족하지 못한 함수들이 생각보다 많더라구요..😱
작성해주신 코드 리뷰를 확인해보겠습니다...💬
요구사항 불만족
추가 요구사항 중 아래와 같은 조건이 있었습니다.
하지만 위에 코드를 보면 두 가지 기능을 하는걸 볼 수 있습니다.
이를 아래와 같이 수정하여 요구사항에 만족할 수 있게 바꿀 수 있을 것 같습니다.
fun shouldMoveForward(): Boolean {
val randomNumber = generateRandomNumber()
return randomNumber >= FORWARD_CONDITION
}
fun printCarStatus(carNamesList: List<String>, carResultList: List<String>) {
for (index in carNamesList.indices) {
println("${carNamesList[index]} : ${carResultList[index]}")
}
println()
}
for (countList in MIN_NUMBER until carListCount) {
if (shouldMoveForward()) {
carResultList[countList] += "-"
}
printCarStatus(carNamesList, carResultList)
}
아래도 동일하게 요구사항에 만족하지 못한 나 자신...🫣🫣
해당 기능도 리뷰 달아주신것 처럼 아래와 같이 바꿀 수 있을 것 같습니다.
fun joinWinners(winnersList: List<String>): String {
return winnersList.joinToString(", ")
}
fun printFinalWinnerMessage(joinedWinners: String) {
println("${Constants.FINAL_WINNER_MESSAGE}$joinedWinners")
}
val joinedWinners = joinWinners(winnersList)
printFinalWinnerMessage(joinedWinners)
느낀점
이번 미션에서 HashMap을 사용해 key와 value로 구현하려는 목표를 세웠습니다. 하지만, HashMap에 대한 이해가 부족하다는 것을 깨닫고 추가로 공부를 했습니다. 그럼에도 불구하고, 실제 구현 과정에서 여전히 어려움을 느꼈습니다. 이에 따라, 요구사항을 만족시키면서도 구현이 가능한 다른 방법을 모색하기로 결정했습니다. 그 결과, 입력받은 자동차 이름의 수만큼 List를 만들어 각 자동차의 전진 여부를 기록하는 방식으로 전략을 변경했습니다. 이 방식으로 미션을 성공적으로 완수하긴 했지만, 처음 계획한 HashMap을 활용한 구현에 도전하지 못한 것에 대한 아쉬움이 남았습니다. 앞으로는 이 경험을 토대로 HashMap을 활용한 구현에 다시 도전해보려고 합니다.
재구현
☁️ 재구현이 완료되면 올려보도록 하겠습니다 !! ☁️
공부하는 공돌이, 공공돌입니다🐻
@sheep1sik
'우테코 프리코스' 카테고리의 다른 글
[우테코 프리코스] 6기 안드로이드 3주차 회고록 (1) | 2023.12.26 |
---|---|
[우테코 프리코스] 6기 안드로이드 1주차 회고록 (4) | 2023.11.21 |