파사드(Facade) 패턴이란?
파사드 패턴은 복잡한 내부 구조 위에 얹히는 간단하고 통합된 인터페이스를 제공하는 디자인 패턴입니다. 클라이언트는 복잡한 하위 시스템의 세부 동작을 몰라도 되며, 파사드가 노출하는 단순한 메서드만 호출하면 됩니다.
패턴의 구성 요소
하위 시스템(Subsystems): 실제 기능을 구현하는 클래스나 객체들입니다. 파사드는 이러한 하위 시스템을 "감싸거나(wrap)" "덮어(cover)" 인터페이스를 단순화할 수 있습니다.
파사드(Facade): 하위 시스템 위에 위치한 추상화 계층으로, 적절한 작업을 어느 하위 시스템에 위임해야 하는지 알고 있습니다.
파사드 패턴의 활용
파사드 패턴은 매우 범용적이어서 거의 모든 주요 애플리케이션에 적용할 수 있습니다. 특히 다음과 같은 상황에서 빛을 발합니다:
- 레거시 코드처럼 여러 이유로 직접 리팩토링하거나 수정하기 어려운 기존 코드를 감쌀 때
- 복잡한 라이브러리나 API를 단순한 인터페이스로 제공하고 싶을 때
- 여러 하위 시스템을 조합하는 일련의 작업 흐름을 하나의 메서드로 묶고 싶을 때
C# 구현 예제
아래 예제는 집에 있는 조명(Lights), 음악 시스템(MusicSystem), 에어컨(Ac)이라는 세 개의 하위 시스템을 하나의 HomeFacade로 감싸는 코드입니다. 외출할 때와 귀가할 때 각각 필요한 일련의 동작을 메서드 하나로 처리할 수 있습니다.
public class HomeFacade {
LightsFacade light;
MusicSystemFacade musicSystem;
AcFacade ac;
public HomeFacade() {
light = new LightsFacade();
musicSystem = new MusicSystemFacade();
ac = new AcFacade();
}
public void LeaveHomeForOffice() {
light.SwitchOffLights();
musicSystem.SwitchOffMusicSystem();
ac.SwitchOffAc();
}
public void ArriveHomeFromOffice() {
light.SwitchOnLights();
musicSystem.SwitchOnMusicSystem();
ac.SwitchOnAc();
}
}
public class LightsFacade {
public void SwitchOnLights() {
Console.WriteLine("Switched on Lights");
}
public void SwitchOffLights() {
Console.WriteLine("Switched off Lights");
}
}
public class MusicSystemFacade {
public void SwitchOnMusicSystem() {
Console.WriteLine("Switched on MusicSystem");
}
public void SwitchOffMusicSystem() {
Console.WriteLine("Switched off MusicSystem");
}
}
public class AcFacade {
public void SwitchOnAc() {
Console.WriteLine("Switched on Ac");
}
public void SwitchOffAc() {
Console.WriteLine("Switched off Ac");
}
}예제 코드 설명
HomeFacade는 생성자에서 세 개의 하위 시스템(LightsFacade, MusicSystemFacade, AcFacade)을 생성하고 보유합니다. 클라이언트는 각 장치를 개별적으로 제어할 필요 없이 다음과 같이 호출하기만 하면 됩니다:
LeaveHomeForOffice(): 출근길에 나설 때 조명, 음악 시스템, 에어컨을 한 번에 끕니다.ArriveHomeFromOffice(): 집에 돌아오면 세 장치를 한 번에 켭니다.
이처럼 파사드 패턴을 사용하면 클라이언트 코드와 하위 시스템 간의 결합도가 낮아지고, 하위 시스템의 내부 구현이 변경되더라도 파사드만 수정하면 되므로 유지보수성이 크게 향상됩니다.