구축을 위한 패턴들
개요
이 노트는 소프트웨어 및 시스템 구축 과정에서 반복적으로 등장하는 설계 패턴과 원칙을 다룬다. 단순한 코드 스니펫이 아닌, 구조적 사고를 가능하게 하는 추상화 수준의 패턴을 중심으로 정리한다.
핵심 통찰
패턴의 이중성: 명시적 패턴과 암묵적 패턴
표면적으로 드러난 설계 패턴(GoF, 아키텍처 패턴 등) 이면에는 문제를 바라보는 인식의 프레임이 숨겨져 있다. 진정한 패턴 리터러시는 “이 상황에서 어떤 패턴을 적용할까?”가 아니라 “이 상황이 본질적으로 어떤 패턴을 요구하고 있는가?”를 감지하는 능력이다.
패턴의 역설: 일반성과 특수성의 긴장
패턴은 일반적인 해결책을 제시하지만, 실제 적용은 항상 특수한 맥락에서 이루어진다. 이 긴장을 해소하는 방법은 패턴을 템플릿이 아닌 제약 조건(constraint)으로 바라보는 것이다. 패턴은 해결책을 제공하는 것이 아니라, 유효한 해결책이 만족해야 할 조건을 정의한다.
주요 패턴 분류
구조적 패턴
- 계층화 (Layering): 각 계층은 자신의 하위 계층만 알며, 상위 계층에 대해 알지 못함
- 파이프-필터 (Pipe-Filter): 데이터 흐름을 변환 단위로 분할
- 브로커 (Broker): 분산 컴포넌트 간 통신을 중개
행위적 패턴
- 이벤트 소싱 (Event Sourcing): 상태 변경을 이벤트 시퀀스로 저장
- CQRS (Command Query Responsibility Segregation): 명령과 조회의 책임 분리
- 사가 (Saga): 분산 트랜잭션을 로컬 트랜잭션의 연쇄로 관리
창발적 패턴
- 도메인 주도 설계 (DDD): 복잡한 도메인을 모델링하는 전략적 패턴
- 헥사고날 아키텍처: 핵심 비즈니스 로직을 외부 의존성으로부터 격리
- 마이크로서비스: 독립적 배포와 확장이 가능한 서비스 단위
패턴 선택의 기준
- 맥락 우선: 패턴을 먼저 정하고 문제에 맞추지 말 것
- 비용 인식: 패턴 도입에는 항상 복잡성 비용이 따름
- 진화 가능성: 패턴은 고정된 해결책이 아닌, 진화하는 프레임워크로 볼 것
- 팀 성숙도: 팀이 패턴을 이해하고 유지보수할 수 있는 수준을 고려