[ 사람들과 함께 성장하는 경험 🫂]

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원이라는 금액 단위 외에 다른 금액 단위는 사용할 수 없다는 것은 설계적으로 오류라는 생각이 들었고 유연하지 못한 코드라고 느껴졌다.
"때문에 이를 해결해보고자 했다."


해결한 로직은 다음과 같다.

  1. 로또 생성을 담당하는 LottoMachine은 로또 가격을 private final 필드로 갖는다.
    그리고 LottoMachine 객체를 생성할 때, 로또 가격생성자 주입으로 입력받는다.
  2. 로또 구입 금액 입력 부분에서 금액을 입력하면 금액이 0이 아닌지만 검증하여 생성자 주입 방식으로 Money 객체를 생성한다.
  3. LottoMachine의 로또 구입 메서드에 매개변수로 Money 객체를 입력하면 로또 가격 단위로 구매 금액이 나누어 떨어지는 지 검증 후, 로또를 생성하여 리턴한다.

LottoMachine 생성 시 로또 가격을 주입받고, 이를 통해 로또 구입 시에 Money가 아닌 LottoMachine에서 금액이 올바른지 검증하도록 로직을 변경하니 로또 구매 가격을 변경하고 싶을 때, LottoMachine 생성 로직에서 로또 가격만 변경하면 되었다.

위와 같은 리팩토링을 통해 런타임 환경에서 동적으로 로또 가격을 지정할 수 있는 코드가 완성되었다.

매주 프리코스의 미션을 수행하며 문제를 바라볼 때 나무가 아닌 숲을 볼 수 있는 트인 시야가 되어가고 있다는 느낌을 받는다.
잘하는 개발자가 되기 위해 정말 필요한 능력이지만 나는 이 능력이 참 부족하다고 생각해왔는데, 프리코스에 몰입하는 과정에서 개발자로서 필요한 역량들이 쌓여가며 진짜 개발자가 되어가고 있는 것 같다는 생각이 들었다.



[ 3주차를 마치며 🏁]

3주차 미션을 수행하면서 첫 미션보다 점점 발전하고 있는 나의 사고 회로와, 그 생각이 녹아든 코드를 보며 정말 값진 순간들을 경험하고 있음을 계속해서 느끼는 중이다.

사실 아직도 뭐가 정답인지, 잘 하고 있는건지 모르겠지만 어제의 나보다 오늘의 내가 조금 더 성장해있다는 생각이 드는 것을 보니 잘 해오고 있는 것 같다.

벌써 우테코 프리코스가 한 주 밖에 남지 않았는데, 프리코스가 끝나고 한 줌의 미련조차 남지 않게 남은 4주차도 모든 걸 쏟아부어 보고자 한다!

profile
하나씩 천천히 깊이있게 쌓아가는 백엔드 개발자 최승준입니다.

0개의 댓글