본문 바로가기
java

자바 백엔드에서 자주 사용되는 디자인 패턴 조합

by 포잉띠 2024. 7. 23.

1. 팩토리 + 싱글턴

팩토리 패턴과 싱글턴 패턴의 조합은 특히 객체 생성 로직이 복잡하거나, 인스턴스(객체)를 전역적으로 한 번만 생성하고 관리해야 할 떄 유용함.

팩토리 패턴을 사용해 객체 생성을 캡슐화하고, 이 팩토리 자체를 싱글턴으로 관리하여 애플리케이션 전역에서 하나의 팩토리 인스턴스(객체)만을 사용하게 할 수 있음.

 

팩토리를 싱글턴으로 관리함으로서 얻는 장점

  • 일관된 객체 접근
    • 모든 컴포넌트가 동일한 설정, 동일한 상태의 객체를 공유하게 하여 일관성을 유지할 수 있게 해줌
  • 자원의 효율적 사용
    • 객체 생성에 필요한 자원을 중복해서 사용하지 않아도 됨.
  • 설정과 구성의 중앙 관리
    •  구성 변경이 필요할 때 단일 위치에서 수정을 하면 그 영향이 애플리케이션 전체에 적용되기 때문에 관리가 용이함
  •  객체 생성 로직의 캡슐화
    • .생성 로직을 캡슐화하여 객체 사용자가 구체적인 클래스와 생성 로직에 대해 알 필요가 없도록 만듬.
    • 싱글턴 패턴과 결합되면, 이 캡슐화된 로직이 애플리케이션 전역에서 일관되게 사용됨.
  • 테스트와 유지보수
    • 테스트 환경에서도 동일한 객체 접근 방식을 사용할 수 있게됨
    • 팩토리 로직을 변경해야 할 경우 싱글턴 인스턴스의 코드를 수정하기만 하면 됨.
  • 의존성 주입과 호환성 
    •  의존성 주입 기법과 자연스럽게 통합 가능. 의존성 주입 컨테이너 내부에서 싱글턴 팩토리를 관리함으로써, 생성된 객체들이 필요한 의존성을 자동으로 주입받을 수 있음. .

 

 

2. 옵저버 + 전략

옵저버 패턴과 전략 패턴의 조합은 시스템에서 발생하는 이벤트에 대해 다양한 반응 방식을 유연하게 구현할 수있게 함.

이벤트를 감지하는 옵저버를 설정하고 발생된 이벤트에 따라 다른 전략( 전략 패턴이 아닌 내부 알고리즘 )을 실행할 수 있음.

이 조합 같은 경우 특히 이벤트 기반 시스템, 메시지 처리 시스템에서 유용하게 사용됨.

 

옵저버와 전략패턴을 함께 사용함에서 오는 이점

  • 응답성 향상
    • 시스템의 특정 부분이 변할 때마다 실시간으로 반응할 수 있음.
    • 이 부분은 시스템이 사용자의 행동이나 외부의 변경 사항에 빠르게 반응해야 하는 인터랙티브 애플리케이션에서 매우 중요한 부분.
  • 유연성과 확장성
    • 각 이벤트에 대해 다른 전략을 적용할 수 있기 때문에, 시스템을 더 유연하고 확장 가능하게 만듬. 새로운 이벤트 처리 전략을 추가하거나 기존 전략을 수정하는것이 편해짐.
    • 유지보수와 확장에 직접적인 영향 

3. 템플릿 메소드 + 데코레이터

템플릿 메소드 패턴은 알고리즘의 구조를 정의하고, 데코레이터 패턴을 통해 이러한 구조에 추가적인 기능을동적으로 첨가할 수 있음. 

이 조합은 기본적은 처리 과정은 유지하면서 실행 시점에 따라 추가 기능을 유연하게 확장할 필요가 있을 때 유용함

 

템플릿 메소드와 데코레이터를 함께 사용함에서 오는 이점

  • 템플릿 메소드로 정의된 알고리즘의 구조 안에서 데코레이터를 사용하여 동적으로 행동을 확장할 수 있음.
    • 동적으로 기능을 추가해야 할 때 : 템플릿 메소드 패턴으로 생성된 객체의 기능을 런타임에 데코레이터를 사용하여 확장할 수 있음. 이를 통해 고정된 로직에 유연성을 부여하고, 다양한 시나리오에 적용할 수 있음.
    • 알고리즘을 변형해야할 때 : 기본 알고리즘 구조는 그대로 유지하면서, 필요에 따라 특정 단계를 데코레이터를 통해 조정하거나 변경할 수 있음.
    • 기능의 재사용과 조합 시 : 템플릿 메소드를 사용하여 기본적인 알고리즘 흐름을 정의하고, 데코레이터를 통해 이 흐름에 다양한 기능을 추가함으로써, 코드의 재사용성을 높이고, 복잡한 기능의 조합을 가능하게 함. 

 

4. 의존성 주입 기법 + 팩토리

설정이나 조건에 따라 다른 객체를 생성하고 자동으로 의존성을 주입할 수 있음.

대규모 어플리케이션, 마이크로서비스 아키텍처에서 서비스의 설정이나 환경에 따라 다르게 동작해야 할 때 유용함.