MUBLO · SYSTEM NOTE

ABOUT

SYSTEM NOTE

도메인 — 공유는 기본값이 아니라 결정입니다

wwiz 2026-08-04 12:20 8분 읽기 조회 82 수정됨

캠핑용품 전문몰을 운영하고 있었습니다.
상품도 자리를 잡았고 단골도 생겼습니다.

반응이 괜찮아서 등산용품 몰을 따로 열기로 합니다.
고객층은 겹치지만 분위기는 다르게 가고 싶습니다. 로고도 다르고, 화면 구성도 다르고, 정산도 따로 봐야 합니다.

여기서 곤란한 것은 몰을 하나 더 만드는 일 자체가 아닙니다.
두 몰을 서로 다르게 운영하면서, 고치는 일은 한 번만 하고 싶다는 것입니다.

지금까지의 선택지

첫째, 설치본을 하나 더 만듭니다.
두 몰은 깔끔하게 나뉘지만 이제 고칠 곳이 두 배가 됩니다. 보안 패치 하나에도 두 곳을 손봐야 하고, 시간이 지나면 두 사본은 조금씩 달라집니다.

둘째, 한 몰 안에서 카테고리로 나눕니다.
관리는 한 번으로 끝나지만 두 브랜드가 같은 운영 체계와 관리자 화면을 나눠 쓰게 됩니다.

두 번째 방식에서는 대개 이런 일이 생깁니다.

캠핑몰에서만 하려던 쿠폰 행사가 등산몰 고객에게도 노출됩니다.
매출을 몰별로 보려면 주문이 어느 브랜드에 속하는지 따로 분류해야 하고, 그 기준은 코드가 아니라 담당자의 기억에 남습니다.
등산몰 운영을 맡길 직원에게 관리자 권한을 주면 캠핑몰 주문 내역까지 함께 열립니다.

기술적으로 어느 쪽도 틀린 선택은 아닙니다.
다만 몰을 나누는 일이 처음부터 구조에 없었기 때문에 나중에 사람이 규칙과 습관으로 빈자리를 메워야 했던 것입니다.

문제는 운영할 사람이 적을 때 커집니다

큰 조직은 전담 개발팀과 예산으로 이런 비용을 어느 정도 흡수할 수 있습니다.
필요하면 별도의 시스템을 만들고, 늘어난 운영 절차를 담당할 사람을 둘 수도 있습니다.

그런 여유가 없는 곳의 사정은 다릅니다.

사장이 상품 등록도 하고 고객 응대도 하는 곳. 개발은 외주에 맡겼는데 그 외주와 연락이 끊긴 곳.
사이트를 하나 더 열고 싶지만 관리할 자신이 없어 미루고 있는 곳.

이런 자리에서 “설치본을 하나 더 만든다”는 선택은 곧 감당해야 할 일이 하나 더 늘어난다는 뜻입니다. 그래서 대개는 한 시스템 안에서 구분하는 쪽을 택하고, 몇 달 뒤 뒤엉킨 데이터 앞에 서게 됩니다.

만들어 넘긴 사람도 편하지 않습니다.
몇 달 뒤 걸려 오는 전화는 대개 크지 않은 부탁이지만, 그런 부탁은 거절하기도, 계속 받아주기도 어렵습니다.

공유는 기본값이 아니라 결정입니다

머블로는 반대쪽에서 출발합니다.

도메인은 하나의 설치본 안에서 독립적으로 운영되는 사이트 경계입니다.
머블로가 기본으로 제공하는 회원·쇼핑몰 기능에서는 회원과 주문·정산 데이터가 도메인별로 나뉘고, 관리 권한도 해당 도메인의 범위 안에서 작동합니다.

공유가 필요한 기능은 공유하겠다고 명시적으로 정합니다.
아무것도 선택하지 않았을 때의 상태는 분리입니다.

나뉜 데이터를 공유하는 길은 기능별 정책으로 열 수 있습니다.
반대로 이미 섞인 데이터를 다시 나누려면 어느 데이터가 누구의 것인지부터 복원해야 합니다.

어느 쪽을 기본값으로 둘지는 그래서 단순한 취향의 문제가 아닙니다.

코어는 경계를 긋고, 나누는 방식은 기능이 정합니다

코어가 하는 일은 요청의 도메인을 먼저 확정하고, 그 도메인에서 활성화된 기능만 불러오는 것입니다.
그 경계 안에서 어떤 데이터를 나누고 무엇을 공유할지는 각 기능이 스스로 정합니다.

게시판은 게시판마다 전체 사이트 공용으로 사용할지 선택할 수 있습니다. 공지사항처럼 여러 몰에 함께 걸고 싶은 글이 있기 때문입니다.
반면 머블로와 함께 배포되는 쇼핑몰은 상품을 몰마다 따로 둡니다.

