: 복잡한 집합에 대한 단순화된 인터페이스를 제공하는 구조적 디자인 패턴
Facade
정면; 건물의 정면 외관;
구조 패턴
: 구조를 유연하고 효율적으로 유지하면서 객체들을 조립하는 방법
연주회 콘서트를 구현
public class Player {
private String instrument;
public Player(String instrument) {
this.instrument = instrument;
}
public void play() {
prepare();
playing();
end();
}
private void prepare() {
System.out.println(instrument + " 연주 준비 중입니다.");
}
private void playing() {
System.out.println(instrument + " 연주 하고 있습니다.");
}
private void end() {
System.out.println(instrument + " 연주를 마쳤습니다.");
}
}
cf) 객체의 자율성
객체가 가지고 있는 역할 또는 책임을 수행할 때, 해당 역할을 어떻게 수행할 지는 객체가 결정하게끔 해야한다.
public class Conductor {
public Conductor() {
System.out.println("지휘자 입장");
}
public void start() {
System.out.println("곡이 시작되었습니다.");
}
public void end() {
System.out.println("곡이 끝났습니다.");
}
}
서브클래스들을 감싸는 하나의 파사드 클래스를 정의
public class SpringConcert {
public void start() {
System.out.println("봄 콘서트 시작합니다.");
Conductor conductor = new Conductor();
conductor.start();
Player player = new Player("바이올린");
player.play();
conductor.end();
System.out.println("봄 콘서트 끝났습니다.");
}
}
서브시스템들을 한번에 수행
public class Run {
public static void main(String[] args) {
new SpringConcert().start();
}
}
Layered Architecture에서 Service Layer의 순환참조를 방지하기 위해 퍼사드 패턴을 적용할 수 있다.
비즈니스 로직이 복잡해지면 한 Service가 다른 Service를 의존하는 경우가 많아지게 된다. 그럼 의존관계가 얽히면서 순환참조가 발생하고, 서로 Bean을 주입받지 못해 Bean을 생성할 수 없게 된다.
따라서, Service Layer를 상위 계층(Component Service)과 하위 계층(Module Service)으로 구분하고, 의존성 방향을 한 방향으로 고정하여 순환참조를 방지할 수 있다.
Module Service는 독립적으로 사용 가능하기 때문에, 필요에 따라 재사용이 가능하다.
@Service
@RequiredArgsConstructor
public class Module1ServiceImpl implements Module1Service {
private final Test1Mapper test1Mapper;
...
}
@Service
@RequiredArgsConstructor
public class Module2ServiceImpl implements Module2Service {
private final Test2Mapper test2Mapper;
...
}
Component Service에 트랜잭션을 적용하여 여러 기능을 하나의 트랜잭션 단위에서 동작 가능하도록 할 수 있다.
@Service
@RequiredArgsConstructor
public class ComponentServiceImpl implements ComponentService {
private final Module1Service module1Service;
private final Module2Service module2Service;
...
}
참고사이트
https://refactoring.guru/ko/design-patterns/facade
https://jangjjolkit.tistory.com/62