Hello

[디자인 패턴] - Facade

by 볼빵빵오춘기

Facade

복잡한 서브시스템(여러 클래스, 모듈 등)을 감싸고 있는 간단한 인터페이스를 제공해주는 디자인 패턴이다.

 

예시 코드 

// 복잡한 서브시스템
class CPU { void freeze() {} void execute() {} }
class Memory { void load(String data) {} }
class HardDrive { String read() { return "data"; } }

// Facade
class ComputerFacade {
    private CPU cpu;
    private Memory memory;
    private HardDrive hd;

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

    public void start() {
        cpu.freeze();
        memory.load(hd.read());
        cpu.execute();
    }
}

// Client
public class Client {
    public static void main(String[] args) {
        ComputerFacade computer = new ComputerFacade();
        computer.start();  // 복잡한 내부 호출을 간단하게
    }
}

 

Facade 패턴의 장점

복잡한 시스템 사용을 단순화

사용자 입장에선 필요한 것만 접근하면 된다.

 

캡슐화 향상

내부 구조를 숨기고, 외부에 꼭 필요한 것만 노출한다.

 

서브시스템 간 결합도 감소

서브시스템 변경 시, Facade만 수정하면 된다.

 

유지보수 용이

복잡한 의존성은 Facade가 관리하므로 수정이 쉽다.

 

Facade 패턴의 단점

기능이 너무 제한적일 수 있음

필요한 세부 기능이 숨겨져서 사용이 제한될 수도 있다.

 

남용 시 모든 로직이 Facade에 몰릴 수 있음

잘못 설계하면 Facade가 거대해질 수 있다. (고질적 단점)

 

서브시스템에 강하게 의존

내부 구현이 바뀌면 Facade도 바뀔 가능성 있다.

 

Facade 패턴은언제 사용하나?

복잡한 서브시스템을 단순하게 사용하고 싶을 때

ex) 복잡한 라이브러리나 API 래핑

 

의존성을 줄이고 싶을 때

클라이언트가 서브시스템을 직접 알지 않게 하기 위해 사용한다.

 

테스트/유지보수를 쉽게 하고 싶을 때

Facade만 Mock으로 대체해서 테스트 가능하다.

 

계층 간 경계를 명확히 하고 싶을 때

ex) Presentation → Facade → Service 구조

 

정리하자면

Facade 패턴은 복잡한 시스템을 감싸고 단순한 인터페이스만 제공하여 사용자가 쉽게 시스템을 다룰 수 있게 해준다.

블로그의 정보

Hello 춘기's world

볼빵빵오춘기

활동하기