Computer Science

Proxy Pattern | 프록시 패턴

연_우리 2022. 8. 16. 22:31
반응형

목차

     

     

     

     

    어떤 상황에서 쓰일까?

    애플리케이션 내에서 A라는 객체를 만드는데에 10초가 걸린다고하자.

    A 객체를 만들어야만 애플리케이션이 동작하는데 

    A 객체의 값이 필요한 상황은 아니라고하자. 즉 A의 깡통만 있으면 된다는 얘기이다!

     

    뒤에 할일이 너무 많아도 10초를 기다려서 A객체가 만들어지기를 기다리는게 나은 선택일까?

     

    차라리 A객체의 값이 실제로 필요할 때 A를 만들고 그 전에는 깡통인 채로 놔두면 어떨까?

     

     

     

     

    프록시 패턴이란?

    특정 객체에 대한 접근을 제어하거나 기능을 추가할 수 있는 패턴

    초기화 지연, 접근제어, 캐싱 등 다양하게 응용할 수 있다!

     

    프록시의 활용

    - 초기화 지연

       리소스가 많이 사용되는 객체인 경우, 해당 객체 타입의 프록시를 만든 후

       실제 객체가 필요한 순간에 프록시가 실제 객체를 바라보게 해서 초기화를 최대한 늦춘다

     

    - 접근제어

       어떤 객체는 특정 권한이 있어야만 접근이 가능할 때, 중간에 프록시를 두고 

       프록시에서 권한을 체크한 후 실제 객체에 접근하게한다

     

    - 캐싱

       객체에 접근할 때, 이미 여러번 접근했던 객체라면 굳이 실제 객체까지 가지 않아도 되지 않을까?

       프록시에서 객체의 값을 저장해두었다가 빠르게 값을 반환해주어 캐싱처리한다

     

    등등...

     

     

    장점

    - 기존 코드를 변경하지 않고 프록시를 통해 새로운 기능을 추가할 수 있다

    - 기존 코드가 해야하는 일만 유지할 수 있다.

     

    단점

    - 코드의 복잡도 증가

     

     

    구현코드

    기존코드

    public class GameService {
        public void startGame() {
            System.out.println("이 자리에 오신 여러분을 진심으로 환영합니다.");
        }
    }
    ---------------------------------------------------------------------------
    public class Client {
        public static void main(String[] args) throws InterruptedException {
            GameService gameService = new GameService();
            gameService.startGame();
        }
    }

     

     

     

    변경코드

    public interface GameService {
        void startGame();
    }
    ---------------------------------------------------------------
    public class DefaultGameService implements GameService {
    
        @Override
        public void startGame() {
            System.out.println("이 자리에 오신 여러분을 진심으로 환영합니다.");
        }
    }
    ---------------------------------------------------------------
    public class GameServiceProxy implements GameService {
    
        private GameService gameService;   //실제 객체가 필요할 때 호출해야하니 참조한다
    
        @Override
        public void startGame() {
        	//초기화 지연
            if (this.gameService == null) {
                this.gameService = new DefaultGameService();
            }
    
            gameService.startGame();
        }
    }
    public class Client {
    
        public static void main(String[] args) {
            GameService gameService = new GameServiceProxy();
            gameService.startGame();
        }
    }

     

     

    반응형
    • 네이버 블러그 공유하기
    • 페이스북 공유하기
    • 트위터 공유하기
    • 구글 플러스 공유하기
    • 카카오톡 공유하기