Spring 기초 정리 - Proxy 객체

Zyoon·2025년 7월 1일

Spring 기초정리

목록 보기
17/18
post-thumbnail

📘Proxy 객체는 진짜 객체 대신 앞에 서서 일을 대신 처리해주는 대리인


📍Proxy 객체란?

  • Proxy 객체는 실제 객체(원본 객체)를 감싸서 대신 동작하는 대리 객체
  • Spring에서는 주로 AOP, 트랜잭션, JPA 등의 기능을 비침투적으로 적용하기 위해 사용
  • 즉, 원래 객체의 기능을 유지하면서도, 부가적인 기능(로깅, 트랜잭션 등)을 삽입할 수 있도록 해주는 구조

📍프로그래밍에서의 Proxy 객체

  • 어떤 객체의 메서드를 호출할 때,
  • 실제로는 그 객체를 감싼 프록시 객체가 먼저 호출을 받은 뒤,
  • 필요한 일을 하고 나서 진짜 객체한테 전달해준다.
  • 즉, 메서드 호출을 가로채서, 부가 작업 후 진짜 메서드를 호출함

📍주요 사용 예시 (AOP, 트랜잭션, JPA)

  1. AOP

공통 관심사(로깅, 보안, 인증 등)를 핵심 로직과 분리해서 관리하기 위해 프록시가 메서드 호출을 가로채 해당 로직을 삽입

@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() {
        //서비스 로직
    }
}
  • 프록시 객체가 메서드를 감싸고 Before/After 코드를 자동 실행
  • 실제 코드에는 영향을 주지 않으면서 로깅/보안/모니터링 삽입 가능

  1. 트랜잭션

트랜잭션을 선언적으로 처리할 수 있도록, 메서드 실행 전후에 프록시가 트랜잭션 시작/커밋/롤백을 제어

@Transactional
public void saveOrder() {
    // 트랜잭션 시작
    // DB 작업 수행
    // 정상 처리 → 커밋 / 예외 → 롤백
}
  • @Transactional이 붙은 메서드는 프록시 객체가 트랜잭션을 관리
  • 메서드 실행 전후에 트랜잭션을 시작/종료해줌
  • 내부에서 this.saveOrder()처럼 직접 호출하면 프록시를 타지 않아 트랜잭션이 적용되지 않음

  1. JPA (지연 로딩, Lazy Loading)

연관 엔티티를 바로 로딩하지 않고 프록시 객체로 대체해서, 실제로 접근시 DB를 조회

@ManyToOne(fetch = FetchType.LAZY)
private User user;
Post post = postRepository.findById(1L).get();
User user = post.getUser(); // 이 시점에 DB 조회 발생
  • post.getUser()를 호출하기 전까지는 user는 프록시 객체
  • 실제로 접근할 때 Hibernate가 DB에서 값을 조회해서 채움
  • 프록시 객체는 영속성 컨텍스트가 닫히면 실제 엔티티를 로딩할 수 없으므로 주의 필요

📍그 외 사용처

기능설명
Spring Security@PreAuthorize 같은 보안 로직을 프록시로 제어
FeignClient / RestTemplateHTTP 통신을 로컬 메서드처럼 사용하기 위해 프록시 생성
Cache캐시 처리 로직도 프록시로 메서드 실행 전후에 제어

📍 마무리

  • Proxy 객체는 핵심 로직을 건드리지 않고 공통 기능을 삽입할 수 있게 해주는 강력한 도구
  • Spring에서의 많은 기능(AOP, 트랜잭션, JPA Lazy Loading 등)은 Proxy 없이 동작 불가
  • 프록시는 인터페이스 기반 또는 클래스 상속 기반 방식으로 생성됨
profile
기어 올라가는 개발

0개의 댓글