메뉴

문서정보

Shopify System Design 분석

오늘 분석할 대상은 Shopify다. 아래 동영상을 기준으로 분석한다.

목차

Shopify에 대해서

쇼피파이는 캐나다의 다국적 기업으로 이커머스 사업자를 위한 Payment, 마케팅, 배송, 고객관리도구를 포함한 일련의 서비스를 제공하는 플랫폼 회사다. 이커머스를 위한 모든 기능을 제공하기 때문에, 사업자는 신속하게 이커머스 비즈니스를 실행 할 수 있다. 이 기능에는 사이트 빌더도 포함하고 있는데, 코딩이나 디자인 기술이 없더라도 위지위그(WYSIWYG) 방식으로 이커머스 웹 사이트를 만들 수 있다. 코딩, 디자인 능력이 없어도 간단하게 웹 사이트를 만들 수 있는 워드프레스를 생각하면 된다.

2021년 현재 175개국에서 1,700,000개 이상의 이커머스 비즈니스가 쇼피파이 플랫픔을 사용하고 있다. 2021년 현재 쇼피파이의 시가총액은 1934.56억으로 캐나다에서 가장 큰 뮤모를 자랑하고 있다. 2020년 한해 동안의 총수익은 29억 2900만 달러에 달했다.

Shopify의 역사

Shopify 분석 작업에 대해서

우리는 Shopify 서비스를 분석 할 것이다. 이커머스는 프론트 앤드, 백앤드, Payment, 주문, 배송, 상품(Products), 구매자, 사업자(몰 운영자), CRM, BI, 각 종 백오피스, 데이터베이스, 미디어처리, 메시지 처리, API를 포함한 매우 복잡한 시스템이다. 이러한 복잡한 시스템이 어떻게 구성되는지를 살펴보는 것은 엔지니어에게는 매우 흥미로운 과제가 될 것이다. 특히 나는 이커머스 업계에서 일을 하고 있기 때문에, 이러한 시스템을 분석하는 것은 시스템 개발에 큰 도움이 될 거라 생각한다.

핵심 키워드

Shopify와 같은 이커머스는 매우 거대한 시스템이다. 분석의 넓이 깊이 모두 한계가 있을 수 밖에 없으므로, 핵심 키워드를 선정하여서, 키워드 위주로 분석하려 한다. Shopify는 "쇼핑몰을 운영하는 사업자", "소핑몰로 부터 상품을 구매하는 구매자", 2개 타입의 유저가 있다. 구매자는 "고객", 사업자는 "점주(owner)"로 부를 것이다. 고객, 프러덕트, 주문, Payment, 점주는 커머스를 위한 일반적인 것들이니 "격리, Plugin, Store Front/Backend, API" 이 부분에 대해서 간단히 살펴보자.

Shopify의 1차 고객은 "점주"이므로 시스템을 구성 할 때 점주는 어떤 성향을 가지며(페르소나), 그들이 원하는 것을 이뤄주기 위해서 어떤 기능이 필요할지 예상을 해야한다.

Shopify 혹은 이와 유사한 플랫폼을 이용해서 온라인 비즈니스를 하려는 사람들은 이커머스에 대한 최소한의 배경지식들을 가지고 있을 것이다. 어떤 사람들은 디지털에 대한 지식도 함께 가지고 있는 반면 어떤 사람은 커머스에 대한 배경지식을 가지는 정도의 차이정도는 있을 것이다.

이들 점주는 오라인 상에서 다른 상점과 가능한 격리된 나만의 상점을 만들고 싶어 할 것이다. 격리(Isolation)는 기술 뿐만 아니라 점주의 입장에서도 필요한 비즈니스 기능이 될 수 있는데 이를 통해서 법적구성요소를 만족해야 한다. Shopify위에서 호스팅을 하고 싶지만 법적 요구사항을 만족하지 못한다면 쉽게 선택 할 수 없을 것이다. Shopify는 전셰계를 대상으로 하는 플랫폼이므로 아래와 같은 격리 수준을 달성해야 한다.
  1. 온라인 몰이 호스팅되는 지역
  2. 내 제품, 주문, 고객, 관리등의 정보와 이를 담고 있는 데이터가 논리적으로 격리되어 있는가.
  3. 원할 경우 물리적으로 격리된 환경에 몰에 구축 할 수 있는가.
