시스템 디자인은 근본적으로 트레이드오프에 관한 것입니다 — 모든 것을 동시에 최적화할 수 없으므로, 좋은 디자인은 트레이드오프를 이해하고 구체적인 요구사항과 우선순위에 따라 의도적인 선택을 하는 것을 수반합니다. 트레이드오프를 잘 추론하는 것이 시스템 디자인의 본질입니다.
완벽한 디자인은 없다
모든 디자인 결정은 트레이드오프를 수반함 → 하나를 개선하면 종종 다른 것을 희생:
→ 일관성, 가용성, 성능, 비용, 단순함을 모두 동시에 최대화할 수 없음
→ "상황에 따라 다름" → 올바른 선택은 구체적인 요구사항과 우선순위에 달림
→ 시스템 디자인 = 보편적 "최고" 디자인 찾기가 아니라 정보에 입각한 트레이드오프 만들기.
흔한 트레이드오프
일관성 ↔ 가용성 (CAP) → 강한 일관성 vs 높은 가용성
LATENCY ↔ 일관성 → 캐싱/replication (빠르나 stale일 수 있음) vs 항상 최신
성능 ↔ 비용 → 더 많은 자원/캐싱은 돈이 듦
단순함 ↔ 확장성/유연성 → 모놀리스 (단순) vs 마이크로서비스 (확장 가능, 복잡)
읽기 ↔ 쓰기 최적화 → 비정규화 (빠른 읽기, 어려운 쓰기) vs 정규화
공간 ↔ 시간 → 미리 계산/캐시 (저장소 더, 계산 덜) vs 요청 시 계산
→ 이를 이해하면 의도적으로 선택 가능.
