우아한테크코스 프리코스 2주, 3주차 통합 회고

엄강우·2022년 11월 16일

OPP 그리고 TDD

사실 프론트엔드라는 이유로 그리고 React를 이용하고 함수컴포넌트를 주로 사용한다고 해서 OOP에 대해 깊게 알려고 하지 않았던 것 같습니다. 그러다보니 Class객체에 대해서도 잘 모르고 this도 마찬가지로 잘 모르고 있었습니다.
이번 회고는 잘 알지 못했던 객체 그리고 OOP 그리고 잘짜여진 TEST CASE가 얼마나 프로그래밍하는데 많은 시간을 절약시켜주는지에 대해 조금 이야기 해볼까 합니다.

OOP

객체지향설계에 관해서는 따로 이야기 하지 않겠습니다. 그저 제 나름대로 짠 코드가 어떤 면에서 OOP스럽지 않았는지와 어떻게 개선하면 좋을지를 설명해 보겠습니다.

기능 목표

  • 로또를 사고
  • 당첨 번호를 입력하고
  • 로또의 결과를 프린트 하는 것

간단하게 설명하면 다음과 같습니다.

그럼 제가 만든 객체에 대해 설명하겠습니다.

  • Lotto : 당첨 번호를 입력 받아 생기는 객체이고 보너스 번호와 내가 산 로또 번호들을 가지고 결과창 까지 출력할 수 있는 객체입니다.
  • LottoMachine : 로또 구매 금액을 입력받고 자동으로 로또를 발행하여 출력할 수 있는 객체입니다.
  • LottoBonus : 보너스 번호를 입력 받는 객체 입니다.
  • Validation : 각 입력에 따른 유효성 검사를 할 수 있는 객체이며 모두 static 메서드로 구성되어 있습니다.

그럼 무엇이 문제엿을까?
일단 Lotto 클래스가 너무 많은 짐을 지고 있습니다.

  • 당첨 번호 가지고 당첨 유무 확인
  • 당첨 유무를 통해 수익률 계산
  • 그리고 프린트 까지

어떻게 개선 할 수 있을까?

  • Print를 할 수 있는 다른 객체를 만들자.
  • 당첨 유무와 수익률 계산할 수 있는 객체도 만들자.

이런식으로 개선을 하면 점점 클래스의 크기가 줄어들면서 각각의 클래스가 단일화된 일을 할 수 있게 됩니다.

그리고 객체에 상태를 저장한다면 그 상태를 적절히 이용하는 로직 또한 포함되어야한다. 상태를 get 혹은 set하기만 하는 객체는 의미없다. 이 부분을 잊지 말아야 할 것 같습니다.

TDD

코스 특성상 0점 방지를 위해 미리 테스트 코드를 제공해 주십니다. 프로그래밍 속도향상에 엄청나게 도움이 되고 있습니다.
기존에는 코딩 -> 테스트 통과 -> 리팩토링 이라는 과정이 이해가 잘 안되었습니다.
그럼 왜 저 일련의 과정이 코드를 빠르게 짜는데 도움을 주는지에 대해 저의 경험을 조금 넣어서 말해보겠습니다.

일단 저는 테스트코드를 받으면 하드코딩으로 테스트를 통과 시킵니다. 그러면 일단 즐거워요. 왜냐면 테스트를 통과 했거든요. 누구나 테스트가 통과하면 즐겁지 않습니까?
그 다음은 리팩토링입니다. 리팩토링은 어떻게 할까요? 요구사항을 크게 나누어서 시작합니다. 그럼 리팩토링을 하는 과정을 한번 살펴봅시다.
리팩토링을 한다고 하면 이제 어떤 객체의 구현이 들어가게 됩니다. 그러면 큼지막한 객체를 만들어서 통과를 시킵니다. 그럼 우리는 이 객체가 테스트 통과한다는걸 알았으니 이 객체를 나누어 봅니다. 사실 테스트가 통과한다는 믿음이 있으면 모든 일련의 과정이 쉽게 느껴집니다. 혹시라도 리팩토링 과정에서 실패한다면 우리에게는 ctrl + z가 있으니 다시 돌아와서 새로 시작하면 그만입니다.

어떤가요? 저의 마음이 혹시 느껴지셨나 모르겠습니다. 물론 저의 방법이 맞다는 것을 주장하기 위함은 아닙니다. 더 잘 사용할 수 있는 방법이 있을 수도 있습니다. 하지만 TDD라는 것이 도움이 된다는 것을 느낄 수 있다는 것에 만족합니다.

짧은 후기

최근에 공부에 대한 회의감을 느끼고 있었습니다. 막상 공부는 하지만 쓸데가 없었거든요. 그리고 공부를 해도 성장하는 느낌이 없었습니다.
요즘은 너무 재밌습니다. 제가 기존에 공부해 왔던 것이 부질 없던 것이 아니었음을 느끼는 것 또한 너무 가슴 벅찬일입니다. 이 글을 보시는 취업준비생 누구라도 꼭 우아한 테크코스를 경험해 보시길 권장합니다.

profile
안녕하세요 프론트엔드 개발자를 꿈꾸는 엄강우입니다.

0개의 댓글