Design Pattern_Structural Patterns_Facade

박지홍·4일 전

DesignPattern

목록 보기
7/8

퍼사드(Facade) 패턴

복잡한 서브 시스템 의존성을 최소화하는 방법
Facade : 건물 정면, 겉모습 => 내부는 복잡해도 겉은 간단한 입구 하나만 보이게 만듬.

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

적용

before/Client.java

  1. 기본 정보 준비
String to = "keesun@whiteship.me";
String from = "whiteship@whiteship.me";
String host = "127.0.0.1";

누구한테, 누가, 어떤 메일 서버?

  1. 프로퍼티 설정
Properties properties = System.getProperties();
properties.setProperty("mail.smtp.host", host);
  1. Session 생성
Session session = Session.getDefaultInstance(properties);
  1. MimeMessage 생성 및 설정
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");

실제 메일 객체

  1. 전송 및 예외 처리

문제점 : 클라이언트가 내부 동작에 너무 깊게 얽혀 있음, 재사용이 어려움. 회원가입 인증 메일, 비밀번호 재설정 메일 이런데서 비슷한 초기화 코드를 반복하게됨.

after

핵심 : 메일 전송의 복잡한 내부를 EmailSender가 감싼다. 이게 Facade

  1. EmailSettings
public class EmailSettings {
    private String host;
}

이메일 전송에 필요한 설정을 담는 객체 (port, username, password 등이 들어갈 수 있다.)

  1. EmailMessage
public class EmailMessage {
    private String from;
    private String to;
    private String cc;
    private String bcc;
    private String subject;
    private String text;
}

보낼 이메일 데이터

  1. EmailSender => Facade 역할
public class EmailSender {
    private EmailSettings emailSettings;

    public EmailSender(EmailSettings emailSettings) {
        this.emailSettings = emailSettings;
    }

    public void sendEmail(EmailMessage emailMessage) {
        ...
    }
}
  1. Client / 설정 준비 -> 메시지 준비 -> 전송 요청
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);

장단점

  • 장점
    • 서브 시스템에 대한 의존성을 한 곳으로 모아 사용법과 코드읽기가 쉬워진다.
  • 단점
    • 퍼사트 클래스가 서브 시스템에 대한 모든 의존성을 가지게 되어 유연성이 줄 수 있다.

=> 라이브러리나 서브시스템이 너무 복잡할 때, 클라이언트 코드를 단순하게 만들고 싶을 때ㅔ 쓴다.

자바와 스프링에서 예제 찾기

  • 스프링 MVC

내부:
URL 매핑 찾고
어떤 컨트롤러인지 찾고
파라미터 바인딩하고
메시지 컨버터 고르고
예외 처리기 찾고
뷰 리졸버 찾고
응답 만들어서 반환

개발자 입장:
컨트롤러 메서드만 씀

  • 스프링이 제공하는 대부분의 기술 독립적인 인터페이스와 그 구현체

0개의 댓글