일반적으로는 도로에서 바라보는 건물의 입구 모습을 의미한다. 건물 내부의 구성은 알 수 없다.
복잡한 의존성들을 최소화하는 방법으로, 의존성들을 간단한 인터페이스로 추상화하는 방법이다. 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();
특정 기술에 종속되지 않으며 특정 트랜잭션을 처리한다.