//
요즘 개발자를 위한 시스템 설계 수업 · 디렌드라 신하, 테자스 초프라
책은 시스템 설계를 이렇게 정의한다.
특정 요구 사항을 이루기 위해 시스템의 아키텍처나 구성 요소, 인터페이스 및 기타 여러 특성을 정의하는 과정
정의 자체는 평범하지만, 여기서 눈여겨볼 단어는 "요구 사항을 이루기 위해"다. 설계는 아름다운 구조를 만드는 일이 아니라 주어진 요구 사항을 만족시키는 구조를 고르는 일이라는 관점이 책 전체를 관통한다.
용어를 두 단계로 구분해 두면 이후 논의가 편해진다.
| 용어 | 정의 |
|---|---|
| 소프트웨어 시스템 | 특정 작업을 수행하려고 함께 동작하는 컴포넌트, 모듈, 프로그램의 집합 |
| 분산 소프트웨어 시스템 | 여러 독립적인 컴포넌트/프로세스/노드가 서로 통신하며 하나의 공동 목표를 달성하는 시스템 |
분산 시스템의 구성 요소들은 원격 프로시저 호출(RPC), 메시지 전달(Message Passing), 발행/구독 모델(Publish/Subscribe) 같은 프로토콜로 소통한다. 그리고 분산 시스템이 되는 순간 요구 사항 목록에 확장성, 가용성, 장애 허용이 강제로 추가된다. 컴퓨팅 플랫폼, P2P 네트워크, 분산 데이터베이스, 콘텐츠 전송 네트워크(CDN)가 모두 이 범주에 들어간다.
책이 제시하는 설계 절차는 다음 여섯 단계다.
이 순서에서 중요한 것은 요구 사항 분석이 맨 앞에 있고, 데이터베이스 설계가 맨 뒤에 있다는 점이다. 실무에서는 테이블 스키마부터 그리기 시작하는 경우가 흔한데, 그러면 요구 사항이 스키마에 맞춰 왜곡된다. 이 절차는 그 유혹을 명시적으로 뒤로 미룬다.
이 6단계는 그대로 체크리스트로 만들어 두면 유용하다. 특히 코딩 에이전트에게 설계 작업을 위임할 때, "요구 사항을 먼저 정리하고 → 고수준 구조를 제안하고 → 그다음 API와 스키마를 뽑아라"는 순서를 프롬프트에 고정해 두면 결과물의 일관성이 크게 올라간다.
책은 시스템 설계를 두 층으로 나눈다. 이 구분은 설계 문서를 어느 해상도로 써야 하는지 판단하는 기준이 된다.
상위 수준에서 결정해야 하는 것은 네 가지다. 시스템 아키텍처, 데이터 흐름, 확장성, 장애 허용 시스템.
가장 먼저 아키텍처 패턴을 고른다. 요구 사항에 가장 적합한 패턴을 선택하는 것이 상위 수준 설계의 출발점이다.
| 패턴 | 특징 |
|---|---|
| 모놀리식(Monolithic) | 모든 구성 요소를 결합한 하나의 독립적인 애플리케이션 |
| 클라이언트-서버(Client-Server) | 클라이언트가 하나 이상의 서버에 서비스를 요청하는 분산 구조 |
| 마이크로서비스(Microservices) | 네트워크로 통신하는 작고 독립적인 여러 서비스로 구성된 모듈형 구조 |
| 이벤트 주도(Event-Driven) | 비동기 이벤트 또는 메시지로 구성 요소가 상호 작용하는 구조 |
패턴을 고른 다음에는 확장성, 유지 보수성, 신뢰성, 지연 시간의 관점에서 그 선택을 검증한다. 특히 지연 시간은 아키텍처 선택이 응답 시간과 성능에 미치는 영향을 뜻하므로, 마이크로서비스처럼 네트워크 홉이 늘어나는 구조에서는 반드시 따져봐야 한다.
데이터 흐름은 수집 → 저장 → 처리 → 검색의 네 단계로 나누어 각각을 설계한다. 확장성은 수직 확장과 수평 확장 중 무엇을 택할지의 문제이고(2장에서 자세히 다룬다), 장애 허용 시스템은 복제, 중복성, 점진적 성능 저하(Graceful Degradation), 모니터링, 자가 복구를 어떻게 배치할지의 문제다.
상세 설계의 주요 요소는 알고리즘, 데이터 구조, API, 코드 최적화다.
알고리즘에서는 시간 복잡도(입력 크기와 연산 횟수의 상관관계)와 공간 복잡도(입력 크기와 메모리 사용량의 관계), 그리고 둘 사이의 트레이드오프를 본다. 시스템 요구 사항과 제약에 따라 어느 쪽에 무게를 둘지가 달라진다.
데이터 구조는 데이터 접근 방식, 쿼리 성능, 메모리 사용량을 기준으로 고른다.
API 설계에서 책이 제시하는 네 가지 기준은 다음과 같다.
코드 최적화 기법으로는 리팩터링, 루프 언롤링(반복문을 개별 구문 여러 개로 대체해 반복 오버헤드를 줄이는 기법), 메모이제이션, 병렬 처리를 든다.
책은 시스템 설계를 올바르게 적용할 때의 이점을 일곱 가지로 정리한다. 요구 사항에 대한 명확한 이해, 협업 시너지 효과, 설계 검토 및 피드백, 높은 확장성, 성능, 유지 보수성, 비용 효율성.
이 목록에서 앞의 세 항목이 사람과 조직에 관한 것이라는 점이 흥미롭다. 설계 문서의 첫 번째 효용은 성능이나 확장성이 아니라, 여러 사람이 같은 그림을 보게 만드는 것이다. 설계를 명시적으로 문서화하면 검토와 피드백이 가능해지고, 그 과정에서 요구 사항의 빈틈이 드러난다.
1장은 이후 15개 장의 목차를 미리 펼쳐 보이는 장이다. 새로운 개념보다 용어와 절차를 정렬하는 데 목적이 있다.
읽으면서 가장 크게 남은 것은 6단계 설계 절차였다. 개념으로 알고 있던 순서를 명시적인 파이프라인으로 고정해 두면, 새 기능을 설계할 때마다 매번 처음부터 고민하지 않아도 된다. 상위 수준과 하위 수준을 구분하는 관점도 실용적이다. 설계 문서를 쓸 때 "지금 어느 해상도로 쓰고 있는가"를 자문하게 만들어, 아키텍처 다이어그램에 함수 시그니처가 섞여 들어가는 흔한 실수를 줄여 준다.
이 글이 도움이 되셨나요?