
📘Proxy 객체는 진짜 객체 대신 앞에 서서 일을 대신 처리해주는 대리인
공통 관심사(로깅, 보안, 인증 등)를 핵심 로직과 분리해서 관리하기 위해 프록시가 메서드 호출을 가로채 해당 로직을 삽입
@Aspect
@Component
public class LogAspect {
@Around("execution(* com.example.service.*.*(..))")
public Object log(ProceedingJoinPoint joinPoint) throws Throwable {
//메서드 실행 전 작업
Object result = joinPoint.proceed(); // 실제 메서드 실행
//메서드 실행 후 작업
return result;
}
}
@Service
public class UserService {
public void createUser() {
//서비스 로직
}
}
트랜잭션을 선언적으로 처리할 수 있도록, 메서드 실행 전후에 프록시가 트랜잭션 시작/커밋/롤백을 제어
@Transactional
public void saveOrder() {
// 트랜잭션 시작
// DB 작업 수행
// 정상 처리 → 커밋 / 예외 → 롤백
}
@Transactional이 붙은 메서드는 프록시 객체가 트랜잭션을 관리this.saveOrder()처럼 직접 호출하면 프록시를 타지 않아 트랜잭션이 적용되지 않음연관 엔티티를 바로 로딩하지 않고 프록시 객체로 대체해서, 실제로 접근시 DB를 조회
@ManyToOne(fetch = FetchType.LAZY)
private User user;
Post post = postRepository.findById(1L).get();
User user = post.getUser(); // 이 시점에 DB 조회 발생
post.getUser()를 호출하기 전까지는 user는 프록시 객체| 기능 | 설명 |
|---|---|
| Spring Security | @PreAuthorize 같은 보안 로직을 프록시로 제어 |
| FeignClient / RestTemplate | HTTP 통신을 로컬 메서드처럼 사용하기 위해 프록시 생성 |
| Cache | 캐시 처리 로직도 프록시로 메서드 실행 전후에 제어 |