디자인 패턴 중 하나인 파사드 패턴에 대해 포스팅합니다.
목차
- 파사드 패턴이란?
- 파사드 패턴 예제
파사드 패턴이란?
파사드는 프랑스어로 건물의 출입구로 이용되는 정면 외벽 부분을 가리키는 말입니다. 패턴에서는 여러 개의 객체와 실제 사용하는 서브 객체의 사이에 복잡한 의존관계가 존재할 때, 중간에 파사드(Facade)라는 객체를 두고 파사드에서 제공하는 인터페이스만을 활용하여 기능을 사용하는 방식입니다. 파사드는 인터페이스만을 사용하기 때문에 자신이 가지고 있는 각 클래스의 기능을 명확히 알고 있어야 합니다.
파사드 패턴 예제
파사드 패턴은 FTP Client를 예로 들겠습니다. 많은 분들이 회사 업무를 하시면서 업무망/인터넷망 간 파일전달 많이 하실 텐데요. 해당 시스템이 FTP Client라고 이해하시면 되겠습니다. 또는 IT 업무를 하시는 분들은 FileZila 생각하시면 될 것 같습니다. 파일 전달을 하기 위해서는 서버 접속을 위한 FTP 클래스, 파일 입력/출력을 위한 Writer/Reader 클래스가 필요합니다.
그럼 Facade 패턴을 사용했을 때와 사용하지 않았을 때를 비교해 보겠습니다.
Facade 패턴 사용하지 않는다면?
Ftp 클래스
Ftp 클래스는 FTP 서버라고 이해하시면 됩니다. FTP에 접속하기 위해서는 host, port, path 세 가지를 알고 있어야 합니다. host는 ip라고 생각하시면 되고 port는 보통 22 port를 사용합니다. path는 사용자가 사용할 경로입니다.
Ftp 클래스는 host, port, path 세 가지 변수를 갖고 있고 Ftp 생성시 전달받은 host, port, path로 세팅합니다. connect 메서드를 통해 ftp 서버와 연결할 수 있고, moveDirectory 메서드를 통해 원하는 경로로 이동할 수 있습니다. disConnect 메서드를 통해 ftp 서버와 연결을 해제할 수 있습니다.
public class Ftp {
private String host;
private int port;
private String path;
public Ftp(String host, int port, String path) {
this.host = host;
this.port = port;
this.path = path;
}
public void connect() {
System.out.println("FTP host : " + host+ ", Port : "+ port+"로 연결");
}
public void moveDirectory() {
System.out.println("path : "+ path+ "로 이동");
}
public void disConnect() {
System.out.println("FTP 연결종료");
}
}
Writer/Reader 클래스
Writer 클래스는 fileName을 변수로 갖습니다. Writer 클래스 생성 시 fileName을 전달받아 세팅합니다. fileConnect 메서드를 통해 fileName에 해당하는 파일을 연결하고 fileWrite 메서드를 통해 연결된 파일에 내용을 작성합니다. fileDisconnect 메서드를 통해 파일 연결을 종료합니다.
Reader 클래스도 Writer 클래스와 동일하게 fileName을 변수로 갖습니다. Reader 클래스 생성시 fileName을 전달받아 세팅합니다. fileConnect와 FileDicConnect 메서드는 Writer와 동일한 동작을 하고 fileRead 메서드를 통해 연결된 파일의 내용을 읽습니다.
public class Writer {
private String fileName;
public Writer(String fileName) {
this.fileName = fileName;
}
public void fileConnect() {
System.out.println("Writer " + fileName + "으로 연결");
}
public void fileWrite() {
System.out.println("Writer " + fileName + "을 쓰기");
}
public void fileDisConnect() {
System.out.println("Writer 연결종료");
}
}
public class Reader {
private String fileName;
public Reader(String fileName) {
this.fileName = fileName;
}
public void fileConnect() {
System.out.println("Reader " + fileName + "으로 연결");
}
public void fileRead() {
System.out.println("Reader " + fileName + "을 읽음");
}
public void fileDisConnect() {
System.out.println("Reader 연결종료");
}
}
Main Class
이제 실행을 해보겠습니다. File을 전달하기 위해 Ftp를 생성해 서버 연결을 진행하고 원하는 경로에 이동합니다. Writer를 생성하여 file을 연결하고 작성합니다. Reader 클래스를 생성하여 file을 연결하고 읽습니다. 작업이 완료되면 역순으로 reader, writer, ftpClient를 연결 해제합니다.
public class FacadeMain {
public static void main(String args[]) {
Ftp ftpClient = new Ftp("127.0.0.1", 22, "/home");
ftpClient.connect();
ftpClient.moveDirectory();
Writer writer = new Writer("test.txt");
writer.fileConnect();
writer.fileWrite();
Reader reader = new Reader("test.txt");
reader.fileConnect();
reader.fileRead();
reader.fileDisConnect();
writer.fileDisConnect();
ftpClient.disConnect();
}
}
=> 실행결과
FTP host : 127.0.0.1, Port : 22로 연결
path : /home로 이동
Writer test.txt으로 연결
Writer test.txt을 쓰기
Reader test.txt으로 연결
Reader test.txt을 읽음
Reader 연결종료
Writer 연결종료
FTP 연결종료
Facade 패턴을 사용하면?
Sftp 클래스
Facade 패턴을 사용하는 Sftp 클래스를 새로 생성해줍니다. Sftp에는 Ftp와 Reader, Writer를 변수로 갖습니다. Sftp를 생성 시 Ftp, Reader, Writer를 전달받아 생성할 수도 있고 host, port, path, fileName을 전달받아 생성할 수도 있습니다. 저는 후자로 생성할 예정입니다.
connect 메서드를 통해 ftp를 연결 후 해당 경로로 이동합니다. reader와 writer 모두 파일을 연결합니다. disconnect 메서드를 통해 파일 연결을 해제하고 ftp를 연결 해제합니다. read, write 메서드를 통해 파일을 읽거나 작성합니다.
public class Sftp {
private Ftp ftp;
private Reader reader;
private Writer writer;
public Sftp(Ftp ftp, Reader reader, Writer writer) {
this.ftp = ftp;
this.reader = reader;
this.writer = writer;
}
public Sftp(String host, int port, String path, String fileName) {
this.ftp = new Ftp(host, port, path);
this.reader = new Reader(fileName);
this.writer = new Writer(fileName);
}
public void connect() {
ftp.connect();
ftp.moveDirectory();
reader.fileConnect();
writer.fileConnect();
}
public void disConnect() {
reader.fileDisConnect();
writer.fileDisConnect();
ftp.disConnect();
}
public void read() {
reader.fileRead();
}
public void write() {
writer.fileWrite();
}
}
Main Class
이제 실행해 보겠습니다. Sftp에 host, port, path, fileName을 파라미터로 넘겨 sftp를 생성합니다. 사용자는 sftp에 연결하고 파일을 작성 후 읽고 작업이 종료되면 sftp에 연결을 해제합니다.
public class FacadeMain {
public static void main(String args[]) {
Sftp sftp = new Sftp("127.0.0.1", 22, "/home", "test.txt");
sftp.connect();
sftp.write();
sftp.read();
sftp.disConnect();
}
}
=> 실행결과
FTP host : 127.0.0.1, Port : 22로 연결
path : /home로 이동
Reader test.txt으로 연결
Writer test.txt으로 연결
Writer test.txt을 쓰기
Reader test.txt을 읽음
Reader 연결종료
Writer 연결종료
FTP 연결종료
정리
실제 Main Class를 보면 Facade 패턴을 사용했을 때와 사용하지 않았을 때 결과는 동일한 것을 확인할 수 있습니다. 다만, Facade 패턴을 사용하지 않을 경우에는 사용 객체에서 Ftp, Reader, Writer에 의존하고 관리해 주어야 합니다. Facade 패턴을 사용할 경우에는 Sftp만 의존하면 되고 Ftp, Reader, Writer는 Sftp에서 의존하는 것을 알 수 있습니다.
즉, Facade 패턴을 통해 의존해야 하는 객체를 줄여주고 코드 또한 간략하게 만들어 주는 이점을 얻을 수 있습니다.
'SPRING' 카테고리의 다른 글
옵저버 패턴이란? (1) | 2022.04.01 |
---|---|
데코레이터 패턴이란? (1) | 2022.03.31 |
[파트 1. 스프링 입문] 챕터 2-4. 프록시 패턴 (1) | 2022.03.24 |
[파트 1. 스프링 입문] 챕터 2-3. 어댑터 패턴 (2) | 2022.03.14 |
[파트 1. 스프링 입문] 챕터 2-2. 싱글톤 패턴 (2) | 2022.03.14 |
댓글