[들어가며]
이번주 미션은 처음 보는 형태의 미션이었다. 이메일 형태의 미션이어서 현업에서 개발자가 받을 수 있을 만한 내용의 메일이기도 하고, 내가 진짜 현업에서 일하고 있는 개발자가 된것 같은 기분이 들게 되는 미션이어서 매우 흥미로웠다. 이번 주의 목표는 저번주와 비슷한 클래스(객체)를 분리하는 연습을 조금 더 해보는 것이 었다. 저번주에 진행한 과제에서 생각해보면 단일 책임 원칙이나, 모듈화나 응집성을 높이지 못한것 같아 아쉬운 부분이 많았는데 이번 주도 같은 목표이다보니 더 연습해 볼 수 있어서 좋았던 것 같다. 미션을 받고 가장 먼저 한 일은 이번 주도 역시 3주차 공통 피드백을 확인했다.
[연관성이 있는 상수는 static final 대신 Enum을 활용한다.]
가장 먼저 눈에 들어온 것은 “연관성이 있는 상수는 static final 대신 Enum을 활용한다.”라는 내용이었다. 저번 주는 로또의 등수를 Enum을 활용했었는데, 이번 주 미션에서는 연관성이 있는 상수가 어떤게 있을지 고민해 보았다.
가장 먼저 떠오른 부분은 메뉴였다. 메뉴 Enum을 사용하여 메뉴와 가격을 관리하는 것은 가독성과 유지보수성을 향상시킬 수 있었고, 메뉴의 가격은 Enum 내부에서 적절하게 캡슐화되어 있어서, 외부에서 직접 변경이 어렵게 된다.
또 어떤 부분이 Enum으로 될 수 있을지 고민해 보았는데, Badge 와 ErrorMessage 부분을 만들어 보았다. 모두 값이 자주 변하지 않고, 연관성이 있다고 생각해서 만들었다. 만들어 보니 확실히 가독성이 많이 좋아지고, Enum은 클래스로 정의되기 때문에 내부에 작은 기능을 하는 메서드를 만들어 사용해 보니 단순한 상수 그룹 이상의 기능을 만들 수 있다고 느꼈다.
[테스트 코드도 코드다.]
다음 인상 깊었던 부분은 “테스트 코드도 코드다”라는 내용이었다. 테스트 코드가 중요하다는 말은 익히 들어서 알고 있었지만, 나는 우테코 이전에 테스트 코드를 작성해 보지 않았다.
일단 가장 큰 이유는 어떻게 작성해야할 지 감이 잡히지 않는 것이었다. 혼자 블로그나 강의를 보며 작성해봤지만, 쉽지 않았던 기억 때문에 습관이 안된것 같다. 하지만 우테코 프리코스를 시작한 이후로 테스트 코드를 작성해보고, 확실히 많은 것을 느낄 수 있었다.
가장 좋은 점은 테스트 코드를 작성 후에 코드 리팩토링을 하다보면 거침 없이 할 수 있다는것이다. 전에 테스트 코드를 작성하지 않고, 리팩토링을 진행 할 때는 코드를 작성하면서 많이 망설이던 모습이 떠오른다. 이걸 고쳤다가 안되면 어떡하지? 라는 생각을 가장 많이 했던 것같다.
하지만 지금은 테스트 코드를 작성 하다보니, 확실히 코드에 문제가 있더라도 어떤 부분에서 문제가 생겼는지, 빠르게 알아차릴 수 있고, 더 나아가 유지보수성이 많이 좋아진다고 느낀다. 돌아와서 “테스트 코드도 코드다.” 부분에서는 테스트 코드의 리펙토링의 중요성을 보여주고 있었다. 특히 이번 주도 저번 주에 공부 했던 @ParameterizedTest 와 @ValueSource 를 사용해서 단순히 파라미터의 값만 바뀌는 경우를 처리해 주려고 노력했고, 가독성이 좋은 테스트코드를 작성하기 위해 노력했는데, 아직 많이 어려운것 같아 꾸준한 연습이 필요할 것 같다.
[단위 테스트하기 어려운 코드를 단위 테스트하기]
이번에 Order라는 클래스를 생성하면서 createOrder 메서드를 테스트하려고 했는데 InputView.getOrder()와 printPreviewPhrase를 직접 호출 하고, 테스트 불가능한 정적 메서드 호출로 인해 단위 테스트가 쉽지않았었다.
리팩토링하여 createOrder 메서드가 외부 의존성을 직접적으로 호출하지 않게 되었고, 대신, createOrderItems 내에서 필요한 의존성을 주입받아 사용하도록 바꿨다. 입력 및 출력 동작은 InputView와 OutputView에 캡슐화되어 있고, 테스트에서는 이를 Mock으로 대체하여 특정 입력값과 출력값을 쉽게 테스트할 수 있게 바꿨다.
주문 생성 및 관련된 동작들이 각자의 클래스에 모듈화 했기 때문에, 특정 기능을 수정할 때 다른 부분에 영향을 미치지 않도록 하였고, 안전하게 변경할 수 있게 되었다. 특히, createOrderItems 메서드에서 OrderItem 클래스를 사용하여 주문 항목을 캡슐화 하면서 유닛 테스트가 더 쉬워질 수 있었다.
정적 메서드 사용을 최소화하고 의존성 주입을 통해 테스트 가능한 코드를 작성하는 중요성을 깨닫게 되었고, 코드의 신뢰성을 향상시키고 유지 보수를 용이하게 만들기 위해 코드를 작성할 때부터 테스트 가능성을 고려하는 것이 중요하다고 생각된다.
[클래스(객체)를 분리하는 연습]
저번주 미션에서도 클래스를 분리하여 비지니스 로직과 UI로직을 분리해서 코드를 작성했지만, 이번주는 더 작게 나누려고 노력해봤다 출력을 담당하는 OutputView 에서 주문 정보를 출력하는 OrderOutputPrinter와 할인 정보를 출력하는 DiscountOutputPrinter로 나누어 주었고, Order 클래스에서 메뉴 이름과, 수량을 담는 OrderItem 클래스도 나누려고 노력했다.
다른 클래스들도 최대한 단일 책임원칙에 맞게 분리하려고 노력했다. 클래스를 분리함으로써 각 클래스는 자체적인 역할을 수행하게 되어 응집도가 높아졌고, 각 클래스는 특정 기능이나 역할을 담당하므로 코드를 이해하고 유지보수하기가 훨씬 쉬워진것 같았다.
또 단위테스트를 작성하면서 각 클래스는 독립적으로 테스트할 수 있기 때문에 특정 기능에 대한 테스트 케이스를 간편하게 작성 할 수 있었다. 하지만 클래스를 분리하면 각 클래스 간의 의존성을 적절히 관리해야 할 것 같았다. 너무 많은 의존성이 발생하면 결합도가 높아져서 코드 변경이 어려워질 것 같고, 처음에 많은 시간이 소요 되서 많은 연습이 필요할 것 같다.
[프리코스 4주 후 느낀점]
프리코스를 진행하며, 내가 부족한 부분에 대해서 더 자세히 알게된 것 같다. 지금까지 개발을 공부 하면서 이런 온보딩 형식의 미션을 접할 기회가 많이 없어서 처음에는 어색하기도 하고, 어려움을 많이 느꼈지만 이제는 “이런식으로 공부하면 정말 빠르게 성장 할 수 있겠구나!” 라는 생각이 든다.
정말 재미있게 몰입할 수 있었고, 타 교육을 진행한 5개월 보다 많은 양을 배울 수 있었던 시간이었다고 확실히 알 수 있었다. 프리코스를 진행하면서 우테코 본 과정에서는 얼마나 많은걸 배울 수 있을까? 라는 생각과 함께 우테코에 대한 열망이 더 많이 생겼다.
이후 목표
- TDD의 가치를 더 깊이 이해하고, 새로운 기능을 추가하거나 기존 코드를 리팩토링할 때 테스트 코드를 우선 작성하도록 연습해야한다. 이를 통해 안정적이고 견고한 코드를 작성하는 습관을 들여야한다.
- 코드의 가독성과 유지보수성을 높이기 위해 꾸준한 노력을 기울여야한다. 가독성이 좋고 간결한 코드 작성을 위해 코드 리뷰와 연습 통해 더 많은 클린 코드 습관을 습득하고 적용해야 한다.
- 객체지향 프로그래밍의 원칙과 패턴에 대한 학습을 지속하고, 실제 프로젝트에서 이를 적용해보려고 한다. 클래스 설계와 객체 간의 관계를 더욱 효과적으로 다루기 위해 노력하여 코드의 유연성과 확장성을 향상 시켜야한다.
- 블로깅을 통해 지식을 공유하며 함께 성장하는 기회를 더욱 많이 찾아봐야한다. 다양한 의견, 경험을 공유하고, 다른 개발자들과 소통하며 성장의 기반을 다지려고한다.