'디자인 패턴 중 하나인 퍼사드 패턴(Facade Pattern) 개념과 예시'
***
'Facade'는 프랑스어 'Façade'에서 유래된 단어로 건물의 출입구로 이용되는 정면 외벽 부분을 가리키는 말로 '건물의 정면'을 의미합니다.
Facade Pattern의 목적은 복잡한 서브 시스템을 인터페이스로 감싸서 사용하기 쉽게 만드는 것인데요. 객체 지향 프로그래밍 분야에서 많이 사용되며, 제3의 API(Third Party API) 같은 외부 라이브러리를 추상화하는데도 사용됩니다.
Gof(Gang of Four)에 따르면 Facade 패턴은 "하위 시스템을 보다 쉽게 사용할 수 있게 해주는 고급 인터페이스"로 정의되어 있습니다.
퍼사드 패턴은 디자인 패턴(Design Patterns) 중에서도 구조 패턴(Structural Patterns)에 속하며 구조 패턴이란 '클라스나 객체를 조합하여 더 큰 구조를 만드는' 패턴입니다.
서로 다른 인터페이스를 지닌 2개의 객체를 묶어 단일 인터페이스를 제공하거나 객체들을 서로 묶어 새로운 기능을 제공할 수 있습니다.
퍼사드를 제외한 6개의 구조패턴
(Adapter Pattern, Bridge Pattern, Composite Pattern, Decorator Pattern, Flyweight Pattern, Proxy Pattern)
***
Facade Pattern은 Adapter Pattern과 비슷하여 비교되고는 하는데요. 퍼사드 패턴과 어댑터 패턴은 거의 같은 방식으로 작동하지만 서로 다른 목적을 가지고 있습니다.
'Adapter Pattern'
간략하게만 알아보면 어댑터 패턴은 한 클래스의 인터페이스를 클라이언트에서 사용하고자 하는 다른 인터페이스로 변환합니다. 어댑터를 이용하면 인터페이스 호환성 문제 때문에 같이 쓸 수 없는 클래스들을 연결해서 사용할 수 있습니다.
'퍼사드 패턴 예시'
다양한 서브 시스템이 함께 이용되는 시스템에서 Facade Class는 이 서브 시스템들을 추상화할 수 있습니다.
Client는 서브 시스템의 존재를 모르고 오직 Facade Class만 알고 있으며 퍼사드 클래스만 접근할 수 있습니다. 이렇게 하면 클라이언트는 서브 시스템으로부터 분리되어 서브 시스템에 의존하지 않아도 됩니다.
세탁기를 예로 들어보면 사용자는 세탁을 할 때 옵션을 조절할 수는 있지만 최종적으로는 동작 버튼 하나만 누르면 세탁기가 세탁 과정, 헹굼 과정, 탈수 과정을 자동으로 진행합니다.
사용자가 직접 서브 시스템인 세탁 과정을 실행하고, 끝나면 헹굼 과정, 또 끝나면 탈수 과정을 직접 진행하지 않습니다. 동작 버튼 하나만 누르면 시스템이 해당 서브 시세템들을 자동으로 실행시켜 주는 것처럼, 복잡한 서브 시스템들을 인터페이스로 감싸서 사용하기 쉽게 만드는 것이 바로 '퍼사드 패턴(Pacade Pattern)'입니다.
(실무에서는 XXXFacade와 같이 퍼사드 패턴이 사용되었음을 따로 명시하지 않고 Service 형태로 많이 이용됩니다.)
// Sub System Wash Class
public class Wash {
public Wash() {}
public void startWash() {
System.out.println("Start Washing");
}
}
// Sub System Rinse Class
public class Rinse {
public Rinse() {}
public void startRinse() {
System.out.println("Start Rinsing");
}
}
// Sub System SpanDry Class
public class SpanDry {
public SpanDry() {}
public void startDry() {
System.out.println("Start Drying");
}
}
'Wash Class, Rinse Class, SpanDry Class'
public class Washer {
private final Wash wash;
private final Rinse rinse;
private final SpanDry spanDry;
public Washer() {
wash = new Wash();
rinse = new Rinse();
spanDry = new SpanDry();
}
public void start() {
wash.startWash();
rinse.startRinse();
spanDry.startDry();
}
}
'Washer Class'
이처럼 Client는 퍼사드 객체인 Washer 객체의 start() 메서드만 가지고 서브 시스템의 startWash(), startRinse(), startDry() 메서드들을 사용할 수 있게 됩니다.
< 참고 자료 >
(퍼사드 패턴을 통해 제 3의 API를 추상화하는 것의 활용법을 참고할 수 있습니다.)
'Programming > Web' 카테고리의 다른 글
ngrok 외부에서 로컬 개발환경 localhost 접근하기(mac) (0) | 2022.04.01 |
---|---|
동기와 비동기, 블로킹과 논블로킹 개념 정리 (0) | 2021.12.28 |
Apache Log4j2 치명적 취약점, 해결방안은? CVE-2021-44228 (0) | 2021.12.12 |
프로그래밍 시간 표현 단위 Unix Time ( = Epoch Time ) 이란 (0) | 2021.10.24 |
프록시 패턴(Proxy Pattern) 이란? (0) | 2021.09.01 |