CS/디자인패턴

[Design Pattern] Facade Pattern(퍼사드 패턴)

2024. 6. 5. 14:52
목차
  1. Facade Parttern이란?
  2. Facade Pattern을 쓰는 이유(==기존 개발 형태에 대한 문제점)?
  3. Facade Pattern(퍼사드 패턴) 구현 방법
  4. 1. 서브시스템(Sub-System) 
  5. 2. 퍼사드(Facade) 
  6. 3. 클라이언트(Client)
  7. Facade Pattern의 장단점
  8. 퍼사드 패턴의 실제 사용 사례

Facade Parttern이란?

복잡한 시스템이나 서브시스템을 단순하게 사용할 수 있는 인터페이스를 제공하는 구조적 디자인 패턴이다.

Façade는 프랑스어로 정면 외벽을 의미한다.

 

즉, 복잡한 내부 구조를 벽에 숨겨놓고 다 알지 않아도

단순하게 객체(인터페이스) 하나만으로도 시스템을 사용할 수 있게끔 도와주는 디자인 패턴이다.

 

Facade Pattern을 쓰는 이유(==기존 개발 형태에 대한 문제점)?

위키에도 올라와있는 예제(사용자가 퍼사드(컴퓨터)를 통해 컴퓨터 내부의 부품(CPU, HDD) 등을 접근한다는 내용의 추상적인 예제)를

퍼사드 패턴을 적용하기 전, 기존 개발 코드로 작성하면 어떨까? 다음과 같을 것이다.

 

서브 시스템을 구성하는 클래스들

public class CPU {
    public void freeze() {
        System.out.println("CPU is frozen");
    }

    public void jump(long position) {
        System.out.println("Jumping to position " + position);
    }

    public void execute() {
        System.out.println("Executing commands");
    }
}

public class Memory {
    public void load(long position, byte[] data) {
        System.out.println("Loading data to position " + position);
    }
}

public class HardDrive {
    public byte[] read(long lba, int size) {
        System.out.println("Reading data from LBA " + lba);
        return new byte[size];
    }
}

 

클라이언트가 직접 서브 시스템을 호출하는 방식

public class Client {
    public static void main(String[] args) {
        CPU cpu = new CPU();
        Memory memory = new Memory();
        HardDrive hardDrive = new HardDrive();

        // 클라이언트가 서브시스템의 모든 세부 사항을 직접 호출하고 관리
        cpu.freeze();
        byte[] data = hardDrive.read(0x2000, 512);
        memory.load(0x1000, data);
        cpu.jump(0x1000);
        cpu.execute();
    }
}

 

문제점

  1. 복잡성 증가:
    • 클라이언트가 서브시스템의 모든 세부 사항을 알아야 하므로 코드가 복잡해짐.
  2. 높은 결합도:
    • 클라이언트와 서브시스템 간의 결합도가 높다. 예를 들어, CPU, Memory, HardDrive 클래스가 변경되면 클라이언트 코드도 수정해야함.
  3. 유지보수 어려움:
    • 서브시스템의 변경이 클라이언트 코드에 영향을 미치므로 유지보수가 어려워짐.

Facade Pattern(퍼사드 패턴) 구현 방법

  1. 서브시스템(Sub-System) 클래스  
  2. 퍼사드(Facade) 
  3. 클라이언트(Client) 

1. 서브시스템(Sub-System) 

클래스 실제 작업을 수행하는 클래스들. 이 클래스들은 직접적으로 클라이언트에게 노출되지 않고, 퍼사드를 통해서만 접근됨.

public class CPU {
    public void freeze() {
        System.out.println("CPU is frozen");
    }

    public void jump(long position) {
        System.out.println("Jumping to position " + position);
    }

    public void execute() {
        System.out.println("Executing commands");
    }
}

public class Memory {
    public void load(long position, byte[] data) {
        System.out.println("Loading data to position " + position);
    }
}

public class HardDrive {
    public byte[] read(long lba, int size) {
        System.out.println("Reading data from LBA " + lba);
        return new byte[size];
    }
}

 

2. 퍼사드(Facade) 

복잡한 서브시스템의 여러 인터페이스를 단순한 하나의 인터페이스로 제공함. 

