3주차
가 시작된 후 새로운 미션을 수행하기 전에, 우테코 커뮤니티(디스코드)
에서 만난 사람들과 함께
2주차
미션에 대한 자신의 코드를 설명하고 서로 리뷰하며 토론하는 시간을 가졌다.
처음엔 모르는 사람들과 얘기하는 것이 어색했지만 공통 관심사
인 개발
얘기를 주고 받다보니
누구하나 어색해하지 않고 즐겁게 토론하듯이 대화했던 것 같다.
특히 Readme에 명시되지 않았지만 해야만 할 것 같던 처리에 대해 얘기했던 것이 가장 재미있었는데,
예를 들어
몇 자 이상
의 이름을 입력 받아야하는 지 명시되지 않아 어떻게 처리할 지에 대해 고민했던 점이동 시도 횟수
로 0
을 입력받아도 되는지등이 있었다.
이러한 고민 공유
와 코드 리뷰
시간은 하나의 주제에 대한 서로의 의견 나누며 사람들의 다양한 관점과 생각을 배울 수 있는 유의미한 시간이었다.
홀로 미션을 수행하며 코드에 대해 고민하고 적용해보며 성장해나가는 것도 유익했지만
사람들과 함께 코드를 소개하며 질문을 주고받으며 지식을 공유하고, 아쉬웠지만 방법이 떠오르지 않아 개선하지 못했던 코드들도 소통을 통해 더 나은 방향으로 개선해나가는 등 ‘함께’
의 과정에서 더 많은 성장과 성취를 느낄 수 있었다.
‘함께의 힘’
은 정말 대단하고 소중한 것이라고 다시 한 번 느낄 수 있던 시간이었다.
우테코 프리코스를 진행하며 겪고 있는 다양한 경험을 통해 깊이있는 몰입을 하고 있는 것 같아 프리코스를 모두에게 열어주신 우아한 테크코스에게 감사하다는 말씀을 꼭 전하고 싶었다.
“정말 감사합니다 우테코!”
1주차
미션 후에 커뮤니티의 여러 사람들로부터 코드 리뷰를 받는 과정에서, 내 코드에 대한 깊은 고민을 하지 못했다고 느껴 정말 아쉬웠다.
때문에 2주차
부터 더욱 근거있는 코드 작성을 위해 정말 많은 시간과 노력을 투자해서 몰입하였고
덕분에 3주차
에 접어든 지금은 자신있게 코드를 설명할 수 있게 되었다.
깊은 고민을 통해 코드를 작성하다보니 아쉬웠던 점
, 개선하고 싶은 점
이 바로바로 보였고
이를 통해 리뷰어들이 확인해줬으면 하는 리뷰 포인트
를 체크 할 수 있어, 고민했던 부분에 대한 집중적인 리뷰를 받아 생각을 정리할 수 있게 되었다!
덕분에 사람들의 리뷰와 개인적인 생각을 바탕으로 아쉬웠던 점들을 효과적으로 종합할 수 있었고, 이번 미션에선 이를 개선하고자 노력하면서 코드 작성에 더욱 몰입할 수 있었다.
특히 도메인 로직
에 대한 UI로직
의 의존성
을 제거하여 확장성있게 구현
하려면 어떻게 해야할 지에 대해 많은 고민이 있었는데,
리뷰 과정에서
“도메인 로직
에 의존하는MessageConverter
객체를 만들어 요구되는 출력 형태의 String을 만들고UI로직
중 출력의 책임을 가진 객체에는 오직‘출력’
이라는 기능만을 수행하게 만들면 되지 않을까?”
라는 결론을 도출해낼 수 있었다.
이번 미션에서 이를 적용하여 도메인 로직
에 대한 UI로직
의 의존성
을 제거하여
유연
하고 확장성
있는 UI로직
을 작성하였고, 메시지 출력 형식이 변경되면 도메인 로직
과 UI로직
변경하지 않고 MessageConverter
객체만 수정하면 되도록 책임을 분리
할 수 있었다.
2주차
부터 테스트 코드 작성
요구 사항이 추가되었다.
때문에 2주차 미션을 진행하며 의미있는 테스트 코드를 작성해보려고 노력하였고, 검증이 필요하다고 생각했던 부분에 대한 테스트를 모두 완료할 수 있었다.
하지만
Junit5
를 많이 사용해보지 않아 라이브러리를 효과적으로 활용하지 못해 매우 아쉬었다.
그렇게 2주차 미션이 마무리 되고 우테코에서 보내준 공통 피드백
과 다른 이들의 코드 리뷰 활동
을 통해 Junit5
의 다양한 사용법을 학습하며, 2주차에서 느낀 아쉬움을 떨쳐내기 위해 쉬지않고 노력했다.
그랬던 덕분인지, 이번 주차 미션의 요구사항인 ‘도메인 로직 단위 테스트’
에 @ParameterizedTest
, @MethodSource
등 학습했던 내용들을 적용해나가며 중복 코드를 최소화
하고 가독성 높은 코드
를 완성할 수 있었다!
미숙했던 부분을 여러 사람들의 도움으로 점차 보완해나가면서 성장하는 내 모습을 돌아보며 우테코 프리코스와 함께하는 시간들이 정말 소중하다고 느꼈고, 이를 아쉽지 않게 잘 활용해보자고 다시 한 번 다짐하게 되었다.
이번 미션을 수행하면서 로또 가격을 런타임 환경에서 동적으로 변경
할 수 있도록
Money
객체와 LottoMachine
객체를 확장성있게 설계
했는데, 이번 미션 코드 중 개인적으로 가장 만족스러웠다.
처음엔 미션에서 주어진 로또 가격인 1000원
을 LottoConstant
라는 상수 클래스에서 관리하고,
Money
객체의 생성자
를 통해 로또 구매 가격이 객체에 전달되면 import한 해당 상수값
으로
가격이 0으로 나누어 떨어지는지 검증하도록 했다.
그리고 LottoMachine
은 이미 검증된 Money
객체를 받으면 별도의 검증 로직 없이 로또를 생성하도록 했다.
하지만 LottoMachine
객체를 테스트 하는 과정에서 이렇게 설계하게 되면 로또의 가격을 변경하고 싶을 때, 런타임 환경에서 동적으로 로또 가격을 변경하는 것이 아닌 Constant
객체의 상수 값을 변경해주어야 함을 인지하게 되었다.
당장에 미션 테스트 코드를 통과시키는 것은 문제가 없지만, 넓게 보았을 때
1000원
이라는 금액 단위 외에 다른 금액 단위는 사용할 수 없다는 것은 설계적으로 오류라는 생각이 들었고 유연하지 못한 코드라고 느껴졌다.
"때문에 이를 해결해보고자 했다."
LottoMachine
은 로또 가격을 private final
필드로 갖는다.LottoMachine
객체를 생성할 때, 로또 가격
을 생성자 주입으로 입력
받는다.0이 아닌지만 검증
하여 생성자 주입 방식으로 Money
객체를 생성한다.LottoMachine
의 로또 구입 메서드에 매개변수로 Money
객체를 입력하면 로또 가격 단위로 구매 금액이 나누어 떨어지는 지 검증
후, 로또를 생성하여 리턴한다.LottoMachine
생성 시 로또 가격을 주입받고, 이를 통해 로또 구입 시에 Money
가 아닌 LottoMachine
에서 금액이 올바른지 검증하도록 로직을 변경하니 로또 구매 가격을 변경하고 싶을 때, LottoMachine
생성 로직에서 로또 가격만 변경
하면 되었다.
위와 같은 리팩토링을 통해 런타임 환경에서 동적으로 로또 가격을 지정할 수 있는 코드가 완성되었다.
매주 프리코스의 미션을 수행하며 문제를 바라볼 때 나무가 아닌 숲을 볼 수 있는 트인 시야가 되어가고 있다는 느낌을 받는다.
잘하는 개발자가 되기 위해 정말 필요한 능력이지만 나는 이 능력이 참 부족하다고 생각해왔는데, 프리코스에 몰입하는 과정에서 개발자로서 필요한 역량들이 쌓여가며진짜 개발자
가 되어가고 있는 것 같다는 생각이 들었다.
3주차 미션을 수행하면서 첫 미션보다 점점 발전하고 있는 나의
사고 회로
와,그 생각이 녹아든 코드
를 보며 정말 값진 순간들을 경험하고 있음을 계속해서 느끼는 중이다.사실 아직도 뭐가 정답인지, 잘 하고 있는건지 모르겠지만 어제의 나보다 오늘의 내가 조금 더 성장해있다는 생각이 드는 것을 보니 잘 해오고 있는 것 같다.
벌써 우테코 프리코스가
한 주
밖에 남지 않았는데, 프리코스가 끝나고 한 줌의 미련조차 남지 않게 남은 4주차도 모든 걸 쏟아부어 보고자 한다!