본문 바로가기
Log/우아한테크코스

[우아한테크코스 5기] 프리코스 3주차 소감문

by 재영(ReO) 2023. 1. 30.

3주차 미션 소감문


태어나서 처음으로 버스와 지하철에서 노트북을 펼쳐 본 일주일이었습니다. 로직을 계속 고민하다가, 순간 떠오른 방법을 까먹을 것 같아서 노트북을 폈습니다. 오랜만에 본가에 내려가서 밥을 먹다가도 적절한 메서드명이 떠올라서 뛰쳐나가 수정했습니다. 그 바람에 어머니가 서운해하셔서 죄송했지만, 앓던 체증이 내려간 듯 속 시원한 느낌을 받았습니다. 3주 동안 프리코스를 하며 매일마다 새삼 놀라는 점이 두 가지 있습니다. 날마다 기하급수적으로 늘어나는 공부할 거리의 양과, 어떻게든 이를 소화해 나가며 눈에 띄게 커지는 일일 공부 용량(?)입니다. 자바에 익숙해져 가기 때문인지 프리코스를 하기 전보다 하루에 받아들이는 양이 정말 많아졌습니다. 이번엔 특히나 고려사항이 다양했고 그만큼 예외도 자주 맞닥뜨렸습니다. 원인을 찾으려 고민하고 공부하며 일주일 전과는 전혀 다른 깊이의 인사이트를 얻었습니다. 아직 한참 부족하지만 무엇을 어떤 방식으로 공부해야 하는지, 그 모든 공부의 목표가 무엇인지에 대한 감을 계속 잡아가는 것 같습니다. 이번 주 미션을 구현하면서 로또 1등에 당첨되도록 당첨 번호를 100번은 족히 넘게 직접 입력했습니다. 비록 저번 주 실제 로또는 한 개의 숫자도 맞추지 못했지만 문득 우테코에 지원하여 프리코스를 진행하기로 한 제 결정이 마치 제 상황에 꼭 마침맞게 1등이 되도록 직접 입력한 당첨번호 같다는 생각을 했습니다.



3주 차 미션에서 배운 것


이번 주차의 목표는 클래스의 분리와 도메인 로직에 대한 단위 테스트 작성이었습니다. 도메인 로직이 무엇인지도 몰랐지만, 동료분이 커뮤니티에 올려주신 블로그 글을 보며 감을 잡았습니다. 이를 토대로 각 클래스가 하나의 역할을 담당하도록 분리해봤습니다. 단위 테스트를 작성하는 것이 번거롭게 느껴지는 순간도 있었습니다만, 수많은 디버깅과 리팩터링들을 진행하며 작성해놓은 테스트 코드로 빠르게 피드백을 받으며 시간을 절약하는 경험을 통해 테스트코드의 필요성을 여실히 느꼈습니다. 코수타와 커뮤니티에서 코치님들과 동료분들에게 많은 도움을 얻었고, 구글링을 통해 더 견고하고 넓은 배움을 얻었습니다. 그리고 직접 구현을 하며 펑크가 나있던 개념의 부분들도 채울 수 있던 값진 시간이었습니다.

클래스의 분리

