라즈베리파이반

라즈베리파이 등 컴퓨터계열 게시판입니다.

제목디자인 패턴(Design Pattern) : 프록시 / 데코레이터2022-06-29 17:26
작성자user icon Level 4

88x31.png



1. 프록시 패턴(Proxy Pattern)


프록시 패턴은 다른 객체로의 접근을 통제하기 위해 그 객체의 대리자를 두는 패턴입니다. 


AaBM3TdBtUrg4msnWJgBqIIdXVtn+WutA4BydBbAnY+DdAcwAFRTLV9mbwUwAJSr0fHanb0VwABUntIXAPqjO4wCANUmfwNAf8jfAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwFbzH1ZLIeZ6vumxAAAAAElFTkSuQmCC


프록시는 인터페이스를 통해 실제 서비스와 같은 이름의 메소드를 구현하며, 클라이언트의 직접적인 접근을 제어할 수 있습니다. 또한 메소드 호출 전후에 별도의 로직을 수행할 수도 있습니다.


예제코드를 작성해보겠습니다.


IServerModule.java:

FiCsK9kAAAAASUVORK5CYII= 

서비스에 대한 인터페이스입니다. 실제 서비스와 같은 이름의 메소드를 사용합니다.


ServerModule.java:

vBKpmVjPTmsAAAAASUVORK5CYII= 

실제 실행되는 서비스의 클래스 입니다. 서비스 인터페이스를 상속받습니다.


Proxy.java:

Ef4VrhbAAAAAElFTkSuQmCC

프록시 클래스 입니다.실제 서비스와 같은 이름의 메소드를 구현하며, 서비스를 실행하기 전후에 별도의 명령을 수행함으로써 서비스에 대한 사용자의 접근을 제어할 수 있습니다.


Main.java:

0ubxgb0ZBLAAAAAElFTkSuQmCC 


프록시를 통해 execute 메소드를 실행하면 아래와 같은 출력을 얻을 수 있습니다.

mP8Dpwb1DBcJunQAAAAASUVORK5CYII= 


프록시의 종류로는 원격 프록시(Remote Proxy), 가상 프록시(Virtual Proxy), 접근 프록시(Access Proxy)가 있습니다.


원격 프록시는 서로 다른 주소 공간에 존재하는 객체의 메소드의 호출을 가능하게 합니다. 위에 예제에서 사용한 프록시가 원격 프록시라고 할 수 있습니다.


가상 프록시는 인스턴스가 필요한 시점에 인스턴스를 생성하고 초기화를 실행합니다. 작업이 오래 걸리는 서비스에 대하여 필요할 경우에 인스턴스를 생성함으로써 작업시간을 줄일 수 있습니다.


접근 프록시는 실제 서비스에 대한 접근을 제어할 수 있습니다. 메소드 접근이 가능한 사용자의 호출만 허가하여 보안을 강화시킬 수 있습니다.




2. 데코레이터 패턴(Decorator Pattern)


데코레이터 패턴은 주어진 상황과 용도에 따라 객체에 동적으로 책임(기능)을 추가할 수 있는 패턴입니다. 유연한 확장을 위해 상속 대신 사용할 수 있는 대안입니다.



Aktk1Dj1yvH7AAAAAElFTkSuQmCC


위에 클래스 다이어그램에서 보듯이 컴포지트 패턴을 사용하여 구현할 수도 있으며, 기능은 프록시 패턴과 유사합니다. 프록시 패턴이 별도의 로직을 처리하는 것이 목적이라면 데코레이터 패턴은 클라이언트의 반환값에 장식을 더하거나 기능을 추가하는 것이 목적입니다.


예제코드를 통해 라면을 끓여보겠습니다.


Component.java:

Hi4iL+bRlBEKaIeDxBUIGgW8aczgf9zRxBEIIhHk8QVEAMTxBUQAxPEFRADE8QVEAMTxBUQAxPEFRADE8QVEAMTxBU4P9vIb3YRvEvPQAAAABJRU5ErkJggg== 

라면 클래스에 대한 인터페이스 입니다.


Ramen.java:

D8lRhGUeb3jswAAAABJRU5ErkJggg== 

기본적인 라면 클래스 입니다.


Decorator.java:

AajEMgMTCExHAAAAAElFTkSuQmCC 

데코레이터 클래스 입니다. 상속을 위한 최상위 클래스가 됩니다.


Kimchi.java:

AQR0PuWuIMzmAAAAAElFTkSuQmCC 

김치를 추가하는 데코레이터 입니다.


Seafood.java:

4IOjgAAAABJRU5ErkJggg== 

해산물을 추가하는 데코레이터 입니다.


Cheese.java:

08LulS31FXXAAAAAElFTkSuQmCC 

치즈를 추가하는 데코레이터 입니다.


라면을 끓여봅시다!


Main.java:

AzGiF9oEEE9KAAAAAElFTkSuQmCC 


같은 make 메소드를 통해 만들어지는 라면이 달라지는 것을 확인할 수 있습니다.

dIOGSCSRcIrQgmQGhBRkKoQUZCqHFLE5cGh06cWl0DFc9ticnDeRRFK+hqqsj4dKshUv2coHucmUW8YjE9I5IuISZCpcw+slJl9T149PoJFwaRt9QRjw5qTzZ4EUytSRcGsDm5KRTbFFkEALYcgm5tYgPSLg0Y+FSC5OTky7KuKKxS5qmlQBKSnDTvSASLk2KlaEYnZzkBtjWlHFtIs6mi1FIuGSNsaEYn5w0+uAMQMKlBwuX7nVyki0kXJqjcMn25KQhwVIbzaU2CZfmKlxS+9R+Xvh9npH4RcKlZ4WESyaQcInQgmQGhBZkKIQWZCiEFmQohBbW56M0ovj2Jp2BEOiyHVCiJz5a4dBzetOucSzWGj+P2KXua+dgOd1jxZr3d+lLg30zzXb+D7ysiY0phKmzAAAAAElFTkSuQmCC 

#디자인 패턴# 프록시 패턴# 데코레이터 패턴
댓글
자동등록방지
(자동등록방지 숫자를 입력해 주세요)