Files
2nd/10_Wiki/Topics/02_Architecture_Principles/System Design.md
T
2026-05-02 16:24:15 +09:00

11 KiB

id, category, confidence_score, tags, last_reinforced
id category confidence_score tags last_reinforced
P-REINFORCE-WIKI-1390CA95 10_Wiki/💡 Topics/02_Architecture_Principles 0.95
system-design
microservices-architecture
event-driven-architecture
layered-architecture
atam-(architecture-tradeoff-analysis-method)
architecture-principles
2026-05-02

System Design

📌 Brief Summary

시스템 설계(System Design) 및 소프트웨어 아키텍처는 시스템의 다양한 구성 요소가 어떻게 결합하고 상호작용하는지를 보여주는 청사진이자 근본적인 구조적 결정을 내리는 과정이다 [1-3]. 이는 시스템의 성능, 확장성, 유지보수성, 보안 및 내결함성을 결정짓는 핵심 토대 역할을 한다 [4-6]. 초기 설계 단계에서의 선택은 이후 변경 비용이 매우 높기 때문에, 비즈니스 요구사항과 기술적 가능성을 종합적으로 고려한 전략적 의사결정이 필수적이다 [3, 7].

📖 Core Content

  • 시스템 설계의 정의 및 범위 시스템 설계(소프트웨어 아키텍처)는 시스템의 고수준 구조, 구성 요소(컴포넌트), 그리고 이들 간의 관계(커넥터)를 정의하는 작업이다 [1, 6, 8]. 이는 기능적 요구사항뿐만 아니라 시스템이 얼마나 잘 수행되는지를 결정하는 비기능적 요구사항(품질 속성)을 만족시키기 위한 인프라 설계를 포함한다 [9, 10]. 시스템 설계는 구현 세부 사항과 분리된, 시스템이 수행해야 할 작업과 그 방법에 대한 전반적인 비전을 제시한다 [11].

  • 핵심 목표 및 품질 속성(Quality Attributes) 훌륭한 시스템 설계는 모듈성, 캡슐화, 보안, 성능, 문서화를 보장해야 한다 [6]. 더불어 시스템의 확장성(Scalability), 유지보수성(Maintainability), 유연성(Flexibility), 신뢰성(Reliability)을 확보하여 급변하는 비즈니스 환경과 트래픽 부하에 대응할 수 있어야 한다 [12-15]. ISO 25010 표준과 같은 품질 모델은 기능 적합성, 성능 효율성, 호환성 등을 객관적으로 평가하는 기준이 된다 [15].

  • 설계 프로세스의 4단계 핵심 활동

    1. 아키텍처 분석(Architectural Analysis): 시스템이 운영될 환경을 이해하고 기능적/비기능적 요구사항(성능, 보안, 법적 제약 등)을 도출한다 [16, 17].
    2. 아키텍처 합성(Architectural Synthesis/Design): 요구사항을 바탕으로 아키텍처 패턴을 결정하고 구조를 설계한다 [18].
    3. 아키텍처 평가(Architecture Evaluation): 설계가 요구사항을 얼마나 잘 충족하는지 ATAM 등의 방법을 통해 평가하고 절충안을 찾는다 [18].
    4. 아키텍처 진화(Architecture Evolution): 변화하는 요구사항과 환경에 맞춰 기존 아키텍처를 유지보수하고 적응시킨다 [19].
  • 아키텍처 패턴과 디자인 패턴의 차이 아키텍처 패턴(Layered, Microservices, Event-Driven 등)은 시스템 전체의 거시적(Macro-level) 구조와 컴포넌트 간의 상호작용을 다루어 확장성이나 성능 등의 거시적 문제를 해결한다 [3, 20-22]. 반면, 디자인 패턴(Singleton, Observer 등)은 특정 컴포넌트나 클래스 내부의 미시적(Micro-level) 구조나 행동 문제를 해결하는 재사용 가능한 솔루션이다 [20, 22, 23].

