본문 바로가기

생존신고 하기/위코드 프리온보딩

위코드 프리온보딩 백엔드 과정 - 회고 3주차 2회 (디어코퍼레이션)

개발요구사항

  • 요금 정책에 따라 요금을 계산해주는 API제작
  • 할인 조건
    ex. 사용자가 파킹존에서 반납하는 경우 요금의 30%를 할인해주며, 사용자가 마지막 이용으로부터 30분 이내에 다시 이용하면 기본요금을 면제해줍니다.
  • 그 외 여러 조건들...
  • 기능을 유지한 채로 새로운 할인이나 벌금 조건이 쉽게 추가될 수 있게 코드를 개선

개발과정

  • 과제분석을 통해 요금조건이 다양하고, 추가와 제거의 가능성이 많으며 조건의, 적용순서도 변경될 여지가 많다는 특징을 확인했다.
  • 고민을 거쳐 책임연쇄패턴이 가장 적합해보였기에 이를 적용하기로 했다.
    src/libs/costCalculator/ 폴더 내의 클래스 다이어그램
  1. CostChainBase는 Chain을 추상화한 인터페이스의 용도로 만들었다. 다만, 자바스크립트는 Duck Typing으로인해 인터페이스 개념이 존재하지 않으므로 어쩔 수 없이 클래스 상속을 이용했다.
  2. ConcreteChain클래스들은 CostChainBase를 상속하여 구체화된 클래스들이다. calculateCost 메소드를 통해 각자의 요금조건을 계산하고 goToNextChain을 통해 다음 체인으로 넘긴다.
  3. CostChainManager는 체인연결, 데이터 전처리 등 종합적으로 체인을 관리하는 클래스이다. addChain으로 체인을 추가하고 최종적으로는 이 클래스의 calculateCost 메소드를 호출하여 요금을 계산한다.
    CostChainBase 실제 코드CostChainManager 실제 코드

 

  • 추가적으로 다른 부분과의 의존성을 낮추기 위해, node.js의 index.js파일 모듈 기능을 이용해 독립적인 폴더로 구분하기로 했다./src/libs/costCalculator/index.js 파일의 내용실제 사용 예
  • const costCalculator = require('../libs/costChains'); let finalCost = await costCalculator.calculateCost(historyId);

 

  • 위와 같은 설계를 통해 요금조건의 추가, 삭제, 순서변경 등의 변화에 있어서 기존코드의 변경을 최소화 할 수 있었다.
  • SOLID원칙들 중 기능의 확장에는 열려있고 기존 코드의 변경에는 닫혀있는 Open-Closed 원칙을 만족할 수 있었습니다. SOLID의 일부 다른 원칙 또한 만족하는 것으로 보인다.

마치며

  • 이번엔 과제가 설계에 집중하는 걸로 보여서 상기한 패턴외에도 코드리뷰와 리팩토링을 통해 가독성 개선, 서비스 모듈의 책임분리 등의
    작업또한 진행했다.
  • 이제 2개의 과제만 남았으니 막판 스퍼트로 달려봐야겠다 :)