본문으로 건너뛰기

© 2026 Molayo

GH Trending릴리즈2026. 05. 25. 20:54

donnemartin/system-design-primer

요약

대규모 시스템 설계 원칙과 인터뷰 준비를 위한 체계적인 학습 리소스를 제공하는 오픈 소스 저장소입니다. 확장 가능한 시스템 구축 방법, 시스템 디자인 인터뷰 질문 및 솔루션, Anki 플래시카드를 통한 개념 학습 등을 지원합니다.

핵심 포인트

  • 대규모 시스템 설계 및 확장성 원칙 학습
  • 시스템 디자인 기술 면접 대비를 위한 예시 솔루션 제공
  • Anki 플래시카드를 활용한 핵심 개념 암기 지원
  • 성능, 가용성, 일관성 등 주요 설계 트레이드오프 정리

English ∙ 日本語 ∙ 简体中文 ∙ 繁體中文 | العَرَبِيَّة ∙ বাংলা ∙ Português do Brasil ∙ Deutsch ∙ ελληνικά ∙ עברית ∙ Italiano ∙ 한국어 ∙ فارسی ∙ Polski ∙ русский язык ∙ Español ∙ ภาษาไทย ∙ Türkçe ∙ tiếng Việt ∙ Français | 번역 추가

이 가이드를 번역하는 것을 도와주세요!

대규모 시스템 (large-scale systems)을 설계하는 방법을 배우세요.

시스템 디자인 (system design) 인터뷰를 준비하세요.

확장 가능한 시스템 (scalable systems)을 설계하는 방법을 배우는 것은 더 나은 엔지니어가 되는 데 도움이 될 것입니다.

시스템 디자인은 광범위한 주제입니다. 시스템 디자인 원칙에 대해 웹 전역에 흩어져 있는 방대한 양의 리소스가 존재합니다.

이 저장소 (repo)는 대규모 시스템을 구축하는 방법을 배우는 데 도움이 되는 리소스들의 체계적인 모음입니다.

이 프로젝트는 지속적으로 업데이트되는 오픈 소스 (open source) 프로젝트입니다.

기여 (Contributions)를 환영합니다!

코딩 인터뷰 (coding interviews) 외에도, 시스템 디자인은 많은 기술 기업의 **기술 면접 프로세스 (technical interview process)**에서 필수 요소입니다.

일반적인 시스템 디자인 인터뷰 질문을 연습하고, 토론, 코드, 다이어그램(diagrams)을 포함한 **예시 솔루션 (sample solutions)**과 자신의 결과를 비교해 보세요.

인터뷰 준비를 위한 추가 주제:

  • 학습 가이드 (Study guide)
  • 시스템 디자인 인터뷰 질문에 접근하는 방법
  • 솔루션이 포함된 시스템 디자인 인터뷰 질문
  • 솔루션이 포함된 객체 지향 설계 (Object-oriented design) 인터뷰 질문
  • 추가 시스템 디자인 인터뷰 질문

제공된 Anki 플래시카드 덱 (flashcard decks)은 간격 반복 (spaced repetition)을 사용하여 핵심 시스템 디자인 개념을 기억하는 데 도움을 줍니다.

이동 중에도 사용하기 좋습니다.

코딩 인터뷰 (Coding Interview) 준비를 돕는 리소스를 찾고 계신가요?

추가적인 Anki 덱이 포함된 자매 저장소인 Interactive Coding Challenges를 확인해 보세요:

커뮤니티로부터 배우세요.

다음 사항을 돕기 위해 자유롭게 풀 리퀘스트 (pull requests)를 제출해 주세요:

  • 오류 수정
  • 섹션 개선
  • 새로운 섹션 추가
  • 번역

다듬기가 필요한 콘텐츠는 개발 중 (under development) 상태로 표시됩니다.

기여 가이드라인 (Contributing Guidelines)을 검토하세요.

장단점을 포함한 다양한 시스템 디자인 주제의 요약본입니다.