숫자야구 미션과 마찬가지로 간단해 보이면서도 막상 구현하려니 잘 그림이 그려지지 않아서 프로그램의 진행 과정을 README에 정리해봤습니다. 어떤 기능들을 구현해야 할지 쉽게 확인할 수 있었고, 어떤 메서드들을 구현해야 할지도 감이 잡혔습니다. 2주 차에서 열심히 고민하며 능력치가 쌓인 덕분이라고 생각합니다.
이번 주 목표는 클래스(객체)를 분리하는 것이기 때문에, 이 메서드들을 어떤 기준으로 클래스에 나눌까 고민해봤습니다. 그러나 잘 떠오르지 않아서 일단 “도메인 로직에 대한 단위 테스트”라는 목표를 보고 도메인 로직이 무슨 말인지 공부해봤습니다. 이때 커뮤니티에 동료분이 올려주신 블로그가 정말 도움이 많이 됐습니다. 우선 도메인은 소프트웨어로 풀고자 하는 현실 세상의 문제, 즉 소프트웨어의 목적이며 이에 대한 로직은 문제를 해결하기 위한 핵심 역할의 기능이라고 이해했습니다. 기능을 도메인 로직과 애플리케이션 서비스 로직으로 나눌 수 있다고 해서, 기능들을 큰 단위로 묶어서 도메인 로직과 애플리케이션 서비스 로직으로 나눠보고 README에 정리해봤습니다. 그리고 우선 이 도메인 로직 단위 별로 클래스를 구성해봤습니다. 이 과정에서 분류하기 굉장히 애매한 것들이 있었는데, 더 작게 쪼개고 또 쪼개 봤더니 클래스의 크기는 매우 작지만 분류를 확실하게 할 수 있었습니다. 이를 통해 저번 주차에 시도했던 역할의 주체 별로 과정을 나눈 것보다 더 세밀하게 역할의 책임을 나눌 수 있었습니다. 클래스를 로직과 역할에 맞춰 작게 분리하니까 어떤 기능을 실행하다 오류가 발생하면, 하나의 긴 소스코드를 열심히 뒤질 필요 없이, 또 여러 소스코드를 왔다 갔다 하며 정신없을 필요 없이 간단히 오류를 찾고 수정할 수 있었습니다.
나눈다고 나눴는데도 부족해서 결국 리팩터링 과정에서 두 개의 큰 클래스를 네 개로 또 나눠야 했습니다. 또 클래스마다 역할이 다르기 때문에 각각 신경 써줘야 하는 요소들이 달랐습니다. 예를 들면 컨트롤러는 멤버 변수를 갖지 않도록 했습니다. 사용자가 한 명인 경우에는 큰 문제가 없을 테지만 여러 사용자가 컨트롤러를 계속 호출한다면 멤버 변수의 값이 계속 변하면서 정상적인 작동을 할 수 없을 것이기 때문입니다. 클래스를 분리하니 각 클래스의 역할이 분명해져서 이러한 점도 쉽게 고려를 할 수 있었습니다.

도메인 로직에 대한 단위 테스트를 작성

domain패키지에 있는 클래스들의 메서드 중 private을 제외한 모든 메서드에 대해서 테스트 코드를 작성하였고, 대부분의 private 메서드 또한 public 메서드를 통해 테스트했습니다. 지난주는 잘 몰라서 UI에 관련된 테스트까지 전부 작성했지만 그럴 필요가 없다고 언급해주셔서 이번 주차에는 도메인 로직들을 점검했습니다. 미션을 진행하며 후반부에 컨트롤러와 크기가 커진 클래스들의 멤버 변수를 정리하고 클래스를 다시 분리하며 조금 더 객체지향적이 될 수 있도록 리팩터링을 했고, 이때 단위 테스트를 작성한 것이 크게 도움이 되었습니다. 리팩터링 후 전체 통합 테스트는 돌려도 오류가 나지 않는 경우가 많았는데 프로그램을 실제로 돌려보면 값이 이상한 경우가 많았습니다. 단위 테스트를 돌리면 여지없이 오류가 있었고 그래서 실수 없이 리팩터링을 완료할 수 있었습니다. 단위 테스트를 작성할 때는 “굳이 이런 기능까지도 테스트를 해야 하나”라는 생각도 얼핏 들었지만, 실제로 도움을 얻은 곳이 바로 그 “굳이 이런 기능”에 대한 테스트 코드였습니다. 확실히 이번 미션을 진행하면서는 메서드나 설계를 수정한 뒤 바로바로 피드백을 받을 수 있었기 때문에 한참을 코드를 들여다보며 어디가 잘못된 건지 머리를 싸매고 고민하지 않았습니다. 테스트 코드의 작성에 대한 필요성을 절실히 느낀 경험이었습니다.

코수타와 커뮤니티에서 받은 도움

