디자인패턴

퍼사드 패턴(Facade Pattern)

JUNGKEUNG 2022. 8. 14. 07:36
반응형

퍼사드 패턴(Facade Pattern) 이란?

퍼사드 패턴(Facade Pattern)은 구조 패턴(Structural Pattern)의 한 종류로, 서브시스템들의 공통적인 기능을 정의하는 단순화된상위 수준의 인터페이스를 정의하는 패턴이다. 

 

 

 

복잡한 서브 시스템 의존성을 최소화하는 방법

  • 클라이언트가 사용해야 하는 복잡한 서브 시스템 의존성을 간단한 인터페이스로 추상화 할수 있다.

이메일 발송로직을 예로 들어봅시다.

 

 

 

퍼사드 패턴 사용 전

public class Client {

    public static void main(String[] args) {
        String to = "namookk@test.com";
        String from = "namookk2@test.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();
        }
    }
}

위와 같이 이메일을 보내려면 이메일 서버셋팅, 이메일 내용 셋팅, 이메일 보내기 와같은 서브시스템들을 모두 호출해야합니다.
퍼사드 패턴을 적용해봅시다.

 

 

 

퍼사드 패턴 사용 후

@Getter
@Setter
public class EmailMessage {

    private String from;

    private String to;
    private String cc;
    private String bcc;

    private String subject;

    private String text;
}

@Getter
@Setter
public class EmailSettings {
    private String host;
}
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);
    }
}

위와 같이 EmailSettings, EmailMessage를 사용한다면
클라이언트는 EmailSender를 통해 sendEmail를 통해 이메일을 보낼 수 있습니다.
물론 예제에서는 셋팅과정도 포함되어있지만 실제 사용할 때는 셋팅은 한번만 셋팅하면 되므로 EmailMessage만 보내서 메일을 발송할 수 있습니다.

 

 

 

퍼사드 패턴의 장단점

장점

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

단점

  • 퍼사드 클래스가 서브 시스템에 대한 모든 의존성을 가지게 된다.

 

특징

  • 낮은 결합도 : 클라이언트가 서브시스템의 코드를 모르더라도 Facade 클래스를 통해 사용 가능
  • 서브 클래스 직접 접근 가능 : Facade 클래스를 통해 서브클래스를 사용할지, 서브클래스를 직접 사용할지 선택 가능

 

 

참고


 

 

코딩으로 학습하는 GoF의 디자인 패턴 - 인프런 | 강의

디자인 패턴을 알고 있다면 스프링 뿐 아니라 여러 다양한 기술 및 프로그래밍 언어도 보다 쉽게 학습할 수 있습니다. 또한, 보다 유연하고 재사용성이 뛰어난 객체 지향 소프트웨어를 개발할

www.inflearn.com

 

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

전략패턴(Strategy Pattern)  (1) 2022.09.20
플라이웨이턴 패턴 (Flyweight Pattern)  (0) 2022.08.15
데코레이터(Decorator) 패턴  (0) 2022.08.04
컴포짓(composite) 패턴  (0) 2022.07.30
브릿지(Bridge)패턴  (0) 2022.07.20