일반적으로는 도로에서 바라보는 건물의 입구 모습을 의미한다. 건물 내부의 구성은 알 수 없다.
복잡한 의존성들을 최소화하는 방법으로, 의존성들을 간단한 인터페이스로 추상화하는 방법이다. Client가 코드들을 직접 사용하지 않고, 중간에 Facade의 중간 시스템을 두고 사용하는 기능에 대한 인터페이스를 압축시켜 Client는 Facade만 사용하도록 한다.
public class Client {
public static void main(String[] args) {
String to = "innjie@naver.com";
String from = "innjielee@gmail.com";
String host = "127.0.0.1";
//java에서 메일을 보낼 때 필요한 요소들
//properties에 속성들을 넣고 Session을 생성한다.
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();
}
}
}
위 코드에서는 Client 가 많은 의존성을 가진다. loosely coupled 원칙을 항상 염두해 두며 유연하게 코드를 작성하는 방식을 고민해야 한다.
public class EmailSender {
private EmailSettings emailSettings;
public EmailSender (EmailSettings emailSettings) {
this.emailSettings = emailSettings;
}
public void sendEmail(EmailMessage emailMessage) {
String to = "innjie@naver.com";
String from = "innjielee@gmail.com";
String host = "127.0.0.1";
//java에서 메일을 보낼 때 필요한 요소들
//properties에 속성들을 넣고 Session을 생성한다.
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, emailMessage.getTo());
message.setSubject(emailMessage.getSubject());
message.setText(emailMessage.getText());
Transport.send(message);
} catch (MessagingException e) {
e.printStackTrace();
}
}
}
public class EmailMessage {
private String from;
private String to;
private String subject;
private String text;
}
public class Client {
public static void main(String[] args) {
EmailSettings mailSettings = new EmailSettings();
emailSettings.setHost("127.0.0.1");
EmailSender emailSender = new EmailSender(emailSettings());
EmailMessage emailMessage = new EmailMessage();
emailMessage.setFrom("innjie");
emailMessage.setTo("innjielee");
emailMessage.setSubject("title");
emailMessage.setText("text");
email.sendEmail(emailMessage);
}
}
Facade 클래스가 서브 시스템에 대한 모든 의존성을 가진다.Facade를 사용하는 것이 의미 있는 리팩토링이 될 수 있다.Bridge 패턴에서의 예시와 비슷하다. 이전에는 상이한 인터페이스를 연결하는데 목적을 두었다면, Facade에서는 기술을 뒤로 감추는 데 목적이 있다.
PlatformTransactionManager platformTransactionManager = new JdbcTransactionManager();
특정 기술에 종속되지 않으며 특정 트랜잭션을 처리한다.