728x90
SMALL
인스타 릴스를 스크롤하거나, 유튜브 알고리즘에 이끌려다니거나, 쿠팡에서 쇼핑할 때 그 뒤에서는 어떤 일들이 벌어지고 있을까요?
각 서비스들은 클릭이나 새로고침 같은 간단한 사용자의 액션에도 서로 연결되어 있는 구성 요소들이 계속 작동하면서 사용자에게는 별일 없는 듯한 깔끔한 UX를 제공해주곤 합니다.
이런 서비스의 뒷편에는 System Design이라는 큰 개념이 자리 잡고 있습니다.
1. System Design이란?
- 시스템 설계(System Design)은 시스템의 여러 요소가 어떻게 상호 작용해서 기능적인 요구사항(무엇을 해야 하는지)과 비기능적인 요구사항(얼마나 잘 해야 하는지)을 모두 충족하는지를 정의하는 프로세스입니다.
- 여기서 가장 중요한 건 확장성, 안정성, 성능 및 비용의 발란스(?)을 맞추는 아키텍처 설계에 대한 결정을 내리는 것이라고 볼 수 있습니다.
실제 사례를 통한 비유 (높은 건물을 설계할 때)
제가 높은 빌딩을 설계하는 건축가라고 상상해 보겠습니다.
처음부터 바로 벽돌을 쌓을 수는 없으니, 설계를 위한 간단한 가정부터 해야 합니다.
- 몇 층짜리 건물을 지을까?
- 몇 명까지 들어갈 수 있어야 할까?
- 이 건물은 어떤 토지 위에 지어질까?
- 내진 성능은 어느 정도 되어야 하지?
이런 요구 사항들이 명확해지면 기초나 기둥, 전기 배선, 엘리베이터 등을 포함한 모든 것이 어떻게 구현되어야 하는지 보여주는 설계도를 작성하게 됩니다.
또 배관 시스템이 전기 배선에는 어떤 영향을 미칠 수 있는지와 같이 여러 시스템이 어떻게 상호 작용하는지도 고려해야 합니다. 향후 확장을 위한 계획(확장성)을 세우고 예상치 못한 문제가 발생하면 건물이 어떻게 대처할지(내결함성)도 생각해야 합니다.
- 위 비유를 SW에서 생각하면 다음과 같은 고려 사항들이 생길 것 같습니다.
- 아키텍처 - 시스템의 전체적인 구조를 생각. 시스템을 모놀리식 구조로? MSA로? 또는 이벤트 기반 시스템(EDA)으로?
- 인터페이스 - 이러한 구조 안에서 구성 요소들이 서로 통신하는 방식(예: REST API, gRPC)을 생각
- 데이터 - 데이터가 저장, 관리, 접근 및 일관성을 유지하는 방법을 생각
- 구성 요소/모듈 - 데이터베이스, 서버, 로드 밸런서, 캐시, 메시지 큐 및 API 등을 생각
2. System Design에서의 10가지 주요 질문
- 시스템 설계는 크게 보면 다음 10가지 질문에 답하는 것을 중심으로 이루어지게 됩니다.
- 확장성 - 시스템이 많은 수의 사용자 또는 요청을 동시에 어떻게 처리할까?
- 지연 시간 및 성능 - 응답 시간을 줄이고 부하 상태에서도 낮은 지연 시간 성능을 보장하려면 어떻게 해야 할까?
- 통신 - 시스템의 여러 구성 요소는 서로 어떻게 상호 작용할까?
- 데이터 관리 - 데이터를 효율적으로 저장, 검색 및 관리하는 방법은 무엇일까?
- 내결함성 및 신뢰성 - 시스템의 일부가 고장나거나 접근할 수 없게 되면 어떻게 될까?
- 보안 - 무단 접근, 데이터 유출, 서비스 거부 공격과 같은 위협으로부터 시스템을 어떻게 보호할 수 있을까?
- 유지보수성 및 확장성 - 시스템을 유지 관리, 모니터링, 디버깅하고 시간이 지남에 따라 발전시키는 것이 얼마나 쉽게 설계되어있을까?
- 비용 효율성 - 성능과 인프라 비용 사이의 균형을 어떻게 맞출 수 있을까?
- 관찰 가능성 및 모니터링 - 운영 환경에서 시스템 상태를 모니터링하고 문제를 진단하는 방법은 무엇일까?
- 법규 준수 및 개인정보 보호 - 관련 법률 및 규정(예: GDPR, HIPAA)을 준수하고 있을까?
3. 시스템의 주요 구성 요소