⚖️ Trade-offs & Caveats

  • 절충(Trade-off)의 법칙 소프트웨어 아키텍처의 기본 법칙 중 하나는 "모든 것은 절충(Trade-off)이다"라는 점이다 [7, 24]. '완벽한 아키텍처'는 존재하지 않으며, 고도의 보안을 확보하면 응답 성능(Latency)에 손해를 볼 수 있고, 빠른 개발을 우선하면 향후 유지보수성이 저하될 수 있다 [24, 25].
  • 패턴 선택에 따른 제약과 부작용 시스템 설계 시 모놀리식 아키텍처를 선택하면 초기 개발과 배포가 단순하지만 시스템이 커질수록 확장성과 유지보수가 어려워진다 [26, 27]. 반면, 마이크로서비스 아키텍처(MSA)를 적용하면 확장성과 독립적 배포가 뛰어나지만 네트워크 지연, 최종 일관성(Eventual Consistency)에 따른 데이터 일관성 문제, 그리고 분산 시스템 관리를 위한 운영 복잡성이 크게 증가한다 [28-31].
  • 아키텍처 침식(Architecture Erosion) 초기 설계가 훌륭하더라도 시간이 지남에 따라 기술 부채가 축적되거나 의도된 아키텍처 원칙을 위반하면서 실제 구현과 아키텍처 간의 간극이 발생하는 '아키텍처 침식' 현상이 나타날 수 있다 [32]. 이는 시스템 성능을 저하시키고 유지보수 비용을 급증시킨다 [33].
  • 의사결정 안티패턴(Anti-patterns) 잘못된 선택을 두려워하여 결정을 미루는 현상이나, 결정 사항을 제대로 문서화(ADR)하지 않아 동일한 논의가 끝없이 반복되는 상황은 시스템 설계 단계에서 흔히 발생하는 안티패턴이므로 지양해야 한다 [34].

🔗 Knowledge Connections

[아키텍처 패턴 (Architectural Patterns)]

  • Microservices Architecture
    • 연결 이유: 대규모 시스템 설계 시 단일 애플리케이션을 작고 독립적인 서비스로 분할하는 가장 핵심적인 현대 아키텍처 접근법이다 [35, 36].
    • 이 개념을 통해 더 깊게 이해할 수 있는 부분: 분산 시스템에서의 독립적 배포, 개별 확장성, 장애 격리(Fault Tolerance) 원리 및 서비스 간 통신 복잡성을 이해할 수 있다 [28, 37, 38].
  • Event-Driven Architecture
    • 연결 이유: 컴포넌트 간 비동기 이벤트를 통해 소통하는 설계 방식으로, 실시간 처리와 고도의 확장성을 요구하는 시스템 설계에 필수적이다 [39, 40].
    • 이 개념을 통해 더 깊게 이해할 수 있는 부분: 느슨한 결합(Loose Coupling), 상태 변화에 따른 시스템의 비동기 반응, 브로커(Broker) 및 메디에이터(Mediator) 토폴로지의 구조적 차이를 학습할 수 있다 [41, 42].
  • Layered Architecture
    • 연결 이유: 가장 널리 사용되는 전통적인 패턴으로, 시스템을 수평적인 계층(예: 프레젠테이션, 비즈니스, 데이터)으로 나누어 설계하는 기본 구조이다 [43, 44].
    • 이 개념을 통해 더 깊게 이해할 수 있는 부분: 관심사의 분리(Separation of Concerns), 계층 간 격리 원칙, 그리고 모놀리식 시스템의 유지보수 및 테스트 방법론을 이해할 수 있다 [45-47].

[아키텍처 평가 및 관리 (Evaluation & Management)]

  • ATAM (Architecture Tradeoff Analysis Method)
    • 연결 이유: 시스템 설계가 비즈니스 및 품질 목표를 얼마나 잘 충족하는지 평가하는 표준 방법론이다 [18, 24].
    • 이 개념을 통해 더 깊게 이해할 수 있는 부분: 구체적인 시나리오를 바탕으로 아키텍처의 리스크, 민감도, 절충점(Trade-off points)을 식별하고 객관적으로 평가하는 실무 기법을 배울 수 있다 [24, 25].
  • ADR (Architecture Decision Record)
    • 연결 이유: 아키텍처 의사결정의 맥락, 결정된 사항, 거절된 대안 및 위험 요소 등을 기록하여 시스템 설계의 타당성을 남기는 핵심 문서화 기법이다 [34, 48].
    • 이 개념을 통해 더 깊게 이해할 수 있는 부분: 팀의 변동이나 시간이 지난 후에도 설계 결정을 추적 가능(Comprehensible)하게 유지하여, 아키텍처의 일관성을 보호하는 관리 방법을 파악할 수 있다 [48, 49].

