본문 바로가기
  • Let's study
BackEnd/Spring

[Spring] Proxy란? @Transactional과 @Lazy가 동작하는 원리

by 코딩고수이고파 2026. 8. 6.

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는 필요한 경우에 사용하는 해결책이다.

댓글