brunch

제24장: 패턴의 조합과 활용

조화로운 협주곡을 만들어내는 기술

by jeromeNa

오케스트라 공연을 생각해 보죠. 바이올린만으로는 아름답지만 단조로울 수 있고, 피아노 독주는 웅장하지만 때로는 차가울 수 있습니다. 하지만 현악기, 관악기, 타악기가 각자의 역할을 하면서도 조화를 이룰 때 감동적인 교향곡이 탄생합니다. 지휘자는 각 악기의 특성을 이해하고, 언제 어떤 악기가 주선율을 담당하고 언제 화음을 받쳐줄지 결정합니다.


소프트웨어 디자인 패턴도 마찬가지입니다. 지금까지 23개의 패턴을 개별적으로 살펴봤지만, 실제 소프트웨어는 여러 패턴이 조화롭게 결합되어 만들어집니다. 마치 요리에서 하나의 재료만으로는 완성된 요리가 될 수 없듯이, 복잡한 소프트웨어 시스템은 여러 패턴의 협주로 완성됩니다.


패턴 조합의 예술: MVC 아키텍처


예를 들어, 가장 대표적인 패턴 조합 사례는 MVC(Model-View-Controller) 아키텍처입니다. 웹 애플리케이션을 생각해 보면, 사용자가 "주문하기" 버튼을 클릭했을 때 여러 패턴이 동시에 작동합니다.


“옵서버 패턴 + 스트래티지 패턴 + 커맨드 패턴”의 조합이 일어납니다. View(화면)는 사용자의 클릭을 감지하고 Controller에게 알립니다(옵저버). Controller는 상황에 따라 다른 처리 방법을 선택하고(스트래티지), 구체적인 주문 처리 명령을 실행합니다(커맨드). Model은 데이터 변경을 View에게 통지하여(옵저버) 화면이 업데이트됩니다.


이처럼 패턴들이 서로 보완하며 더 강력한 구조를 만들어냅니다. 마치 바이올린의 선율을 첼로가 받쳐주고, 플루트가 장식음을 더하는 것과 같습니다.


전자상거래 시스템의 패턴 협주곡


실제 전자상거래 시스템에서는 어떤 패턴들이 조합될까요?


“싱글톤 + 팩토리 + 데코레이터 + 옵저버” 조합을 살펴보겠습니다. 결제 시스템 관리자는 싱글톤으로 구현하여 일관성을 보장하고, 다양한 결제 수단(신용카드, 페이, 가상계좌)은 팩토리 패턴으로 생성합니다. 기본 결제에 할인, 적립, 보험 등의 부가 서비스를 데코레이터로 추가하고, 결제 완료 시 재고 관리, 배송, 알림 시스템에 옵저버 패턴으로 통지합니다.


각 패턴이 독립적으로 작동하면서도 전체적으로는 하나의 완성된 시스템을 만들어냅니다. 싱글톤이 안정성을, 팩토리가 유연성을, 데코레이터가 확장성을, 옵저버가 반응성을 담당하는 것이죠.


패턴 선택의 지혜: 상황에 맞는 악기 선택


패턴을 선택할 때는 몇 가지 기준을 고려해야 합니다.


“복잡성 vs 필요성”: 간단한 프로그램에 복잡한 패턴을 적용하는 것은 대포로 참새를 잡는 격입니다. 10줄짜리 스크립트에 추상 팩토리를 적용할 필요는 없죠.


“변화의 빈도”: 자주 변경되는 부분에는 스트래티지나 브리지 패턴을, 안정적인 부분에는 싱글톤이나 템플릿 메서드를 적용합니다.


“성능 요구사항”: 메모리가 중요하면 플라이웨이트를, 처리 속도가 중요하면 프록시 패턴을 고려합니다.

“팀의 경험”: 팀원들이 이해하고 유지보수할 수 있는 수준의 패턴을 선택해야 합니다.


안티패턴: 조화를 해치는 불협화음


패턴을 잘못 사용하면 오히려 시스템을 복잡하게 만들 수 있습니다.


“골든 해머(Golden Hammer)”: 망치를 가진 사람에게는 모든 것이 못으로 보인다는 말처럼, 하나의 패턴만 계속 사용하는 실수입니다. 싱글톤만 알면 모든 것을 싱글톤으로 만들려 하죠.


“패턴 과잉”: 간단한 문제에 여러 패턴을 과도하게 적용하여 시스템을 불필요하게 복잡하게 만드는 경우입니다.


“잘못된 조합”: 서로 상충하는 패턴을 억지로 조합하려는 시도입니다. 예를 들어, 싱글톤과 프로토타입을 함께 쓰려하면 모순이 발생합니다.


패턴의 진화: 시대에 따른 변주


패턴은 고정된 것이 아닙니다. 클라우드 시대에는 마이크로서비스 아키텍처와 함께 새로운 패턴 조합이 등장했습니다. 서비스 간 통신을 위한 중재자 패턴, 장애 격리를 위한 프록시 패턴, 설정 관리를 위한 싱글톤 패턴이 새로운 방식으로 결합됩니다.


함수형 프로그래밍의 영향으로 전통적인 객체지향 패턴들도 새롭게 해석되고 있습니다. 스트래티지 패턴이 고차 함수로, 커맨드 패턴이 클로저로 표현되는 것처럼 말이죠.


결론: 조화로운 설계자가 되기 위해


디자인 패턴의 진정한 가치는 개별 패턴을 아는 것이 아니라, 상황에 맞게 적절한 패턴을 선택하고 조합하는 것에 있습니다. 이는 요리사가 재료의 특성을 이해하고 조화로운 요리를 만들어내거나, 지휘자가 각 악기의 특색을 살려 아름다운 교향곡을 연주하는 것과 같습니다.


중요한 것은 패턴에 얽매이지 않는 것입니다. 패턴은 목적이 아니라 수단입니다. 때로는 패턴을 사용하지 않는 것이 최선의 선택일 수도 있습니다.


좋은 설계자는 다양한 패턴의 레퍼토리를 가지고 있으면서도, 각 상황에서 진정 필요한 것이 무엇인지 판단할 수 있는 균형감각을 가진 사람입니다. 단순함과 복잡함 사이에서, 유연성과 안정성 사이에서 최적의 지점을 찾아가는 여정이 바로 소프트웨어 설계의 예술인 것입니다.




keyword