name: system-design-studio description: 모든 제품 또는 회사에 대한 시니어 수준의 시스템 설계(HLD) 가이드를 생성합니다: 요구사항, 용량, 아키텍처 및 ER 다이어그램, 스키마, API 및 트레이드오프를 라이트/다크 테마로 제공합니다.
System Design Studio
사용자가 시스템의 하이 레벨 설계(HLD)를 요청할 때 사용하십시오: "Uber 설계", "Netflix 시스템 설계", "결제 게이트웨이 HLD", "URL 단축기 설계", "X 설계 인터뷰 준비". 결과물은 라이트/다크 모드를 지원하는 하나의 독립적이고 탐색 가능한 HTML 설계 문서이며, 필요시 대화형 캔버스를 함께 제공할 수 있습니다. 사용자가 로컬에서 실행할 파일을 원하는 경우, 가이드와 캔버스를 하나의 HTML 페이지(탭 방식, §9)로 제공하십시오.
이 저장소의 예제 파일들은 품질 기준을 보여줍니다: examples/stock-broker/ (기본 테마, 가이드와 캔버스가 별도 페이지) 및 examples/uber/ (제품 테마, 손으로 그린 아키텍처 SVG, 가이드와 캔버스가 하나의 파일).
1. 주제와 테마 결정
먼저 요청을 분류합니다. 이는 콘텐츠 방향과 디자인을 결정합니다.
- 이름이 있는 제품 또는 회사 (Uber, Netflix, WhatsApp, Swiggy, Zerodha, Airbnb, Spotify, Stripe, Instagram, ...): 가이드는 "<회사>의 시스템 설계"이며 해당 제품의 세계를 반영한 테마를 적용합니다(§5.2 참조). 모든 곳에서 해당 회사의 실제 도메인 용어를 사용합니다 (Uber: 라이더, 드라이버, 여정, 디스패치, 서지, ETA; Netflix: 타이틀, 재생, CDN, 인코딩 래더; WhatsApp: 채팅, 전송 확인, 마지막 접속).
- 일반 시스템 (URL 단축기, 채팅 앱, 결제 게이트웨이, 레이트 리미터, 알림 서비스, 회사 이름 없이 "라이드 셰어링 앱") 또는 파악하기 어려운 제품: 기본 템플릿 테마를 사용합니다(§5.1).
- 사용자가 스타일을 지정한 경우 ("Stripe 문서처럼 보이게", "심플하고 미니멀하게"): 위의 두 규칙보다 사용자의 요청을 따릅니다.
이름이 있는 회사의 경우, 설계 전에 조사하십시오: 해당 회사의 공개 엔지니어링 블로그 게시물과 발표를 웹 검색하십시오 (예: Uber: H3 지리공간 인덱스, Ringpop, Schemaless, Cadence; Netflix: Open Connect, EVCache, Zuul). 공개된 정보만 사용하고, 그 출처를 명시하며("Uber 엔지니어링 블로그에 따르면"), 가이드 하단에 출처 목록을 추가하고, 추론된 내용은 가정으로 표시하십시오. 추론된 설계를 회사의 실제 내부 아키텍처로 제시하지 마십시오.
2. 구축 전 브레인스토밍
HTML을 작성하기 전에, 다음 내용을 한 개의 짧은 메시지로 사용자에게 제시하십시오:
- 도메인의 핵심 통찰력: 한 가지 경계 또는 아이디어로, 이를 놓치면 전체 설계가 잘못됩니다. 예: "브로커는 라우팅하고, 거래소는 매칭한다", "결제 게이트웨이는 자금을 보유하지 않으며, 인수 은행이 한다", "Uber의 디스패치는 초 단위 레이턴시 예산 하의 지리공간 매칭 문제이다". 개요에 강조 표시하여 배치하십시오.
- 평면: 강한 일관성이 필요한 경로(돈, 주문, 재고, 예약 → CP)와 가용성을 선호하는 경로(피드, 검색, 프레즌스, 위치 핑, 분석 → AP)를 구분하십시오. 경계에서 분리하십시오.
- 어려운 문제: 멱등성, 순서 지정, 팬아웃, 핫 키, 지역 분할, 정산, 정확히 한 번 처리.
- 범위 내 / 범위 외 (외부 통합으로 처리되는 것).
- §1의 테마 결정: 어떤 제품 테마를 사용할지, 또는 기본 테마를 사용할지.
요청이 명확하지 않은 경우(어떤 제품인지? 인터뷰 수준인지 실제 수준인지?), 한 가지 질문을 하십시오. 그렇지 않으면 시작하십시오.
3. 필수 섹션 (번호 순서)
- 개요: 시스템이 무엇인지, 핵심 통찰력 강조 표시, 범위 내 / 범위 외 목록.
- 요구사항: 기능 요구사항 표 (도메인 → 기능, 실제 도메인 용어와 열거형 사용) 및 비기능 요구사항 표 (속성 → 목표 → 설명). 항상 지연 시간, 가용성, 일관성(경로별 CP/AP), 내구성, 확장성, 보안, 멱등성을 포함하십시오.
- 용량 추정: 가정 → 도출된 수치(사용자, DAU, 최대 동시 접속자, 초당 쓰기 수 평균 및 최대, 초당 읽기 수, 팬아웃 이그레스, 일일 저장량) 표. 계산 과정을 보여주어 검증 가능하게 하고, 각 평면이 어떤 축으로 확장되는지에 대한 요점을 강조 표시로 마무리하십시오. 실제 회사의 경우, 공개적으로 알려진 규모를 기준으로 삼고 출처를 인용하십시오.
- 아키텍처: 렌더링된 다이어그램(§6 참조)과 각 평면 및 이벤트 백본에 대한 설명.
- 컴포넌트 상세 분석: 각 핵심 서비스에 대해: 책임, 작동 방식(상태 머신, 프로토콜, 알고리즘), 소유한 데이터, 오류 처리.
- 핵심 흐름 수명 주기: 제품의 대표적인 종단 간 흐름(Uber: 라이드 요청 → 매칭 → 여행; Netflix: 재생 버튼 클릭 → 스트리밍; WhatsApp: 메시지 전송 → 전송 확인 → 읽음 확인)을 단계 표(단계 번호, 단계, 담당자, 상태/이벤트)로 표시하고, 동기/비동기 경계에 대한 설명을 추가하십시오.
- 데이터 모델 및 스키마: ER/클래스 다이어그램(§6 참조), 비관계형 저장소(캐시 키 패턴, 시계열 레이아웃, 지리공간 인덱스, 검색 인덱스), 이벤트 토픽(토픽, 파티션 키, 이벤트) 및 하나의 샘플 이벤트 JSON. 주요 스키마 뷰로 원시 SQL DDL을 덤프하지 마십시오.
- API 설계: 규칙 표(인증, 멱등성, 오류 봉투, 속도 제한, 페이지네이션, 버전 관리), 컬러 메서드 알약이 있는 엔드포인트 표, 주요 쓰기 작업에 대한 하나의 요청/응답 쌍(상태 코드 의미를 보여줌, 예: 비동기의 경우 202), 상태 코드 표, 스트리밍 프로토콜(WebSocket/SSE/gRPC 스트림)이 있다면 포함.
- 일관성 및 신뢰성: 각 보장이 적용되는 위치, 사가 + 보상 트랜잭션, 멱등성 계층, 오류 시나리오 표.
- 확장 및 성능: 샤딩 키, 무상태 자동 확장, 파티셔닝, 캐싱, 스파이크 처리.
- 보안 및 규정 준수: 인증/인가, 데이터 보호, 규제 데이터 보존, 남용 방지.
- 관찰 가능성: 골든 메트릭, 추적, 정산 대시보드, 알림.
- 트레이드오프: 결정 → 선택 및 이유 표, "다섯 가지를 기억해야 한다면"으로 끝나는 강조 표시.
4. 정확성 기준 (게시 전 확인)
- 용량의 모든 숫자는 명시된 가정에서 도출되었으며 내부적으로 일관성이 있어야 합니다(평균 대비 최대 배수 명시).
- 아키텍처 다이어그램의 모든 컴포넌트는 상세 분석 또는 흐름에 나타나야 하며, 그 반대도 마찬가지입니다.
- ER 다이어그램의 모든 엔티티는 일부 흐름 또는 API에서 사용되어야 합니다. 모든 API의 쓰기 경로는 실제 엔티티를 참조해야 합니다.
- 스키마 섹션의 Kafka/큐 토픽은 아키텍처 다이어그램의 엣지 레이블과 일치해야 합니다.
- 돈이 존재하는 곳에서는 돈을 이중 입력 원장으로 모델링해야 합니다. 멱등성 키는 스키마(고유 제약 조건)와 API(헤더) 모두에 나타나야 합니다.
- 도메인의 실제 용어(주문 유형, FIX/ISO 8583과 같은 프로토콜, 규정)를 사용하고, 가정인 경우 명시하십시오.
- 이름이 있는 회사의 경우: 실제 스택에 대한 모든 주장은 출처가 있어야 합니다. 그 외의 모든 것은 가정으로 표시하십시오.
- 진정한 정확히 한 번을 주장하지 마십시오. 멱등성 + 정산을 설명하십시오.
5. 테마, 라이트 모드 및 다크 모드
모든 가이드는 라이트 모드와 다크 모드를 모두 제공합니다. 기본적으로 사용자의 시스템 설정을 따르며, 헤더의 토글 버튼으로 재정의할 수 있습니다(브라우저별로 기억됨). 페이지를 작성하기 전에 artifact-design 스킬을 로드하십시오.
5.0 토큰 시스템 (두 모드 모두)
모든 색상은 CSS 사용자 정의 속성입니다. 규칙, SVG 또는 다이어그램에서 색상을 하드코딩하지 말고 항상 토큰을 사용하십시오. :root에 라이트 값을 정의한 다음, 다크 값을 두 번 정의하십시오(시스템 기본 설정(사용자가 라이트를 선택하지 않은 경우) 및 명시적 다크 선택):
:root{ color-scheme:light; /* 라이트 토큰 */ }
@media (prefers-color-scheme: dark){
:root:not([data-theme="light"]){ color-scheme:dark; /* 다크 토큰 */ }
}
:root[data-theme="dark"]{ color-scheme:dark; /* 다크 토큰, 반복 */ }
body{ background:var(--bg); color:var(--ink); }
필수 토큰 역할 (각 테마는 두 모드 모두에서 모든 역할을 설정합니다). 다이어그램 렌더러가 쉼표로 분할하므로 일반 hex 값을 사용하십시오(rgba(...) 사용 금지):
| 토큰 | 역할 |
|---|---|
--bg, --surface, --surface-2, --line, --line-soft | 페이지, 카드, 상단 카드, 테두리 |
--ink, --ink-mid, --ink-dim | 제목/강조 텍스트, 본문, 캡션 |
--accent, --accent-ink | 테마의 시그니처 색상 및 그 위에 그려지는 텍스트 |
--svc, --svc-bg | 다이어그램의 서비스 |
--bus, --bus-bg | 큐 / 이벤트 버스 |
--ext, --ext-bg | 외부 시스템 |
--store, --store-bg | 데이터 저장소 |
--ok, --warn, --danger, --info | 강조 표시, 메서드 알약, CP/AP 알약 |
--code-bg, --code-ink, --code-key, --code-str, --code-num, --code-com | 코드 블록 |
--font-display, --font-body, --font-mono | 글꼴 계열 |
대비: 본문 텍스트(--bg 및 --surface 위의 --ink-mid)는 두 모드 모두에서 최소 4.5:1이어야 합니다. --surface 위의 강조 텍스트도 최소 4.5:1이어야 합니다. 어두운 배경에서 잘 보이는 밝은 강조 색상은 일반적으로 라이트 모드에서 더 어두운 음영이 필요하므로, 각 모드의 값을 재사용하지 말고 별도로 선택하십시오.
스타일시트 전에 <head>에 다음을 배치하여 저장된 선택이 깜박임 없이 적용되도록 하십시오:
<script>
(function(){var t=null;try{t=localStorage.getItem('sdg-theme')}catch(e){}
if(t==='light'||t==='dark')document.documentElement.dataset.theme=t;})();
</script>
헤더의 토글 버튼(<button class="theme-toggle" id="themeToggle" aria-label="색상 테마 전환"></button>) 및 <body> 끝 부분에 가까운 스크립트:
<script>
(function(){
var root=document.documentElement, mq=matchMedia('(prefers-color-scheme: dark)');
function current(){return root.dataset.theme||(mq.matches?'dark':'light');}
function label(){var b=document.getElementById('themeToggle');if(b)b.textContent=current()==='dark'?'☀ Light':'☾ Dark';}
document.getElementById('themeToggle').addEventListener('click',function(){
var next=current()==='dark'?'light':'dark';root.dataset.theme=next;
try{localStorage.setItem('sdg-theme',next)}catch(e){}
label();document.dispatchEvent(new Event('themechange'));});
mq.addEventListener('change',function(){if(!root.dataset.theme){label();document.dispatchEvent(new Event('themechange'));}});
label();
})();
</script>
5.1 기본 템플릿 테마 (일반 시스템)
이름이 있는 제품과 관련되지 않은 모든 것에 대한 기본 스타일:
- 서체: Space Grotesk (디스플레이), Inter (본문), JetBrains Mono (식별자, 열거형, 토픽, 경로).
- 다크: 미드나잇 베이스.
--bg #0a0e17,--surface #141b2c,--surface-2 #1a2336,--line #28324e,--ink #eaf0fb,--ink-mid #aab6d2,--ink-dim #7a86a4,--accent #5ec7df,--svc #4fd0e0/--svc-bg #152036,--bus #f3ab54/--bus-bg #241d12,--ext #fb7f95/--ext-bg #2a1622,--store #93a3c0/--store-bg #131b2c. - 라이트: 쿨 페이퍼.
--bg #f6f8fc,--surface #ffffff,--surface-2 #eef2f8,--line #d6deea,--ink #0f1729,--ink-mid #45536b,--ink-dim #5f6c85,--accent #0b7287,--svc #0b7287/--svc-bg #e3f3f7,--bus #a35a00/--bus-bg #fdf0dd,--ext #b4234a/--ext-bg #fde7ec,--store #55627a/--store-bg #eef1f6. - 레이아웃: 히어로(눈썹, 제목, 핵심 통찰력이 포함된 한 문단 요약, 4개의 TL;DR 카드: 최대 규모, 연결, CP 경로, AP 경로), 그 다음 데스크톱에서는 고정 목차와 스크롤스파이가 있는 2열 본문, 모바일에서는 플로팅 "☰ Contents" 드로어.
5.2 제품 테마 (이름이 있는 회사)
페이지가 해당 제품의 세계에 속한 것처럼 느껴져야 하지만, 독립적인 연구임을 명확히 해야 합니다. 제품의 공개된 시각적 특성(팔레트, 서체 분위기, 모양 언어(날카로운 vs 둥근), 밀도, 하나의 시그니처 모티프)에서 전체 토큰 세트(두 모드 모두)를 파생하십시오. 시작점 (대략적, 복사보다는 연상):
| 제품 | 팔레트 방향 | 서체(무료 대체) | 모양 및 모티프 |
|---|---|---|---|
| Uber | 모노크롬 흑백, 하나의 녹색 강조 | Inter Tight, 두꺼운 디스플레이 두께 | 날카로운 모서리, 높은 대비; 지도 경로 선과 픽업/드롭오프 점 |
| Netflix | 진한 검정에 진한 빨간색 강조; 라이트 모드 따뜻한 흰색 + 빨간색 | Bebas Neue 디스플레이, Inter 본문 | 영화적인 큰 제목, 포스터 카드 행 |
| 부드러운 중성색 위 청록색; 다크 모드 진한 녹색 회색 | Inter / 시스템 UI | 채팅 버블 강조 표시, 이중 체크 상태 표시 | |
| Airbnb | 따뜻한 흰색에 산호색 강조 | Nunito Sans | 넉넉한 둥글림, 부드러운 그림자, 친근한 간격 |
| Spotify | 검정에 밝은 녹색; 라이트 모드 흰색 + 녹색 | Figtree 또는 DM Sans | 알약 버튼, 파형/진행 바 모티프 |
| Stripe | 라이트 우선, 인디고/바이올렛 강조, 부드러운 그라데이션 | Inter | 선명한 가는 선, 코드 블록을 일등 시민으로 |
| Swiggy / Zomato | 크림색 위 따뜻한 주황색 또는 빨간색; 다크 브라운 블랙 | Poppins | 둥근 카드, 주문 추적 타임라인 |
| Zerodha | 파란색 강조가 있는 깨끗한 흰색; 다크 슬레이트 | Inter | 밀도 높은 데이터 테이블, 티커 스트립 |
표에 없는 회사의 경우 동일한 방법을 적용하십시오: 시그니처 색상, 분위기 및 모티프를 식별한 다음 두 모드를 구축하십시오.
제품 테마의 가드레일:
- 영감을 받았을 뿐, 복사하지 않음. 로고, 워드마크, 앱 아이콘, 마스코트, 스크린샷 또는 복사된 UI 화면, 독점 서체(Uber Move, Netflix Sans, Circular, Cereal)를 사용하지 마십시오. 무료 대체 서체를 사용하십시오. 모티프는 일반적으로 그려집니다(경로 선, 채팅 버블).
- 제목은 연구로 표시: "Uber의 시스템 설계" 또는 "Uber 규모 라이드 헤일링 플랫폼 설계", Uber가 게시한 것처럼 표시하지 마십시오.
- 항상 바닥글: "독립적인 교육 연구. <회사>와 관련이 없거나 보증하지 않습니다. 아키텍처는 공개 소스 및 명시된 가정에서 재구성되었습니다." 및 출처 목록.
- 다이어그램, 표, 강조 표시 및 알약은 여전히 기본 템플릿과 동일한 컴포넌트 구조를 사용하고, 토큰을 통해 색상을 변경합니다. 제품 테마는 13개 섹션 구조가 아니라 모양을 변경합니다.
5.3 공유 컴포넌트
- 둥근 스크롤 래퍼의 테이블; 컬러 왼쪽 막대가 있는 강조 표시(키 / 경고 / 정보 / 참고); 메서드 알약(GET
--ok, POST--info, PUT--warn, DELETE--danger); CP/AP 알약. - JSON 페이로드, 키 패턴 및 프로토콜 메시지에 대해서만 코드 블록, 언어 또는 엔드포인트 이름을 지정하는 헤더 바 및
--code-*토큰의 구문 색상. - 휴대폰 너비...
… (다음 내용 계속)