허술함을 가장한 애자일(느슨한 서비스)

서비스 개발자라면 한번쯤은 이런 생각을 해 봤을 겁니다. 페이스북은 그렇게 많은 사용자의 요청을 어떻게 처리할까? 알리바바는 광군제 하루에만 27조 이상의 매출이 나고 있는데 이런 미친듯한 주문 트렌젝션은 어떻게 처리할까? 위챗은 8억명의 Active 사용자가 있다고 하는데 이들 메시지는 어떻게 지체 없이 전달될까? 물론 다양한 분산 기술과 캐쉬, 수만 또는 수십만대 이상의 서버 등으로 처리를 하고 있겠지만 이런 기술적인 측면만으로는 설명하기 어려운 부분이 많이 있습니다. 예를 들어 아무리 분산 처리를 한다 하더라도 구매 주문이라면 재고 확인, 결재 계좌 확인, 배송지 주소 확인 등 다양한 처리가 필요하고 이들 처리 중 트렌젝션 락이 걸리게 되고, 이런 락으로 인해 아무리 많은 서버를 준비한다 하더라도 처리의 한계가 있을 것입니다. 이번글에서는 이런 대규모 트래픽을 처리하는 방법을 기술적인 측면이 아는 문화적인 측면에서 이야기 해보려고 합니다.

제 글을 계속 읽어오신 분들이라면 제가 북경에서 서비스를 개발하고 있다는 것을 다 아실 겁니다. 중국에 와서 경험한 것 중 한국 문화와 가장 차이가 많이 나는 부분은 “뭔가 허술해 보이는 데 문제없이 돌아 간다”는 것입니다. 제가 개발자이기 때문에 이런 문화의 차이가 서비스 개발에는 어떻게 나타나고 있는지도 유심히 살펴 보았습니다.

이번 글은 최근 한국에서 모 커머스 회사를 대상으로 발표한 내용을 글로 표현하였습니다. 발표 자료는 이 글을 참고하세요. 이 발표 자료의 내용을 시리즈 글로 연재를 해볼까 합니다.

이상한 자판기

제가 일하는 북경 오피스의 휴게실에는 사진과 같은 자판기가 하나 놓여 있습니다.

vending_machine

자판기라고 하기에는 뭔가 좀 이상해 보이지 않나요? 잠금 장치도 없고, 지불을 위한 동전이나 지폐를 넣는 투입구나 카드 결재 장치도 없습니다. 이 자판기에서 물건을 구매하는 순서는 다음과 같습니다.

  1. 위챗에서 자판기(?) 상단에 있는 QR 코드를 스캔한다.
  2. 위챗에 자판기 내에 진열된 상품 목록이 나타난다.
  3. 구매하고자 하는 제품을 선택한다.
  4. 위챗 페이로 비용을 지불한다.
  5. 자판기(?) 문을 열고 자신이 지불한 상품을 꺼낸다.
  6. 마신다.

이런 프로세스를 설명하면 많은 한국 개발자 또는 한국 회사를 다니는 사람은 이런 질문을 합니다.

잠금 장치가 없는데 지불을 하지 않고 그냥 꺼내 마시면 어떻게 해요?

아무런 상관이 없습니다. CCTV가 있거나 별도의 센서가 있는 것이 아니기 때문에 지불 없이 그냥 사용해도 무방합니다. 그래서 자판기라기 보다 그냥 업소용 냉장고에 QR 코드 스트지에 출력에서 붙여 놓은 장비입니다.

왜 이렇게 말도 안되는 자판기가 등장하게 되었을까요? 전통적인 자판기의 경우 잠금장치, 동전/지폐 투입구, 거스름돈 처리 등으로 인해 제작 비용도 위의 단순한 냉장고에 비해 몇배 이상 비쌉니다. 또한 판매 가능한 제품도 정해진 몇가지 종류만 가능합니다. 반대로 위의 자판기는 흔히 볼수 있는 업소용 냉장고로 제작 비용이 아주 저렴합니다. 그리고 판매할 수 있는 제품도 과일부터, 병음료까지 다양하게 판매 가능합니다.

