| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 |
- web
- 미니정리
- 백엔드
- jpa
- BACK-END
- MySQL
- 자바
- 정리
- 알고리즘
- 자바스크립트
- Next.js
- java
- 서버
- spring
- SQL
- 프런트엔드
- oracle
- 오라클
- 스프링부트
- 프론트엔드
- 코드 테스트
- 데이터베이스
- node.js
- 디자인 패턴
- 쿼리
- 코드테스트
- jsp
- 프로그래머스
- JavaScript
- 스프링
- Today
- Total
참치코더의 꿈 메모장
디자인 패턴 / 프록시 패턴(Proxy) 정리 본문

프록시 패턴은 대상 객체에 직접 접근하지 않고, 대리 객체(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에서 조회하도록 프록시 객체로 감싼다.
'디자인 패턴' 카테고리의 다른 글
| 상태 패턴(State Pattern) 정리 (0) | 2025.10.26 |
|---|---|
| 디자인 패턴 / 컴포지트 패턴 정리 (0) | 2025.10.22 |
| 디자인 패턴 / 반복자 패턴 정리(코드 위주) (0) | 2025.10.16 |
| 디자인 패턴 / 템플릿 메서드 패턴 (0) | 2025.10.14 |
| 디자인 패턴 / 퍼사드(Facade) 패턴 (0) | 2025.10.12 |