모든 것은 트레이드오프 (trade-off)입니다. 각 섹션에는 더 심도 있는 리소스로 연결되는 링크가 포함되어 있습니다.

  • 시스템 디자인 (System design) 주제: 여기서부터 시작하세요
  • 성능 (Performance) vs 확장성 (Scalability)
  • 지연 시간 (Latency) vs 처리량 (Throughput)
  • 가용성 (Availability) vs 일관성 (Consistency)
  • 일관성 패턴 (Consistency patterns)
  • 가용성 패턴 (Availability patterns)
  • 도메인 네임 시스템 (Domain name system)
  • 콘텐츠 전송 네트워크 (Content delivery network)
  • 로드 밸런서 (Load balancer)
  • 리버스 프록시 (Reverse proxy) (웹 서버)
  • 애플리케이션 계층 (Application layer)
  • 데이터베이스 (Database)
  • 캐시 (Cache)
  • 비동기성 (Asynchronism)
  • 통신 (Communication)
  • 보안 (Security)
  • 부록 (Appendix)
  • 개발 중 (Under development)
  • 크레딧 (Credits)
  • 연락처 정보 (Contact info)
  • 라이선스 (License)

인터뷰 일정(단기, 중기, 장기)에 따라 검토할 것을 권장하는 주제입니다.

Q: 인터뷰를 위해 여기 있는 모든 내용을 알아야 하나요?

A: 아니요, 인터뷰 준비를 위해 여기 있는 모든 내용을 알 필요는 없습니다.

인터뷰에서 무엇을 질문받는지는 다음과 같은 변수에 따라 달라집니다:

  • 귀하의 경력 수준
  • 귀하의 기술적 배경
  • 지원하는 직무
  • 지원하는 회사

경력이 더 많은 후보자는 일반적으로 시스템 디자인에 대해 더 많이 알고 있을 것으로 기대됩니다. 아키텍트 (Architect)나 팀 리드 (Team lead)는 개별 기여자 (Individual contributor)보다 더 많은 지식을 갖추어야 할 수도 있습니다. 상위 기술 기업 (Top tech companies)들은 하나 이상의 디자인 인터뷰 라운드를 가질 가능성이 높습니다.

범위를 넓게 잡고 몇몇 분야를 깊게 파고드세요. 다양한 핵심 시스템 디자인 주제에 대해 조금씩 알아두는 것이 도움이 됩니다. 다음 가이드를 귀하의 일정, 경력, 지원 직무 및 지원 회사에 맞춰 조정하세요.

단기 일정- 시스템 디자인 주제의 **폭(breadth)**을 목표로 하세요. 몇 가지 인터뷰 문제를 풀며 연습하세요. 중기 일정- 시스템 디자인 주제의 **폭(breadth)**과 **어느 정도의 깊이(some depth)**를 목표로 하세요. 많은 인터뷰 문제를 풀며 연습하세요. 장기 일정- 시스템 디자인 주제의 **폭(breadth)**과 **더 깊은 깊이(more depth)**를 목표로 하세요. 대부분의 인터뷰 문제를 풀며 연습하세요.

구분단기중기장기
시스템이 작동하는 방식에 대한 폭넓은 이해를 위해 시스템 디자인 주제를 통독하기👍👍👍
...
시스템 디자인 인터뷰 질문에 대처하는 방법.

시스템 디자인 인터뷰는 **개방형 대화 (open-ended conversation)**입니다. 당신이 대화를 주도해야 합니다.

다음 단계들을 사용하여 논의를 이끌어갈 수 있습니다. 이 과정을 확실히 익히기 위해, 다음 단계들을 사용하여 '시스템 디자인 인터뷰 질문과 솔루션' 섹션을 연습해 보세요.

요구사항을 수집하고 문제의 범위를 설정(scope)합니다. 유스케이스 (use cases)와 제약 사항 (constraints)을 명확히 하기 위해 질문을 던지세요. 가설 (assumptions)에 대해 논의합니다.

  • 누가 이것을 사용할 것인가?
  • 그들은 어떻게 사용할 것인가?
  • 사용자는 얼마나 많은가?
  • 시스템이 수행하는 기능은 무엇인가?
  • 시스템의 입력 (inputs)과 출력 (outputs)은 무엇인가?
  • 얼마나 많은 데이터를 처리할 것으로 예상하는가?
  • 초당 요청 수 (requests per second)는 얼마나 될 것으로 예상하는가?
  • 예상되는 읽기 대 쓰기 비율 (read to write ratio)은 얼마인가?

