---
description: Structural Pattern
---

# Facade Pattern

## Intro

* 일반적으로 비즈니스 로직은 구현 세부 정보와 밀접하게 결합되어 이해하고 유지 관리가 어렵다.
* 복잡하고 하위 시스템에 대한 간단한 인터페이스를 제공하는 기능이 필요
* 간단한 인터페이스는 클라이언트가 정말로 관심을 갖는 기능만을 말한다.

## 파사드가 제공하는 기능

* 인터페이스 또는 하위 시스템의 복잡성을 숨길 수 있는 기능 제공

## 파사드의 규칙

* Facade는 새 인터페이스를 정의하는 반면 Adapter는 이전 인터페이스를 사용한다.
* Adapter는 완전히 새로운 인터페이스를 정의하는 것과 반대로 두 개의 기존 인터페이스가 함께 작동하도록 한다.
* Adapter와 Facade는 서로 다른 종류의 래퍼이다.
  * Facade의 목적은 더 간단한 인터페이스를 생성하는 것이고, Adapter의 목적은 기존 인터페이스를 설계하는 것이다.
  * Facade는 일상적으로 여러 개체를 래핑하고, Adapter는 단일 개체를 래핑한다.
  * Facade는 하나의 복잡한 개체의 Front-end 역할을 할 수 있고, Adapter는 여러 레거시 개체를 래핑할 수 있다.
* Flyweight는 많은 작은 개체를 만드는 방법을 보여주지만 Facade는 단일 개체가 전체 하위 시스템을 나타내는 방법을 보여준다.
* Adapter와 Facade의 차이는 레거시 클래스 구조를 래핑하느냐의 차이가 아니라 의도로 구분할 수 있다.
  * Adapter: 하나 이상의 클래스의 인터페이스를 클라이언트가 예상하는 하나의 인터페이스로 변경하여 제공
  * Facade: 복잡한 인터페이스를 가진 단일 클래스에 대한 단순화 된 인터페이스 제공

### 체크 리스트

* 하위 시스템 또는 구성 요소를 위한 더 간단하고 통합된 인터페이스를 식별한다.
* 서브 시스템을 캡슐화하는 래퍼클래스를 디자인 한다.
* 파사드 / 래퍼는 구성 요소의 복잡성과 공동 작업을 캡처하고 적절한 메서드에 위임한다,
* 클라이언트는 Facade만 사용한다.
* 추가 `Facade` 가 가치를 더할 수 있는지 고려해야 한다.

### 파사드 패턴의 장점

* 파사드 패턴은 클라이언트가 모든 복잡한 하위 시스템 클래스를 처리할 필요가 없도록 보호하므로 하위 시스템과 클라이언트 간에 느슨한 결합이 생성된다.
* 요청이 많은 경우 파사드는 요청을 적절한 하위 시스템으로 전달하고 그 사이에 필요한 번역을 수행할 수 있다.

## Java API

* javax.faces.context.ExternalContext 클래스는 내부적으로 HttpSession, HttpServletRequest 및 기타 클래스를 사용한다.

## 주의사항

* 일반적으로 단일 파사드 객체가 필요하며 싱글톤으로 구현된다.
