반응형
퍼사드 패턴?
퍼사드(Facade) : 건물의 출입구가 있는 정면
복잡한 시스템이나 서브시스템을 단순화된 인터페이스를 통해 외부로 노출시키는 패턴입니다.
이를 통해 클라이언트가 시스템의 복잡성을 몰라도 간단한 인터페이스를 통해 시스템을 사용할 수 있도록 합니다.
실생활에서 볼 수 있는 퍼사드 패턴의 예시
일상적인 예제로는 스마트폰의 전원 버튼을 들 수 있습니다.
스마트폰의 내부에는 수많은 하드웨어 및 소프트웨어 컴포넌트가 복잡하게 동작합니다. 그러나 사용자에게는 전원 버튼 하나만 노출되어 있고, 이 버튼을 누르면 전체 시스템이 켜지거나 꺼집니다.
개발 과정에서 만나게 되는 퍼사드 패턴이 필요한 상황
- 복잡한 시스템 또는 라이브러리를 간편하게 사용하려고 할 때.
- 다른 시스템과의 상호작용을 캡슐화하려고 할 때.
- 서브시스템의 변경에 영향을 최소화하면서 클라이언트 코드를 관리하려고 할 때.
UserService 가 ArticleService 에만 의존하는 상황에서는 아직은 괜찮습니다.
그러나 Servcice 가 서로 의존한다면 문제가 생길 수 있습니다. (순환참조)
이 때 퍼사드 패턴을 통해서 해결합니다.
각각의 컨트롤러에서 UserService, ArticleService 두 개 다 필요한 메서드라면,
-> 퍼사드 클래스에서 수행하도록 합니다.
그게 아니라 Service 하나만 필요한 메서드라면
-> 퍼사드 클래스를 거치지 않고 해당 Service 를 직접 호출해서 사용하면 됩니다.
퍼사드 패턴이 적용되면서 생긴 장점과 퍼사드 패턴이 보호하고자 하는 것
- 클라이언트 코드 간소화: 시스템의 복잡성을 숨기고, 클라이언트에게는 간단한 인터페이스만 노출되므로 클라이언트 코드를 간소화합니다.
- 시스템의 유지 보수 용이성: 시스템 내부 변경이 있을 때, 퍼사드 패턴을 사용하면 클라이언트에 영향을 미치지 않고 서브시스템 변경을 쉽게 처리할 수 있습니다.
- 시스템의 확장성: 새로운 기능을 추가하거나 다른 서브시스템을 통합하기 쉽습니다.
- 보안과 접근 제어: 클라이언트는 오직 퍼사드 인터페이스만 접근할 수 있으며, 시스템 내부 구현과 상세 내용은 숨겨진 채로 보호됩니다.
// 서브시스템 (Engine)
class Engine {
public void start() {
System.out.println("엔진 시동을 걸었습니다.");
}
}
// 서브시스템 (Battery)
class Battery {
public void supplyPower() {
System.out.println("배터리 전원을 공급합니다.");
}
}
// 퍼사드 클래스 (CarStarter)
class CarStarter {
private Engine engine;
private Battery battery;
public CarStarter() {
this.engine = new Engine();
this.battery = new Battery();
}
public void startCar() {
battery.supplyPower();
engine.start();
System.out.println("자동차 시동이 걸렸습니다.");
}
}
// 클라이언트 코드
public class Main {
public static void main(String[] args) {
CarStarter carStarter = new CarStarter();
carStarter.startCar();
}
}
반응형
'백엔드 데브코스' 카테고리의 다른 글
[Java] 어댑터패턴에 관한 예제 (0) | 2023.10.09 |
---|---|
[Java] 디자인패턴과 안티 패턴 (0) | 2023.10.08 |
[Java] 도서관리 프로그램을 만들면서 배운것들 - Enum, Builder 디자인패턴 (0) | 2023.10.06 |
[Java] SOLID란? (2) - 객체 지향 프로그래밍의 5가지 기본 원칙 (0) | 2023.09.29 |
[Java] SOLID란? (1) - 객체 지향 프로그래밍의 5가지 기본 원칙 (0) | 2023.09.27 |