JAVA/JAVA Design Pattern

JAVA 퍼사드(Facade) 패턴, 복잡한 시스템을 단순화하는 방법

임베디드 친구 2024. 12. 27. 08:31
반응형

소프트웨어 개발 과정에서 시스템이 점점 복잡해질 때가 있습니다. 이런 경우 클라이언트가 시스템의 여러 구성 요소와 직접 상호작용하는 대신, 퍼사드(Facade) 패턴을 사용하여 단순하고 일관된 인터페이스를 제공할 수 있습니다.

오늘은 퍼사드 패턴에 대해 자세히 살펴보겠습니다. 클래스 다이어그램, 장단점, 실제 사례, 그리고 예제 코드를 통해 이해를 돕겠습니다.

퍼사드 패턴이란?

퍼사드(Facade) 패턴은 복잡한 시스템의 내부 구조를 숨기고 단순한 인터페이스를 제공하여 클라이언트가 쉽게 사용할 수 있도록 만드는 구조적 디자인 패턴입니다.

  • 복잡한 서브시스템들을 하나의 통합된 인터페이스로 감싸줍니다.
  • 클라이언트는 퍼사드 클래스와만 상호작용하면 됩니다.

이 패턴은 GOF 디자인 패턴 중 하나로, 시스템의 구조를 단순화하고 사용성을 개선하는 데 효과적입니다.


퍼사드 패턴 클래스 다이어그램

                         +------------------+
                         |     Client       |
                         +------------------+
                                  |
                                  v
                         +------------------+
                         |     Facade       |
                         +------------------+
                                  |
          -------------------------------------------------
          |                       |                       |
+----------------+       +----------------+       +----------------+
|   SubsystemA   |       |   SubsystemB   |       |   SubsystemC   |
+----------------+       +----------------+       +----------------+
| operationA()   |       | operationB()   |       | operationC()   |
+----------------+       +----------------+       +----------------+
  • Client: 퍼사드 클래스를 통해 시스템에 접근합니다.
  • Facade: 클라이언트와 서브시스템 간의 인터페이스를 제공합니다.
  • Subsystem: 실제 작업을 수행하는 클래스들입니다. 클라이언트는 이를 직접 호출하지 않습니다.

퍼사드 패턴의 장점

  1. 단순한 인터페이스: 복잡한 시스템을 단순화하여 사용자가 쉽게 접근할 수 있습니다.
  2. 결합도 감소: 클라이언트와 서브시스템 간의 의존성을 줄입니다.
  3. 유연한 확장: 시스템 변경 시 퍼사드 클래스를 통해 영향 범위를 최소화합니다.

퍼사드 패턴의 단점

  1. 추가 코드: 퍼사드 클래스를 추가로 만들어야 하므로 코드가 늘어날 수 있습니다.
  2. 서브시스템 의존: 퍼사드 패턴이 서브시스템에 지나치게 의존하면 퍼사드 클래스의 역할이 무거워질 수 있습니다.

퍼사드 패턴 실제 사례

  1. 컴퓨터 시스템 부팅: 컴퓨터를 켜면 CPU, 메모리, 하드디스크 등 다양한 하위 시스템이 동시에 작동하지만, 사용자는 전원 버튼만 누르면 됩니다.
  2. 호텔 서비스: 고객은 리셉션에 요청만 하면 다양한 호텔 서비스를 받을 수 있습니다.

예제 코드 (JAVA)

컴퓨터 시스템 부팅 예제를 퍼사드 패턴으로 구현해 보겠습니다.

// Subsystem 클래스들
class CPU {
    public void start() {
        System.out.println("CPU 시작...");
    }
}

class Memory {
    public void load() {
        System.out.println("메모리 로드...");
    }
}

class HardDrive {
    public void read() {
        System.out.println("하드 드라이브 읽기...");
    }
}

// Facade 클래스
class ComputerFacade {
    private CPU cpu;
    private Memory memory;
    private HardDrive hardDrive;

    public ComputerFacade() {
        this.cpu = new CPU();
        this.memory = new Memory();
        this.hardDrive = new HardDrive();
    }

    public void startComputer() {
        System.out.println("컴퓨터 시작 중...");
        cpu.start();
        memory.load();
        hardDrive.read();
        System.out.println("컴퓨터 시작 완료!");
    }
}

// Client 코드
public class FacadePatternExample {
    public static void main(String[] args) {
        ComputerFacade computer = new ComputerFacade();
        computer.startComputer();
    }
}

실행 결과

컴퓨터 시작 중...
CPU 시작...
메모리 로드...
하드 드라이브 읽기...
컴퓨터 시작 완료!

결론

퍼사드 패턴은 복잡한 시스템을 단순하게 사용할 수 있도록 도와줍니다. 시스템이 확장되거나 복잡해질수록 퍼사드 패턴을 사용하면 코드의 유지보수성가독성이 크게 향상됩니다.

위 예제와 같이 퍼사드 클래스를 도입하여 클라이언트가 복잡한 내부 구조를 몰라도 원하는 기능을 쉽게 사용할 수 있도록 구현해 보세요!

반응형