즉, 지불하지 않고 훔쳐가는 금액이 비싼 자판기 제조 비용보다 많지 않으면 일반 자판기를 도입하는 것에 비해 수익이 더 많다는 단순한 논리가 성립됩니다. 이것은 비즈니스의 가장 기본이라고 할 수 있습니다.

이익이 더 많은 방식으로 판매한다.

물론 어떤 장소는 훔쳐가는 금액이 아주 클 수 있을 것입니다. 이것은 자판기 서비스를 운영하면서 그런 장소는 자판기를 수거하면 그만입니다. 하지만 대부분 사무실이나 건물 내에 위치하고 있기 때문에 그런 경우는 많지 않을 것으로 예상이 됩니다.

같은 듯 다른 공유 자전거

또 하나 재미 있는 비즈니스 경험이 있었습니다. 최근 한국이나 다른 국가에서도 많이 도입하고 있는 중국의 공유 자전거 입니다. 저도 매일 출퇴근 시에 이용하고 있는 아주 유용한 서비스입니다. 더군다나 북경은 인위적으로 만든 도로를 제외하면 거의 언덕이 없고 대부분의 도로에 분리된 이륜차 도로가 별도로 있기 때문에 이런 자전거 서비스를 운영하기 가장 적합한 도시가 아닐까 생각합니다.

공유 자전거는 제가 북경에서 근무를 시작하기 바로 직전에 2016년 하반기 부터 도입되기 시작했는데 처음에는 두개 업체만 있다가 2017년에는 여러 업체들이 새로 나타나기 시작했습니다. 중국에서 많은 서비스들은 소비자들이 쉽게 서비스를 구분할 수 있도록 색깔을 많이 사용하는데 자전거도 서비스 마다 고유의 색깔을 가지고 있었습니다. 가장 먼저 시작한 두 업체가 빨간(실제로는 주황), 노란색이었고, 이후 후발 업체들이 다른 색깔을 선택했습니다. 심지어 나중에는 무지개색 자전거까지 나왔으니 많은 새로운 업체들이 출현했다는 것을 알 수 있습니다. 2018년 봄 현재 시점에서 결과를 보면 2개 업체만 살아 남은 상태입니다[1].

살아 남은 두개 업체는 공유 자전거 서비스를 성공 시킨 최초의 서비스 사업자들이라고 할 수 있는데 모바이크(Mobike)와 오포(Ofo) 입니다. 아래 사진에서 주황색이 모바이크이고 노란색이 오포 자전거입니다. 아래 사진은 필자가 집앞 지하철 역의 풍경을 직접 찍은 사진입니다. 몇백 미터를 양쪽으로 두 서비스 업체의 자전거가 배치되어 있습니다. 직접 보지 않으면 어느 정도인지 감이 잘 오지 않으실 겁니다.

mobike_ofo

이 두 업체는 자전거 공유 서비스를 하고 있지만 자세히 보면 다른 프로세스를 갖추고 있습니다.

모바이크 오포
1. 모바이크 앱 또는 위챗에서 자전거에 부착되어 있는 QR 코드를 스캔한다.

2. 자동으로 잠금 장치가 열린다.

3. 자전거를 사용한다.

4. 사용이 끝나면 아무 곳에나 자전거를 세우고 잠금 장치를 잠근다.

5. 앱에서는 자동으로 주행 완료가 되고 과금 결재가 자동으로 처리된다.

1. 오포 앱 또는 위챗에서 자전거에 부착되어 있는 QR 코드를 스캔한다.

2. 앱에 자전거의 비밀번호 4자리가 표시된다.

3. 비밀번호를 입력하여 잠금 장치를 해제한다.

4. 자전거를 이용한다.

5. 사용이 끝나면 아무 곳에나 자전거를 세우고 잠금 장치를 잠근다.

6. 앱에서 “사용 종료” 버튼을 클릭한다.

