ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [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은 대리인이라고 불리는 객체를 먼저 호출하여 사용하고, 용량이 큰 진짜 객체를 나중에 필요할때만 사용하고 싶을 때 사용한다.
    • 대리인 객체를 너무 남발하면 오히려 더 무거워 질수 있으니, 굳이 속도가 나오는데 객체를 나눠서 사용하진 않아도 된다.
    반응형

    댓글

Designed by Tistory.