001 Facade Pattern

퍼사드 (Facade) 패턴 #

img_2.png

  • 복잡한 서브 시스템 의존성을 최소화하는 방법.
  • 클라이언트가 사용해야 하는 복잡한 서브 시스템 의존성을 간단한 인터페이스로 추상화 할 수 있다.
  • 복잡한 디테일을 퍼사드 뒤로 숨긴다.
  • 복잡한 서브 클래스들의 공통적인 기능을 정의하는 상위 수준의 인터페이스를 제공하는 패턴이다.
  • 서브 클래스의 코드에 의존하는 일을 감소시켜 주고, 복잡한 소프트웨어를 간단히 사용 할 수 있게 간단한 인터페이스를 제공해준다.
  • 서브 시스템(SubSystem)들 간의 종속성을 줄여줄 수 있으며, 퍼사드 객체를 사용하는 곳(Client)에서는 여러 서브 클래스들을 호출할 필요 없이 편리하게 사용할 수 있다.
  • Facade Object(WashingMachine)만을 호출하여 ‘어떤 동작’을 수행할 수 있으며, 메서드의 의미 또한 명확하게 알 수 있다. img.png

장점 #

  • 서브 시스템에 대한 의존성을 한곳으로 모을 수 있다. (결합도 감소, 응집도 증가)

단점 #

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

적용 전 #

package com.designpattern.report._10_facade.step1_before;

import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.util.Properties;

public 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 properties = System.getProperties();
        properties.setProperty("mail.smtp.host", host);

        Session session = Session.getDefaultInstance(properties);

        /**
         * SOLID 객체 지향 원칙
         */
        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");

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

적용 후 #

EmailMessage

package com.designpattern.report._10_facade.step2_after;

import lombok.Getter;
import lombok.Setter;

@Getter
@Setter
public class EmailMessage {

    private String from;

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

    private String subject;

    private String text;
}

EmailSettings

package com.designpattern.report._10_facade.step2_after;

import lombok.Getter;
import lombok.Setter;

@Getter
@Setter
public class EmailSettings {
    private String host;
}

EmailSender

package com.designpattern.report._10_facade.step2_after;

import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.util.Properties;

/**
 * 인터페이스로 만들고
 * 각 구현클래스로 확장해갈 수도 있다.
 */
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();
        }
    }


}

Client

public class Client {

    public static void main(String[] args) {
        /* Email Setting */
        EmailSettings emailSettings = new EmailSettings();
        emailSettings.setHost("127.0.0.1");

        /* Email Sender */
        EmailSender emailSender = new EmailSender(emailSettings);

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

        emailSender.sendEmail(emailMessage);
    }
}

적용 후 모습 #

img_1.png