모든 중요한 구성 요소를 포함하여 상위 수준 설계 (high level design)의 개요를 작성합니다.

  • 주요 구성 요소와 연결 관계를 스케치합니다.
  • 당신의 아이디어를 정당화 (justify)합니다.

각 핵심 구성 요소의 세부 사항을 파고듭니다. 예를 들어, URL 단축 서비스 (url shortening service)를 설계하라는 요청을 받았다면, 다음 사항들을 논의합니다:

  • 전체 URL의 해시 (hash) 생성 및 저장

  • 해시된 URL을 전체 URL로 변환

  • 데이터베이스 조회 (Database lookup)

  • API 및 객체 지향 설계 (object-oriented design)

제약 사항을 고려하여 병목 현상 (bottlenecks)을 식별하고 해결합니다. 예를 들어, 확장성 (scalability) 문제를 해결하기 위해 다음 요소들이 필요한가요?

  • 로드 밸런서 (Load balancer)
  • 수평 확장 (Horizontal scaling)
  • 캐싱 (Caching)
  • 데이터베이스 샤딩 (Database sharding)

잠재적인 솔루션과 트레이드오프 (trade-offs)를 논의합니다. 모든 것은 트레이드오프입니다. 확장 가능한 시스템 디자인 (scalable system design) 원칙을 사용하여 병목 현상을 해결하세요.

수기로 추정치를 계산하라는 요청을 받을 수도 있습니다. 다음 리소스는 부록 (Appendix)을 참조하세요:

  • 백 오브 디 엔벨로프 (back of the envelope) 계산법
  • 2의 거듭제곱 표
  • 모든 프로그래머가 알아야 할 지연 시간 수치 (Latency numbers)

무엇을 기대할 수 있는지 더 잘 파악하려면 다음 링크들을 확인해 보세요:

  • 시스템 디자인 인터뷰에서 승리하는 법 (How to ace a systems design interview)
  • 시스템 디자인 인터뷰 (The system design interview)
  • 아키텍처 및 시스템 디자인 인터뷰 입문 (Intro to Architecture and Systems Design Interviews)
  • 시스템 디자인 템플릿 (System design template)

샘플 논의, 코드 및 다이어그램이 포함된 일반적인 시스템 디자인 인터뷰 질문들입니다.

솔루션은 solutions/ 폴더 내의 콘텐츠와 연결되어 있습니다.

질문
Design Pastebin.com (또는 Bit.ly)솔루션 (Solution)
...

샘플 토론, 코드 및 다이어그램이 포함된 일반적인 객체 지향 설계 (Object-oriented design) 인터뷰 질문들입니다.

솔루션은 solutions/ 폴더 내의 콘텐츠와 연결되어 있습니다.

참고: 이 섹션은 개발 중입니다.

질문
Design a hash map솔루션 (Solution)
...

시스템 디자인 (System design)이 처음이신가요?

먼저, 일반적인 원칙들에 대한 기본적인 이해가 필요합니다. 그것들이 무엇인지, 어떻게 사용되는지, 그리고 장단점(Pros and cons)에 대해 학습해야 합니다.

  • 다루는 주제:

  • 수직 확장 (Vertical scaling)

  • 수평 확장 (Horizontal scaling)

  • 캐싱 (Caching)

  • 부하 분산 (Load balancing)

  • 데이터베이스 복제 (Database replication)

  • 데이터베이스 파티셔닝 (Database partitioning)

  • 다루는 주제:

다음으로, 상위 수준의 트레이드오프 (Trade-offs)를 살펴보겠습니다:

성능 (Performance) vs 확장성 (Scalability)
지연 시간 (Latency) vs 처리량 (Throughput)
가용성 (Availability) vs 일관성 (Consistency)

**모든 것은 트레이드오프 (Trade-off)**라는 점을 명심하세요.

그 다음 DNS, CDN, 그리고 부하 분산기 (Load balancers)와 같은 더 구체적인 주제들을 깊이 있게 다룰 것입니다.

서비스가 추가된 리소스에 비례하는 방식으로 성능 (Performance) 향상을 가져온다면, 그 서비스는 **확장 가능 (Scalable)**하다고 합니다. 일반적으로 성능을 높인다는 것은 더 많은 작업 단위를 처리하는 것을 의미하지만, 데이터셋이 커질 때와 같이 더 큰 작업 단위를 처리하는 것을 의미할 수도 있습니다.1

