참치코더의 꿈 메모장

디자인 패턴 / 프록시 패턴(Proxy) 정리 본문

디자인 패턴

디자인 패턴 / 프록시 패턴(Proxy) 정리

참치깡 2025. 11. 2. 13:48
728x90

 

프록시 패턴은 대상 객체에 직접 접근하지 않고, 대리 객체(Proxy)를 통해 접근하도록 만드는 디자인 패턴이다.

즉 대리인이 실제 객체 대신 일을 처리하거나, 접근을 제어하는 구조이다.

 

- 대상 객체에 대한 접근을 제어하는 패턴

 

Client -> Proxy -> RealSubject

 

Client : 실제 기능을 요청하는 사용자

Proxy (대리자) : RealSubject에 대한 접근을 제어(전/후 처리, 캐싱, 보안, 로깅 등)

RealSubject (실제 객체) : 실제 비즈니스 로직을 수행

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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
// Subject 인터페이스
public interface Image {
    void display();
}
 
// RealSubject (실제 객체)
public class RealImage implements Image {
    private String filename;
 
    public RealImage(String filename) {
        this.filename = filename;
        loadFromDisk(); // 무거운 작업
    }
 
    private void loadFromDisk() {
        System.out.println("이미지를 디스크에서 로드합니다: " + filename);
    }
 
    @Override
    public void display() {
        System.out.println("이미지를 표시합니다: " + filename);
    }
}
 
// Proxy (대리 객체)
public class ProxyImage implements Image {
    private RealImage realImage;
    private String filename;
 
    public ProxyImage(String filename) {
        this.filename = filename;
    }
 
    @Override
    public void display() {
        if (realImage == null) { // 필요할 때만 로드한다.
            realImage = new RealImage(filename);
        }
        realImage.display();
    }
}
 
// Client
public class ProxyPatternDemo {
    public static void main(String[] args) {
        Image image = new ProxyImage("photo.png");
 
        // 실제 이미지 로드는 여기서 한 번만 일어난다.
        image.display();
        System.out.println("----------");
        image.display();
    }
}
cs

 

프록시 패턴의 종류

 

가상 프록시(Virtual Proxy) -> 무거운 객체의 생성을 지연(lazy loading)

보호 프록시(Protection Proxy) -> 접근 권한 제어

원격 프록시(Remote Proxt) -> 원격 객체를 로컬에서 대리

캐싱 프록시(Cache Proxy) -> 결과를 저장해 재사용

로깅 프록시(Logging Proxy) -> 호출 이력을 남김

 

장점 

 

- 객체에 대한 접근 제어가 가능하다.

- 지연로딩이나 캐싱, 로깅, 보안 등의 부가기능 추가가 가능하다.

- 기존 코드를 수정하지 않고 기능 확장이 가능하다. (OCP 원칙을 준수한다.)

 

단점

 

- 클래스 수가 많아져서 구조가 복잡해질 수 있다.

- 중간 계층이 존재해 실제 객체보다 성능이 약간 떨어 질수 있다.

 

스프링에서의 활용 예시

 

-  스프링 프레임워크는 내부적으로 프록시 패턴을 아주 많이 활용한다.

 

AOP

 

- 메서드 호출 전후로 로깅, 트랜잭션, 보안 등 부가기능을 추가할 때 프록시를 자동 생성한다.

 

트랜잭션 처리 (@Transactional)

 

- 프록시가 실제 비즈니스 로직 호출 전후에 트랜잭션 시작/종료를 처리한다.

 

지연 로딩 (Lazy Loading)

 

- JPA에서 연관된 엔티티를 실제로 접근할 때만 DB에서 조회하도록 프록시 객체로 감싼다.

 

 

 

728x90
Comments