본문 바로가기

강의/Design pattern

퍼싸드(Facade) 패턴

SMALL

Facade Pattern

일반적으로는 도로에서 바라보는 건물의 입구 모습을 의미한다. 건물 내부의 구성은 알 수 없다.
복잡한 의존성들을 최소화하는 방법으로, 의존성들을 간단한 인터페이스로 추상화하는 방법이다. Client가 코드들을 직접 사용하지 않고, 중간에 Facade의 중간 시스템을 두고 사용하는 기능에 대한 인터페이스를 압축시켜 Client는 Facade만 사용하도록 한다.


Example Code

public class Client {
	public static void main(String[] args) {
		String to = "innjie@naver.com";
		String from = "innjielee@gmail.com";
		String host = "127.0.0.1";

		//java에서 메일을 보낼 때 필요한 요소들
		//properties에 속성들을 넣고 Session을 생성한다.
		Properties properties = System.getProperties();
		properties.setProperty("mail.smtp.host", host);

		Session session = Session.getDefaultInstance(properties);

		try {
			MimeMessage message = new MimeMessage(session);
			message.setFrom(new InternetAddress(from));
			message.addRecipient(Message.RecipientType.TO, new InternetAddress(to));
			message.setSubject("Test Mail from Java Program");
			message.setText("message");

			Transport.send(message);
		} catch (MessagingException e) {
			e.printStackTrace();
		}
	}
}

위 코드에서는 Client 가 많은 의존성을 가진다. loosely coupled 원칙을 항상 염두해 두며 유연하게 코드를 작성하는 방식을 고민해야 한다.


Example Code - Loosely Coupled

  • message와 관련된 코드 분리
  • 서버 설정과 관련된 코드 분리
  • 메일을 보내는 부분과 관련된 코드 분리
    등의 방법으로 추상화할 수 있다.

EmailSender

public class EmailSender {
	private EmailSettings emailSettings;

	public EmailSender (EmailSettings emailSettings) {
		this.emailSettings = emailSettings;
	}
	public void sendEmail(EmailMessage emailMessage) {
		String to = "innjie@naver.com";
		String from = "innjielee@gmail.com";
		String host = "127.0.0.1";

		//java에서 메일을 보낼 때 필요한 요소들
		//properties에 속성들을 넣고 Session을 생성한다.
		Properties properties = System.getProperties();
		properties.setProperty("mail.smtp.host", emailSettings.getHost());

		Session session = Session.getDefaultInstance(properties);

		try {
			MimeMessage message = new MimeMessage(session);
			message.setFrom(new InternetAddress(emailMessage.getFrom()));
			message.addRecipient(Message.RecipientType.TO, emailMessage.getTo());
			message.setSubject(emailMessage.getSubject());
			message.setText(emailMessage.getText());

			Transport.send(message);
		} catch (MessagingException e) {
			e.printStackTrace();
		}
	}
}

EmailMessage

public class EmailMessage {
	private String from;
	private String to;
	private String subject;
	private String text;
}

Client

public class Client {
	public static void main(String[] args) {
		EmailSettings mailSettings = new EmailSettings();
		emailSettings.setHost("127.0.0.1");
		EmailSender emailSender = new EmailSender(emailSettings());
		EmailMessage emailMessage = new EmailMessage();
		emailMessage.setFrom("innjie");
		emailMessage.setTo("innjielee");
		emailMessage.setSubject("title");
		emailMessage.setText("text");
		email.sendEmail(emailMessage);
	}
}

장단점

장점

  • 서브 시스템에 대한 의존성을 한곳으로 모을 수 있다.

단점

  • Facade 클래스가 서브 시스템에 대한 모든 의존성을 가진다.
    -> 기존 코드와 비교해서 가독성이 높아지는 경우에는 Facade를 사용하는 것이 의미 있는 리팩토링이 될 수 있다.

Example

Bridge 패턴에서의 예시와 비슷하다. 이전에는 상이한 인터페이스를 연결하는데 목적을 두었다면, Facade에서는 기술을 뒤로 감추는 데 목적이 있다.

PlatformTransactionManager

PlatformTransactionManager platformTransactionManager = new JdbcTransactionManager();
특정 기술에 종속되지 않으며 특정 트랜잭션을 처리한다.

SMALL

'강의 > Design pattern' 카테고리의 다른 글

프록시(Proxy) 패턴  (0) 2022.09.22
플라이웨이트 (Flyweight) 패턴  (0) 2022.08.16
브릿지 (Bridge) 패턴  (0) 2022.08.16
어댑터 (Adapter) 패턴  (0) 2022.08.16
프로토타입 (Prototype) 패턴  (0) 2022.08.16