점주는 상품을 전시, 소개, 판매하기 위해서 사이트 페이지를 만들고 디자인해야 한다. 다양한 고객이 있기 때문에 웹 사이트는 쉽게 디자인 할 수 있으면서 동시에 커스터마이징 가능해야 한다. 그리고 데이터를 처기하기 위한 백앤드도 있어야 한다.

Shopify는 "이머커스 API"를 제공하고 있다. 우리는 여기에서 이커머스의 기능이 API 형태로 분리되어 있음을 추측할 수 있다. 이커머스의 기능을 API로 분리하는 이러한 비즈니스 모델을 헤드리스 이커머스라고 한다. 헤드리스 이커머스라는 이상한 용어로 부른다고 해서 머리아파 할 필요는 없다. 다른 인터넷 산업에서 일반적으로 사용하는 OpenAPI를 듣기 좋게 만든 비즈니스 용어일 뿐이다.

기타 인증같은 요소들이 있는데, 범위가 너무 넓어지니 다루지 않도록 하겠다. Shopify를 이커머스 플랫폼으로 만들게 하는 핵심 요소를 파악하는게 목적이다.

핵심 기능

오프라인 상점 분석

점주가 원하는 것은 온라인에 "상점"을 오픈하는 거다. 그리고 온라인에 상점의 구성요소를 조율해서 작동하게 만들고 여기에 상품(Products)를 배치하여 고객이 들어올 수 있도록 만드는 것은 오프라인 상점을 만드는 것과차이가 없다. 그 공간이 오프라인인지 온라인인지의 차이만 있을 뿐이다.

그리하여 이커머스는 오프라인 커머스를 디지털화하는 것이 중요한 과업이다. 이러한 과정을 우리는 DT(디지털 트랜스포메이션)이라고 한다. 대략 2019년부터 금융/커머스 업계의 화두중 하나가 디지털 트랜스포메이션이기도 하다.

따라서 온라인 상점을 제대로 이해하기 위해서 오프라인 상점의 구성요소를 살펴볼 필요가 있다. 오프라인 상점의 구성요소들을 살펴보고, 이 것들을 어떻게 디지털화 하면 될지를 고민해보자.

 오프라인 상점

오프라인 상점은 하드웨어와 소프트웨어로 구성된다. 하드웨어는 물리적 공간이고 소프트웨어는 상점을 운영하기 위한 여러가지 정책과 정책을 수행하기 위한 툴들의 집합이다.

  1. 오프라인 건물을 온라인에 올려야 할 것이다. 가장 일반적으로 생각 할 수 있는게 상점용 웹 사이트다. 상점용 웹 사이트는 상점디자인, 전시가 가장 중요한 기능이다.
  2. 오프라인에서 사용하던 POS 기반의 Payment 시스템을 온라인 환경에 맞게 구성해야 한다. PG(Payment Gateway)를 연동하게 될 것이다.
  3. 고객관리, 상품, 재고 관리, 마케팅, 배송.
  4. 매장의 보수, 새로운 디자인, 새로운 기능(물리, 소프트웨어적)의 도입
DT는 이러한 오프라인의 모든 것들을 디지털화 하는 작업이다. 그냥 소프트웨어만 개발한다고 되는 것이 아니다. 각 구성요소의 유기적인 결합, 이에 따른 업무 프로세스와 조직의 변경 등 광범위한 부분에서의 변화가 이루어진다. 예를들어 고객관리/커뮤니케이션도 소셜인증과 소셜 네트워크 기반으로 이루어질 것이다. 오프라인에서의 마케팅의 수행, 마케팅 추적, 통계도 온라인에서는 완전히 달라진다.

