스프링이 빈을 감싼 대리 객체를 대신 주입해서, 메서드 호출 앞뒤에 트랜잭션·보안 같은 부가 기능을 끼우는 방식. aop(Aspect-Oriented Programming)의 기본 구현이다.
- @Transactional은 프록시가 호출 전에 트랜잭션을 열고, 끝나면 커밋하거나 롤백한다
- 같은 클래스 안에서
this.method()로 부르면 프록시를 거치지 않아 부가 기능이 빠진다 → 자기 호출 문제 - JPA 지연 로딩도 비슷한 아이디어로, 연관 엔티티 자리에 프록시를 두고 처음 접근할 때 조회한다
- 인터페이스 기반 JDK 동적 프록시(JDK Dynamic Proxy)와 하위 클래스를 만드는 CGLIB(Code Generation Library) 프록시가 있고, Spring Boot는 기본으로 CGLIB를 쓴다
이 방식은 GoF 디자인 패턴의 프록시 패턴을 프레임워크가 대신 적용한 것이다. 프록시 패턴은 실제 객체와 같은 인터페이스를 가진 대리 객체를 앞에 두고 접근을 가로채, 권한 확인·지연 로딩·캐싱·원격 호출 같은 통제를 끼워 넣는다. 호출하는 쪽은 진짜와 대리를 구분하지 않는다. 같은 "감싸기"라도 기능을 덧붙이는 데 목적이 있으면 데코레이터 패턴, 인터페이스를 바꾸면 어댑터 패턴으로 구분한다(구조 패턴).
참고: Proxying Mechanisms — Spring Framework · Proxy — Refactoring.Guru