본문으로 바로가기
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.



프록시는 대리자, 대변인이라는 뜻을 가진다. 프록시는 다른 누군가를 대신해 그 역할을 수행하는 존재를 말한다. 뉴스에서도 청와대 대변인, 백악관 대변인 등등 다양한 대변인이 등장하는 것처럼 디자인 패턴에서도 대리자/대변인이 등장한다.


프록시 패턴의 중요 포인트


1. 대리자는 실제 서비스와 같은 이름의 메서드를 구현한다. 이때 인터페이스를 사용한다.

2. 대리자는 실제 서비스에 대한 참조 변수를 갖는다(함성).

3. 대리자는 실제 서비스의 같은 이름을 가진 메서드를 호출하고 그 값을 클라이언트에게 돌려준다.

4. 대리자는 실제 서비스의 메서드 호출 전후에 별도의 로직을 수행할 수도 있다.


프록시 패턴을 사용하지 않은 일반적인 코드


1
2
3
4
5
6
7
8
9
10
11
12
13
class Service {
    public String greeting(String str) {
        
        return "안녕하세요 " + str + "입니다.";
    }
}
 
public class ProxyPattern {
    public static void main(String[] args) {
        Service service = new Service();
        System.out.println(service.greeting("ktko"));
    }
}



프록시 패턴을 사용한 코드


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
interface IService {
    public String greeting(String str);
}
 
class Service implements IService{
 
    @Override
    public String greeting(String str) {
        // TODO Auto-generated method stub
        
        return "안녕하세요 " + str + "입니다.";
    }
}
 
class Proxy implements IService {
    IService iService;
    
    @Override
    public String greeting(String str) {
        // TODO Auto-generated method stub
        System.out.println("호출에 대한 흐름 제어가 주목적이며, 반환 결과를 그대로 전달한다.");
        
        iService = new Service();
        return iService.greeting(str);
    }
    
}
 
public class ProxyPattern {
    public static void main(String[] args) {
        IService service = new Proxy();
        System.out.println(service.greeting("청와대"));
    }
}



아래 예제를 보면 프록시 패턴을 이용하여 대리자를 새웠다. 또한 위에서 말한 프록시 패턴의 중요 포인트의 내용들을 포함하고 있다. 


프록시 패턴을 간단하게 정리하자면 "제어 흐름을 조정하기 위한 목적으로 중간에 대리자를 두는 패턴"


위의 예제에서 Service, IService, Proxy의 구조를 보면 SOLID의 개방 폐쇄 원칙(OCP)를 활용한 것임을 알 수 있다. 또한 인터페이스를 중간에 두고 영향을 받지 않게끔 하기 위해 SOLID의 의존역전 법칙(DIP)를 사용하였다. 프록시 패턴은 개방 폐쇄 원칙과 의존 역전 법칙이 적용된 설계 패턴이다.


SOLID가 무엇인지 모른다면 블로그에 SOLID 5가지 원칙을 정리하였으니 보는 것을 추천한다.


다른 프록시 패턴의 예제로 위키백과에 있는 프록시 패턴 예제를 들 수 있다.