Shopify는 온라인 매장을 원하는 점주에게 이러한 모든 것을 제공할 수 있어야 한다.

Shopify 의 구조

오프라인 몰을 분석하면서 Shopify에서 서비스해야 하는 것들을 큰 틀에서 확인 할 수 있었다. 이 정보들을 토대로 Shopify의 구조를 높은 수준(High-Level)에서 조망해보자.

Shopify는 아래의 것들을 제공해야 한다. 쇼핑 몰 사이트를 제공하는 방법을 좀 더 살펴보자. Shopify는 개발자와 디자이너가 없더라도 쇼핑 몰을 운영할 수 있도록 하고 있다. 워드프레스의 템플릿처럼 미리 정의된 디자인을 포함한 템플릿을 고객에게 제공해야 한다. 고객은 템플릿을 수정해서 자신만의 디자인과 기능을 만들 어서 배포 할 테다. 이를 위해서 아래의 기능이 필요하다. 오프라인 매장을 생각해보자. 매장을 차리고 나면, 점주는 매장의 성장에 따라 다양한 기능들을 추가하려 할 것이다. 더 빠른 배송 시스템, 고도화된 고객 관리 소프트웨어의 도입, 재고 관리 시스템, 더 편리한 지불 수단 등이 그것이다.

Shopify는 플러그인(Plugin)을 이용해서 쇼핑 몰을 확장 할 수 있다.

Shopify에서 쇼핑몰을 운영하기 위한 필요한 핵심 적인 것들이 정리된 것 같다.
  1. 쇼핑몰 사이트
  2. 이커머스 기능을 사용하기 위한 API
  3. 쇼핑몰을 만들어주기 위한 Store Orchestrator
  4. 쇼핑몰을 확장하기 위한 플러그인
이들 정보를 토대로 Shopify의 구조를 묘사해보자. High-Level 컴포넌트 구성도 정도가 될 것이다.

 쇼피파이 구성도

쇼핑 몰의 제작

점주는 개별적인 (shop-1, shop-2로 표현된)쇼핑 몰을 가질 것이다. 이들 쇼핑 몰은 웹페이지를 가지고 있을테다. 이 웹페이지가 오프라인 공간에서의 물리적인 공간이 된다. 점주는 이 웹페이지를 이용해서 디자인을 하고, 상품을 전시하고 판매한다.

Shopify는 개발자와 디자이너 없이 간단하게 쇼핑몰을 구축할 수 있도록 하는게 주요 비즈니스 모델이다. 이 목적을 달성하기 위해서 디자인과 전시기능을 포함한 미리정의된 템플릿(Template)를 제공한다. 점주는 원하는 디자인을 가지는 템플릿을 선택하고, 자기 맘에 맞게 수정(커스터마이징) 하고 발행하면 즉시 쇼핑몰이 만들어진다.

디자인과 전시를 포함하는 중요한 영역으로 독립적인 마켓플레이스를 운영하고 있다. 그자체로 비즈니스 모델을 만들고 있다.

 shopify 테마

점주는 템플릿으로 부터 자신의 쇼핑 몰을 만들게 될건데, 이 과정을 나타내보자.

 쇼핑몰 제작 과정

처음 상점을 제작 할 때는 (shopify가 제공하는)템플릿원본 중 마음에 드는 것을 선택하여, 에디터를 이용해서 편집할 것이다. 편집이 끝나면 사용자 템플릿 저장소에 저장될 것이다.

사용자 템플릿 저장소에는 어떤 것이 저장 될까. 아마도 디자인과 플러그인(Plugin)들과 배치 정보들이 있을 것이다. 템플릿 저장소에 사용자의 템플릿이 저장되면, 템플릿을 "변환하는 작업을 하게 될 것이다." 변환이되면 HTML, CSS, Javascript로 구현된 완전한 하나의 페이지가 만들어진다.

