2023.08.06

퍼사드 패턴

퍼사드 패턴이란, 서브 시스템에 있는 인터페이스 집합을 통합된 인터페이스(Wrapper)로 제공하는 패턴이다. 어댑터 패턴은 다른 코드와 사용할 수 있는 인터페이스를 제공하는 거라면 퍼사드 패턴은 기존 인터페이스를 더 간편하게 사용할 수 있게 하는 패턴이다.


데메테르(디미터) 원칙

퍼사드 패턴이 언급될 때 항상 나오는 것이 데메테르 원칙이다. 최소 지식의 원칙이라고도 불리는데, 모듈은 자신이 조작하는 객체의 속사정을 몰라야 한다. 즉, 객체 내부 구조가 외부로 노출되지 않는 것이다. 내부 구조가 노출되지 않는다는 것은 객체간의 결합도를 낮추게 되고, 유지 보수가 편해지는 장점이 있다.

퍼사드에서 디미터 법칙이 나오는 이유는 퍼사드 패턴을 써야하는 상황이 이 법칙에 위반되는 코드이기 때문이다. 퍼사드는 기존 인터페이스를 더 간편하게 사용할 수 있게 함으로 주로 내부 구조를 몰라도 사용할 수 있게 해준다.


구현

주로 예시로 드는 것은 리모컨이다. 리모컨은 TV 가 어떻게 켜지는지 알 필요가 없다. 그냥 켜저라 라고 신호만 주는 일을 한다. 퍼사드도 이와 비슷하게 TV 객체의 시동을 호출할 뿐 해당 TV가 어떻게 구현되었는지 알 필요가 없다. 리모컨에서 TV로 신호를 주면, 모니터가 켜지고, 오디오가 켜지고, 영상이 켜진다고 가정하자.

class TV {
	public void findMovie() { ... }
	public void play() { ... }
}

class Monitor {
	public void turn_on() { ... }
}

class Audio {
	public set_volume(int volume) { ... }
}

// 퍼사드 패턴
class RemoteController {

	String defaultMovie = "spiderman";
	int defaultVolume = 10;

	public RemoteController(String movie, int vol) {
		this.defaultMovie = movie;
		this.defaultVolume = vol;
	}

	public void turn_on() {
		TV tv = new TV();
		Monitor monitor = new Monitor();
		Audio audio = new Audio();

		monitor.turn_on();
		audio.set_volume(10);
		tv.findMovie();
		tv.play();
	}
}

//실제로는 아래 만 실행
class Client {
	public static void main(String[] args) throws ParseException {
		RemoteController remote = new RemoteController("모범시민", 20);
		remote.turn_on();
	}
}


퍼사드 패턴인 RemoteController 에서 각 객체에 대한 호출을 할 뿐 내부 구현을 모른다. 일일히 필요한 곳에 각 객체를 호출할 필요 없이 이를 모아 둠으로 신호만 주면(퍼사드의 함수를 호출하면) TV를 편하게 킬 수 있는 것이다.


여기까지 이해하면, 앞서 말한 서브 시스템의 인터페이스를 통합된 인터페이스로 제공한다 라는 말이 이해될 것이다. 항상 과정이 똑같은 영화 시나리오 같은 시스템에서 주로 사용하는 것 같다.



Leave a comment