public 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 start() {
        cpu.freeze();
        memory.load(0x1000, hardDrive.read(0x2000, 512));
        cpu.jump(0x1000);
        cpu.execute();
    }
}

3. 클라이언트(Client)

퍼사드 객체를 통해 서브시스템의 기능을 사용함.

public class Client {
    public static void main(String[] args) {
        ComputerFacade computer = new ComputerFacade();
        computer.start();
    }
}

 

  • 서브시스템 클래스들: CPU, Memory, HardDrive 클래스들은 각각 복잡한 작업을 수행함.
  • 퍼사드 클래스: ComputerFacade 클래스는 서브시스템 클래스들을 캡슐화하고, 클라이언트에게 단순한 인터페이스를 제공해 줌.
  • 클라이언트: 클라이언트는 ComputerFacade를 통해 복잡한 서브시스템의 기능을 간단하게 사용할 수 있음.

 

다른 예제

내가 있는 현재 위치를 지도에서의 주소로 출력하기 위해서는 다음과 같은 기능들이 필요하다.

1. 내 위치를 가져오고,

2. 해당되는 위치가 지도상에서 어디인지 도로명이나 지번과 같은 문자열로 받아오고,

3. 받아온 문자열을 출력한다.

 

그럼 서브 시스템의 클래스는 다음과 같다.

// 1. 내 위치(위도, 경도)를 가져오는 것 
public class GeoLocation {
  public double[] getGeoLoc() { 
    double[] geoLoc = {0, 0};
    return geoLoc;
  }
}

// 2. 지도에서 해당 위치가 어디인지 문자열로 받아오는 것
public class InternetConnection {
  public void connect() {};
  public String getData(String url, Object param) {
    return "";
  }
  public void disconnect() {};
}

// 3. 받아온 문자열을 출력하는 것
import java.util.HashMap;
import java.util.Map;

public class Json {
  public Map<String, Object> parse(String str) {
    Map<String, Object> result = new HashMap<>();
    result.put("address", "서울시 개발구 객체동");
    return result;
  }
}

 

기존 클라이언트 코드

import java.util.Map;

public class OldPattern {
  public static void main(String[] args) {

    double[] myGeoLoc = new GeoLocation().getGeoLoc();

    InternetConnection conn = new InternetConnection();
    conn.connect();
    String data = conn.getData("https://주소_API_URL", myGeoLoc);
    conn.disconnect();

    Map<String, Object> address = new Json().parse(data);

    System.out.println(address.get("address"));
    // 서울시 개발구 객체동
  }
}

 

퍼사드 패턴

import java.util.Map;

public class MyLocFacade {

  public void printMyAddress () {
    double[] myGeoLoc = new GeoLocation().getGeoLoc();

    InternetConnection conn = new InternetConnection();
    conn.connect();
    String data = conn.getData("https://주소_API_URL", myGeoLoc);
    conn.disconnect();

    Map<String, Object> address = new Json().parse(data);

    System.out.println(address.get("address"));
  }
}

public class FacadePattern {
  public static void main(String[] args) {
    new MyLocFacade().printMyAddress();
    // 서울시 개발구 객체동
  }
}

 

Facade Pattern의 장단점

장점

  1. 사용성 향상:
    • 클라이언트가 복잡한 서브시스템을 쉽게 사용할 수 있도록 해줌.
  2. 결합도 감소(== 의존성 감소):
    • 클라이언트와 서브시스템 간의 결합도를 낮춰서, 시스템의 변경이 클라이언트에 미치는 영향을 줄여줌.
  3. 코드의 가독성 및 유지보수성 향상:
    • 코드의 가독성과 유지보수성을 향상시킴.

단점

  1. 추가된 추상화:
    • 퍼사드가 모든 기능을 제공하지 않을 수 있으며, 특정 기능을 사용하려면 여전히 서브시스템에 직접 접근해야 할 수도 있음.
  2. 복잡성 증가:
    • 시스템의 복잡도가 매우 낮은 경우, 퍼사드를 도입하면 오히려 복잡성이 증가할 수 있음.

 