7. 과금 결재가 자동으로 처리된다.

모바이크는 아주 깔끔하고 단순하면서 확실한 프로세스를 가지고 있습니다. 반면 오포는 아주 허술하고 빈틈이 많은 프로세스입니다. 예를 들어 5번의 잠금 장치를 닫는 것을 하지 않고 6번 “사용 종료” 버튼을 클릭해도 알지 못합니다. 이 헛점을 이용해서 일부 사용자는 잠금 장치를 닫지 않고 계속 재 사용하는 경우도 있습니다. 그리고 여러 자전거 중에 한두대는 항상 잠금 장치가 안된 상태인 경우가 많기 때문에 그냥 타는 경우도 많습니다.  이런 헛점을 이용하면 한명만 오포에 가입하고 친구들은 가입하지 않아도 여러대를 동시에 탈 수 있습니다.

이렇게 헛점 투성인 서비스가 어떻게 살아 남을 수 있었고 심지어는 1위 사업자를 위협하고 있을까요?

다음 챠트는 1위 사업자인 모바이크와 오포의 월별 사용자 현황에 대한 지표입니다. 이 지표에 보면 2017년 초반에 오프가 극적으로 모바이크를 따라 잡는 것을 볼 수 있습니다.

mobike_ofo2

오프는 어떻게 모바이크를 따라 잡을 수 있었을까요? 앞에 설명한 프로세스의 헛점이 시장 점유율을 따라 잡는데 많은 공헌을 했다고 생각합니다.

  • 오포의 이런 프로세스 헛점이 모바이크에 비해 자전거 제작 비용이 훨씬 적다.
  • 공유 자전거 서비스을 사용하기 위해서는 보증금을 넣어야 하는데 대략 자전거 한대 가격에 해당한다. 모바이크의 경우 300위완(약 51,000원)이고 오포의 경우 100위완(17,000원)으로 1/3 가격이다.
  • 이렇게 사용자 가입의 진입 장벽이 낮고, 서비스의 허술함 때문에 초기에 사용자가 급격하게 늘었을 것이다.
  • 이 시기에 거리에는 온통 노란색의 향연이었는데 대당 자전거 제작 비용이 싸기 때문에 엄청난 물량 공세가 가능했다. 실제 2017년 초기에 모바이크는 사람이 많이 다니는 지점에서만 볼 수 있었지만 오포 자전거는 왠만한 곳에서 다 볼 수 있었다.

즉, 오프가 많은 공유 자전거 업체 속에서 살아 남고, 1위 사업자인 모바이크와 시장 점유율에서 비슷한 위치를 점유하고 있는 것도 허술함을 유지하면서 자신만의 강점을 전면에 내세운 덕분이 아닐까 생각해 봤습니다.

그렇다면 우리는?

앞에서 설명한 휴게실에 설치된 자판기나 오포와 같은 프로세스를 가지고 있는 서비스를 한국에서 출시할 수 있을까요? 제 생각에는 아주 어려울 것이라는 겁니다. 첫번째는 서비스 기획자가 이렇게 허술한 서비스 프로세스를 만들지 않을 것이며, 이런 서비스 프로세스를 만든다 하더라도 경영진으로 의사 결정이 올라가면서 “말도 안되는 이런 서비스를 어떻게 출시하냐” 라는 핀잔과 질책을 들을 가능성이 많기 때문입니다.

모바이크오 오포의 사례에서 볼 수 있듯이 좋은 프로세스를 만들어서 서비스를 할 수 도 있지만 느슨하면서 허술한 프로세스로 얼마든지 서비스를 만들 수 있으며 시장을 차지할 수 있다는 것입니다. 이런 느슨한 서비스를 출시할 수 있는 것과 없는 것이 제가 느낀 한국과 중국과의 비즈니스의 가장 큰 문화적인 차이였습니다.

서비스 개발도 허술하게