1주 차와 2주 차 미션을 완료한 후 동료분들의 코드를 리뷰하기 위해서 커뮤니티를 통해 다른 동료분들의 PR을 확인할 수 있었습니다. 제가 느끼기에는 정말 많은 분들이 “도대체 왜 우테코에 지원을 하는 거지?”싶을 정도로 이미 많은 연습이 되어있고 바로 취직을 할 수 있을 것 같아 보였습니다. 대충 아무 링크나 찍어서 들어가 봐도 개중 반에서 이런 느낌을 받았다는 건 제가 많이 부족한 것이라고 생각해 점점 의기소침해지기도 했습니다. 제게 우테코는 정말 간절하고, 절실하게 함께하고 싶은데 다른 분들보다 많이 부족하다고 느껴서 우울했습니다. 이런 생각들에 잠식되고 있을 때쯤 코수타에서 코치님들이 해주신 말이 정말 큰 위로가 되었습니다. 다른 사람과의 비교는 필연적이고 그럴수록 본인만의 속도로 가는 것이 제일 중요하다는 말을 듣고, 강의실에서 몰래 실시간으로 듣다가 혼자 눈물도 찔끔거렸습니다. 다른 이들과의 비교보다는 무언가를 만들어보면서 실제로 익혀보는 것이 중요하고, 몰입을 해서 머릿속으로 계속 그것만 생각할 때 뭔가가 떠오르는 경험을 해봐야 프리코스를 제대로 경험하는 것이라는 말을 듣고 지난 2주가 떠올랐습니다. 많은 시험들과 일정 속에서도 계속 우테코의 미션을 생각했습니다. 중간고사를 보는 와중에도 머릿속으로 코딩을 하고 있던 경험, 이동 시간도 아까워서 폰으로 회고와 소감문을 적으며 등하교했던 기억들이 떠오르면서 내가 그래도 제대로 프리코스를 경험하고 있구나라는 확신과 용기를 얻었고 이번 주에도 반드시 그러리라 다짐했습니다. 이미 공부가 많이 되어있는 분들은 하루면 쉽게 구현을 하시겠지만, 일주일 내내 몰입을 하며 미션을 해결하고 공부하는 제가 어쩌면 더 알찬 4주를 보낼 것이라고 생각했습니다.
커뮤니티를 통해 여러 좋은 학습자료들을 공유하고 받는 과정에서 계속 끊임없이 공부할 거리를 얻을 수 있었습니다. 또 슬랙으로 구한 스터디를 통해 코드 리뷰도 상세히 받고 몰랐던 것들도 알게 되었습니다. (https://velog.io/@semi-cloud) 좋은 분들을 만나서 도움을 받으며 궁금했던 부분에 대해서도 토론하며 답을 찾아볼 수 있었습니다. 예외 처리를 어느 부분에서 하는 것이 적절한 가에 대한 토론을 했고 각자 생각이 달랐지만 정말 매끄럽게 모두가 납득할 결론을 내서 이번 미션에 적용해보았습니다. 혼자서 고민했다면 적절한 답을 찾기 힘들었을 것으로 생각합니다. 정말 “함께”로부터의 시너지를 여실하게 체험했습니다.

직접 구현과 구글링을 통한 배움

Enum을 사용하는 요구사항이 있어서 효과적으로 활용하기 위해 Enum에 대한 내용을 하루 종일 구글링 했습니다. 그 과정에서(m을 두 번 치는 실수…) EnumMap이라는 자료형을 찾을 수 있었고 HashMap보다 Enum key에 대해 훨씬 성능이 좋다고 하는 글을 봐서 이를 사용해서 구현을 해봤습니다. 자바 기본서에서는 본 적 없는 새로운 내용을 찾아내서 마치 보물을 얻은 느낌이었고 하루 종일 기분이 날아갈 것 같았습니다.
스트링 포맷을 사용할 때 0.1f로 float를 받으면 저절로 반올림이 되는 것, %를 출력하고 싶으면 %%로 작성해야 하는 것, 당첨금을 매우 크게 했을 때의 오류를 고치기 위해 고민하고 long자료형을 실제로 써보는 경험 등도 해봤습니다. 모든 내용들이 다 자바 기본서에 있었지만, 책을 처음부터 훑는 과정에서는 저도 모르게 그냥 지나쳤던 것 같습니다. 실제 구현을 해보면서 문제를 맞닥뜨리고 책을 뒤져서 찾아낸 후 다시 공부하고 구현에 사용을 하는 과정을 통해서 정말 잊기 힘들 정도로 머리에 관련 내용들이 박혔습니다. 아마 책만 훑는 식의 공부가 이어졌다면 어쩌면 평생 몰랐을 수도 있다는 생각이 들었습니다.



3주 차 미션에서 느낀 것


벌써 마지막 주만 남기고 있다는 것이 정말로 아쉽습니다. 3주동안 참 빠르게 성장했습니다. 게더타운, 슬랙, 깃헙 디스커션 모두 프리코스를 통해 처음 알았지만 어느새 없으면 안될 소중한 만남의 장과 지식의 보고가 되었습니다. 계속해서 함께 성장해 나갈 수 있으면 좋겠습니다. 그러기 위해서 남은 한주도 지금처럼 최선을 다해 몰입하고 성장하겠습니다. 항상 감사드립니다.