1. 퍼사드 패턴

퍼사드 패턴의 목적은 클라이언트가 사용해야 하는 복잡한 서브 시스템 의존성을 간단한 인터페이스로 추상화하는 구조적 패턴이다. 코드 작업을 위해서는 객체 초기화, 종속성 관계 추적, 메서드 실행 순서에 관한 내용에 관해 이해해야 한다. 여러 비즈니스 로직들의 세부 구현 사항을 알고 있다면 코드를 이해하고 유지 관리하기 어려워 추상화가 필요하다. 이를 해결하기 위한 방법이 퍼사드 패턴이다.

 

퍼사드를 사용하는 이유는 loosely coupling 이다. tight coupling 은 해당 코드를 변경하기 어렵고, 변경 이유도 많고, 테스트도 어렵다. 이를 loosely coupling 을 통해 변경에 유연하고, 테스트하기 쉬운 코드로 작성하기 위함이다. 추상화 또한 이와 관련된 내용이며 세부 구현을 뒤로 숨기고 코드 진입 장벽을 낮출 수 있는 장점이 있다.

 

퍼사드를 사용하면 서브 시스템에 대한 의존성을 한 곳으로 모을 수 있다. 하지만 이는 단점도 일 수 있다. 오히려 서브 시스템의 모든 의존성을 가지게 된다.

 

before facade pattern (출처 : [inflearn] 코딩으로 학습하는 GoF의 디자인 패턴)

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 = 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();
        }
    }
}

 

after facade pattern (출처 : [inflearn] 코딩으로 학습하는 GoF의 디자인 패턴)

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);
    }
}

@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();
        }
    }

}

 

Reference