# 대규모 시스템 설계의 지향점과 철학
# 1. 시스템 설계는 기술 문제가 아니라 구조의 문제다
시스템 설계를 이야기할 때 많은 사람이 먼저 떠올리는 것은 다음과 같다.
- 어떤 언어를 쓸 것인가
- 어떤 프레임워크가 좋은가
- 클라우드냐 온프레미스냐
- 마이크로서비스냐 모놀리스냐
하지만 대규모 시스템 설계에서 이런 질문은 대부분 2순위다.
진짜 중요한 질문은 이것이다.
이 시스템은 사람이 바뀌어도 동일하게 동작하는가?
시스템 설계의 본질은
“똑똑한 개발자를 뽑는 것”이 아니라 “똑똑하지 않아도 안전하게 운영되는 구조를 만드는 것”이다.
# 2. 시스템 설계의 궁극적 지향점
대규모 시스템 설계의 목표는 단순하다.
불확실성을 구조로 흡수하는 것
이를 조금 더 구체화하면 다음 세 가지로 수렴한다.
- 개인에게 의존하지 않는다
- 예측 가능하게 변화한다
- 실패해도 통제 가능하다
이 세 가지가 충족되지 않으면 시스템은 커질수록 리스크 증폭기가 된다.
# 3. 개인 의존 시스템의 전형적인 실패 패턴
대규모 장애의 원인을 추적해보면 기술적인 한계보다 다음 문제가 더 자주 등장한다.
- 특정 사람이 아니면 구조를 모른다
- 암묵적인 운영 규칙이 많다
- 문서보다 기억이 신뢰된다
- "그분이 원래 그렇게 하셨어요"라는 말이 나온다
이런 시스템은 규모가 커질수록 이렇게 변한다.
사람이 병목이 되고, 기억이 규칙이 되고, 실수가 장애가 된다.
시스템 설계의 첫 번째 목표는 이 의존성을 구조적으로 제거하는 것이다.
# 4. 소프트웨어 공학은 시스템 설계의 언어다
많은 사람이 묻는다.
“이건 소프트웨어 공학 영역인가요?”
정답은 그렇다다.
하지만 우리가 학교에서 배운 소프트웨어 공학은 종종 이렇게 축소된다.
- 폭포수 vs 애자일
- UML
- 테스트 기법
대규모 시스템 설계에서의 소프트웨어 공학은 다음 질문에 대한 답이다.
- 책임은 어디에 있는가?
- 변경은 어디까지 전파되는가?
- 실패는 어디서 차단되는가?
- 규칙은 코드인가, 사람인가?
즉,
구조를 통해 인간의 한계를 보완하는 학문
이게 시스템 설계 관점의 소프트웨어 공학이다.
# 5. 개인에게 의존하지 않는 구조의 핵심 원칙
# 5.1 규칙은 사람의 판단이 아니라 시스템에 존재해야 한다
- 접근 통제는 요청이 아니라 권한으로
- 배포는 결심이 아니라 파이프라인으로
- 장애 대응은 순발력이 아니라 절차로
사람이 판단할수록 편해지지만 시스템은 점점 예측 불가능해진다.
# 5.2 모든 흐름에는 통제 지점이 있어야 한다
대규모 시스템은 자유로운 구조가 아니다.
외부 요청
↓
[ 통제 지점 ]
↓
내부 시스템
2
3
4
5
- API Gateway
- Message Queue
- 승인 프로세스
- 배포 관문
통제 지점은 느리게 만드는 요소가 아니라 안전하게 만드는 요소다.
# 5.3 암묵적 지식은 반드시 제거해야 한다
- "원래 이렇게 해요"
- "보통 이 시간에 안 터져요"
- "이건 거의 안 써요"
이런 문장은 시스템 설계 실패의 신호다.
좋은 시스템은 이렇게 말한다.
"몰라도 됩니다. 구조가 막고 있습니다."
# 6. 예측 가능한 개발이란 무엇인가
예측 가능한 개발이란
변경의 영향 범위를 사전에 알 수 있는 상태다.
이는 속도와 반대 개념이 아니다. 오히려 대규모 시스템에서는 속도의 전제 조건이다.
# 6.1 변경은 항상 국소적이어야 한다
- 한 모듈 수정 → 전체 영향 ❌
- 한 경계 수정 → 명확한 영향 ⭕
그래서 대규모 시스템은 항상 경계를 만든다.
- 서비스 경계
- 데이터 경계
- 네트워크 경계
- 책임 경계
# 6.2 실패는 정상 상태여야 한다
대규모 시스템에서는
실패하지 않는 시스템 ❌ 실패를 전제로 설계된 시스템 ⭕
그래서 등장하는 개념들이 있다.
- Circuit Breaker
- Retry 정책
- Timeout
- Bulkhead
이건 기술 패턴이 아니라 실패를 통제하는 사고 방식이다.
# 7. 대규모 시스템 설계의 철학 한 문장
대규모 시스템 설계의 철학은 다음 문장으로 요약할 수 있다.
사람이 실수해도 시스템은 무너지지 않아야 한다.
그리고 한 문장이 더 붙는다.
사람이 바뀌어도 시스템의 성격은 유지되어야 한다.
# 8. 좋은 아키텍처의 결과물
좋은 시스템 설계는 다음 결과를 만든다.
- 새로운 사람이 와도 사고가 나지 않는다
- 장애의 원인이 추적 가능하다
- 변경이 두렵지 않다
- 운영이 개인의 역량을 넘지 않는다
이는 기술 선택의 문제가 아니라 설계 철학의 문제다.
# 9. 마무리
시스템 설계의 지향점
예측이 빗나가도 시스템이 버틸 수 있도록 만드는 일이다.
대규모 시스템 설계는 똑똑한 개인을 전제로 하지 않는다.
대신,
평범한 사람들이 실수하면서도 안정적으로 운영할 수 있는 구조를 만든다.
← LLM