- 클라이언트/프론트엔드 - 사용자가 직접 상호 작용하는 시스템(예: 웹 브라우저, 모바일 앱)입니다. 정보를 표시하고, 사용자의 입력 값들을 수집하고, 백엔드와의 통신을 담당하곤 합니다.
- 서버/백엔드 - 시스템의 핵심 기능들을 처리합니다. 들어오는 요청을 처리하고, 비즈니스 로직을 실행하고, 데이터베이스나 서비스와 상호 작용하고, 클라이언트에 응답을 보냅니다.
- 데이터베이스/저장소 - 데이터를 저장하고 관리하는 역할을 합니다. 애플리케이션의 요구 사항에 따라 관계형 데이터베이스(SQL), 비관계형 저장소(NoSQL), 인메모리 캐시 또는 분산 객체 저장 시스템 등 다양한 형태로 가져갈 수 있습니다.
- 네트워킹 계층 - 이 계층에는 시스템의 여러 요소 간의 안정적이고 효율적인 상호 작용을 보장하는 로드 밸런서, API 및 통신 프로토콜과 같은 구성 요소가 포함됩니다.
- 타사 서비스 - 시스템의 기능을 확장하는 외부 API 또는 플랫폼입니다. 일반적인 예로는 결제 처리 서비스, 이메일 또는 SMS 알림 서비스, 인증 제공 업체, 분석 도구나 클라우드 기반 AI 서비스 등이 있습니다.
4. System Design의 프로세스
- System Design는 요구 사항을 이해하는 것부터 시작해서 세부적인 설계도를 완성하는 단계적인 과정입니다.
1단계 - 요구사항 수집 단계
- 모든 설계는 대화에서부터 시작됩니다. 다이어그램을 그리거나 기술을 선택하기 전에 시스템이 수행해야 할 기능을 이해하는 데 집중하는 게 중요합니다.
- 기능 요구사항(핵심 기능이나 Workflow)은 뭐가 있을까?
- 사용자는 누구이며, 초기 및 최종적으로 예상되는 사용자 수는 얼마나 될까?
- 기능 외 요구사항(확장성, 가용성, 지연 시간, 일관성)은 무엇일까?
- 제약 조건(예: 특정 기술, 예산 또는 규정 준수)이 있나?
- 예상되는 데이터 사용량과 트래픽 패턴은 어떻게 될까?
2단계 - 대략적인 추정 단계
- 다음은 시스템의 규모를 추정해 보는 단계입니다. 대략적인 수치를 통해서 설계 목표를 가늠할 수 있습니다.
- 데이터 크기(저장 공간 요구 사항)
- 대역폭 요구 사항
- 필요한 서버 또는 인스턴스 수
- 초당 쿼리 수(QPS) 또는 초당 요청 수(RPS)
- 이런 값들이 설계에서 결정을 내리는 데 도움이 될 수 있고, 설계가 현실적인 목표에 기반을 두고 있는지 확인하는 데 유용할 수 있습니다.
3단계 - High-level 설계 단계 (HLD)
- 이제 구축해야 할 시스템과 필요한 규모를 이해했으니, 시스템의 구성 요소와 그 구성 요소들이 어떻게 상호 작용하는지 시각화하는 단계로 넘어가보겠습니다.
- 주요 모듈 및 서비스
- 외부 종속성(예: 타사 API, 외부 데이터베이스)
- 이 사이의 데이터 흐름
- 이 단계에서는 시스템의 전체적인 모습을 보여주는 시스템 아키텍처를 그려보면 됩니다.
4단계 - 데이터 모델/API 설계
- 위 아키텍처가 명확해지면 데이터와 인터페이스에 더 집중할 시간이 됩니다.
- 적절한 DB 유형(관계형, NoSQL, 시계열 등)을 선택
- 스키마, 테이블 및 관계(ERD)를 정의
- 서비스 간 상호 작용을 위한 API를 설계 (예: POST, GET 요청)
5단계 - 상세 설계/심층 분석
- 각 구성 요소에 딥다이브 하는 시간입니다.
- 내부 로직, 캐싱 및 동시성 처리, 복제, 파티셔닝 및 내결함성 설계
- 스케일링 전략은 어떻게 할 것인지? (수평적 스케일링 vs 수직적 스케일링)
- 또한 이 부분에서는 가용성, 신뢰성 및 지연 시간과 같은 비기능적 요구사항(NFR)을 다뤄야 합니다.
- 다시 말해, 시스템이 무엇을 하는지에서 시스템이 어떻게 하는지로 넘어가는 것입니다.
6단계 - 병목 현상 및 트레이드 오프 파악
- 완벽한 시스템이라는 건 존재할 수 없고, 그래서 모든 선택에는 장단점이 있습니다.
- 시스템에 과부하가 걸렸을 때 어떤 부분에서 문제가 발생할 수 있을까?
- 캐싱이나 복제가 부하를 줄이는 데 도움이 될 수 있을까?
- 가용성을 높이기 위해 최종 일관성을 선택하는 것이 괜찮을까?
- 단일 실패 지점이 어디일까?
- 훌륭한 시스템 설계는 트레이드 오프를 없애는 것이 아니라, 트레이드 오프를 명확히 드러내고 근거를 세우는 것입니다.
7단계 - 검토, 설명 및 반복
- 마지막으로 설계 결정 사항을 확실히 설명할 수 있어야 합니다. 특정 선택을 한 이유와 그게 요구 사항을 어떻게 충족하는지 설명해야 합니다.
- 피드백에 열린 마음을 갖고, 약점을 보완하고, 설계를 다듬어볼 수 있습니다.
- 처음부터 모든 것을 완벽하게 할 필요는 없습니다. 중요한 건 새로운 통찰력이나 제약 조건들을 발견하면서 설계를 조정하고, 다듬고, 발전시키는 능력입니다.
5. 마무리
- 시스템 설계는 신뢰성, 확장성, 유지보수성이 뛰어난 소프트웨어를 구축하는 데 있어 가장 중요한 것 중 하나입니다.
- 소규모 웹 서비스을 설계하든 대규모 분산 플랫폼을 설계하든, 시스템 설계 원칙을 이해하면 더 나은 아키텍처 결정을 내릴 수 있고, 적절한 기술을 선택하고, 성능을 자신 있게 최적화할 수도 있습니다.
위 내용은 https://algomaster.io/ 의 내용을 학습하며 저의 나름대로 정리한 내용입니다.
728x90
LIST