본문 바로가기
카테고리 없음

생성 패턴 구조 클래스 행위 커뮤니케이션

by 디디이 2025. 6. 1.

디자인 패턴의 실무 적용 예시

디자인 패턴은 소프트웨어 설계에서 반복적으로 발생하는 문제를 해결하기 위한 검증된 해결책입니다. 유지보수가 용이하고 재사용 가능한 코드를 작성하기 위해 개발자라면 반드시 이해하고 활용해야 할 개념입니다. 본 글에서는 대표적인 디자인 패턴의 종류와 그 특징, 실무에서의 적용 예시를 중심으로 실질적인 활용법을 소개합니다.

생성 패턴: 객체 생성 과정을 추상화하기

생성 패턴(Creational Patterns)은 객체 생성 방식을 설계하는 데 초점을 맞춘 패턴으로, 시스템이 객체를 생성, 구성, 표현하는 방법을 추상화합니다. 이는 객체 생성을 단순화하고, 코드의 결합도를 낮춰 시스템의 유연성과 확장성을 높이는 데 도움이 됩니다. 대표적인 생성 패턴에는 다음과 같은 것이 있습니다:

  • 싱글톤 패턴(Singleton): 클래스의 인스턴스를 하나만 생성하도록 제한하고, 어디서든 동일한 인스턴스에 접근할 수 있게 합니다.
  • 팩토리 메서드 패턴(Factory Method): 객체 생성을 서브클래스에서 결정하게 하여, 클라이언트 코드가 구체 클래스에 의존하지 않도록 합니다.
  • 추상 팩토리(Abstract Factory): 관련 있는 여러 객체를 생성할 수 있는 인터페이스를 제공합니다.
  • 빌더 패턴(Builder): 복잡한 객체의 생성 과정을 단계별로 나눠 처리할 수 있게 하며, 다양한 구성 옵션이 있는 객체 생성에 유리합니다.
  • 프로토타입 패턴(Prototype): 기존 객체를 복제하여 새로운 객체를 생성하는 방식입니다.

이러한 생성 패턴은 객체 생성을 캡슐화하여 코드의 유연성과 유지보수성을 높이는 데 필수적인 역할을 합니다.

제가 만든 Node.js 기반 웹 서비스에서, 초반에는 요청마다 DB 커넥션을 새로 생성했는데, 비효율이 심하고 속도도 느려졌습니다.
이후 싱글톤 패턴으로 DB 커넥션 클래스를 구성해 단일 인스턴스를 공유하도록 바꾸니, 성능이 크게 향상됐고 관리도 쉬워졌어요.
코드도 훨씬 간결해졌고, 추후에 다른 서비스로 확장할 때도 해당 인스턴스만 주입하면 되니 유지보수성도 높아졌습니다.
이 경험 덕분에 “객체 생성을 어떻게 관리하느냐가 전체 시스템 품질에 직결된다”는 걸 실감했죠.

 

구조 패턴: 클래스와 객체의 관계를 정리하기

구조 패턴(Structural Patterns)은 클래스나 객체를 조합하여 더 큰 구조를 만들 때 사용되는 패턴입니다. 주로 코드의 유연성과 확장성을 높이기 위한 설계 구조를 제공합니다. 대표적인 구조 패턴은 다음과 같습니다:

  • 어댑터 패턴(Adapter): 호환되지 않는 인터페이스를 가진 클래스를 함께 사용할 수 있도록 변환기를 두는 패턴입니다.
  • 데코레이터 패턴(Decorator): 객체에 추가 기능을 동적으로 부여할 수 있는 패턴입니다.
  • 프락시 패턴(Proxy): 실제 객체에 대한 접근을 제어하는 대리 객체를 사용합니다.
  • 브리지 패턴(Bridge): 구현부와 추상화를 분리하여 독립적으로 확장할 수 있도록 합니다.
  • 컴포지트 패턴(Composite): 트리 구조로 구성된 객체들을 동일한 방식으로 처리할 수 있도록 합니다.

구조 패턴을 잘 활용하면 시스템 아키텍처가 훨씬 유연해지고, 기능 변경이나 확장 시에도 코드를 대폭 수정하지 않고 대응할 수 있습니다.

제 친구는 프리랜서로 쇼핑몰 백엔드를 구축했는데, 다양한 PG사(결제 모듈)를 연동해야 했습니다. 각 PG사마다 API 구조가 달라서 애를 먹었대요.
그래서 어댑터 패턴을 적용해서 내부 서비스는 동일한 processPayment() 인터페이스만 호출하게 만들고, PG사마다 어댑터 클래스를 따로 만들어 표준화했죠.
이 덕분에 새로운 PG사를 추가해도 어댑터 하나만 작성하면 되니, 시스템 구조가 깔끔하고 유연해졌다고 합니다.
“API 구조가 제각각일수록 어댑터 패턴은 필수”라는 말, 정말 실전에서 와닿더라고요.

 

행위 패턴: 객체 간의 커뮤니케이션 정리하기

행위 패턴(Behavioral Patterns)은 객체 간의 커뮤니케이션과 책임 분산에 중점을 둔 패턴입니다. 프로그램의 흐름을 제어하거나 객체 간 상호작용을 구조화할 때 유용합니다. 주요 행위 패턴은 다음과 같습니다:

  • 옵서버 패턴(Observer): 한 객체의 상태 변화가 다른 객체에 자동으로 전달되도록 하는 패턴입니다.
  • 전략 패턴(Strategy): 알고리즘을 객체로 캡슐화하고 동적으로 교체할 수 있도록 합니다.
  • 커맨드 패턴(Command): 요청을 객체로 캡슐화하여 취소, 저장, 재실행 등을 처리할 수 있습니다.
  • 상태 패턴(State): 객체의 내부 상태에 따라 행동을 바꾸는 패턴입니다.
  • 템플릿 메서드(Template Method): 알고리즘의 구조를 정의하고, 세부 단계는 서브클래스에서 구현하게 합니다.

행위 패턴을 통해 복잡한 제어 흐름을 정리하고, 코드의 가독성과 유지보수성을 높일 수 있습니다.

디자인 패턴은 단순한 코드 구조가 아니라, 문제 해결을 위한 전략입니다. 생성, 구조, 행위 패턴 각각의 개념과 활용 사례를 이해하고 나면 실제 개발에서 반복되는 문제에 효과적으로 대응할 수 있습니다. 지금부터 코드 작성 전에 패턴 적용을 고민해 보세요.

제 친구는 병원 예약 시스템을 개발하고 있는데, 예약이 생성되면 병원 관리자, 환자, 간호사에게 각각 다른 방식으로 알림을 보내야 했습니다.
그래서 형은 옵서버 패턴을 적용했어요. 예약 이벤트를 Subject로 만들고, SMS, 이메일, 관리자 대시보드 업데이트 등을 각각 옵서버로 등록했죠.
결과적으로 예약 로직은 그대로 두고, 알림 로직만 쉽게 추가하거나 제거할 수 있어서 유지보수나 기능 확장 시 훨씬 효율적이었다고 합니다.
이 사례처럼 행위 패턴은 복잡한 프로세스를 깔끔하게 정리해주는 도구가 됩니다.