띵동은 고객들이 원하는 것들을 모바일 앱으로 주문할 수 있는 온디맨드 딜리버리 서비스 입니다. 고객이 주문을 하면, 띵동의 메신저들은 음식/물건들을 픽업하고, 최종 목적지까지 배달을 완료합니다. 음식 영역 뿐만 아니라 생활에 필요한 다양한 생활편의 서비스들을 주문할 수 있습니다. 띵동 서비스를 제공하는 허니비즈라는 회사는 2012년에 창업을 하였고, 현재까지 꾸준히 서비스를 제공하고 있습니다. 많은 회사들이 그러하듯, 회사가 오랜기간 성장을 하며, 기술적인 부분에서의 발전이 좀 더 필요했고, 2018년 여름부터 띵동 서비스 미래를 위한 새로운 시스템, 더욱 탄탄한 개발 조직을 만들기 시작했습니다.
280개 이상의 테이블 중에, 30% 테이블은 legacy로 남아있었습니다.
지속적으로 발전하는 시스템을 만들기 위해서는 다음과 같은 과제들이 있었습니다.
데이터베이스 성능 Bottleneck 여러개의 서버가 1개의 데이터베이스를 바라보는 구조를 가지고 있어, 고객 사용량이 피크치는 시간대(점심, 저녁)에 모든 서버가 속도에 영향을 받고 있었습니다. 물론 이 데이터베이스의 성능을 최대치로 끌어올려 문제를 해결할 수도 있겠지만, 향후 지역 확장을 위한 방향에 있어서, 최고의 방법은 아니었습니다.
고객의 요구에 맞춰 변화하는 비즈니스 로직 처음 이 비즈니스가 시스템으로 구성될 때에는 출발지와 도착지가 있는 심플한 주문의 형태를 띠고 있었습니다. 그래서 퀵 배달 서비스들이 쓰던 솔루션으로 주문을 처리할 수 있는 상태였습니다. 하지만 시간이 지남에 따라서, 고객의 다양한 주문들 — 사다주기, 편의점 배달, 하우스 헬퍼, 가구 옮기기 등 — 이 새로 만들어지고 있었고, 이를 시스템에서 처리하기 위해, 기존의 주문 구조와 형태(음식점, 상품)를 조금씩 변형해서 일이 처리되고 있었습니다. 하지만 이런 주문 뿐만 아니라, 외부 O2O 주문, 지역 배달대행 주문등 더 다양한 형태들, 이러한 주문들에 대한 정산 처리등 확장 가능한 유연한 형태의 설계가 필요했습니다.
레거시 코드, 조금은 오래된 프레임워크 위에서 언급했듯이, 시스템은 1개의 데이터베이스에 여러개의 서버가 바라보고 있는 형태였습니다. 이러한 서버들은 각 클라이언트들(고객 앱, 라이더 앱, 음식점 앱등)을 대응하기 위해 만들어져 있었고, 각 서버에는 중복된 비즈니스 로직, 코드들이 존재하여 유지보수를 하려면 모든 서버를 동시에 수정해야되는 상태였습니다. 예를 들어, 라이더의 정산 수수료를 계산하는 로직을 바꾸려면, 개발자는 고객 앱, 라이더 앱등 여러곳의 서버를 찾아봤어야 했습니다. 또한 2009년쯤 만들어진 Spring 3로 서버들이 구성되어 있어, 이를 유지보수하기 위한 개발자들을 찾기도 어려웠고, 육성하기도 어려웠습니다.
생각보다 많은 제품군, 하지만 적은 수의 개발자 외부에서 보이는 것과 달리, 내부에는 10개 이상의 프로젝트들(고객 앱, 음식점 앱, POS, Web, 라이더 앱, TMS 어드민 등)이 있습니다. 각각의 프로젝트들은 서로 다른 프로그래밍 언어, 프레임워크들로 만들어져 있어(Spring3, Java, Objective-C, jQuery, Delphi, PHP, Mysql 등등) 각 언어 및 프레임워크를 다룰 수 있는 많은 수의 개발자들을 고용해야 했습니다.
많은 과제들을 한번에 풀 수는 없다고 판단했으며, 가장 첫번째는 팀과 아키텍처에 집중하였습니다.
사람은 소프트웨어를 만들고, 소프트웨어는 비즈니스 문제를 해결하는데, 좋은 아키텍처는 이것들을 더 쉽게 만듭니다.
먼저는 개발팀의 프로그래밍 언어를 JavaScript로 통일 했습니다. 현재의 JavaScript는 과거에 단순 웹을 꾸미는 수준에서, 백엔드를 위한 서버, 탄탄한 구조의 웹 프레임워크, 네이티브 수준의 모바일 개발까지 서비스의 모든 부분을 커버할 수 있는 수준으로 발전했습니다. 또한 다음과 같은 장점들에 집중했습니다.
프로그래밍 언어의 통일성으로, 백엔드 및 프론트엔드 모든 개발자들이 같이 협력할 수 있습니다.
백엔드의 코드가 웹에서도 활용할 수 있고, 더 나아가 모바일까지 코드 재사용이 가능합니다.
최근 다양한 교육 기관, 코스들과 함께 개발자를 채용하기가 더 수월합니다.
백엔드에서는 Express Framework가 가장 유명하고, 서비스에서 원하는 부분들을 폭넓게 지원하기 때문에 보편적이지만, 성능 측면에서는 단점을 가지고 있다고 판단하여, Fastify framework(fastify.io)를 백엔드 기본 프레임워크로 선택하였습니다. Fastify 에서 수행한 벤치마크를 보면 다른 프레임워크들 보다 오버헤드가 적어 훨씬 좋은 성능을 보여줍니다.(https://www.fastify.io/benchmarks/)
프론트엔드중 웹 분야에서는 React를 기본 프레임워크로 사용합니다. 최근에 React의 생태계가 점점 더 커지며, 관련 자료도 풍부할 뿐만 아니라, 웹 개발의 최신 흐름을 따라가려 했습니다.
모바일 개발에 있어서는, 안드로이드는 Java로, iOS는 Swift로 네이티브 개발을 하는게 가장 좋습니다. 하지만 우리는 제품군이 많고, 각각의 개발자들을 모두 채용하여 유지보수 및 발전을 하기 어려웠습니다. 그래서 React Native를 기반으로, iOS, Android 각 플랫폼의 기능 개발을 좀 더 효율화 내려고 하였습니다. 또한 React를 사용하는 웹 개발자들과 함께 지식을 공유하며 좋은 코드 테크닉등을 교류하고 있습니다.
비즈니스 도메인 영역에 있어서, 띵동은 정말 많은 도메인들을 가지고 있습니다. 고객, 음식점, 라이더, 정산, 센터 등 많은 도메인들을 한번에 이해하고 시스템으로 결합하는게 쉽지는 않았습니다. 그래서 이러한 도메인들을 Bounded Context Strategy(Martin Fowler’s Bounded Context)로 최대한 분리하고, 이를 Microservice Architecture(Martin Fowler’s Microservices)로 구현하려고 노력하였습니다.
인프라와 데이터베이스에서는, Node.js를 활용하는 서비스라면 하나의 데이터베이스와, 하나의 서버, 그리고 인스턴스를 관리하는 PM2로 구현하는게 가장 심플한 구조입니다. 하지만 트래픽의 변화로 인프라를 Scale-out 해야될때 쉽지 않았으며, 특히나 Microservice Architecture 구현에서는 적합한 구조가 아니었습니다. 최대한 인프라 관리에 대한 노력을 최소화 하고, 쉽게 Scale-out 할 수 있는 구조를 만들기 위해 많은 리서치를 하였고, 최종적으로는 Amazon ECS (https://aws.amazon.com/ecs) 기반으로 인프라를 구성하고, 직접 인스턴스위에 데이터베이스를 돌리기 보다는, MongoDB Atlas (https://www.mongodb.com/cloud/atlas) 로 구성하여, 노력을 덜 들이고 쉽게 확장할 수 있는 구조로 구성하였습니다.
팀 구성 및 관리 관점에 있어서 가장 먼저 해야되는 것은 팀의 목표를 설정하는 일입니다. 이것은 비전이 될 수도 있고, 미션이 될 수도 있습니다. 어떤 것이든 개발팀이 가야할 길을 명확히 가리키는 North Star가 필요했습니다.
편리함 — 이 키워드는 가장 기본적인 사람의 욕구입니다. 과거부터 사람들은 도움을 받으려고 했고, 또한 도움을 주려고 합니다. 이러한 2가지 사람의 기본 니즈를 연결하는 것이 우리 비즈니스의 가장 중요한 핵심이고, 우리는 이 연결을 기술로 계속 발전시키고 혁신하려고 합니다.
스포츠에서는 “팀보다 위대한 선수는 없다.”라는 말이 있습니다. 우리는 소프트웨어 개발팀도 스포츠팀 처럼 생각합니다. 다른 팀을 이기기 위해서(비즈니스에서 앞서가기 위해서)는 팀 안의 개인들은 각각의 역할이 있고, 팀워크를 바탕으로, 서로 노력을 합쳐서 이겨야 합니다. 각 개인에 있어서는 책임이 가장 중요합니다. 단순히 사무실에 앉아서 의미없이 시간을 오래 보내는것은 의미 없습니다. 예를들어, 눈 비가 오는 날에 출퇴근 시간 걱정할 바에는, 원격근무로 바로 집에서 노트북을 키고 일을 하는게 더 좋습니다. 회사는 개인이 일에 집중할 수 있도록, 어려운거, 집중을 방해하는 것들을 제거해주며, 생산성 높은 환경을 조성해주어야 합니다. 팀 관점에서는 공통의 문제를 해결하기 위해서 서로를 위해 헌신하며, North Star를 향해 함께 앞으로 나아가야 합니다.
우리는 비즈니스 리그에서 우승하기 위한 시작단계에 있습니다. 팀원들을 모으고, 팀에 대한 미션을 설정하고, 미션을 수행하며, 더 넓은 지역에서 (지금)보다 많은 고객들을 만나기 위해 확장해야 합니다. 최고의 기술을 가진 팀이 만든 제품을 통해 제공되는 최고의 서비스는 우리네 삶을 더 편리하게 만들거라 믿습니다.