퍼사드 패턴 (facade pattern)
- 라이브러리 혹은 프레임워크에 간소화된 인터페이스를 제공하는 패턴이다.
- 클래스의 복잡한 시스템에 간소화된 인터페이스를 제공한다.
- 클래스를 직접 사용하지 않는 것이 포인트이다.
- 퍼사드란 건물의 대문같은 입구를 말한다.
- 또 여기엔 내부 구조를 숨긴다는 의미도 내포되어 있다.
- 복잡한 서브 시스템을 최대한 숨겨 의존성을 최소화하는 방법이다.

자바 이메일 코드로 보는 퍼사드 패턴 예제
기존의 코드
- 아래의 코드도 잘 돌아가며 잘못된 부분은 없다.
- 그러나 몇가지 단점이 있다.
- 테스트하기에 약간 힘든 코드이다.
- 코드의 의도를 이해하기 위해 기술적인 부분까지 봐야 한다.
public class Client {
public static void main(String[] args) {
String to = "n00nietzsche@gmail.com";
String from = "admin@naver.com";
String host = "127.0.0.1";
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();
}
}
}
개선된 코드
- 개선 방법으로 기존 클라이언트 코드에서 3가지 관심사를 추출하고 그에 따른 클래스를 만들어줬다.
- 메일을 보내기 위한 호스트를 설정하는 부분 (
EmailHost) - 메일의 메세지를 설정하는 부분 (
EmailMessage) - 메일을 보내는 부분 (
EmailSender)
- 메일을 보내기 위한 호스트를 설정하는 부분 (
EmailHost 클래스
@Getter
public class EmailHost {
private final Session session;
public EmailHost(String host) {
Properties properties = System.getProperties();
properties.setProperty("mail.smtp.host", host);
this.session = Session.getDefaultInstance(properties);
}
}
EmailMessage 클래스
@Getter
@AllArgsConstructor
@Builder
public class EmailMessage {
private final String to;
private final String from;
private final String title;
private final String body;
private final EmailHost host;
public MimeMessage getMimeMessage() throws MessagingException {
MimeMessage message = new MimeMessage(host.getSession());
message.setFrom(new InternetAddress(from));
message.addRecipient(Message.RecipientType.TO, new InternetAddress(to));
message.setSubject(title);
message.setText(body);
return message;
}
}
EmailSender 클래스
public class EmailSender {
public static void send(EmailMessage emailMessage) {
try {
Transport.send(emailMessage.getMimeMessage());
} catch (MessagingException e) {
e.printStackTrace();
}
}
}
새롭게 개선된 Client 클래스
public class Client {
public static void main(String[] args) {
EmailHost host = new EmailHost("127.0.0.1");
EmailSender.send(EmailMessage.builder()
.to("n00nietzsche@gmail.com")
.from("admin@naver.com")
.title("안녕하세요.")
.body("내용입니다.")
.host(host)
.build());
}
}
개선해서 좋아진 점
- API 사용자가 이용하기 훨씬 편리하다.
- 프로토콜 설정, 세션 생성 등 기술적인 구현부를 볼 필요 없이 직관적으로 누구에게 보낼지 내용은 무엇인지 등만 설정하면 된다.
- 테스트 코드를 작성하기도 훨씬 더 쉬워졌다.
조금 더 개선할 수 있는 점
- 여러 메일 구현체를 이용해 이메일을 보낸다면,
EmailSender라는 인터페이스를 만들고 구현 방식에 따른 여러EmailSender구현체를 만들 수도 있을 것이다.
퍼사드 (Facade) 패턴의 장단점
장점
- 서브 시스템의 의존성을 한 곳에 몰 수 있다.
- 코드가 훨씬 읽기 편해진다.
- 모든 API 를 다 노출시킬 필요가 없는 경우 유용하다.
- API 사용자가 이용하기 훨씬 편하다.
- 테스트코드를 작성하기 훨씬 편하다.
단점
- 퍼사드 클래스가 서브 시스템에 대한 모든 의존성을 가지게 된다.
- 기술적인 부분이 모두 무시되어 사용자 입장에서는 기술적인 이해도가 낮아질 수 있다.
퍼사드 (Facade) 패턴이 적용된 스프링 코드
- 브릿지 패턴과 비교되는데 브릿지 패턴은 연결하려는 의도가 주된 의도였다면, 퍼사드 패턴은 기술적인 코드를 뒤로 감추려는 게 의도이다.
- 디자인 패턴은 보는 시각에 따라 의도가 달라지므로 코드 하나에 어떤 패턴 하나만 적용되었다고 단순하게 판단하긴 어렵다.
JavaMailSenderImpl은MailSender인터페이스를 내놓고 자바에서 메일을 보내는 기술적인 코드를 숨기고 있다.MailSender는 특정한 기술에 종속되어 있지 않다.
JdbcTransactionManager도PlatformTransactionManager인터페이스를 내놓고 자바 트랜잭션 관리 기술을 숨기고 있다.PlatformTransactionManager인터페이스를 통해서 JDBC, JPA 등 다양한 플랫폼에서 트랜잭션을 관리할 수 있다.
- 스프링 MVC 전체의 모든 API 를 퍼사드 패턴으로 볼 수도 있다.
- 자바가 제공하는 서블릿을 감싸는 퍼사드로 볼 수 있다.
- 스프링 WebFlux 는 동일한 스프링 애노테이션 등을 제공하지만 Reactive 로 동작하게 만들 수 있다.
public class FacadeInSpring {
public static void main(String[] args) {
MailSender mailSender = new JavaMailSenderImpl();
PlatformTransactionManager platformTransactionManager = new JdbcTransactionManager();
}
}
레퍼런스
'Java > 자바 디자인 패턴' 카테고리의 다른 글
| 프록시 패턴 (Proxy Pattern) 이란? (0) | 2023.04.25 |
|---|---|
| 플라이웨이트 패턴 (Flyweight Pattern) 이란? (0) | 2023.04.22 |
| 데코레이터 패턴 (Decorator Pattern) 이란? (0) | 2023.02.25 |
| 컴포지트 패턴 (Composite Pattern, 컴포짓 패턴) 이란? (0) | 2023.02.20 |
| 브릿지 패턴 (Bridge Pattern) 이란? (0) | 2023.02.19 |