Static Page가 저장되고 Javascript로 동적으로 변경되는 데이터를 읽어오기 때문에 이론적으로 쇼핑몰을 구성하는 전체페이지를 캐시 할 수 있을 것 같다. 실제 가능 할지 가설로 검증해보자.

쇼핑몰의 오케스트레이션

이렇게 해서 쇼핑몰 페이지를 만들었다. 클라이언트(웹브라우저)가 특정 고객의 쇼핑몰을 요청하면, 이를 호스팅 해줘야 한다. 호스팅을 위해서 아래와 같은 기능들의 조율(오케스트레이션)이 필요하다.  오케스트레이션

플러그인

플러그인은 상점을 확장하기 위한 도구들의 모음이다. 플러그인은 워드프레스의 플러그인과 원리적으로 동일하다. Shopify의 Plugin은 App Store에서 구독할 수 있다. 아래와 같이 다양한 카테고리에 수많은 앱들이 있다. 플러그인은 API를 호출하는 방식으로 작동하기도 하지만, 뷰(HTML, CSS, Javascript)를 포함 할 수도 있다. 예를 들어 상품평가 플러그인의 경우에는 텍스트와 그래픽 요소(별 같은)이 들어갈 것이다. 또한 플러그인의 인증과 사용권한도 관리가 필요하다. 플러그인의 요구사항을 정리해 보자.

  1. 플러그인의 등록
  2. 플러그인이 실행되기 위한 인프라
  3. 플러그인 코드
  4. 플러그인을 호출하기 위한 Gateway
  5. (뷰가 있을 경우)템플릿의 저장
대략 아래와 같은 구성을 생각해 볼 수 있다.

 플러그인 구성

Plugin은 기능과 뷰로 구성될 것이다. 기능은 비즈니스 로직을 포함하며, JSON 데이터를 리턴할 것이다. 일반적인 API와 마찬가지로 작동한다. 개발자는 API 스펙을 이용해서 디자인을 포함한 구현을 할 수 있을 것이다. 하지만 Plugin이 뷰(View)까지 함께 제공한다면, 굳이 개발자가 디자인에 신경쓰지 않고, 가져다 쓸 수 있게 할 수 있다. 뷰는 템플릿 형태를 가지며 사용자는 템플릿의 매개변수들을 수정하는 것으로 디자인을 커스터마이징 할 수 있다. 커스터마이징 된 View는 S3 혹은 CloudFront 등을 통해서 배포되며, 이를 웹 브라우저가 출력하게 된다. 물론 별도의 인스턴스(서버)에서 뷰를 요청 할 때마다 랜더링 하는 방법을 사용 할 수 있다.

Plugin은 앱 스토어에서 판매를 해야 하므로 앱 스토어도 설계해야 한다. 앱 스토어의 요구사항을 정리해 보자. 앱 스토어는 너무 세부적인 내용이라서 여기에서는 다루지 않기로 한다. (원문에서도 다루지 않고 있다. 그리고 다루기에는 너무 귀찮다.)

API

Shopify는 이커머스 관련 API를 제공한다. REST API와 GraphQL를 이용해서 이커머스 관련 기능을 사용 할 수 있다. Headless 이커머스 서비스를 제공하는 셈이다. Shopify에서 제공하는 API를 이용해서 자신만의 온라인 상점을 개설 할 수 있다. 원론적으로 보자면 Shopify에서 제공하는 상점도 API를 통해서 개발 됐을 수 있다.(아마도 그럴 것이라 생각한다.)

Shopify에서 제공하는 API의 카테고리는 아래와 같다. Shopify에서 API는 아래와 같이 구성될 것이다.

 Shopify API

API는 API Gateway 패턴을 이용해서 구현 할 것이다. API Gateway는 외부(인터넷)에서 API 서버에 진입하는 단일 endpoint가 된다. 애플리케이션 관점에서 API Gateway는 일종의 미들웨어로 작동한다. 따라서 인증/권한, 라우팅, API 등록, 로깅과 같은 기능들을 구현 할 수 있다. 이는 애플리케이션의 전체적인 복잡도를 감소시키고 비즈니스로직에 집중할 수 있도록 한다.

