티스토리 뷰

디자인 패턴

10. 퍼사드 패턴

jin-park 2022. 2. 10. 17:47

1. 의미

  • facade 사전적 의미 → (건물의) 정면; 앞면.
  • 복잡한 서브 시스템(라이브러리, 프레임워크) 의존성을 최소화하는 방법
    • 모든 기능들을 숨긴다
    • 특정한 기능을 감싸고 있는 인터페이스
  • 클라이언트가 사용해야 하는 복잡한 서브 시스템 의존성을 간단한 인터페이스로 추상화 
    • 복잡한 클래스나 메소드를 클라이언트가 직접 사용하지 않고 우리가 만든 facade 만을 이용하도록 함

다이어그램

2. 작성방법

  • 아래 메일 전송 샘플 코드를 퍼사드 패턴으로 적용해본다.

2.1. 적용전

class Client {
    public static void main(String[] args) {
        String to = "keesun@whiteship.me";
        String from = "whiteship@whiteship.me";
        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();
        }
    }
}

2.2 적용후

  • 처음에 작성한 client 소스가 결국엔 EmailSender 안으로 옮겨진 것 뿐 이지만 코드 가독성 및 재사용성이 높아짐.
@Data
public class EmailSettings {
    private String host;
}
@Data
public class EmailMessage {
    private String from;
    private String to;
    private String cc;
    private String bcc;
    private String subject;
    private String text;
}
public class EmailSender {
 
    private EmailSettings emailSettings;
 
    public EmailSender(EmailSettings emailSettings) {
        this.emailSettings = emailSettings;
    }
 
    /**
     * 이메일 보내는 메소드
     * @param emailMessage
     */
    public void sendEmail(EmailMessage emailMessage) {
        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, new InternetAddress(emailMessage.getTo()));
            message.addRecipient(Message.RecipientType.CC, new InternetAddress(emailMessage.getCc()));
            message.setSubject(emailMessage.getSubject());
            message.setText(emailMessage.getText());
 
            Transport.send(message);
        } catch (MessagingException e) {
            e.printStackTrace();
        }
    }
}
public class Client {
    public static void main(String[] args) {
        EmailSettings emailSettings = new EmailSettings();
        emailSettings.setHost("127.0.0.1");

        EmailSender emailSender = new EmailSender(emailSettings);

        EmailMessage emailMessage = new EmailMessage();
        emailMessage.setFrom("keesun");
        emailMessage.setTo("whiteship");
        emailMessage.setCc("일남");
        emailMessage.setSubject("오징어게임");
        emailMessage.setText("밖은 더 지옥이더라고..");

        emailSender.sendEmail(emailMessage);
    }
}

3. 장단점

3.1. 장점

  • 복잡한 서브 시스템 의존성을 최소화 하는 패턴
  • 서브 시스템에 대한 의존성을 한 곳으로 모아 관리
  • 소스 읽기가 편함

3.2. 단점

  • 퍼사드 클래스가 서브 시스템의 모든 의존성을 갖고 있음
    • 서브 시스템의 의존성은 피할 수 없음

'디자인 패턴' 카테고리의 다른 글

12. 프록시 패턴  (0) 2022.02.10
11. 플라이 웨이트 패턴  (0) 2022.02.10
09. 데코레이터 패턴  (0) 2022.02.10
08. 컴포짓 패턴  (0) 2022.02.10
07. 브릿지 패턴  (0) 2022.02.10
댓글