처음 4주 차 미션 내용을 보자마자 '이걸 내가 어떻게 하지?'라는 생각이 가장 먼저 들었습니다. 프리코스를 진행하면서 많이 성장했다고 느꼈지만, 이번 주 미션은 어떻게 헤쳐 나가야 할지 막막했습니다. 그래서 이때까지 했던 프로젝트들의 기억을 떠올려 요구사항을 먼저 파악하기로 했습니다. 그다음 입력과 출력 조건, 그리고 유효성 조건까지 찾고 프로그램을 어떻게 설계할지 고민했습니다.
고민보다 go
우선 어떤 기능이 필요한지 무작정 적어봤습니다. 그리고 금액과 관련된 기능을 하는 클래스, 주문받는 클래스, 이벤트를 관리하는 클래스 등 필요해 보이는 객체들을 간단히 적어놓고 프로그램 실행 흐름을 고민했습니다. 그때까지는 단 한 줄의 코드도 없이 더 나은 설계를 위해 '객체 지향 사고 프로세스(맷 와이스펠드)'라는 책도 읽으며 수없이 고민했지만 이렇다 할 진전이 없었습니다. 또 각 객체 간의 협력 과정을 생각해 글로 적어봤지만, 과연 제 생각대로 동작할지 확신이 서지 않아 섣불리 코드를 작성하지 않고 있었습니다. 미션 첫날을 그렇게 보내고 잠이 들 때쯤 이런 생각이 들었습니다.
'요구사항이랑 입출력 조건, 유효성 조건도 다 파악해 놓았는데 일단 뼈대만 세우고 시작하면 안 되나? 코드를 봐야 구체적인 그림이 보이지 않을까?'
그래서 바로 다음 날부터 구현에 들어갔습니다. 그러다 보니 점점 어떤 클래스를 만들고 어떻게 연결 시켜줘야 하는지 보이기 시작했습니다. 이때까지 저는 손에 물을 묻히지도 않고 모래성을 지으려던 것입니다. 인제야 프로그램의 형태가 잡혀가기 시작했습니다.
다시 본 객체 지향 프로그래밍
저는 2주 차 미션부터 MVC 패턴으로 개발하면서 Manager나 Service 객체로 하여금 관련 객체들의 결과를 취합하고 가공해 내보내도록 했습니다. 하지만 그 과정에서 Controller가 도메인의 정보를 되도록 조금 알도록 하고자 객체에서 한 번에 값을 전달할 수 있었음에도 굳이 Manager나 Service를 거쳐서 값을 전달하도록 했습니다. 그러다 보니 쓸데없는 로직이 늘어났고, 이는 단위 테스트와 디버깅을 어렵게 만들었습니다.
이번에도 초반에 그 습관을 버리지 못하고 플래너를 관리하는 Manager와 이벤트를 관리하는 Manager를 만들었습니다. 그러나 이번 주 학습 목표인 '클래스의 분리'를 계속 생각하면서 코드를 작성하다 보니 Manager에서 다른 객체의 반환 값을 불러와 그대로 내보내는 로직이 많은 걸 발견하고 이를 줄이기 위해 원래 Manager가 맡고 있던 역할을 다른 객체나 새로운 객체들에 분배했습니다. 그러자 플래너를 관리하는 Manager는 아무 일도 하지 않게 되어 삭제할 수 있었습니다. 이벤트를 관리하던 Manager도 이벤트 목록을 만드는 일 외에는 아무 일도 하지 않게 되었습니다. 그래서 거의 다 짜놓은 코드들을 객체의 기능에 맡게 여기저기로 옮기고 이벤트 목록만 만드는 정적 팩토리 메서드만 가진 클래스로 탈바꿈시켰습니다.
하나를 고치니 다른 곳도 자연스럽게 고칠 수 있었는데, 이벤트 관리 Manager에서 Controller로 증정 메뉴를 주기 위해 증정 이벤트 객체만 따로 생성자에서 불러오는 부분이 있었습니다. 그런데 모든 이벤트를 목록에 담는 메서드가 초기화된 증정 이벤트 인스턴스 변수를 사용해 다시 생성자에서 실행되고 있었습니다. 그리고 테스트 코드를 돌려보니 생성자에서 메서드 호출 순서가 바뀌면 NullPointerException이 발생하는 상황이었습니다. 앞서 Maneger를 대폭 수정하면서 증정 이벤트를 호출하는 부분도 따로 떼어내 Null의 위협에서 벗어날 수 있었습니다.
이렇게 클래스의 분리에 대해 고민하며 리팩토링해 보니 객체가 자기 역할이 아닌 코드를 갖고 있다면 단지 개념적인 문제뿐만 아니라 프로그램이 쉽게 무너질 수 있음을 알게 되었습니다. 저는 바보 예외 처리만 다 하면 완벽한 프로그램이 되는 줄 알고 있었으나, 객체 지향적 설계를 잘 적용하면 구조적 결함을 막아 더 완벽한 프로그램을 만들 수 있다는 걸 배웠습니다.
프리코스에서 깨달은 것들
이번 주 미션은 두려움으로 시작했으나 오랜만에 어릴 적 종이접기를 하던 때의 기분을 느꼈습니다. 그때는 어려운 것을 접을 때 하루 종일 종이에 매달려 있곤 했습니다. 어려운 단계를 돌파해 나가고 점점 종이의 모양이 잡혀갈 때 느꼈던 희열을 임무를 수행하며 다시 느낄 수 있었습니다.
느리더라도 더 좋은 설계를 위해 밤을 새우고 마침내 설계한 대로 프로그램이 작동했을때 제겐 두려움이 아닌 희열과 자신감만이 남아있었습니다.
4주 전의 저는 등산로 입구에 있었지만 치열한 4주를 보낸 지금 저는 입구가 보이지 않는 곳까지 온 것 같습니다.
그럼에도 아직 정상은 보이지 않고, 앞으로도 정상은 없을 테지만 프리코스 커뮤니티처럼 여러 사람과 함께 올라가면 더 힘을 낼 수 있을거라 생각합니다.
때론 뒤처진다고 느껴도 저만의 페이스로 꾸준히 오르는 게 중요하다는 걸 프리코스를 통해 알게 되었습니다.
'우테코 6기 프리코스' 카테고리의 다른 글
3주차 회고 (4) | 2023.11.09 |
---|---|
2주차 회고 (0) | 2023.11.05 |
1주차 회고 (0) | 2023.10.25 |