Shopfiy는 Shopifyplus라는 Headless commerce 서비스를 제공한다. 예를 들어 오프라인 쇼핑몰을 운영하고 있으며 개발팀을 보유하고 있는 대형 기업이라면 Headless commerce를 이용해서 자신만의 온라인 쇼핑 브랜드를 구축 할 수 있다.

격리

오프라인 매장이 다른 매장들과 완전히 독립된 공간, 고객을 가지듯이 쇼핑몰 역시 온라인 상에서 완전히 격리되어야 한다. 격리는 점주와 구매자의 정보를 보호한다는 측면에서도 매우 중요한 요소다. 또한 격리는 인프라 구축/운영 비용에도 영향을 주므로 신중하게 격리 수준을 진지하게 검토해야 한다.

온라인상에서의 격리를 위해 필요한 요소들을 살펴보자.

도메인 : 도메인은 오프라인에서의 상점명에 해당한다. 온라인에서 각 쇼핑몰은 도메인이름을 통해서, 다른 상점과 구별된다.

컨테이너 혹은 인스턴스 : 온라인이라는 공간에서 상점을 어떻게 격리할 것인가에 대한 문제다. 쉽게 생각 할 수 있는 것은 컨테이너 혹은 인스턴스(EC2)로 격리하는 것이다. 도메인이 상점의 주소라면 컨테이너 혹은 인스턴스가 상점 공간인 셈이다. 컨테이너를 기준으로 격리를 해보자.

Shopify는 온라인 상점의 기능을 API로 제공하고 있으므로 아래와 같은 격리 구조를 설계할 수 있을 것이다.

 격리 구조

완전 호스팅형 이커머스 플랫폼의 경우에는 독립된 컨테이너를 제공하기도 하지만 Shopify의 경우 독립된 컨테이너를 제공할 필요는 없다. 도메인이름을 기준으로 프론트엔드를 구성하고 API를 호출하면 될 일이다. 컨테이너 풀을 관리하기 쉽다는 장점도 있다.

대형 고객의 경우, 트래픽을 격리하기 위해서 별도의 컨테이너 그룹을 서비스 할 수도 있다. 물론 더 많은 비용을 지불해야 할 것이다. 별도의 Auto Scaling group을 만들고, 고객 도메인 트래픽을 라우팅하면 된다.

도메인 기반 호스팅

안정성, 가용성, 복원력

Shopify는 여러 브랜드들이 입점을 한다. 시스템에 문제가 생길 경우 전체 브랜드가 피해를 입을 수 있다. 이 서비스에서 안정성, 가용성, 복원력은 핵심적인 고객가치다.

안정성의 주요 요소는 복원력이다. 복원력의 의미는 아래와 같다.

복원력에는 인프라나 서비스의 시스템 장애를 복구하고, 컴퓨팅 리소스를 동적으로 확보하여 수요에 대응하거나, 구성 오류나 일시적 네트워크 문제와 같은 장애를 완하하는 워크로드의 기능을 포함한다.

안정성에 영향을 미치는 다른 요인으로 아래와 같은 것들이 있다. 안정성, 가용성, 복원력, (효과적)비용을 만족하는 시스템을 구성하는 것은 매우 어려운일이다. 다행히 지금은 위임을 통해서 해결 할 수 있다. 나는 AWS를 기반으로 스케치해볼 생각이다.

AWS에서 제공하는 대부분의 서비스들은 99.999% 이상의 가용성을 보장, 모니터링/백업/복원을 위한 기능의 제공, 코드(API, IaC)를 이용한 자동화, 자체적인 복원능력을 제공하기 때문에 안정성, 가용성, 복원력을 쉽게 달성 할 수 있다.

 AWS의 복원력

유지/관리

Shopify는 2개의 레이어로 구성된다.
  1. Platform : API, Plugin, Template 등을 제공하는