퍼사드 패턴의 실제 사용 사례

  1. 라이브러리 및 프레임워크:
    • 복잡한 라이브러리나 프레임워크의 기능을 단순화된 인터페이스로 제공하여 사용성을 높임.
  2. API 디자인:
    • 복잡한 API를 단순화된 인터페이스로 제공하여, 개발자가 쉽게 사용할 수 있도록 함.
  3. 모듈화된 시스템:
    • 큰 시스템을 모듈화하고, 각 모듈의 복잡한 내부 구현을 감추기 위해 퍼사드를 사용함.

 

참조

https://www.youtube.com/watch?v=q3_WXP9pPUQ

 

반응형

'CS > 디자인패턴' 카테고리의 다른 글

[Design Pattern] Composite Pattern(컴포지트 패턴)  (0) 2024.06.06
[Design Pattern] Decorator Pattern(데코레이터 패턴)  (0) 2024.06.05
[Design Pattern] Proxy Pattern(프록시 패턴)  (0) 2024.06.03
[Design Pattern] Strategy Pattern(전략 패턴)  (0) 2024.06.02
[Design Pattern] Factory Pattern(팩토리 패턴)  (0) 2024.06.01
  1. Facade Parttern이란?
  2. Facade Pattern을 쓰는 이유(==기존 개발 형태에 대한 문제점)?
  3. Facade Pattern(퍼사드 패턴) 구현 방법
  4. 1. 서브시스템(Sub-System) 
  5. 2. 퍼사드(Facade) 
  6. 3. 클라이언트(Client)
  7. Facade Pattern의 장단점
  8. 퍼사드 패턴의 실제 사용 사례
'CS/디자인패턴' 카테고리의 다른 글
  • [Design Pattern] Composite Pattern(컴포지트 패턴)
  • [Design Pattern] Decorator Pattern(데코레이터 패턴)
  • [Design Pattern] Proxy Pattern(프록시 패턴)
  • [Design Pattern] Strategy Pattern(전략 패턴)
three von
three von
어려워 보이는 프로그래밍 언어를 쉽게 정복하는 블로그
LangEASY : 프로그래밍 언어를 쉽게 정복하는 공간어려워 보이는 프로그래밍 언어를 쉽게 정복하는 블로그
반응형
three von
LangEASY : 프로그래밍 언어를 쉽게 정복하는 공간
three von
전체
오늘
어제
  • 분류 전체보기 (89)
    • BackEnd (5)
    • JAVA (5)
      • 기초개념 (5)
    • 자료구조 & 알고리즘 (7)
      • 기초수학 (0)
      • 선형 자료구조 (4)
      • 비선형 자료구조 (1)
      • 알고리즘 (1)
    • CS (18)
      • 컴퓨터구조 (0)
      • 운영체제 (3)
      • 시스템 소프트웨어 (0)
      • 네트워크 (4)
      • 디자인패턴 (10)
    • 데이터베이스 (4)
    • Spring (4)
    • Project (2)
      • 팀프로젝트 (1)
      • 토이프로젝트 (1)
    • 회고 (0)
    • Git&Github (8)
    • IntelliJ (5)
    • 코테 (16)
      • 프로그래머스 (10)
      • 백준 (6)
    • BookStudy (12)
      • 스프링 부트 핵심 가이드 (12)
    • C++ (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • java heap 자료구조
  • 제로베이스백엔드스쿨
  • 개발자
  • 명령어변환
  • 인텔리제이에서 gitbash로 vi vim 에디터 사용하는법
  • 자바 자료구조 힙
  • 깃 이슈관리
  • 제로베이스백엔드스쿨미니과제
  • vi/vim에디터사용
  • windowcmd창
  • vi/vim
  • LiveTemplate사용
  • IntelliJ 자동화
  • 자바 선형자료구조
  • spring
  • githubTest
  • 자바 자바해시맵
  • 코테
  • github
  • 리눅스 명령어 윈도우 cmd창에서 가능
  • 백엔드 스쿨
  • 백엔드공부
  • Java
  • heap 자료구조
  • 백엔드스쿨
  • 윈도우에서 리눅스 명령어
  • 제로베이스
  • github이슈관리
  • 백엔드
  • InteliJ에서 gitbash사용

최근 댓글

최근 글

hELLO · Designed By 정상우.
three von
[Design Pattern] Facade Pattern(퍼사드 패턴)
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.