5. Proxy

JPA (Java Persistence API)에서 Proxy(프록시)는 엔티티(Entity)를 지연 로딩(Lazy Loading)하기 위해 사용되는 동적 생성된 객체입니다. JPA는 프록시를 사용하여 엔티티의 연관된 객체를 필요할 때까지 로딩을 지연시킴으로써 성능을 향상시킬 수 있습니다.

프록시는 실제 엔티티와 동일한 인터페이스를 가지고 있지만, 실제 객체 데이터를 갖고 있지 않습니다. 대신, 프록시는 실제 데이터를 로딩하기 위해 영속성 컨텍스트(Persistence Context)와 데이터베이스와의 상호작용을 대신합니다. 이를 통해 필요한 시점에만 데이터를 로딩하여 불필요한 쿼리 실행을 줄일 수 있습니다.

프록시는 엔티티의 연관 관계에서 특히 많이 사용됩니다. 예를 들어, A 엔티티와 B 엔티티가 일대다 관계를 가진다고 가정해보겠습니다. A 엔티티를 조회할 때 B 엔티티를 모두 함께 로딩한다면, 성능 저하와 메모리 낭비가 발생할 수 있습니다. 이때 JPA는 B 엔티티를 프록시로 감싸고, B 엔티티가 실제로 필요한 시점에만 로딩합니다.

프록시는 주로 다음과 같은 상황에서 사용됩니다

1. 지연 로딩 (Lazy Loading)

연관된 엔티티를 필요로 할 때까지 로딩을 지연시키는 기능입니다. 필요한 시점에만 데이터를 로딩하여 쿼리 실행을 최적화할 수 있습니다.

2. 프록시 캐싱

프록시는 실제 엔티티와 동일한 인터페이스를 가지기 때문에 캐싱이 가능합니다. 반복적으로 동일한 프록시를 요청하면 영속성 컨텍스트에서 캐시된 프록시를 반환하여 성능을 향상시킵니다.

3. 엔티티의 연관 관계 관리

프록시를 사용하여 엔티티 간의 연관 관계를 관리할 수 있습니다. 엔티티를 조회하거나 저장할 때 연관된 엔티티를 자동으로 로딩하거나 저장할 수 있습니다.

프록시는 JPA에서 내부적으로 사용되는 기능이므로 개발자가 직접 프록시를 생성하거나 다룰 필요는 없습니다. JPA는 엔티티와 연관된 프록시를 투명하게 관리하여 개발자에게 객체 지향적인 인터페이스를 제공합니다.

Last updated