시스템 설계 요약 및 정리
📘 출처: 『요즘 개발자를 위한 설계 수업 1부 1장』
💡 시스템 설계란?
시스템 설계(System Design)는
소프트웨어 시스템의 아키텍처, 구성 요소, 인터페이스, 데이터 관리 전략을 효율적으로 정의하는 과정입니다.
좋은 설계는 다음을 가능하게 합니다:
- 사용자 경험 향상
- 보안 강화
- 개발 및 운영 비용 절감
- 개발 시간 단축
🧱 시스템 설계의 정의
- 소프트웨어 시스템의 아키텍처, 구성 요소, 인터페이스, 데이터 관리 전략을 포함
- 복잡한 프로세스를 자동화하고 성능을 최적화
시스템 설계란?
작업을 수행하기 위해 함께 동작하는 컴포넌트, 모듈, 프로그램의 집합
예) 데이터 관리, 트랜잭션 처리, 서비스 제공 등
설계 과정에서 고려해야 할 질문들:
- 어떤 언어로 개발할까?
- 어떤 에디터나 프레임워크를 사용할까?
- 테스트와 배포는 어떻게 할까?
- 유지보수는 어떤 방식으로 할까?
시스템 설계(System Design)는
소프트웨어 시스템의 아키텍처
🌐 분산 시스템 설계

목적
확장성, 가용성, 장애 허용성을 보장해야 하는 대규모 애플리케이션에서 활용
예)
- 클라우드 컴퓨팅 플랫폼 (AWS)
- P2P 네트워크
- 분산 DB
- CDN (Content Delivery Network)
특징
- 독립적인 컴포넌트, 프로세스, 노드로 구성
- 서로 통신하며 공동의 목표를 달성
- RPC (Remote Procedure Call)
- Message Passing (nats 사용 중이지만 휘발되는 메세지)
- Publish / Subscribe (예: Redis)
- 지리적으로 분산된 환경에서 동작
- 기능적 & 비기능적 요구사항을 모두 충족해야 함
⚙️ 시스템 설계의 기본 단계
- 요구사항 분석
**2. 상위 수준 아키텍처 설계
- 하위 수준 상세 설계**
- 사용자 인터페이스 설계
- API 설계
- 데이터베이스 설계
🏗️ 시스템 설계의 다양한 유형
1️⃣ 상위 수준의 아키텍처 설계
🔸 시스템 아키텍처
정의
- 시스템의 전체 구조와 구성 요소 간의 관계, 통신 방식을 정의
- 요구사항에 부합하는 적절한 아키텍처 선택이 핵심
유형
- 모노리식
- 클라이언트-서버
- MSA (Microservices Architecture)
- 이벤트 기반 아키텍처
💬 현재 우리 회사는 이 모든 구조를 일부씩 사용 중입니다.
고려 요소
- 확장성: 트래픽/데이터 증가 시 문제없이 기능 추가 가능한가?
- 유지보수성: 버그 수정, 성능 개선이 용이한가? (테스트 용이성 포함)
- 신뢰성: 장애 발생 시에도 안정적으로 동작하는가?
- 지연시간: 응답 속도 및 성능에 미치는 영향은?
🔸 데이터 흐름 설계
정의
- 데이터를 수집, 저장, 처리, 검색하는 전체 과정을 효율적으로 설계하는 것
고려 요소
- 수집: API / 실시간 스트리밍 / 배치 중 어떤 방식을 택할지
- 저장: 접근 빈도, 검색 성능, 데이터 일관성
- 처리: 변환, 분석, 요약 과정 중 지연이나 병목은 어떻게 해결할지
- 검색: 캐싱 전략, 요청 부하 대응 방법
🔸 확장성 (Scalability)
정의
- 성능 저하 없이 증가하는 부하를 처리할 수 있는 능력
유형
- 수직 확장 (Vertical Scaling): 서버 자원 증설
- 수평 확장 (Horizontal Scaling): 여러 서버로 분산 처리 (예: 클러스터)
🔸 장애 허용성 (Fault Tolerance)
정의
- 일부 구성 요소가 실패해도 전체 시스템이 정상 동작할 수 있는 능력
핵심 요소
- 복제 및 중복성
- 점진적 성능 저하 설계
- 모니터링 및 알림
- 자가 복구 메커니즘
2️⃣ 하위 수준의 상세 설계
목적: 성능, 메모리 사용, 코드 유지 보수성을 최적화하기 위한 설계
알고리즘
정의
- 계산, 데이터 처리, 문제 해결을 수행하는 단계별 절차
고려할 점
데이터 구조
정의
- 메모리에서 데이터를 구성하고 관리하는데 사용
- 시스템의 성능과 자원 사용에 영향을 미치는 요소
고려할 점
유형
- 배열, 연결 리스트, 해시 테이블, 그래프 etc
API
정의
- 시스템 내 여러 구성 요소 간 통신에 필요한 요소
고려할 점
코드 최적화
정의
- 코드의 성능, 가독성, 유지 보수정을 향상시키는 기법
구분
- 리팩토링, 루프 언롤링, 메모이제이션, 병렬ㄹ 처리
결론
좋은 시스템 설계란,
- 시스템의 성능, 확장성, 신뢰, 보안 요구 사항을 지키기 위한 설계
- 또한, 시간이 지나 변경된 요구 사항이나 실행 환경을 유연하게 대응하기 위함
시스템 설계의 중요성
- 설계를 진행하며 요구사항을 명확히 이해
- 설계를 하며 시스템의 핵심 기능, 성능, 보안 지침등을 고려하기 때문
- 이해 관계자와의 원활한 협업을 할 수 있게 해줌
- 피드백 과정이 용이 -> 확장성, 성능, 유지 보수성 보장
🧩 우리 팀의 현재 상태
보완이 필요한 부분
잘하고 있는 부분
- 하위 수준 설계 과정에 이해관계자들이 함께 참여하고 있음
→ 시스템 이해도와 협업 품질을 높이는 좋은 문화