주요글: 도커 시작하기
반응형

최근에 온라인 쇼핑 시스템을 구축하는 프로젝트를 시작했다. 쇼핑 시스템 자체는 솔루션을 약간 커스터마이징해서 사용할 예정이다. 이 시스템의 사용자는 다음의 요구 사항을 갖고 있다.

  • 현재 사용중인 ERP 시스템에서 쇼핑 시스템의 판매 정보(매출 등)도 함께 보고 싶음
  • 현재 사용중인 ERP 시스템의 재고와 쇼핑 시스템의 재고를 맞추고 싶음
  • 이 ERP 시스템은 외부에서 서비스로 제공
우리가 맡은 책임 중 하나는 쇼핑 시스템과 외부 ERP 시스템 사이의 연동을 처리하는 것이다. 이 프로젝트는 이제 막 시작되었으며 현재는 쇼핑 시스템의 디자인과 요구 사항을 정리하는 과정에 있다. 아직 쇼핑 시스템의 개발자가 본격 투입 전이고, ERP 시스템과의 연계 방식을 논의한 회의를 몇 차례 가졌다.

이 시점에서 우리는 무엇을 할 수 있을까? ERP 시스템과의 연동을 위한 논의만 했을 뿐, 아직 연동을 할 수 있는 시스템은 마련되지 않았다. 또한, 쇼핑 시스템과의 연계 방식은 논의조차 시작하지 못했다. 우리가 만들어야 할 (쇼핑 시스템과 외부 ERP 시스템 간의) 중계 기능의 구현을 시작하기에는 미결정 사항들이 (많이) 존재한다. 게다가 그 결정을 바로 할 수 있는 것도 아니다.

문제는 이 프로젝트의 일정이 녹녹치 않다는 데 있다. 만약 우리가 중계 기능을 제 때에 만들어내지 못하면, 우리 때문에 전체 일정이 밀리게 된다. 그런데, 구현을 위해 필요한 결정을 지금 바로 할 수 없는 처지이다. 그렇다면, 우리는 나중에 뒤에 가서 '그 때 외부 ERP 시스템 개발자와 쇼핑 시스템 개발자가 구현에 필요한 정보를 늦게 알려줘서 어쩔 수 없었다'라고 변경해야 하나? 이런 변명이 통한다면야 좋겠지만, 뒤에 가서 일정을 맞추느라 개!고생을 하게 될 것이다.

고수준 모듈과 저수준 모듈 구별하기

자! 그럼, 우리는 뻔히 보이는 고생을 그대로 받아들여야 하나? 답은 "아니오"이다. ERP 시스템과의 연동 API가 정해지지 않았어도, 아직 쇼핑몰 시스템의 개발자와 미팅을 할 수 없어도, 우리는 중계 기능의 일부를 미리 만들어 낼 수 있다. 우리가 만들 수 있는 영역은 바로 "고수준 모듈"과 관련된 코드이다.

소프트웨어는 고수준 모듈과 저수준 모듈로 구분할 수 있다. 고수준 모듈은 의미 있는 기능을 제공하는 모듈이며, 저수준 모듈은 고수준 모듈의 기능을 구현하기 위해 필요한 하위 기능의 실제 구현이 된다. 우리가 만들어볼 중계 기능의 일부를 예로 들면 고수준 모듈과 저수준 모듈은 아래와 같이 구분할 수 있다.


여기서, 우리가 저수준 모듈에서 할 수 있는 것이라곤 결과를 보관할 DB 테이블을 정하는 정도이다. 쇼핑 DB에서 데이터를 가져오는 방법도, ERP 서비스 제공 업체에 데이터를 넘기는 방법도 우리가 마음대로 할 수 없다. 하지만, 이런 저수준의 구현 상세함이 정해지지 않았다 하더라도 우리는 고수준의 기능을 구현할 수 있다. 비밀은 바로 DIP에 있다.


DIP를 적용해서 저수준 모듈 없이 고수준 모듈 구현하기


DIP는 Dependency Inversion Principle의 약자로, 이 원칙에 대한 설명은 본 글에서는 생략한다. 이에 대한 내용이 궁금한 독자는 http://en.wikipedia.org/wiki/Dependency_inversion_principle 글 또는 필자가 지은 '객체 지향과 디자인 패턴' 책을 참고하기 바란다.


DIP를 적용해서 저수준 모듈이 고수준 모듈에 의존하게 바꾸면, 저수준 모듈의 상세한 구현 없이도 고수준 모듈을 (어느 정도 수준까지) 만들어낼 수 있다. 아래 그림은 DIP를 적용한 결과를 보여주고 있다.



OrderInfoSync가 의존하는 타입은 모두 인터페이스이므로 Mock을 이용해서 얼마든지 다양한 시나리오의 테스트 코드를 만들 수 있다. 우리는 아래쪽에 붉은 색 상자안에 위치한 저수준 모듈 클래스의 구현이 존재하는지 여부에 상관없이 OrderInfoSync 클래스를 구현할 수 있다.


실제로 지금 이 방식으로 외부 연동을 위한 고수준 모듈의 코드를 한 줄 한 줄 만들어나가고 있다. 물론, 저수준 모듈의 구현없이 고수준 모듈을 완벽하게 구현할 순 없지만, 상당한 양의 구현을 사전에 미리 만들어 낼 수가 있다. 그리고 이 핵심에는 DIP가 있다!



+ Recent posts