Deeper Research Questions

  • 단일 모놀리식(Monolithic) 시스템에서 마이크로서비스(Microservices) 아키텍처로 마이그레이션할 때, 데이터베이스 분리와 도메인 분해(Decomposition)를 위해 고려해야 할 시스템 설계 원칙은 무엇인가?
  • 이벤트 기반 아키텍처(Event-Driven Architecture) 설계 시, 서비스 간 데이터의 '최종 일관성(Eventual Consistency)'을 보장하면서도 분산 트랜잭션의 복잡성을 관리하기 위한 Saga 패턴 등의 적용 전략은 어떠한가?
  • 대용량 데이터 및 트래픽 폭증이 예상되는 시스템 설계에서, 기존 관계형 데이터베이스의 병목을 해결하기 위한 Space-Based 아키텍처의 작동 원리와 한계는 무엇인가?
  • 조직의 구조가 소프트웨어 시스템의 설계 구조에 반영된다는 '콘웨이의 법칙(Conway's Law)'은 매크로 수준의 아키텍처 설계와 팀 구성에 어떤 영향을 미치는가?
  • 소프트웨어 아키텍처 침식(Erosion) 현상을 초기에 진단하고 이를 방지하기 위해, CI/CD 파이프라인과 정적 코드 분석 등 자동화된 개발 프로세스를 어떻게 설계에 통합해야 하는가?

Practical Application Contexts

  • Implementation: 개발자는 시스템 설계 단계에서 확정된 아키텍처 패턴(예: 헥사고날 아키텍처의 포트와 어댑터)에 따라 코드베이스 구조를 짜고, 비즈니스 로직과 외부 인프라스트럭처(DB, UI 등) 간의 의존성을 엄격히 격리하여 구현한다 [50, 51].
  • System Design: 소프트웨어 아키텍트는 비즈니스 목표(예: 빠른 타임 투 마켓, 대규모 트래픽 수용)와 제약 사항을 바탕으로, 모놀리식, 마이크로서비스, 또는 서버리스 등 거시적 아키텍처를 결정하고 시스템의 논리적, 물리적 인프라 청사진을 도출한다 [2, 52-55].
  • Operation / Maintenance: 설계된 아키텍처는 시스템 운영 및 장애 복구 능력에 직결된다. 분산된 마이크로서비스 기반 시스템에서는 각 서비스별로 독립적 확장이 가능하나, 운영 복잡성을 낮추기 위해 서킷 브레이커, 분산 로깅 및 트레이싱과 같은 관측성(Observability) 도구가 필수적으로 병행 운영되어야 한다 [31, 56, 57].
  • Learning Path: 시스템 설계 학습은 기초 컴퓨터 과학 및 객체 지향 원칙 이해 -> 디자인 패턴(클래스/객체 단위) 습득 -> 전통적인 N-Tier 계층형 모놀리식 아키텍처 구현 -> MSA 및 EDA와 같은 분산 시스템 설계 패턴 탐구 -> 시스템 성능 평가 및 절충 분석(ATAM) 역량 확보의 단계로 진행된다.
  • My Project Relevance: 현재 진행 중인 프로젝트의 팀 규모, 예산, 예상 트래픽을 평가하여 초기에는 비용과 개발 속도가 유리한 모듈형 모놀리스(Modular Monolith)나 계층형 구조로 시작하고, 서비스가 성장함에 따라 병목이 발생하는 도메인만 점진적으로 마이크로서비스나 서버리스로 분리하는 실용적인 기술 전략을 수립하는 데 적용할 수 있다 [58-62].

Adjacent Topics

  • Design Patterns
    • 확장 방향: 아키텍처 패턴이 시스템 전반의 뼈대와 컴포넌트 간 통신을 다룬다면, 디자인 패턴은 그 하위 레벨에서 특정 모듈 내 객체의 생성, 구조, 행위와 관련된 구체적인 구현 문제(예: Singleton, Factory, Observer)를 해결하는 기법으로 확장 학습할 수 있다 [20-22].
  • Domain-Driven Design (DDD)
    • 확장 방향: 복잡한 시스템 설계 시 비즈니스 도메인을 모델링하고 '바운디드 컨텍스트(Bounded Context)'를 식별하는 방법을 학습하여, 마이크로서비스나 헥사고날 아키텍처의 서비스 경계를 올바르게 나누는 핵심 기준을 확보할 수 있다 [63-65].

Last updated: 2026-05-02