-
[JAVA]객체 지향 디자인 패턴 - Proxy Pattern(대리인 패턴)프로그래밍/Java 2022. 3. 23. 16:44반응형
Proxy Pattern이란?
- 어떤 객체의 행위가 무거운 행동일 때 이 내용을 먼저 보여주지 않고 Proxy라는 대리인을 먼저 보여준다음 진짜 수행해달라고 요청을 할때 내용을 수행하는 것을 의미한다.
- 예를 들어 유튜브 동영상리스트를 보면 먼저 thumbnail과 제목이 보이고 마우스를 위로 올리면 preview가 보이며 그것을 클릭을 했을 때 진짜 페이지가 이동하면서 동영상이 보이는 것처럼 thumbnail과 제목이 proxy(대리인)역할이며, Preview가 보이는 것이 Real 행동이라고 보면 된다.
Proxy Pattern Structure(프록시 패턴 구조)
- 먼저 Thumbnail이라는 인터페이스를 기준으로 ProxyThumbnail, RealThumbnail을 작성한다.
- ProxyThumbnail은 대리인이므로, 먼저 페이지에 노출 시킬 객체, RealThumbnail은 진짜 행동을 하는 객체로 구분한다.
- ProxyThumbnail에서는 동영상을 가지고 있지 않고 showPreview를 호출 하면 RealThumbnail를 생성 및 showPreview를 호출하여 동영상을 재생시켜 준다.
- ProxyThumbnail은 동영상을 가지고 있지 않는 이유는 동영상 리스트가 모두 데이터를 가지고 있는다면 용량이 커져서 화면이 구동되지 않는 것을 방지하기 위함이다.
Proxy Pattern Example
(출처. 얄팍한 코딩사전)
Thumbnail 인터페이스 및 객체 클래스
public interface Thumbnail { public void showTitle(); public void showPreview(); } public class RealThumbnail implements Thumbnail{ private String title; private String movieUrl; public RealThumbnail(String title, String movieUrl) { this.title = title; this.movieUrl = movieUrl; //URL로부터 영상을 다운받는 작업 - 시간 많이 소모 System.out.println(movieUrl + "로부터" + title + "의 영상 데이터 다운"); } @Override public void showTitle() { System.out.println("제목: " + title); } @Override public void showPreview() { System.out.println(title + "의 프리뷰 재생"); } } public class ProxyThumbnail implements Thumbnail{ private String title; private String movieUrl; private RealThumbnail realThumbnail; <----- RealThumbnail 객체를 가지고 있다. public ProxyThumbnail(String title, String movieUrl) { this.title = title; this.movieUrl = movieUrl; //영상을 받아오지 않는다. } @Override public void showTitle() { System.out.println("제목: " + title); } @Override public void showPreview() { //객체 생성 시 동영상을 가져오는 로직이 있기때문에 //동일한 내용이 반복적으로 재생되지 않기 위해서 if(realThumbnail == null) { realThumbnail = new RealThumbnail(title, movieUrl); } realThumbnail.showPreview(); <---Real객체를 호출해 준다 } }
구동하기
public class ThumbnailTest { public static void main(String[] args) { ArrayList<Thumbnail> thumbnails = new ArrayList<Thumbnail>(); thumbnails.add(new ProxyThumbnail("Git 강좌","/git.mp4")); thumbnails.add(new ProxyThumbnail("Rest API란?","/rest_api.mp4")); thumbnails.add(new ProxyThumbnail("도커 사용법","/docker.mp4")); thumbnails.add(new ProxyThumbnail("객체지향 프로그래밍","/oodp.mp4")); thumbnails.add(new ProxyThumbnail("블록체인의 원리","/blockChain.mp4")); for(Thumbnail thumbnail : thumbnails) { thumbnail.showTitle(); } // 제목: Git 강좌 // 제목: Rest API란? // 제목: 도커 사용법 // 제목: 객체지향 프로그래밍 // 제목: 블록체인의 원리 //객체가 이미 생성 되어있으므로 같은 것을 호출 하게 되면 //동영상을 다시 받아오는 과정은 생략 된다. thumbnails.get(2).showPreview(); thumbnails.get(2).showPreview(); thumbnails.get(4).showPreview(); thumbnails.get(1).showPreview(); // /docker.mp4로부터도커 사용법의 영상 데이터 다운 // 도커 사용법의 프리뷰 재생 // 도커 사용법의 프리뷰 재생 // blockChain.mp4로부터블록체인의 원리의 영상 데이터 다운 // 블록체인의 원리의 프리뷰 재생 // /rest_api.mp4로부터Rest API란?의 영상 데이터 다운 // Rest API란?의 프리뷰 재생 } }
- 여기서 중요한 점은 ProxyThumbnail만 객체를 생성해서 그안에 있는 함수만 사용했다는 점이다.
Proxy Pattern을 사용하는 이유?
- Proxy Pattern은 대리인이라고 불리는 객체를 먼저 호출하여 사용하고, 용량이 큰 진짜 객체를 나중에 필요할때만 사용하고 싶을 때 사용한다.
- 대리인 객체를 너무 남발하면 오히려 더 무거워 질수 있으니, 굳이 속도가 나오는데 객체를 나눠서 사용하진 않아도 된다.
반응형'프로그래밍 > Java' 카테고리의 다른 글
[JAVA]객체 지향 디자인 패턴 - Decorator Pattern(장식자 패턴) (0) 2022.03.24 [JAVA]객체 지향 디자인 패턴 - Template Method Pattern(탬플릿 메소드 패턴) (0) 2022.03.23 [JAVA]객체 지향 디자인 패턴 - Adapter Pattern(어댑터 패턴) (0) 2022.03.23 [JAVA]객체 지향 디자인 패턴 - State Pattern(상태 패턴) (0) 2022.03.22 [JAVA]객체 지향 디자인 패턴 - Strategy Pattern(전략 패턴) (0) 2022.03.22