Proxy란?
Proxy는 진짜 객체 대신 동작하는 가짜 객체이다.
사용자
│
▼
Proxy
│
▼
Real Object
실제 업무는 Real Object가 수행한다.
Proxy는 필요한 작업만 추가한다.
Proxy를 사용하는 이유
대표적으로 두 가지 목적이 있다.
1. 실행을 최대한 늦추기
대표적인 예가 @Lazy이다.
필요하기 전까지 실제 객체를 생성하지 않는다.
사용 안함
↓
객체 생성 X
↓
사용하는 순간
↓
객체 생성
메모리와 실행 시간을 절약할 수 있다.
2. 전처리 / 후처리 수행
대표적인 예가 @Transactional이다.
@Transactional이 붙은 메서드를 호출하면 실제 메서드가 바로 실행되는 것이 아니라, 먼저 Proxy가 호출된다.
Proxy는 메서드 실행 전후에 필요한 작업을 수행한 뒤 실제 객체의 메서드를 호출한다.
트랜잭션 시작
↓
실제 메서드 실행
↓
커밋 또는 롤백
이 과정은 모두 Proxy가 자동으로 처리해준다.
따라서 개발자는 비즈니스 로직만 작성하면 된다.
@Transactional
public void save() {
}
Proxy인지 확인하는 방법
디버깅을 해보면
PersonService$$SpringCGLIB$$0
처럼 출력된다.
이런 이름이 보이면 Spring이 Proxy 객체를 생성한 것이다.
@Lazy를 이용한 순환 참조 해결
@Autowired
@Lazy
private AppConfig self;
@Lazy를 사용하면 객체 생성을 뒤로 미룰 수 있다.
순환 참조가 발생하는 경우 생성 시점을 늦춰 문제를 해결하는 데 사용할 수 있다.
다만 순환 참조 자체는 설계를 개선하여 해결하는 것이 가장 좋은 방법이며, @Lazy는 필요한 경우에 사용하는 해결책이다.
'BackEnd > Spring' 카테고리의 다른 글
| [Spring] @Transactional이 내부 호출에서 동작하지 않는 이유 (0) | 2026.08.07 |
|---|---|
| [Spring] JPA 메서드 명명 규칙(Query Method) (0) | 2026.08.07 |
| [Spring] Bean 심화 - @Bean, @Qualifier, @Order 정리 (0) | 2026.08.06 |
| Spring Boot에서 HTML 페이지 출력하기 (Thymeleaf 사용법) (0) | 2026.08.06 |
| [Spring] Lazy Loading vs Eager Loading (0) | 2026.08.05 |
댓글