❓파사드 패턴?
파사드 패턴이란, 복잡한 시스템, 서브 시스템을 단순한 인터페이스로 감싸, 클라이언트가 해당 시스템을 쉽게 사용할 수 있게 해주는 것을 말합니다. ‘싱글턴 추상 팩토리’ 라고 불리기도 합니다.
객체지향 개발 방식에서는 하나의 모듈을 작은 단위로 분리하고, 클래스로 캡슐화하며, 작게 분리된 모듈은 다른 기능 구현에도 재사용됩니다. 이 과정에서 수많은 클래스가 생성되고 객체는 복잡한 관계를 가지게 되는데요, 파사드 패턴을 이용해 이 복합한 객체 연결 구조 사이에 인터페이스를 두어서 시스템간 의존성 관리를 할 수 있고, 이는 느슨한 결합을 유지시켜줍니다.
파사드로 인해 새로운 계층이 추가되어, 객체 사이의 결합도를 낮추어 유연한 구조를 가질 수 있습니다.
특히 파사드 패턴은, 클라우드, 서비스API를 구축할 때 응용되는 패턴입니다.
❗파사드 패턴의 예시 (JS)
파사드 패턴은 다른 패턴과 달리 특정한 구조를 가지는 것은 아닙니다. 그저 서브 시스템을 간단하게 호출할 수 있는 인터페이스 모듈을 말하는 것이기 때문입니다.
// DoorLockSystem.js
// 서브시스템: 도어락 제어 클래스
class DoorLockSystem {
unlock() {
console.log("도어락이 열렸습니다.");
}
lock() {
console.log("도어락이 잠겼습니다.");
}
}
export default DoorLockSystem
// DoorLockController
import DoorLockSystem from "./DoorLockSystem.js"
// 파사드: 도어락 컨트롤러
class DoorLockController {
constructor() {
this.doorLockSystem = new DoorLockSystem();
}
openDoor() {
this.doorLockSystem.unlock();
}
closeDoor() {
this.doorLockSystem.lock();
}
}
DoorLockSystem이라는 서브 클래스를 불러와, 파사드를 통해 간단한 메서드를 구현하는 예시입니다!
❓최소 지식 원칙?
파사드 패턴은 최소 지식 원칙이 적용되는 좋은 예라고 합니다. 이게 무슨 말일까요?
최소 지식 원칙(Principle of Least Knowledge)이란 객체지향 설계 원칙 중 하나로, 객체 간의 상호작용에서 객체가 다른 객체와의 관계를 최소한으로 유지하도록 하는 원칙을 말합니다. 위에서 계속 말해온 느슨한 결합을 의미하는 것이겠네요!
다음과 같은 원칙을 지킨다면 최소 지식 원칙을 쉽게 적용할 수 있습니다.
- 자기 자신의 객체 사용
- 메서드에 전달된 매개변수 사용
- 메서드에서 생성된 객체 사용
- 객체에 속하는 메서드 사용
❗파사드 패턴의 장점!
1. 서브 시스템 보호
메인 시스템이 직접적으로 서브 시스템에 노출되지 않기 때문에, 서브 시스템의 구성 요소를 보호할 수 있습니다. 잘못 사용하는 경우를 방지할 수 있기도 합니다.
2. 확장성
변화하는 코드를 파사드 형태로 제공하면 보다 쉽게 변경, 확장할 수 있습니다. 상위 시스템은 파사드를 이용함으로 변화를 느낄 수 없기 때문입니다.
3. 계층화
복잡한 서브 시스템은 계층화 구조로 되어 있는 경우가 많습니다. 복합 객체 또는 복합체 와 같은 패턴을 활용하면, 계층화 되면서 상당히 복잡한 구조를 가지게 되는데요, 파사드 패턴은 서브 시스템에 간접적으로 접근하기 때문에, 이 복잡한 계층 구조를 단계별로 접근할 수 있게 됩니다.
4. 공개 인터페이스
서브 시스템이라고 무조껀 파사드 패턴을 사용할 필요는 없습니다. 서브 시스템에 직접적으로 접근하여 필요한 행위를 요청할 수 있지만, 파사드 패턴을 활용하면 행위만 노출하고 그 외의 코드를 캡슐화 할 수 있게 됩니다. 즉 특정 기능을 감출 수 있다는 이야기입니다!
❗결론!
파사드 패턴은 서브 클래스를 단순화하여 클라이언트에서 간접적으로 접근할 수 있는 패턴을 말하는 것이네요! 클라우드, API 서비스와 같은 외부에 의존하는 것들이 많아 지는 요즘 이 패턴이 더더욱 중요하겠습니다!
'개발 상식 > 디자인 패턴' 카테고리의 다른 글
[디자인 패턴] 프록시(Proxy) 패턴. 자바스크립트 프록시 (0) | 2023.11.22 |
---|---|
[디자인 패턴] 플라이웨이트(Flyweight) 패턴 (0) | 2023.11.21 |
[디자인 패턴] 장식자(Decorator) 패턴 (0) | 2023.11.17 |
[디자인 패턴] 복합체(Composite) 패턴 (0) | 2023.11.15 |
[디자인 패턴] 브릿지(Bridge) 패턴 (0) | 2023.11.14 |