제가 몸담고 있는 소프트웨어 개발에 이런 내용을 대입해 보겠습니다.  글의 서론에서 화두로 던진 몇억 이상의 사용자를 위한 서비스를 어떻게 만들 수 있을까? 에 대한 답변도 “허술함”에 있었습니다. 제가 지금까지 만든 많은 기능들도 아주 빡빡하게 움직이도록 만들어 졌던 것 같습니다. 예를 들어 주문의 경우 다음과 같은 절차들이 있습니다.

  1. 사용자가 주문 요청
  2. 해당 제품의 재고 확인
  3. 주문 마스터, 상세 테이블에 저장
  4. 결재 정보 저장
  5. 택배 배송 정보 요청

이 전체 프로세스를 하나의 트렌젝션으로 묶고 하나라도 문제가 발생하면 주문 요청을 실패하는 방식으로 만들어 왔습니다. 이렇게 하면 트렌젝션이 길어져 동시에 많은 양을 요청을 처리할 수 없게 됩니다. 결재 처리와 택배 배송은 다른 서비스와도 연결되어야 하기 때문에 더 많은 시간이 소요되고, 서비스 인터페이스도 실패할 가능성이 많습니다. 이런 상황에서 이런 프로세스 전체를 하나의 트렌젝션으로 묶는다는 것 자체가 말도 안된다고 할 수 있습니다.

직접 서비스 구성을 보지는 못했지만 중국내의 많은 서비스들은 이런 상황에서 핵심 업무에 대한 처리만 집중하고 다른 부가적인 기능에 대해서는 비동기 처리를 선호하고 있는 것 같았습니다. 그리고 그런 비동기 처리를 프로그램으로 아주 깔끔하게 처리하지 않고 앞의 자판기 서비스와 같이 뭔가 허술하지만 돌아가게 구성이 되어 있는 느낌을 많이 받았습니다.

최근의 서비스는 서비스 내에서 처리하지 않고 다른 회사의 서비스와 연동되는 경우도 많이 있습니다. 중국의 최대 쇼핑 시즌인 11/11일 광군제에서는 택배 처리를 매 건마나 호출하면 처리할 수  없을 것입니다. 이런 경우 시간단위로 모아서 전송한다든지 택배 처리 결과도 시간 마다 받아서 처리하는 등의 작업이 일상적이라고 할 수 있습니다. 이런 상황이 특정일 하루만을 위한 기능이 아니라 상시도 운영되고 있습니다. “개발자가 바라본 중국 쇼핑 축제 광군제” 글에서 이런 분위기를 잘 전달하고 있습니다.

또 다른 예는 필자가 만들고 있는 서비스에서 실제 있던 사례로 알리바바 그룹에서 운영하고 있는 중국내 최대 지불 서비스인 알리페이와의 연동 관련 시스템입니다. 알리바바 그룹에서 운영하는 온라인 커머스 사이트인 티몰 에서 알리페이로 지불이 발생하면 티몰의 판매 레코드와 알리페이의 지불 레코드를 받아 정산하는 시스템입니다. 같은 알리바바 그룹 서비스이지만 운영 주체가 다르기 때문에 서로 다른 API로 데이터를 가져와 정산 작업을 해야 합니다.

상식적으로 온라인 판매에서 지불된 지불 레코드에는 당연히 “주문번호”가 있고 이 키를 이용하여 정산 프로그램을 만들 것입니다. 다음 그림은 알리페이에서 제공하는 데이터에서 주문번호가 저장된 필드입니다. 보시는 것처럼 필드명은 “memo” 이고, 주문번호라고 생각되는 값도 다양한 패턴으로 존재하는 것을 알 수 있습니다.

alipay_interface

자세히 보시면 어떤 방식으로든 메모의 내용에서 주문번호를 가져 올 수는 있게 되어 있습니다. 같은 패턴으로 다른 형태의 번호가 나타나지는 않는다는 겁니다. 왜 이런 방식으로 처리를 했을까요? 추측해보면, 사업의 전개 속도가 잘 짜여진 프로그램을 만들때 까지 기다려 주지 않기 때문일 가능성이 많습니다. 이런 상황에서 이 서비스를 만드는 개발자도 사업의 속도를 따라가면서도 주문번호를 제공해야 한다는 가장 기본적인 요건만 만족시켰던 것이라고 봅니다. 이것이 이들의 비즈니스 전개 방식이라고 볼 수 있습니다.

