퍼사드 패턴

반응형
반응형

퍼사드? 그게 뭔데 패턴으로 붙여 놨을까? 이것 부터 알아야할듯 싶다. 완벽하게 일치는 안해도 퍼사드 하면 떠오르는 이미지가 있는게 좋지 않을까?

퍼사드는 건물의 정면을 말한다고 한다. 어떻게 보면 이름을 잘지은 패턴이라고 할 수도 있겠다.

퍼사드 패턴은 객체지향의 최소 지식 원칙을 준수한다고 한다. 최소 지식 원칙이라는게 무엇일까? 여기서 말하는 지식은 도대체 뭘까? 내가 생각할 때, 사람의 지식은 아닌것 같다는 느낌이 든다. 이게 무슨 말이냐면...

보통 지식은 많은 것을 아는 것을 뜻한다. 하지만 객체지향의 지식은 조금 다르게 해석 되는것 같다. 

바로 클래스의 연결로 결정된다. 이게 무슨 말이냐면

 

A,B클래스가 있다고 가정하자.

또, A클래스는 B클래스와 연결이 되어있다. 이 정도가 최소 지식 원칙인 것이다. A클래스에 메소드가 얼마나 들었는지 B클래스에 메서드가 얼마나 많은지는 상관없다. 왜냐하면 객체 지향은 객체를 뜻하는 것이기 때문이다. 클래스 하나당 사람으로 봐야지 이걸 사람의 생각이나 뇌로 생각하면 곤란하다. 만약 이렇게 이해하려고 노력한다면 이미 이 패턴을 이해하는데 어려움이 있을거라 예상한다.

 

근데... 프로그래밍이라는게 위 처럼 클래스가 2개만 존재하는 것이 아니다. 3,4개 아니 100개도 객체가 존재할 수 있는 세계가 바로 이 객체지향 세계다. 그러면 100개 이상이 되는 클래스들을 어떻게 하면 전부 최소 지식 원칙을 준수하면서 만들 수 있을까? 사실 정답은 이미 알고 있다. 다만 이것을 어떻게 구현하는지는 설명하고 있지 않기 때문에 이 부분에 대해 설명하도록 하겠다.

 

예제 이기 때문에 100개가 넘는 클래스를 작성하는 건 무리고,

간단하게 3,4개 정도 되는 클래스로 준비를 해봤다.

저번 패턴들과 달리 이번에는 한 시나리오를 도입해보려고 한다. 시나리오는 다음과 같다.

도서관이 있다.  도서관에는 사서, 청소부, 고객이 있다. 또 사서는 책을 정리하고, 청소부는 청소를 한다. 고객은 책을 읽는다. 이것을 구현해보자.

 

사서, 청소부, 고객이다. 이들은 다음과 같은 역할을 한다.

public class Librarian {
    public void work() {
        System.out.println("일을 합니다.");
    }
}

public class Cleaner {
    public void clean() {
        System.out.println("청소를 합니다.");
    }
}

public class Customer {
    public void book() {
        System.out.println("대출합니다.");
    }
}

물론 현재는 도서관 클래스에 때려 박아도 이 원칙에는 어긋나지 않을 듯 싶다. 하지만 고객이 사서로 취업한다면??? 그 코드를 작성해보자.

 

public class Customer {
    public void book() {
        System.out.println("대출합니다.");
    }

    public Librarian job() {
        return new Librarian();
    }
}

현재까지는 아무런 문제가 없다. 이제 도서관 객체를 만들어서 이들을 일시켜보자.

public class Library {
    
    private Librarian librarian;
    private Cleaner cleaner;
    private Customer customer;
    
    public void work() {
        librarian.work();
        cleaner.clean();
        customer.book();
    }
}

지금까지는 아무런 문제가 없지만... 고객이 갑자기 취업이 되버려서 사서가 되버린다면???

public class Library {
    private Customer customer;

    public void work() {
        customer.job().work();
    }
}

이건 최소 지식 원칙에 벗어난다. 왜냐하면 도서관 클래스에서 고객 객체를 가져오고 그 객체(사서 객체)에서 메소드(work)를 호출하기 때문이다.

