Mobile & App Stack/Java Software Architecture & Patterns

퍼사드 패턴(Facade Pattern) 완벽 정리: 복잡한 시스템을 단순하게 만드는 마법

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

소프트웨어 시스템이 커질수록 우리는 수많은 클래스와 라이브러리에 둘러싸이게 됩니다. 클라이언트가 이 모든 복잡한 내부 동작을 일일이 알아야 한다면 사용법은 어려워지고 유지보수는 지옥이 될 것입니다. 이때 필요한 것이 바로 퍼사드 패턴(Facade Pattern)입니다.

오늘은 복잡한 시스템 전면에 서서 단순한 창구 역할을 수행하는 퍼사드 패턴에 대해 자세히 알아보겠습니다.

Generated by Gemini AI.


1. 퍼사드 패턴이란?

퍼사드(Facade)는 프랑스어로 '건물의 정면'을 뜻합니다. 건물의 복잡한 배선이나 배관을 알 필요 없이 정문으로 들어가면 되듯이, 이 패턴은 복잡한 서브시스템들의 인터페이스 집합에 대해 하나의 통합된 고수준 인터페이스를 제공합니다.

왜 사용하는가? (최소 지식 원칙)

이 패턴의 핵심은 "최소 지식 원칙(Law of Demeter)"을 지키는 데 있습니다. 클라이언트가 내부의 수많은 클래스(서브시스템)와 직접 관계를 맺지 않도록 하여, 시스템 간의 결합도를 낮추고 의존성을 줄여줍니다.


2. 퍼사드 패턴의 구조

퍼사드 패턴은 복잡한 서브시스템을 감싸는 단순한 Wrapper 역할을 합니다.

  • Facade: 서브시스템의 기능을 조합하여 클라이언트에게 단순화된 메서드를 제공합니다.
  • Subsystems: 실제 복잡한 비즈니스 로직을 수행하는 다양한 클래스들입니다.
  • Client: 서브시스템을 직접 호출하는 대신 Facade를 통해 원하는 기능을 수행합니다.

3. 퍼사드 패턴의 장단점

👍 장점

  • 낮은 결합도: 서브시스템의 내부 코드가 변경되어도 클라이언트 코드는 영향을 받지 않습니다.
  • 가독성 향상: 클라이언트는 단 하나의 메서드 호출만으로 복잡한 연쇄 동작을 실행할 수 있습니다.
  • 학습 비용 감소: 라이브러리 사용자가 내부 구조를 깊이 공부하지 않아도 기능을 즉시 사용할 수 있습니다.

👎 단점

  • 퍼사드 객체의 비대화: 시스템이 너무 복잡해지면 퍼사드 클래스 하나가 너무 많은 책임을 갖게 되어 '전지전능한 클래스(God Object)'가 될 위험이 있습니다.
  • 추가 계층 형성: 단순한 시스템에서는 오히려 관리 포인트만 늘어나는 오버헤드가 될 수 있습니다.

4. Java 구현 예제: 스마트 홈 부팅 시스템

외출 후 집에 돌아와 조명을 켜고, 에어컨을 가동하고, 음악을 재생하는 과정을 퍼사드 패턴으로 단순화해 보겠습니다.

Step 1. 복잡한 서브시스템 클래스들

Java
 
class Lighting {
    void on() { System.out.println("💡 조명을 켭니다."); }
}

class AirConditioner {
    void setTemperature(int temp) { System.out.println("❄️ 에어컨을 " + temp + "도로 설정합니다."); }
}

class AudioSystem {
    void playMusic() { System.out.println("🎵 편안한 음악을 재생합니다."); }
}

Step 2. Facade 클래스 구현 (복잡한 과정을 하나로)

Java
 
class SmartHomeFacade {
    private Lighting lighting;
    private AirConditioner ac;
    private AudioSystem audio;

    public SmartHomeFacade() {
        this.lighting = new Lighting();
        this.ac = new AirConditioner();
        this.audio = new AudioSystem();
    }

    // 클라이언트를 위한 단순한 인터페이스
    public void welcomeHome() {
        System.out.println("--- '귀가 모드'를 실행합니다 ---");
        lighting.on();
        ac.setTemperature(24);
        audio.playMusic();
        System.out.println("--- 실행 완료! 편안한 휴식 되세요 ---");
    }
}

Step 3. 클라이언트 코드

Java
 
public class Main {
    public static void main(String[] args) {
        // 클라이언트는 개별 가전기기 사용법을 몰라도 됩니다.
        SmartHomeFacade home = new SmartHomeFacade();
        
        // 버튼 하나로 모든 복잡한 동작 제어
        home.welcomeHome();
    }
}

5. 실무에서는 어떻게 쓰이나요?

  • 컴퓨터 부팅: 사용자가 전원 버튼(Facade)을 누르면 내부적으로 CPU, RAM, Disk가 순차적으로 구동되는 과정.
  • Spring Framework: 다양한 설정과 복잡한 DB 접근 로직을 단순하게 제공하는 여러 Template 클래스들.
  • API 통합: 여러 마이크로서비스(MSA)의 데이터를 모아서 하나의 결과로 제공하는 API Gateway 역할.

결론

퍼사드 패턴은 "단순함이 궁극의 정교함이다"라는 말을 가장 잘 보여주는 패턴입니다. 클라이언트에게는 편의를 제공하고, 개발자에게는 내부 로직의 자유로운 수정을 보장하는 이 패턴을 통해 더 깔끔한 아키텍처를 설계해 보세요!


포스팅이 도움이 되셨다면 공감과 구독 부탁드립니다! 디자인 패턴에 대해 더 궁금한 점이 있다면 댓글로 자유롭게 소통해요.

반응형