성능 vs 확장성을 바라보는 또 다른 방법:

  • 만약 성능 (Performance) 문제가 있다면, 시스템이 단일 사용자에게 느린 것입니다.
  • 만약 확장성 (Scalability) 문제가 있다면, 시스템이 단일 사용자에게는 빠르지만 과부하 (Heavy load) 상태에서 느린 것입니다.

**지연 시간 (Latency)**은 어떤 동작을 수행하거나 결과를 생성하는 데 걸리는 시간입니다.

**처리량 (Throughput)**은 단위 시간당 그러한 동작이나 결과의 횟수입니다.

일반적으로, 허용 가능한 지연 시간 (Acceptable latency) 내에서 **최대 처리량 (Maximal throughput)**을 목표로 해야 합니다.

분산 컴퓨팅 시스템 (Distributed computer system)에서는 다음 보장 사항 중 두 가지만 지원할 수 있습니다:

일관성 (Consistency) - 모든 읽기 작업은 가장 최근의 쓰기 작업 결과물을 받거나 에러를 반환받아야 합니다.
가용성 (Availability) - 모든 요청은 응답을 받아야 하지만, 그 응답이 정보의 가장 최신 버전을 포함한다는 보장은 없습니다.
분할 내성 (Partition Tolerance) - 네트워크 장애로 인한 임의의 분할 (Partitioning) 상황에서도 시스템은 계속해서 작동해야 합니다.

네트워크는 신뢰할 수 없으므로, 분할 내성 (Partition tolerance)을 지원해야 합니다. 따라서 일관성 (Consistency)과 가용성 (Availability) 사이에서 소프트웨어적인 트레이드오프 (Tradeoff)를 결정해야 합니다.

분할된 노드 (Partitioned node)로부터 응답을 기다리는 것은 타임아웃 (Timeout) 에러를 초래할 수 있습니다. 비즈니스 요구사항이 원자적 읽기 및 쓰기 (Atomic reads and writes)를 필요로 한다면 CP가 좋은 선택입니다.

응답은 어떤 노드에서든 가장 즉시 사용 가능한 데이터 버전을 반환하며, 이는 최신 버전이 아닐 수도 있습니다. 분할이 해결되었을 때 쓰기 작업이 전파되는 데 시간이 걸릴 수 있습니다.

비즈니스 요구사항이 최종 일관성 (Eventual consistency)을 허용하거나, 외부 오류에도 불구하고 시스템이 계속 작동해야 하는 경우라면 AP가 좋은 선택입니다.

동일한 데이터의 여러 복사본이 존재할 때, 클라이언트가 데이터에 대해 일관된 뷰 (View)를 가질 수 있도록 이들을 어떻게 동기화할 것인지에 대한 선택 문제에 직면하게 됩니다. CAP 정리 (CAP theorem)의 일관성 (Consistency) 정의를 상기해 보십시오 - 모든 읽기 작업은 가장 최근의 쓰기 작업 결과물을 받거나 에러를 반환받아야 합니다.

쓰기 작업 이후, 읽기 작업에서 해당 내용을 볼 수도 있고 보지 못할 수도 있습니다. 최선의 노력 (Best effort) 방식이 취해집니다.

이러한 방식은 memcached와 같은 시스템에서 볼 수 있습니다. 약한 일관성 (Weak consistency)은 VoIP, 비디오 채팅, 실시간 멀티플레이어 게임과 같은 실시간 사용 사례에서 잘 작동합니다. 예를 들어, 전화 통화 중에 몇 초 동안 수신이 끊겼다면, 연결이 복구되었을 때 연결이 끊긴 동안 나누었던 대화는 들을 수 없습니다.

쓰기 작업 이후, 읽기 작업은 결국 해당 내용을 보게 됩니다 (통상적으로 밀리초 단위 이내). 데이터는 비동기적 (Asynchronously)으로 복제됩니다.

이러한 방식은 DNS 및 이메일과 같은 시스템에서 볼 수 있습니다. 최종 일관성 (Eventual consistency)은 고가용성 (Highly available) 시스템에서 잘 작동합니다.

