개발새발/Spring

220202_스프링입문_디자인패턴_파사드 패턴_패스트캠퍼스 챌린지 10일차

막동이아빠 2022. 2. 2. 21:46

220202_스프링입문_디자인패턴_파사드 패턴_패스트캠퍼스 챌린지 10일차

<2022년 02월 012일 _ 패스트캠퍼스 챌린지 10일차>

[스프링입문_디자인패턴_파사드 패턴]

1. Facade Pattern

 : 건물의 앞쪽 정면이라는 뜻

 : 여러개의 객체와 실제 사용하는 서브 객체의 사이에 복잡한 의존관계가 있을때, 중간에 facade라는 객체의 interface만을 활용해 기능을 사용하는 방식

 : 자신이 가지고 있는 각 클래스의 기능을 명확히 알아야 함

 

2. 실습

 (1) com.company.design 패키지에 facade 패키지 추가 & Ftp, Writer, Reader 클래스 추가 

(2) facade패턴이 적용되지 않은 형태 먼저 실습

 Ftp 클래스 작성

package com.company.design.facade;

public class Ftp {

    //포트 22번으로 특정한 호스트에 붙어야 함
    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 + " Prot : "+ port + "로 연결합니다.");
    }

    public void moveDirectory(){
        System.out.println("path : " + path + "로 이동합니다.");
    }

    public void disConnect(){
        System.out.println("FTP 연결을 종료합니다.");
    }
}

Reader 클래스 작성

package com.company.design.facade;

public class Reader {

    private String fileName;

    public Reader(String fileName){
        this.fileName = fileName;
    }

    public void fileConnect(){
        String msg = String.format("Reader %s 로 연결합니다.", fileName);
        System.out.println(msg);
    }

    public void fileRead(){
        String msg = String.format("Reader %s 의 내용을 읽어옵니다.", fileName);
        System.out.println(msg);
    }

    public void fileDisconnect(){
        String msg = String.format("Reader %s 로 연결 종료합니다.", fileName);
        System.out.println(msg);
    }
}

Writer 클래스 작성 

package com.company.design.facade;

public class Writer {

    private String fileName;

    public Writer(String fileName){
        this.fileName = fileName;
    }

    public void fileConnect(){
        String msg = String.format("Writer %s 로 연결합니다.", fileName);
        System.out.println(msg);
    }

    public void write(){
        String msg = String.format("Writer %s 로 파일쓰기를 합니다.", fileName);
        System.out.println(msg);
    }

    public void fileDisconnect(){
        String msg = String.format("Writer %s 로 연결 종료합니다.", fileName);
        System.out.println(msg);
    }
}

(3) Main문 작성(facade패턴이 적용되지 않은 형태)

package com.company.design;

import com.company.design.facade.Ftp;
import com.company.design.facade.Reader;
import com.company.design.facade.Writer;

public class Main {

    public static void main(String[] args) {
        //facade패턴이 적용되지 않은 형태
        Ftp ftpClient = new Ftp("www.foo.co.kr", 22, "/home/etc");
        ftpClient.connect();
        ftpClient.moveDirectory();

        Writer writer = new Writer("text.tmp");
        writer.fileConnect();
        writer.write();

        Reader reader = new Reader("text.tmp");
        reader.fileConnect();
        reader.fileRead();

        reader.fileDisconnect();
        writer.fileDisconnect();
        
        ftpClient.disConnect();
    }
}

(4) Facade 패턴이 적용된 형태 만들기 (SftpClient 추가)

SftpClient

package com.company.design.facade;

public class SftpClient {

    private Ftp ftp;
    private Reader reader;
    private Writer writer;

    public SftpClient(Ftp ftp, Reader reader, Writer writer){
        this.ftp = ftp;
        this.reader = reader;
        this.writer = writer;
    }

    //오버로딩
    public SftpClient(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();
        writer.fileConnect();
        reader.fileConnect();
    }

    public void disConnect(){
        reader.fileDisconnect();
        writer.fileDisconnect();
        ftp.disConnect();
    }

    public void read(){
        reader.fileRead();
    }

    public void write(){
        writer.fileWrite();
    }
}

(5) Facade 패턴이 적용된 형태 만들기 (Main문 작성)

package com.company.design;

import com.company.design.facade.Ftp;
import com.company.design.facade.Reader;
import com.company.design.facade.SftpClient;
import com.company.design.facade.Writer;

public class Main {

    public static void main(String[] args) {
        //facade패턴이 적용되지 않은 형태
        System.out.println("facade패턴이 적용되지 않은 형태");
        Ftp ftpClient = new Ftp("www.foo.co.kr", 22, "/home/etc");
        ftpClient.connect();
        ftpClient.moveDirectory();

        Writer writer = new Writer("text.tmp");
        writer.fileConnect();
        writer.fileWrite();

        Reader reader = new Reader("text.tmp");
        reader.fileConnect();
        reader.fileRead();

        reader.fileDisconnect();
        writer.fileDisconnect();

        //facade패턴이 적용된 형태
        System.out.println("facade패턴이 적용된 형태");
        SftpClient sftpClient = new SftpClient("www.foo.co.kr", 22, "/home.etc", "text.tmp");
        sftpClient.connect();

        sftpClient.write();
        sftpClient.read();

        sftpClient.disConnect();
    }
}

결론:

Facade 패턴을 적용하면, 기능 자체는 기존과 동일하나 바깥쪽에서는 코드가 간결해지고, 기존 기능을 인터페이스 해주는 형태로 코드가 구현된다.

 

10일차 강의 완료~

필기 & 내 화면 스크린샷 저장

 

https://bit.ly/37BpXiC

 

패스트캠퍼스 [직장인 실무교육]

프로그래밍, 영상편집, UX/UI, 마케팅, 데이터 분석, 엑셀강의, The RED, 국비지원, 기업교육, 서비스 제공.

fastcampus.co.kr

본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성되었습니다.