본문 바로가기
Thinking/Concept

퍼사드 패턴(Facade Pattern) 이해하기

by Dev_카페인 2024. 11. 15.
반응형

퍼사드 패턴(Facade Pattern) 이해하기

퍼사드 패턴복잡한 서브시스템을 단순화하여 사용자가 간단한 인터페이스로 시스템을 사용할 수 있게 해주는 구조적 디자인 패턴입니다. 복잡한 모듈이나 서브시스템을 통합 관리하고, 사용자에게는 단순한 인터페이스를 제공하여 코드의 복잡성을 숨기는 것이 퍼사드 패턴의 주요 목적입니다.

이번 포스트에서는 퍼사드 패턴의 개념과 구조, 구현 방법, 장단점, 사용 시점 등을 구체적인 예제와 함께 살펴보겠습니다.

퍼사드 패턴이란?

퍼사드 패턴은 복잡한 서브시스템의 여러 클래스를 하나의 단순한 인터페이스로 감싸는 디자인 패턴입니다. 이를 통해 사용자는 복잡한 서브시스템 내부의 세부 구현을 알 필요 없이 단순한 메서드 호출을 통해 기능을 사용할 수 있습니다.

퍼사드 패턴은 특히 서브시스템이 많은 메서드나 클래스들로 이루어져 있고, 이를 일일이 직접 호출하기 어렵거나 불필요할 때 유용합니다. 퍼사드 패턴을 통해 코드의 복잡성을 줄이고, 서브시스템의 세부 사항을 클라이언트로부터 숨겨 더 깔끔한 코드 구조를 만들 수 있습니다.

 

퍼사드 패턴의 구조

퍼사드 패턴은 다음과 같은 구성 요소로 이루어집니다.

  1. Facade (퍼사드): 서브시스템의 복잡한 기능을 간단하게 사용할 수 있도록 단순화된 인터페이스를 제공하는 클래스입니다. 퍼사드는 클라이언트가 필요로 하는 기능을 메서드로 제공하고, 내부적으로 여러 서브시스템 객체의 메서드를 호출하여 작업을 수행합니다.
  2. Subsystem (서브시스템): 퍼사드가 감싸고 있는 서브시스템의 클래스들입니다. 각각 개별적으로 복잡한 기능을 가지고 있으며, 퍼사드는 이러한 서브시스템의 기능을 클라이언트가 쉽게 접근할 수 있게 합니다.
  3. Client (클라이언트): 퍼사드 패턴을 사용하는 사용자로, 퍼사드를 통해 서브시스템을 쉽게 이용할 수 있습니다.

퍼사드(Facade)

퍼사드 패턴의 구현 방법

예제 코드: 영화 관람 시스템 예제

영화 관람 시스템을 예로 들어, 영화 관람을 위해 티켓을 구매하고, 음료를 주문하고, 영화 상영을 준비하는 등의 복잡한 과정이 퍼사드를 통해 단순화되는 예제를 구현해보겠습니다.

// Subsystem 클래스들

public class TicketSystem
{
    public void PurchaseTicket(string movie)
    {
        Console.WriteLine($"Ticket for '{movie}' has been purchased.");
    }
}

public class SnackSystem
{
    public void OrderDrink(string drink)
    {
        Console.WriteLine($"Drink '{drink}' has been ordered.");
    }
}

public class MovieSystem
{
    public void StartMovie(string movie)
    {
        Console.WriteLine($"Movie '{movie}' is starting.");
    }
}

// Facade 클래스

public class MovieFacade
{
    private TicketSystem _ticketSystem;
    private SnackSystem _snackSystem;
    private MovieSystem _movieSystem;

    public MovieFacade()
    {
        _ticketSystem = new TicketSystem();
        _snackSystem = new SnackSystem();
        _movieSystem = new MovieSystem();
    }

    public void WatchMovie(string movie, string drink)
    {
        _ticketSystem.PurchaseTicket(movie);
        _snackSystem.OrderDrink(drink);
        _movieSystem.StartMovie(movie);
    }
}

// Client 코드

class Program
{
    static void Main()
    {
        // 퍼사드를 통해 영화 관람 절차를 단순화
        MovieFacade movieFacade = new MovieFacade();
        movieFacade.WatchMovie("Inception", "Cola");
    }
}

위 코드에서 TicketSystem, SnackSystem, MovieSystem은 각각 티켓 구매, 음료 주문, 영화 시작을 담당하는 서브시스템입니다. MovieFacade 클래스는 퍼사드로서, 각 서브시스템의 기능을 간단하게 사용할 수 있는 WatchMovie() 메서드를 제공합니다. 클라이언트는 MovieFacade 객체의 WatchMovie() 메서드를 호출하여 영화 관람 절차를 간단하게 진행할 수 있습니다.