쇼핑몰이 그렇게 만들어진 것은 코어가 공유를 막아서가 아닙니다.
전문몰은 상품 구성과 가격 정책이 서로 다르다는 판단에서 나온 그 패키지의 결정입니다.

공용 카탈로그를 두고 몰마다 판매 여부와 가격만 다르게 가져가는 쇼핑몰이 필요하다면, 그 정책을 구현한 패키지를 얹으면 됩니다.
도메인 경계는 그대로 두고 그 위에서 공유 방식을 달리하는 것입니다.

그래서 도메인이 먼저입니다

세 번째 글 「요청 하나가 지나가는 길」에서 도메인은 반드시 확장보다 먼저 정해져야 한다고 적었습니다. 여기서 그 이야기를 잇겠습니다.

사이트 요청이 들어오면 머블로는 이 요청이 어느 도메인으로 들어왔는지부터 확정합니다.
등록된 도메인인지, 사용할 수 있는 상태인지 확인합니다. 여기까지 끝난 뒤에야 그 도메인에서 켜둔 기능을 불러옵니다.

순서를 바꾸면 격리가 성립하지 않습니다.
도메인을 정하기 전에 기능부터 불러오면 캠핑몰에만 켜둔 기능이 등산몰 요청에서도 살아 있을 수 있습니다.

격리가 기본값이 되려면 격리의 기준부터 먼저 정해져 있어야 합니다.

이 순서 덕분에 따라오는 결과가 있습니다.
켜둔 기능만 주소록에 오르므로 등산몰에서 사용하지 않는 기능의 주소는 그 몰에 존재하지 않습니다. 사이트맵에도 그 사이트에서 활성화된 기능과 공개 메뉴가 제공한 주소만 담깁니다.

격리를 위해 따로 덧붙인 기능이 아니라, 요청의 순서를 지켜 얻은 결과입니다.

이 구조가 하지 못하는 것

머블로의 격리는 논리적 격리입니다.
여러 사이트가 하나의 서버와 데이터베이스를 함께 사용합니다. 물리적으로 분리된 저장소가 요구되는 환경이라면 설치본을 나누는 편이 맞습니다.

트래픽 성격이 크게 다른 서비스를 한 설치본에 얹는 것도 권하지 않습니다.
나뉘어 있는 것은 데이터와 권한이지 서버 자원 자체가 아닙니다.

이 구조가 기능 개발자의 책임까지 없애는 것도 아닙니다.
각 기능은 데이터를 조회하고 변경할 때 도메인 경계를 지켜야 하며, 그 계약이 깨지지 않는지 테스트해야 합니다.

사이트가 늘어나면 정할 것도 늘어납니다.
도메인마다 사용할 기능과 스킨, 권한을 정해야 합니다. 한 번 정하면 그 경계 안에서 운영되지만, 처음 사이트를 열 때는 그만큼의 설정이 필요합니다.

무엇을 기본값으로 두는가

여러 사이트를 운영하는 기능 자체는 새롭지 않습니다.
머블로가 다르게 잡은 것은 기능의 유무가 아니라 무엇을 기본값으로 두었는가입니다.

도메인 판별과 기능 활성화는 문서에만 적힌 약속이 아니라 요청이 지나가는 순서에 들어 있습니다.
매번 개발자가 기억해 지켜야 하는 규칙이 아니라, 구조가 먼저 지키는 경계입니다.

코어가 모든 정책을 대신 정하지 않기 때문에, 서로 다른 운영 방식도 같은 구조 위에 올릴 수 있습니다.

머블로가 보고 있는 자리가 여기입니다.
규모가 작다고 해서 필요한 구조까지 작아지지는 않습니다. 오히려 사람이 적을수록 구조가 대신 지켜줘야 할 것이 많습니다.

그렇다고 큰 프로젝트를 담지 못하는 구조는 아닙니다.
도메인을 여럿 두고 필요한 기능을 나눠 붙이는 방식은 규모가 커질수록 더 분명한 경계를 제공합니다.

다만 저희가 바라보는 곳은 혼자서, 또는 적은 사람이 많은 일을 해내야 하는 곳입니다.

등산몰을 맡길 직원에게 권한을 주면서 캠핑몰 주문까지 열리지는 않을지 걱정하지 않아도 되는 것.
이번 달 매출을 볼 때 어느 주문이 어느 몰의 것인지 따로 세어보지 않아도 되는 것.
쿠폰 하나를 걸면서 이게 저쪽 고객에게도 보이지 않을까 확인하지 않아도 되는 것.

운영이 덜 두렵다는 말은 그런 뜻입니다.
무언가를 더 할 수 있게 되어서가 아니라, 신경 쓸 것이 하나씩 줄어서입니다.

글쓰기

댓글 0

등록된 댓글이 없습니다.