실제 객체를 호출하기전 앞 단에서 호출되어 서비스를 위임하는 패턴. 주 목적은 접근제어. 접근제어에는 권한에 따른 접근 차단, 캐싱, 지연 로딩 등이 있다.

Untitled

프록시 패턴 사용시 장점

프록시 객체가 클라이언트의 모든 요청을 받아서 실제 객체에 대한 서비스에 대한 접근을 흐름을 제어하면서 서비스를 유연하게 제공할 수 있다.

Untitled

예를 들어 리소스를 많이 잡아먹는 쿼리문을 각각의 클라이언트 들이 요청을 한다면 데이터베이스는 정말 느려진다

Untitled

프록시는 데이터베이스 객체로 자신으로 변장한다. 프록시는 지연된 초기화 및 결과값 캐싱을 클라이언트와 실제 데이터베이스 객체가 알지 못하는 상태에서 처리할 수 있다.

프록시 구현 코드


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

Untitled

Untitled

프록시 적용시

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() {
        System.out.println("게임 준비 중");
        
        if (this.gameService == null) {
            this.gameService = new DefaultGameService();
        }
        gameService.startGame();
        
        System.out.println("게임 진행 완료");
    }
}