ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 퍼사드 패턴(Facade Pattern)이란?
    Design Pattern/구조 디자인 패턴 2024. 4. 14. 15:58
    반응형

     퍼사드(Facade) 패턴은 객체 지향 프로그래밍에서 복잡한 시스템을 더 간단한 인터페이스로 제공하여, 서브시스템들의 의존성을 감소시키고 클라이언트와 서브시스템 간의 상호작용을 단순화하는 구조적 디자인 패턴입니다. 이 패턴은 하나의 통합된 인터페이스를 통해 서브시스템들을 더 쉽게 사용할 수 있도록 해 줍니다.

    1. 퍼사드 패턴은 주로 어디에 쓰이나?

     퍼사드 패턴은 복잡한 라이브러리나 프레임워크의 간소화된 인터페이스를 제공하는 데 주로 사용됩니다. 이는 클라이언트 프로그램이 시스템의 복잡성을 이해하지 않아도 되도록 하여 사용의 용이성을 보장합니다. 예를 들어, 복잡한 비디오 변환 라이브러리를 사용할 때, 퍼사드를 통해 사용자는 단순한 메서드 호출로 비디오 파일 형식을 변환할 수 있습니다.

    2. Java와 Go로 퍼사드 패턴을 구현할 때의 차이점

     Java에서 퍼사드 패턴은 주로 클래스와 인터페이스를 통해 구현됩니다. 객체의 상속과 다형성을 활용하여 더 강력한 타입 체크와 보안을 제공할 수 있습니다.

    Go에서는 인터페이스를 사용하여 퍼사드 패턴을 구현합니다. Go의 인터페이스는 묵시적으로 만족되므로, 사용자는 서브시스템을 더 유연하게 교체하거나 모의 객체로 대체하는 등의 작업을 쉽게 할 수 있습니다. 이는 특히 단위 테스트에서 유용합니다.

    3. 퍼사드 패턴 예시 (Java, Golang)

    Java:

    class VideoConverterFacade {
        private VideoFile file;
        private CodecFactory codecFactory;
        private CompressionCodec codec;
        
        public VideoFile convert(String fileName, String format) {
            file = new VideoFile(fileName);
            codec = codecFactory.extract(format);
            return new BitrateReader().read(file, codec);
        }
    }
    
    public class Client {
        public static void main(String[] args) {
            VideoConverterFacade converter = new VideoConverterFacade();
            VideoFile mp4Video = converter.convert("example.ogg", "mp4");
            System.out.println("Conversion completed.");
        }
    }

    Java 코드에서는 VideoConverterFacade 클래스를 사용하여 비디오 파일 변환의 퍼사드를 제공합니다. 이 클래스는 내부적으로 필요한 객체들을 생성하고 관리하여, 클라이언트가 복잡한 내부 구조를 몰라도 비디오 파일의 형식 변환을 요청할 수 있게 합니다.

    • VideoFile, CodecFactory, CompressionCodec: 이 객체들은 비디오 파일을 읽고, 적절한 코덱을 선택하고, 최종적으로 파일을 변환하는 데 필요한 컴포넌트입니다.
    • convert 메서드: 클라이언트가 호출하는 유일한 메서드로, 변환하고자 하는 파일 이름과 포맷을 인자로 받습니다. 이 메서드는 필요한 객체를 생성하고, 파일을 읽은 다음 적절한 코덱을 사용하여 변환을 수행합니다.

    Golang:

    type VideoConverter struct{}
    
    func (vc *VideoConverter) Convert(fileName string, format string) *VideoFile {
        file := NewVideoFile(fileName)
        codec := NewCodecFactory().Extract(format)
        return NewBitrateReader().Read(file, codec)
    }
    
    func main() {
        converter := VideoConverter{}
        mp4Video := converter.Convert("example.ogg", "mp4")
        fmt.Println("Conversion completed.", mp4Video)
    }

    Golang 코드에서는 VideoConverter 구조체를 통해 유사한 기능을 구현합니다. Go에서는 클래스가 없으므로, 구조체와 메서드를 사용하여 비슷한 기능을 제공합니다.

    • VideoConverter 구조체: 비디오 변환 기능을 감싸는 구조체입니다.
    • Convert 메서드: 이 메서드는 Java의 convert 메서드와 유사하게 작동합니다. 파일 이름과 포맷을 인자로 받아, 적절한 비디오 파일과 코덱 객체를 생성하고 변환을 수행합니다.

    공통점과 차이점

     두 예시 모두 퍼사드 패턴을 통해 클라이언트에게 복잡한 시스템의 간단한 인터페이스를 제공합니다. 차이점은 Java가 클래스와 객체 지향 특성을 사용하는 반면, Go는 구조체와 인터페이스를 사용하여 좀 더 유연하고 간결한 코드를 제공한다는 점입니다. 또한, Go의 구현 방식은 타입 시스템과 런타임 동작에서 Java보다 유연성을 제공하며, 이는 테스트와 유지보수에서 이점을 제공할 수 있습니다.

     

    4. 퍼사드 패턴의 장단점

    장점:

    • 복잡한 시스템에 대한 간단하고 이해하기 쉬운 인터페이스 제공
    • 시스템과 클라이언트 사이의 의존성 감소
    • 서브시스템의 변경 사항이 클라이언트에 미치는 영향 최소화

    단점:

    • 퍼사드 클래스가 너무 많은 책임과 작업을 수행하게 되면 퍼사드 자체가 시스템의 복잡성을 증가시킬 수 있음
    • 일부 클라이언트는 퍼사드를 통한 제한된 기능에 만족하지 못할 수 있음

    이러한 구조를 통해 복잡한 시스템을 효과적으로 관리하고 유지보수할 수 있으며, 퍼사드 패턴은 시스템의 복잡성을 내부에 숨기는 데 탁월한 방법을 제공합니다.

     

    반응형
Designed by Tistory.