[디자인 패턴] 파사드 패턴 Facade Pattern in Java

sua_ahn·2024년 5월 24일
0

디자인 패턴

목록 보기
2/2

파사드 패턴

: 복잡한 집합에 대한 단순화된 인터페이스를 제공하는 구조적 디자인 패턴

  • 복잡한 하위 시스템을 분리하여 숨기고(캡슐화) 하나의 고수준 인터페이스로 묶어줌

Facade
정면; 건물의 정면 외관;

  • 디자인 패턴의 목적에 따라 3가지로 분류 가능
    → 구조 패턴에 속함

    구조 패턴
    : 구조를 유연하고 효율적으로 유지하면서 객체들을 조립하는 방법

 


Java 예시1

연주회 콘서트를 구현

Subsystem class

연주자 객체

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("곡이 끝났습니다.");
	}
}

 

Facade class

서브클래스들을 감싸는 하나의 파사드 클래스를 정의

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 예시2

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

profile
해보자구

0개의 댓글