---
id: wiki-2026-0508-소프트웨어-아키텍처-설계
title: 소프트웨어 아키텍처 설계
category: 10_Wiki/Topics
status: verified
canonical_id: self
aliases: [Software Architecture Design, SW Architecture]
duplicate_of: none
source_trust_level: A
confidence_score: 0.9
verification_status: applied
tags: [architecture, design, software-engineering]
raw_sources: []
last_reinforced: 2026-05-10
github_commit: pending
tech_stack:
  language: agnostic
  framework: agnostic
---

# 소프트웨어 아키텍처 설계

## 매 한 줄
> **"매 architecture는 매 의사결정의 기록이며, 매 변경 비용을 결정한다"**. Bass/Clements/Kazman의 SEI 정의 이후, 매 architecture는 매 코드 자체가 아닌 매 component / connector / constraint의 집합으로 본다. 매 2026 modern view는 매 evolutionary architecture (Ford) — 매 fitness function 으로 매 architectural property 를 매 자동 검증.

## 매 핵심

### 매 4+1 View (Kruchten)
- **Logical**: 매 도메인 객체 / 책임 분배.
- **Process**: 매 runtime concurrency / 매 thread / 매 process.
- **Development**: 매 module / 매 package 구조.
- **Physical**: 매 deployment topology.
- **Scenarios (+1)**: 매 use case driven validation.

### 매 Quality Attributes (ISO/IEC 25010)
- **Performance**: latency, throughput.
- **Scalability**: horizontal / vertical 확장.
- **Availability**: SLA, MTBF, MTTR.
- **Security**: CIA triad.
- **Modifiability**: 매 변경 cost.
- **Testability**: 매 격리 가능성.

### 매 응용
1. C4 model 으로 매 stakeholder communication.
2. ADR (Architecture Decision Record) 으로 매 결정 추적.
3. Fitness function 으로 매 architectural drift 방지.

## 💻 패턴

### ADR template
```markdown
# ADR 0042: Adopt CQRS for Order service

## Status
Accepted (2026-05-10)

## Context
Read traffic 100x higher than write. Single Postgres table contention.

## Decision
Split into command (Postgres) + query (Read replica + Redis cache).
Event sourcing via Kafka.

## Consequences
+ Read scales independently.
- Eventual consistency window ~50ms.
- Two data models to maintain.
```

### Fitness function (ArchUnit, Java)
```java
@AnalyzeClasses(packages = "com.shop")
class ArchitectureTest {
    @ArchTest
    static final ArchRule domain_independent =
        noClasses().that().resideInAPackage("..domain..")
            .should().dependOnClassesThat().resideInAPackage("..infra..");

    @ArchTest
    static final ArchRule controllers_only_call_services =
        classes().that().resideInAPackage("..controller..")
            .should().onlyDependOnClassesThat()
            .resideInAnyPackage("..service..", "java..");
}
```

### C4 Container diagram (Structurizr DSL)
```
workspace {
    model {
        user = person "Customer"
        shop = softwareSystem "Shop" {
            web = container "Web App" "React" "TypeScript"
            api = container "API" "Spring Boot"
            db = container "Database" "PostgreSQL 16"
        }
        user -> web "Browses"
        web -> api "Calls" "REST/JSON"
        api -> db "Reads/writes" "JDBC"
    }
}
```

### Hexagonal Architecture (Python)
```python
# domain/order.py — pure
class Order:
    def confirm(self) -> "Order": ...

# application/ports.py
class OrderRepo(Protocol):
    def save(self, o: Order) -> None: ...

# infra/postgres_order_repo.py — adapter
class PostgresOrderRepo:
    def save(self, o: Order) -> None:
        self.conn.execute("INSERT ...")
```

### Event Storming output → bounded contexts
```
[Order Placed] → [Payment Authorized] → [Inventory Reserved] → [Order Confirmed]
   Order BC          Payment BC             Inventory BC           Order BC
```

## 매 결정 기준
| 상황 | Approach |
|---|---|
| 매 small team, simple domain | Modular monolith (Shopify-style) |
| 매 high read/write asymmetry | CQRS |
| 매 audit critical | Event sourcing |
| 매 polyglot / independent scaling | Microservices |
| 매 latency critical, ML inference | Service mesh + sidecar |

**기본값**: 매 modular monolith → 매 evidence 기반 매 split.

## 🔗 Graph
- 부모: [[아키텍처 패턴 지식]]
- 변형: [[Hexagonal Architecture]] · [[CQRS]] · [[Event Sourcing]]
- 응용: [[Microservices]] · [[Cloud_Native|Modular Monolith]]
- Adjacent: [[Domain-Driven Design]] · [[ADR]] · [[C4 Model]]

## 🤖 LLM 활용
**언제**: 매 ADR 초안 / 매 trade-off 분석 / 매 quality attribute scenario 생성.
**언제 X**: 매 production-grade fitness function 의 자동 작성 — 매 human review 필수.

## ❌ 안티패턴
- **Big design up-front**: 매 evolution 무시.
- **Architecture astronaut**: 매 abstraction layer 과잉.
- **Distributed monolith**: 매 microservice 의 분리 but 매 coupling 유지.
- **No fitness function**: 매 drift 매 silently.

## 🧪 검증 / 중복
- Verified (Bass/Clements/Kazman, *Software Architecture in Practice 4e*; Ford, *Building Evolutionary Architectures 2e*).
- 신뢰도 A.

## 🕓 Changelog
| 날짜 | 변경 |
|---|---|
| 2026-05-08 | Phase 1 |
| 2026-05-10 | Manual cleanup — 매 4+1, ADR, fitness function 패턴 추가 |
