우아한테크코스 프리코스가 10/19일 목요일부터 시작되었다.
이번 미션은 숫자 야구게임이었다.⚾️
숫자 야구 게임은 고등학교 시절 수업시간에 옆 친구랑 정말 많이 했기에 룰 자체는 금방 이애했다.
즉, 3자리 숫자를 정하고 내가 말한 숫자가 컴퓨터의 숫자와 정확하게 일치하는 자릿수만큼이 스트라이크
이고
내가 말한 숫자가 정확한 컴퓨터의 자리에는 없지만 컴퓨터 숫자안에 있으면 볼
,
내가 말한 숫자가 컴퓨터숫자와 전혀 연관이 없으면 낫싱
이다.
내가 1주차 프리코스를 진행했던 방식
처음에 기능목록을 작성이 내게는 어려웠다.
기능목록이 무엇인지 찾아보고 어떻게 작성해야하는지, 매우 자세하게 작성해야 하는것인지 혹은 간단하게만 작성하면 되는건지 감이 잡히지 않았고, 첫날은 그렇게 아무것도 못한 채 기능목록 작성을 위한 준비하는데 시간을 투자했다.
처음 기능목록은 매우 세세하게 함수명, 각 함수가 하는 기능, 게임 전체 로직을 작성하였다.
하지만 생각을 해보니 내가 개발을 하면서 함수명은 언제든지 수정될 수 있고, 내가 처음부터 생각했던 로직이 결국은 오류가 발생하는 로직일수도 있으니 굳이 처음부터 이렇게 자세하게 작성할 필요가 있을까? 라는 생각이 들었다.
그래서 결국에는 모두 지우고 새로 작성하였다. 😣
물론 내 말이 무조건 맞다는건 아니다.
처음 생각했던 방식이 맞았을수도 있으나 우선은 바뀐생각대로 구현하였고, 내가 틀린부분은 2주차, 3주차, 4주차를 진행하면서 수정하기로 결정하였다.
위의 기능목록을 작성하고 각 기능은 각각의 함수로 작성하였다.
아직 내가 코틀린에 익숙하지도 않았고, 리팩토링 경험도 없었으며, 개발경험도 많지 않았기에 모든 기능을 구현하고나서 리팩토링하기로 마음먹었기에, 위의 기능을 전부 함수로 구현하고나서 리팩토링하였다.
진행하면서 어려웠던점
구현을 끝내고 리팩토링하는 과정이 내게는 너무 어려웠다.
또한 처음 커밋메세지를 어떻게 작성해야할지도 막막하였다.
사실 처음에는 커밋 메세지를 내마음대로 마구자비로 작성하였다.
위처럼 막 메세지를 작성하였으나, 커뮤니티를 보며 다른사람들은 어떻게 작성했나 확인하던 중 다들 커밋컨벤션을 지키며 커밋메세지를 작성한다고 보았고, 그것이 뭔지 바로 찾아보았다.
그리고 내 커밋방식이 틀렸다는 것을 깨닫고 내 저장소를 밀어버리고 새로 커밋메세지를 작성하였다.
기능 구현은 feat: [message]
,
리팩토링은 refactor: [메세지]
,
코드수정없는 주석제거, 공백추가 등은 style: [message]
로 작성하였다.
이렇게 하고보니 무슨 의미인지 한눈에 알아볼 수 있었고, 이래서 커밋 메세지의 규칙을 정하는 것이 중요하구나 싶었다.
리팩토링에서의 어려움
OT에서 포비가 “사람은 눈앞에 정답지가 있으면 정답지를 보고싶어하는것이 본능이다.” 라고 말한적이 있기에 최소한 내 스스로가 구현을 끝내기 전까지는 커뮤니티, 구글링을 최소한으로 하자 라고 마음먹었고, 모든 기능을 구현하고나서 커뮤니티를 보며 다른사람은 어떤방식으로 구현했을까 하는마음으로 들어가보았다.
사실 구현 중에도 중간 중간 들어가보긴 했지만 정말 잘하시는 분들이 많았다.
근데 그 잘하시는 분들이 하는얘기를 보고있으니 멘붕이왔다.
디자인패턴, MVC, 클린코드 TDD 등,,, 나는 이제 막 어찌 어찌 구현을 끝내고 내 코드를 보며 이정도면 잘했다하며 만족해하고 있었는데 다른사람들은 MVC 패턴으로 코드를 구현했으며, 이미 진작에 구현을 마치고 리팩토링하며 클린코딩중이었다..
너무 멘붕하여 커뮤니티를 계속 보다보면 하루종일 우울해지겠구나 싶어 그만보고 다시 내 코드를 보았는데 처음에는 만족스러웠던 내 코드가 정말 형편 없어보였다.
나도 리팩토링을 하려고 코드를 살펴보았는데 어디서부터 건드려야할지 모르겠었다.
그래서 뒤늦게라도 리팩토링이 무엇인지 공부하며 겨우겨우 했다 ㅠㅠ
리팩토링이란 무엇일까?
이번 우아한테크코스 6기 프리코스를 진행 중 리팩토링을 하던중 자꾸 에러가나고 어떻게해야할지 감이 제대로 공부하기로 결정하였다. 리팩토링이란 물론 리팩토링을 하기 전 리팩토링이 무
anjji.tistory.com
아쉬웠던 점과 1주차에서 배운 것들
우선 내가 아직 코틀린과 친하지않다는 것을 느꼈다.
그래서 우선 코틀린 메서드, 코틀린 코드 컨벤션 등 docs를 열심히 찾아보며 친해져야겠다는 생각이 들었다.
사실 시작전에는 그래도 내가 코틀린으로 알고리즘도 어느정도 풀었고 어느정도는 자신있었지만 다른사람이 어떻게 했나 보고나니 나는 아직 코틀린에 대해서 정말 모르는구나 느낄수있었다.
또 나는 고작 클래스 나누기 정도가 한계였는데 다른사람들은 MVC 패턴도 사용하고, 정말 클래스를 잘게 나누어 구현했다.
정말 잘하시는 분들이 많았기에 엄청 주늑들기도 했다 ㅠㅠ
프리코스 시작하면서 커뮤니티에 다양한 토론글, 함께 나누기 글이 올라왔다.
나도 함께 나누고싶어 글을 작성하고 싶었으나 아직 내 수준으로는 어림도 없다고 느꼈다. 정말 더 많이 공부해야겠다…
우선 내가 정말 코틀린에 대하여 모른다는 것을 느꼈다.
나는 나름 코틀린으로 알고리즘도 풀며 어느정도 수준으로는 이해했다고 생각하였다. 하지만 그것은 나의 오만이었다.
package baseball
import camp.nextstep.edu.missionutils.Console
import java.lang.IllegalArgumentException
class User {
companion object {
private const val RESTART = "1"
private const val QUIT = "2"
private const val SIZE = 3
private const val NOT_VALIDATE_LENGTH = "3자리의 입력이 아닙니다."
private const val NOT_VALIDATE_NUMBER = "사용자의 입력이 1부터 9까지의 숫자가 아닙니다."
private const val NOT_UNIQUE_NUMBER = "사용자의 입력 중 중복된 숫자가 존재합니다."
private const val NOT_VALIDATE_RESTART_NUMBER = "입력이 1 또는 2가 아닙니다."
}
fun inputUserNumber(): MutableList<Int> {
print("숫자를 입력해주세요 : ")
val userNumber = Console.readLine()
checkValidUserNumber(userNumber)
return userNumber.map { it.digitToInt() }.toMutableList()
}
fun decideGame(): Boolean {
val userInput = Console.readLine()
checkValidRestartNumber(userInput)
return userInput == RESTART
}
private fun checkValidUserNumber(number: String) {
validateLength(number)
validateNumber(number)
validateUnique(number)
}
private fun validateLength(number: String) {
if (number.length != SIZE) {
throw IllegalArgumentException(NOT_VALIDATE_LENGTH)
}
}
private fun validateNumber(number: String) {
val regex = Regex("[1-9]{3}")
if (!regex.matches(number)) {
throw IllegalArgumentException(NOT_VALIDATE_NUMBER)
}
}
private fun validateUnique(number: String) {
val checkDuplicateSet = number.toSet()
if (checkDuplicateSet.size != SIZE) {
throw IllegalArgumentException(NOT_UNIQUE_NUMBER)
}
}
private fun checkValidRestartNumber(input: String) {
if (input == RESTART || input == QUIT) {
return
}
throw IllegalArgumentException(NOT_VALIDATE_RESTART_NUMBER)
}
}
우선 위의 코드는 내가 작성한 클래스 중 하나인 User 클래스이다.
여기서 나는 처음으로 companion object
라는 개념을 사용했다.
사실 이것도 처음부터 알고있던 개념은 아니었다. 단지 const val
을 사용하기 위해서 코드를 작성하였으나 IntelliJ IDEA에서 const val을 사용하고 싶으면 companion object
를 사용하라고 오류표시를 해주었기 때문이다…
또 정규표현식을 처음으로 사용했다.
물론 이 정규표현식 코드도 내가 처음부터 생각했던 것은 아니었고, 효율적인 방식을 찾으며 구글링하다가 발견한 것이다.
이 뿐이 아니다ㅠㅠ
fun decideGame(): Boolean {
val userInput = Console.readLine()
checkValidRestartNumber(userInput)
return userInput == RESTART
}
이 함수에서 return userInput == RESTART
부분은 처음 코드는 아래와 같다.
if(userInput == RESTART)
return true
else
return false
4줄의 코드가 단 한줄로 바뀌었다.
정말 내가 많이 부족하구나 느낄 수 있는 부분이었다.
또 위에 companion object
로 만드는 것도 방법이지만 Enum class
라는 것도 있다고 한다.
불변값으로 사용되는 것들은 별도의 enum class
로 만들어 관리하는 것도 하나의 방법이라고 한다.
또 중복값 확인 부분에서 나는 처음에 number 문자열을 문자 배열로 만든 후 distinct라는 메서드를 사용하였는데 내가 사용했던 방식보다 위의 코드 중 Set 자료형을 이용하는 방식이 더 효율적이라고 했다.
정말 코틀린의 문법 중 내가 아는 부분은 극히 일부구나 느꼈고 더 찾아봐야겠다 느꼈다....
커뮤니티를 보며 많은 것들도 배웠다.
나는 아래 그림처럼 클래스를 분리하였다.
하지만 다른 사람들은 MVC 패턴을 사용하였고, 많은 사람들이 클린코딩중이었다.
나는 클래스 분리조차 겨우해냈지만 다른 사람들은 그것보다 더 나아가서 MVC 패턴을 사용하였고, 최대한 코드가 간결하고 이해하기 쉽게 클린코딩을 하며 리팩토링중이었다.
물론 이 과정에서 많이 불안감을 느끼기도 했고 좌절도 많이했지만 그래도 좋은것들은 빨리 배워 내것으로 만들어야 한다.
우선 리팩토링을 공부하며 정리하였고 MVC 패턴도 최대한 빨리 공부하여 적용할 것이다.
MVC 패턴이란
anjji.tistory.com
현재 기준 프리코스 1주차 미션에 PR을 보내신분이 129명정도 되시고 Fork수는 대략 230명이다.
정말 많은 분들이 제출하셨고 나도 어제 제출시간이 되고 제출하고나서 129명의 코드를 전부 읽고 분석하려고 하였다.
물론 아직 반정도밖에 읽지 못하였다.
제출하신 분들중에는 이미 MVC 패턴을 적용하신 분들도 계셨고, 나랑 정말 비슷하게 코딩하신 분들도 많으셨다.
내 게임 중 로직 중에 난 Flag를 사용하였으나 다른 분들 중에는 true로 무한루프를 돌리고 게임이 종료되었으면 break, 재시작은 continue로 넘겨 구현하시는 분들도 계셨고 do - while 문을 통해 구현하신분들도 상당히 많았다. 정말 많은 분들이 제출하였지만 전부 다른 코드로 작성하셨다.
다른 사람 코드들을 보며 정말 배울점도 많았다. 나랑 정말 비슷한 코드임에도 나보다 더 효율적으로 작성하신 분들도 계셨기에 많은 것들을 배울 수 있었다.
또 MVC 패턴에서 더 나아가 MVVM 패턴을 적용하신 분들도 계셨다. 정말 잘하시는분들도 많았고 아직 내 수준으로는 제대로 된 분석조차 힘든 코드들이 있어 고생좀했다 ㅠㅠ
이렇게 분석하다보니 많은 인사이트를 얻은 것 같아 다음 주차에는 더 나은 코드를 짤 수 있을 것 같은 자신감이 든다!!
전부다 분석해서 내 것으로 만들거야 ㅡㅡ
2주차에서의 목표
우선 가장먼저 코틀린과 가장 먼저 친해지고자 한다.
그 후에는 리팩토링이 무엇인지 더 빨리 이해하기 위해 관련 서적을 보며 공부할 것이다.
2주차 부터는 추가 기능요구사항이 주어진다고 한다.
그것을 위해서라도 클린코딩이 무엇인지, 어떻게하면 더 나은 코드를 작성할 수 있을지 고민해봐야할 것이다.
그리고 MVC 패턴을 나도 사용해보고싶다. 구조도 신기하고 뭔가 이제까지 내가 해왔던 방식이랑 다른 방식이라 색달랐다.
물론 내가 해왔던방식은 초짜들이나 하는 방식이 MVC 패턴은 디자인패턴으로 소프트웨어 디자인 과정에서 자주 발생하는 문제들에 대한 일반적인 해결책이니 비교할수도 없겠지만 그래도 새로운것을 접했으니 쓰고싶다.
마지막으로 스스로 테스트케이스를 설계하고 작성할 것이다!
커뮤니티에서 포비가 올린 ‘멘탈관리는 어떻게 하면 좋을까?’ 라는 글에 달린 답변 중 하나이다.
사실 나는 우아한테크코스를 합격하기 위해 프리코스에서의 목표를 세웠던 것 같다.
물론 합격한다면 더할 나위 없이 좋겠지만, 위의 분 말씀처럼 2주차부터 합격은 부수적인 목표로 설정하고, 이 프리코스를 통해 더 나은 개발자로 성장하는 것을 가장 큰 목표로 삼으려고 한다.
포기하지 않고 함께 공유하면서 더 많은 것들을 배우고, 스스로 발전해 나갈 것이다.
이 프리코스가 끝나고 더 나아진 내가 됐으면 한다.
'회고 > 우아한테크코스 프리코스' 카테고리의 다른 글
[우아한테크코스 6기] 프리코스 4주차 회고 (0) | 2023.11.15 |
---|---|
[우아한테크코스 6기] 프리코스 3주차 회고 (0) | 2023.11.08 |
[우아한테크코스 6기] 프리코스 2주차 회고 (2) | 2023.11.01 |
우아한테크코스 API 분석 (1) | 2023.10.22 |
우아한테크코스 6기 지원! (1) | 2023.10.16 |