개발자가 할 수 없는 것!

이런 방식으로 서비스를 구성하게 되면 일부 데이터는 맞지 않는 경우도 있고, 처리하지 못하는 고객의 요청도 있습니다. 제가 이런 강연을 하면 항상 나오는 질문이 있습니다. 이렇게 놓치거나 문제가 있는 데이터에 대한 책임은 누가 지는가? 이것은 개발자가 고민할 필요가 없는 부분이라고 생각합니다. 이것은 비즈니스 의사 결정의 문제이지 서비스 개발의 문제가 아닌 것입니다.

비즈니스 의사 결정자가 우리 서비스는 대략 이 정도의 사용자의 요청을 처리해야 한다고 하면 서비스 개발팀은 그런 요청을 처리하기 위해서는 이 정도의 오류는 감수해야 합니다. 라고 피드백이 전달되어야 합니다. 그리고 비즈니스 의사 결정자는 이런 의견을 잘 듣고 거기에 맞는 전략을 만들어야 하고요.

한국의 많은 서비스들이 아주 견고하게 만들어지는 반면 유연하지 않은 것은 이런 토론 과정이 부족하기 때문이라고 생각합니다. “많은 요청을 처리하면서 100% 처리가 보장되고, 비용이 많이 들지 않는” 그런 서비스를 만들지 못한다고 말하는 것이 개발팀이 무능력하다고 생각하는 경영진이 많기 때문입니다. 개발팀 스스로도 그렇게 생각하고 있을지도 모릅니다.

비즈니스 결정에 대한 역할과 서비스를 개발하는  역할이 원활하게 토론하고 현재 조직의 한계를 알고 의사 결정을 하는 것이 자연스럽게 되어야만 이런 느슨한 서비스를 개발하는 것이 가능할 것입니다. 그래서 이글도 개발자들에게 많이 읽기보다(이미 개발자는 알고 있습니다) 비즈니스 의사 결정권자, 즉 사장님들이 많이 읽었으면 하는 바램니다. 공유 많이 부탁 드립니다. 그래야 조금이나마 그 분들도 볼 수 있지 않을까요?

글을 마치며

이 글에서 설명한 이런 느슨함과 빡빡함과 같은 문화의 차이가 실제 서비스 개발에 어떻게 나타나고 있는지를 체험해보니 왜 한국에서의 서비스 개발이 이렇게 팍팍하고, 한국 서비스가 글로벌로 도전하기 어려운지를 새삼 깨닫게 되었습니다. 흔히 말하는 레가시 시스템 또는 서비스의 경우 많은 사용자들이 중요 활동으로 사용하고 있기 때문에 어느 정도는 견고함 속에서 운영되어야 할 것입니다. 하지만 신규로 비즈니스를 만들어 가는 과정에서는 이제는 다르게 접근을 해야 하지 않을까요?

금방 지나간 중국에서의 1년 이지만 많은 새로운 경험과 새로운 시야를 갖게된 시간이었습니다. 이런 경험을 기반으로 중국내에 SaaS 서비스를 조만간 오픈할 예정에 있습니다. 서비스의 성공과 실패를 떠나 서비스를 오픈할 수 있다는 자체에 감사할 따름입니다.

기술적인 부분에 대한 내용들은 다음 글에서 소개하도록 하겠습니다.

[1]: 블루고고(Bluegogo)는 2017년 하반기에 회사를 더 이상 운영할 수 없는 상태가 되었다가 최근 중국의 차량 공유 서비스 회사인 디디추싱(滴滴出行)이 인수하면서 2018년 봄에는 3개 색깔의 자전거를 거리에서 볼 수 있습니다.