그럼 이걸 어떻게 바꿔야 할까? 간단히 말하면 customer.work()같은걸로 바꿔야 한다.

public class LibraryFacade {
    private Librarian librarian;
    private Cleaner cleaner;
    private Customer customer;

    public LibraryFacade(Librarian librarian, Cleaner cleaner, Customer customer) {
        this.librarian = librarian;
        this.cleaner = cleaner;
        this.customer = customer;
    }
    
    public void librarianWork() {
        librarian.work();
    }
    
    public void cleanerWork() {
        cleaner.clean();
    }
    
    public void customerWork() {
        customer.book();
    }
    
}

이제 각자 일을 부여하고 일을 시켜줬다. 사실 여기까지 작성했을때 잘 모르겠다. 내가 생각한게 맞는지 아닌지도 확실하진도 모르겠다. 일단 다시 도서관 클래스를 만들어보자.

public class Library {
    
    private LibraryFacade libraryFacade;
    
    public void work() {
        libraryFacade.librarianWork();
        libraryFacade.cleanerWork();
        libraryFacade.customerWork();
    }
    
}

자 이렇게 하면 완성이다. 그럼 여기서 드는 의문은 취업은??? 어떻게 되었지 라는 의문이 들지도 모른다.

그건 바로 생성자에 추가해주면 된다. customet.job()이렇게 추가해주면 이것또한 사서 객체이므로 이 패턴에서 벗어나지 않는다.

 

물론 지금까지 설명한게 틀릴 수 도 있다. 하지만 퍼사드의 핵심은 퍼사드에서 서브 클래스를 연결 시켜준다는 점은 변함이 없다. 어떻게 보면 어댑터 패턴과 유사하다. 하지만 어댑터 패턴은 서로 다른 객체를 바꾼다는 점에 있지만 퍼사드 패턴은 1개 이상의 객체를 사용한다는점에 있다. 뭐 어떻게 보면 사용한다는것이 바꾼다는 거랑 같다고 느낄 수도 있겠다.

 

근데 여기서는 생성자로 입력을 받았지만 이걸 빌더 패턴으로 만들 수도 있고, 또, set같은걸로 만들 수 도 있을것 같다.

그래야 더 확실해질 것 같은 느낌이다. 물론 단점이 있다. 가끔 이런 생각이 들 수 도 있다. 굳이 이렇게 작성해야하나. 그냥 바로 사용하면 안되나.... 너무 클래스를 많이 만드는거 야냐... 성능이 떨어지는 거아냐가 단점이다..ㅜㅜ 하지만 이 원칙을 지키면 깔끔한 코드를 작성할 수 있다는 점은 분명하다.

 

지금까지 공부한것을 접목 시켜 생각해보자.

포스팅은 작성되지 않았지만 전략 패턴 : 사용이 가능하나 클래스 하나하나 신경써줘야 할듯 싶다.

예를 들어 : 고객을 책만 읽는 고객, 그냥 고객, 아무것도 안하는 고객등으로 구분 지을 수 있을 것 같다.

어댑터 패턴 : 어떤 특정 클래스를 변환 시켜줄 수 있을 것 같다.

예를들어 고객 -> 사서로 여기에서는 메서드로 표현했지만 어댑터를 이용하면 패턴을 사용해서 바꿀 수 있을 것같다.

브릿지 패턴 : 평소에는 고객이 책을 1권만 빌릴 수 있지만, 어떤 날에는 3-4권을 빌릴 수 있게 만들 수 있을 것 같다.

왜냐하면 브릿지 패턴은 기능을 변경하거나 추가하는것이기 때문이다.

 

 

반응형

'디자인패턴' 카테고리의 다른 글

데코레이터 패턴  (0) 2020.05.02
컴포지트 패턴  (0) 2020.05.01
옵저버 패턴  (0) 2020.04.28
브릿지 패턴  (0) 2020.04.22
어댑터 패턴  (0) 2020.04.21

댓글

Designed by JB FACTORY