출력 결과는 다음과 같습니다:

Ticket for 'Inception' has been purchased.
Drink 'Cola' has been ordered.
Movie 'Inception' is starting.

이 예제에서는 복잡한 영화 관람 절차가 퍼사드를 통해 단순화되었습니다. 클라이언트는 세부 절차를 알 필요 없이 WatchMovie() 메서드를 호출하기만 하면 됩니다.

 

퍼사드 패턴의 장단점

장점

  1. 복잡성 감소: 퍼사드를 통해 클라이언트가 복잡한 서브시스템을 간단하게 사용할 수 있어, 코드의 복잡성을 줄일 수 있습니다.
  2. 클라이언트 코드 보호: 퍼사드를 통해 서브시스템의 내부 구현을 캡슐화할 수 있어, 클라이언트가 서브시스템의 변경에 영향을 받지 않도록 보호할 수 있습니다.
  3. 서브시스템 간의 결합도 감소: 서브시스템과 클라이언트 간의 결합도를 낮춰, 더 유연하고 유지보수하기 쉬운 코드를 작성할 수 있습니다.

단점

  1. 추가 클래스의 복잡성: 퍼사드 클래스를 추가해야 하므로, 전체 클래스 구조가 다소 복잡해질 수 있습니다.
  2. 기능 확장의 제한: 퍼사드는 서브시스템의 모든 기능을 제공하지 않을 수 있어, 서브시스템의 특정 기능에 직접 접근해야 할 경우 한계가 있을 수 있습니다.
  3. 성능 문제: 퍼사드가 서브시스템의 모든 요청을 처리하는 경우, 요청이 많아질수록 퍼사드가 병목이 될 수 있습니다.

 

언제 퍼사드 패턴을 사용해야 할까?

퍼사드 패턴은 복잡한 서브시스템을 단순화하고, 클라이언트가 서브시스템의 세부 구현에 종속되지 않도록 할 때 유용합니다. 다음과 같은 경우에 사용하면 좋습니다.

  1. 복잡한 서브시스템이 있는 경우: 서브시스템이 여러 클래스와 메서드로 이루어져 있고, 이를 클라이언트가 단순하게 사용할 수 있도록 할 때.
  2. 클라이언트와 서브시스템 간의 결합도를 낮추고 싶을 때: 클라이언트가 서브시스템의 내부 구조나 동작 방식을 알지 않도록 캡슐화할 필요가 있을 때.
  3. 유지보수가 용이한 코드를 작성하고 싶을 때: 서브시스템의 변경이 클라이언트에 영향을 미치지 않도록 인터페이스를 제공하여 유지보수를 쉽게 할 수 있습니다.
  4. 테스트를 쉽게 하고자 할 때: 퍼사드를 통해 서브시스템의 사용이 단순해지므로 테스트가 용이해질 수 있습니다.

 

퍼사드 패턴과 관련 패턴 비교

퍼사드 패턴은 시스템의 복잡성을 숨기기 위한 패턴으로, 특히 어댑터 패턴, 프록시 패턴과 유사하지만 목적과 사용 방식이 다릅니다.

  • 어댑터 패턴: 기존 객체의 인터페이스를 클라이언트가 기대하는 인터페이스로 변환하기 위해 사용됩니다. 주로 호환성을 위한 변환에 집중합니다.
  • 프록시 패턴: 실제 객체에 대한 접근을 제어하기 위해 대리 객체를 사용하는 패턴으로, 원래 객체에 대한 접근 제어, 로깅, 캐싱 등의 목적으로 사용됩니다.
  • 퍼사드 패턴: 서브시스템의 복잡성을 숨기고, 단순화된 인터페이스를 제공하여 클라이언트가 서브시스템을 더 쉽게 사용할 수 있게 합니다.

따라서, 호환성이 필요할 때는 어댑터 패턴을, 접근 제어가 필요할 때는 프록시 패턴을, 복잡한 서브시스템을 단순화하고 싶을 때는 퍼사드 패턴을 사용하는 것이 적절합니다.

 

마무리하며

퍼사드 패턴은 복잡한 서브시스템을 단순화하고, 사용자에게 간단한 인터페이스를 제공하여 코드의 가독성과 유지보수성을 높이는 유용한 패턴입니다. 복잡한 클래스나 서브시스템을 포함하는 대규모 시스템에서 퍼사드 패턴을 활용하면 클라이언트가 복잡한 내부 구조를 알 필요 없이, 필요한 기능만을 간단히 사용할 수 있습니다.

대규모 서브시스템을 관리하고, 사용자에게 단순화된 인터페이스를 제공해야 하는 경우 퍼사드 패턴을 사용해보세요.

반응형