퍼사드 패턴(Facade pattern, Singletone Abstract Factory, 싱글톤 추상 팩토리)
- GOF에 따르면 퍼사드 패턴은 "하위 시스템의 인터페이스 세트에 일관된 인터페이스를 제공하는 것"
- 하위 시스템의 복잡도를 감추는 동시에 그 전체 기능을 사용하기 쉬운 인터페이스로 제공한다.
실생활에서 퍼사드 패턴의 예시
- 세탁기
- 찌든 때, 에벌 빨래 두 가지 모드가 있다.
- 두 모드에 따라 세탁 방법이 다른다.
- 세제 투입량, 물 온도, 탈수시간 등등
- 위와 같은 잡다한 정보를 인터페이스 내부에 두고 두 가지 세탁 모드만 제공한다.
- 사용자는 복잡한 생각 없이 모드만 선택하면된다.
퍼사드 패턴을 쓰는 경우
- 레거시 백 엔드 시스템에 단일 접근 창구를 제공한다.
- 클래스에 드라이버 같은 API를 만든다.
- 거시적으로 서비스에 접근하는 창구를 만든다.
- 네트워크 호출을 줄인다. 퍼사드는 하위 시스템에 여러 차례 호출하는 반면 원격 클라이언트는 퍼사드를 한 번만 호출한다.
- 보안과 단순함 측면에서 애플리케이션 내부 상세 및 실행 흐름을 캡슐화한다.
퍼사드 패턴 적용 예시
<hide/>
public class WashingMachine {
int temperature;
int washTemperature;
int washCycleDuration;
int spinCycleDuration;
boolean detergentYn;
boolean bleachYn;
boolean softenerYn;
boolean heatWaterYn;
boolean startWashYn;
private void setWaterTemperature(int temperature) {
this.temperature = temperature;
}
private void setWashCycleDuration(int washCycleDuration) {
this.washCycleDuration = washCycleDuration;
}
private void setSpinCycleDuration(int spinCycleDuration) {
this.spinCycleDuration = spinCycleDuration;
}
private void addDetergent() {
detergentYn = true;
}
private void addBleach() {
bleachYn = true;
}
private void addSoftener() {
softenerYn = true;
}
private void heatWater() {
heatWaterYn = true;
}
private void setStartWash() {
startWashYn = true;
}
// 1. 찌든때 세척 모드
public void heavilySoiled() {
setWaterTemperature(100);
setWashCycleDuration(90);
setSpinCycleDuration(10);
addDetergent();
addBleach();
addSoftener();
heatWater();
setStartWash();
}
// 2. 에벌 빨래 모드
public void lightSoiled() {
setWaterTemperature(40);
setWashCycleDuration(20);
setSpinCycleDuration(10);
addDetergent();
heatWater();
setStartWash();
}
}
- new WashingMachine.ligntSoiled() .. 처럼 호출해서 에벌 빨래 가능하다.
- 메서드만 호출하면 빨래 돌릴 수 있다.
- 메서드 구현체는 클라이언트와 완전히 분리되어 있으므로 구현체를 바꿔도 세탁 서비스에 접근하는 클라이언트에는 아무런 영향이 없다.
퍼사드 패턴의 장점
- 클라이언트가 하위 시스템을 알 필요가 없어서 결합도가 낮아진다.
- 코드 변경 시, 유지 보수성의 관리성이 좋아진다.
- 재사용하기 쉽다.
- 일관성 보장
- 연관된 메서드를 하나로 묶어 호출하니까 로직이 덜 복잡
- 보안, 트랜잭션 관리를 중앙화(centralization)한다.
- 테스트할 수 있고 목(mock)을 쓸 수 있는 패턴으로 구현한다. => 테스트를 더 유연하게
- 어떤 객체를 주입 받아야 mock 으로 사용 가능하다.
- Ex) A 클래스, 1번 메서드
- 1번 안에 복잡하다고 가정
- a클래스를 mock 객체로 대체한다.
- given() 어떤 메서드 실행시 정해진 어떤 데이터 나오도록 가정한다.
- mock으로 퉁침
- => A 클래스가 퍼사드 패턴
- 복잡한 로직을 상위 레벨에서 캡슐화하고 접근 지점을 명확하게 단일화해서 API를 통해서만 접근 가능하도록 유도한다.
정리
- POJO 또는 stateful/stateless 세션 빈으로 구현 가능하다.
- 퍼사드를 stateful 세션 빈으로 구현할 때는 리소스가 바닥나지 않도록 주의
- 퍼사드 패턴을 과용하면 레이어가 늘어나서 복잡한 시스템이 되니까 주의
출처 - Java EE 디자인패턴 - 무라트 예네르, 알렉스 사돔 (길벗)
'디자인 패턴 (Design Pattern)' 카테고리의 다른 글
[구조 패턴] 프록시 패턴(Proxy pattern) (0) | 2023.03.13 |
---|---|
[구조 패턴] 데코레이터 패턴(Decorator pattern, 장식자) (0) | 2023.03.12 |
[행동 패턴] 커맨드 패턴(Command Pattern, 명령 패턴) (0) | 2023.02.27 |
[행동 패턴] 템플릿 메서드(Template Method) (0) | 2023.02.27 |
[행동 패턴] 전략 패턴(Strategy Pattern) (0) | 2023.02.27 |