쓰기 작업 이후, 읽기 작업은 해당 내용을 보게 됩니다. 데이터는 동기적 (Synchronously)으로 복제됩니다.

이러한 접근 방식은 파일 시스템 (File systems) 및 관계형 데이터베이스 관리 시스템 (RDBMSes)에서 볼 수 있습니다. 강력한 일관성 (Strong consistency)은 트랜잭션 (Transactions)이 필요한 시스템에서 잘 작동합니다.

고가용성 (High availability)을 지원하기 위한 두 가지 상호 보완적인 패턴은 **장애 조치 (Fail-over)**와 **복제 (Replication)**입니다.

액티브-패시브 (Active-passive) 장애 조치에서는 대기 중인 액티브 서버와 패시브 서버 사이에 하트비트 (Heartbeats)가 전송됩니다. 만약 하트비트가 중단되면, 패시브 서버가 액티브 서버의 IP 주소를 인계받아 서비스를 재개합니다.

다운타임 (Downtime)의 길이는 패시브 서버가 이미 '핫 (Hot)' 대기 상태로 실행 중인지, 아니면 '콜드 (Cold)' 대기 상태에서 시작해야 하는지에 따라 결정됩니다. 오직 액티브 서버만이 트래픽을 처리합니다.

액티브-패시브 장애 조치는 마스터-슬레이브 (Master-slave) 장애 조치라고도 불릴 수 있습니다.

액티브-액티브 (Active-active) 방식에서는 두 서버가 모두 트래픽을 관리하며, 부하를 서로 분산합니다.

만약 서버가 외부 공개형 (Public-facing)이라면, DNS가 두 서버의 공인 IP (Public IPs)를 알고 있어야 합니다. 만약 서버가 내부용 (Internal-facing)이라면, 애플리케이션 로직 (Application logic)이 두 서버를 모두 알고 있어야 합니다.

액티브-액티브 장애 조치는 마스터-마스터 (Master-master) 장애 조치라고도 불릴 수 있습니다.

  • 장애 조치는 더 많은 하드웨어와 추가적인 복잡성을 더합니다.
  • 새로 작성된 데이터가 패시브로 복제되기 전에 액티브 시스템이 실패할 경우 데이터 손실의 가능성이 있습니다.

이 주제는 데이터베이스 (Database) 섹션에서 더 자세히 다룹니다:

가용성 (Availability)은 종종 서비스가 사용 가능한 시간의 백분율로서 업타임 (Uptime, 또는 다운타임)으로 수치화됩니다. 가용성은 일반적으로 '9'의 개수로 측정됩니다. 예를 들어, 99.99%의 가용성을 가진 서비스는 '포 나인 (Four 9s)'을 가진다고 설명합니다.

기간허용 가능한 다운타임
연간 다운타임8h 45min 57s
...
기간허용 가능한 다운타임
------
연간 다운타임52min 35.7s
...

만약 서비스가 장애가 발생하기 쉬운 여러 구성 요소 (Components)로 구성되어 있다면, 서비스의 전체 가용성은 구성 요소들이 직렬 (In sequence)로 연결되어 있는지 또는 병렬 (In parallel)로 연결되어 있는지에 따라 달라집니다.

가용성이 100% 미만인 두 구성 요소가 직렬로 연결되면 전체 가용성은 감소합니다:

Availability (Total) = Availability (Foo) * Availability (Bar)

만약 FooBar가 각각 99.9%의 가용성 (Availability)을 가진다면, 직렬 연결 시 전체 가용성은 99.8%가 됩니다.

가용성이 100% 미만인 두 구성 요소가 병렬 (Parallel)로 연결되면 전체 가용성은 증가합니다:

Availability (Total) = 1 - (1 - Availability (Foo)) * (1 - Availability (Bar))

만약 FooBar가 각각 99.9%의 가용성 (Availability)을 가진다면, 병렬 연결 시 전체 가용성은 99.9999%가 됩니다.

출처: DNS 보안 발표 자료

도메인 네임 시스템 (Domain Name System, DNS)은 www.example.com과 같은 도메인 네임 (Domain Name)을 IP 주소 (IP address)로 변환합니다.

AI 자동 생성 콘텐츠

본 콘텐츠는 GitHub Trending Python (daily)의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.

원문 바로가기
0

댓글

0