소프트웨어 개발자/디자인패턴

[디자인 패턴] 구조 패턴 - Facade (파서드) 패턴

yubi5050 2024. 6. 8. 18:31

구조 (Structure) 패턴

구조 패턴 이란 객체 간의 상호 작용에 대한 구조적 관계를 명확히 정의하여, 코드의 유연성과 재사용성을 높이는 디자인 패턴

 

주요 패턴으론 다음 사항들이 있다.

  • 어댑터 (Adapter) 
  • 데코레이터(Decorator) 
  • 복합자(Composite) 
  • 파셔드(Facade) <- 이번 글에서 다룰 내용
  • 플라이웨잇(Flyweight)
  • 프록시(Proxy)
  • 브릿지(Bridge)

 

파서드 (Facade) 패턴 이란

복잡한 클래스 세트/하위 시스템에 대해 클라이언트 에게 단순화 된 인터페이스를 제공하는 구조적 디자인 패턴

아래 그림과 같이 안에는 복잡하지만, 최종 바깥 문 (=단순화된 인터페이스)를 제공하는 것

 

https://refactoring.guru/images/patterns/content/facade/facade-2x.png

 

주로 다음 경우에 많이 사용된다.

  • 복잡한 하위 시스템에 대한 제한적이지만 간단한 인터페이스가 필요한 경우
  • 하위 시스템을 레이어로 구성하려고 할 때, Facade를 사용

 

등장 배경

ex) 외부 라이브러리/프레임워크에 속하는 다양한 객체들을 사용하는 경우, 해당 객체를 모두 초기화 하고, 종속성을 추적해야 됨. 

여기서 종속성을 추적하는 것이란, 올바른 순서로 객체를 초기화해서 메서드를 실행했고, 라이브러리 코드 실행 간 논리상 문제가 될 만한 부분이 없는 지 등을 체크하는 것 

 

구조

  1. Client는 Facade 객체의 linksToSubSystemObjects를 통해 하위 서브 시스템 모듈에 접근한다.
  2. Facade는 기본적으로 어떤 요청에 어떤 서브시스템으로 보내야 하는지 알고 있다.
  3. Facade는 서브시스템 외에도 optionalAdditionalFacade() 함수를 통해 다른 Additional Facade로 연결할 수도 있다.

요약하면 클라이언트는 Facade를 통해 하위 시스템 객체들을 직접 호출하지 않는 다는 것

 

https://refactoring.guru/images/patterns/diagrams/facade/structure-2x.png

 

PseudoCode

VideoConvert 라는 Facade 객체가 있음

convertVideo라는 비디오 변환의 목적을 가진 함수가 호출되면, 하위의 다양한 Subsystem 과정 등을 거쳐야 함

 

 

다음 예제 Pseudo Code 처럼 서브 시스템의 복잡한 과정을 Video Converter 라는 Facade 객체로 감추고 쉽게 사용 될 수 있게 함

class VideoFile
class OggCompressionCodec
class MPEG4CompressionCodec
class CodecFactory
class BitrateReader
class AudioMixer

class VideoConverter
    method convertVideo(filename, format)
        file = new VideoFile(filename)
        if (format == "mp4")
            destinationCodec = new MPEG4CompressionCodec()
        buffer = BitrateReader.read(filename, sourceCodec)
        result = (new AudioMixer()).fix(result)
        return new File(result)

class Application is
    method main() is
        convertor = new VideoConverter()
        mp4 = convertor.convertVideo("funny-cats-video.ogg", "mp4")
        mp4.save()

 

 

장단점

장점

  • 하위 시스템의 복잡성으로부터 코드를 분리

 

단점

  • 파사드는 하나 둘 엮다 보면, 앱의 모든 클래스와 결합된 신(god) 객체가 될 수 있습니다.

 

다른 패턴과의 관계

vs (구조 패턴) Adapter

  • Adapter : 일반적으로 하나의 객체만 래핑 + 기존의 인터페이스를 사용 할수 있도록 맞추는 것
  • Facade : 객체의 전체 하위 시스템과 함께 작동하며, 기존 객체에 대한 새로운 인터페이스를 정의

 

vs (생성 패턴) Abstract Factory

  • 하위 시스템 개체가 생성되는 방식만 숨기려는 경우 Facade 의 대안으로 사용 가능

 

vs (구조 패턴) Flyweight

  • Flyweight : 작은 개체를 많이 만드는 방법을 보여주는 방법
  • Facade : 전체 하위 시스템을 나타내는 단일 객체를 만드는 방법

 

vs (구조 패턴) Mediator

  • Facade와 Mediator는 비슷한 역할로, 밀접하게 결합된 많은 (서브)클래스 간의 협업을 조직하는 역할을 수행
  • Facade : 서브시스템의 복잡성을 숨기고 단순한 인터페이스 제공 목적 (클라이언트가 Facade를 통해 서브시스템과 상호작용)
  • Mediator : 객체 간 복잡한 상호작용을 중앙 집중화 하여 단순화(only mediator) 하고, 의존성을 줄이고자 하는 목적 (객체들이 Mediator를 통해서만 상호작용)

 

vs 데코레이터, 어댑터, 퍼사드

  • 어댑터 : 하나의 인터페이스를 다른 인터페이스로 변환
  • 데코레이터 : 인터페이스는 바꾸지 않고, 책임(기능)만 추가
  • 퍼사드 : 인터페이스를 보다 간단하게 변경