본문 바로가기
DB/JPA

[JPA] Proxy(프록시)

by 보보트레인 2024. 1. 16.

Proxy는 "대리"의 의미를 지닌다.

 

즉, 내부 네트워크에서 인터넷 접속을 할 때, 빠른 엑세스나 안전한 통신등을 확보하기 위한 중계서버를 "프록시 서버"라고 일컫는다. 클라이언트와 Web서버의 중간에 위치하고 있어, 대신 통신을 받아 주는 것이 프록시 서버이다.

 

프록시(Proxy)의 종류


 프록시(Proxy)는 포워드 프록시리버스 프록시로 나뉘어져, 기본적으로 포워드 프록시는 클라이언트쪽, 리버스 프록시는 서버쪽의 설정을 한다.

출처: https://engineer-mole.tistory.com/288 [매일 꾸준히, 더 깊이:티스토리]

 

 

포워드 프록시의 경우 프록시 서버가 위와 같이 외부 Web서버와 통신을 한다. 그러므로 클라이언트는 프록시 서버만을 통해 정보를 얻게 된다. 따라서 Web 서버 쪽에서는 프록시 서버를 통한 엑세스 로그가 남는다.

 

이 로그를 통해 프록시 서버에 캐시를 저장할 수 있다.

다시 동일한 페이지를 리퀘스트 했을 때에는 캐시에 남아 있는 정보를 클라이언트에게 즉시 전달해준다. 사이트에 접속하는 속도가 빨라진다. 추가적으로 외부의 엑세스는 프록시 서버를 경유하므로 사용자 전원의 외부 웹 사이트로의 엑세스를 필터링 할 수 있다. 

 

리버스 프록시의 경우 포워드 프록시와 달리 Web서버쪽에 위치하여 클라이언트의 접근을 최초로 받아 리퀘스트에 해당하는 Web서버에 배분해주는 역할을 한다.

부담을 분산하고이고, 캐시를 저장할 수 있음은 물론, 프록시 서버에 집약되는 통신을 이용하여 프록시 서버 내에 보안, 바이러스 대책을 구축하는데 용이하다.

 


JPA 에서의 프록시(Proxy)


JPA에서 프록시는 엔티티 객체를 대신하여 데이터베이스에서 필요한 정보를 지연 로딩하거나 추가적인 작업을 수행한다.

<프록시의 주요 사용 사례>

1. 엔티티 로딩

JPA는 엔티티를 로딩할 때 프록시를 사용하여 성능을 최적화 한다.

엔티티가 실제로 필요할 때까지 로딩을 지연할 수 있다.


2. 지연 로딩 (Lazy Loading)

프록시를 사용하여 엔티티의 연관 관계를 지연 로딩으로 설정할 수 있으며, 실제로 접근할 때 로딩된다.

 

<예시>

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "id")
private Id id;

 

@ManyToOne(fetch = FetchType.LAZY)  : 다 대 일 관계에서의 지연로딩을 정의하고 있다.

 

< 어떤 상황에서 어떤 전략을 사용해야 하는지 안내 >

프록시 사용 (지연 로딩):
연관된 엔티티가 필요한 경우에만 로딩해야 할 때.
연관된 엔티티가 많거나 큰 규모의 데이터인 경우 성능을 최적화하려는 경우.

 

Eager Loading(즉시 로딩) 사용:
연관된 엔티티가 항상 필요한 경우.
연관된 엔티티 수가 적고, 성능 저하 없이 모든 데이터를 함께 로딩할 수 있는 경우

※ @ManyToOne, @OneToOne, @OneToMany @ManyToMany

@ManyToOne, @OneToOne, @OneToMany, @ManyToMany 어노테이션을 사용하여 다대일(N:1) 및 일대일(1:1) 관계를 설정할 때 프록시로의 로딩을 활성화할 수 있습니다.

반응형

'DB > JPA' 카테고리의 다른 글

[JPA] Entity Class 만들기  (0) 2024.01.10