728x90

 

✍️ Proxy란 ?

 

프록시(Proxy)는 다른 객체를 대리하거나 중간 역할을 하는 객체로, 해당 객체에 대한 접근을 제어하거나 추가 기능을 제공하기 위해 사용됩니다. 프록시를 사용하는 주된 목적은 클라이언트와 실제 객체 간의 상호작용을 관리하거나 제어하는 것입니다.

 

프록시는 실체 클래스를 상속받아서 만들어집니다. 실제 객체의 동작을 대신하며, 클라이언트 코드가 프록시와 실제 객체를 동일하게 다룰 수 있도록 합니다. 프록시는 지연 로딩, 보안, 캐싱, 로깅과 같은 다양한 목표를 달성하는 데 활용됩니다.

주로 다음과 같은 상황에서 사용됩니다

  1. 지연 로딩 (Lazy Loading): 프록시는 객체의 일부를 미리 로딩하지 않고 필요한 시점에 로딩하여 성능을 개선할 수 있습니다. 예를 들어, 데이터베이스에서 데이터를 가져오는 시간이 오래 걸릴 수 있는데, 프록시를 사용하면 실제 데이터 로딩을 최대한 늦출 수 있습니다.

  2. 보안 및 접근 제어: 프록시를 사용하여 객체에 대한 접근을 제한하거나 보안 검사를 수행할 수 있습니다. 클라이언트는 프록시를 통해서만 실제 객체에 접근하므로 프록시에서 접근 권한을 검사할 수 있습니다.

  3. 트랜잭션 관리: 프록시는 트랜잭션을 관리하거나 적절한 시점에 데이터베이스에 변경 사항을 반영하는 데 사용될 수 있습니다.

  4. 캐싱: 프록시는 객체의 메서드 호출을 가로채어 캐싱을 수행하거나, 이미 로딩된 데이터를 재사용하는 등의 작업을 수행할 수 있습니다.

https://velog.io/@jm1225/네트워크-Proxy

 

 


 

✍️ em.find( ) 와 em.getReference( )의 차이점 !

 

EntityManager의 find()와 getReference() 메서드는 JPA에서 엔티티를 조회할 때 사용되는 두 가지 주요 방법입니다. 그러나 두 메서드는 동작 방식과 사용 시 주의할 점에서 차이가 있습니다.

 

em.find() 메서드

find() 메서드는 실제 데이터베이스에서 데이터를 조회하여 엔티티 객체를 가져옵니다. 데이터 베이스에서 실제 엔티티 객체를 바로 쿼리를 통해 조회하고, 해당 엔티티가 데이터베이스에 존재하지 않는 경우, null을 반환합니다. 데이터베이스에서 데이터를 가져와서 엔티티를 영속성 컨텍스트에 등록합니다.

 

getReference() 메서드

getReference() 메서드는 실제 데이터베이스에 쿼리를 전송하지 않고, 프록시 객체를 반환합니다. DB 조회를 미루는 가짜 (proxy)엔티티를 조회합니다. 실제 데이터 로딩을 최대한 지연시키며, 프록시 객체를 사용하는 동안에는 데이터베이스 조회를 지연시킵니다.

 

해당 엔티티가 데이터베이스에 존재하지 않는 경우에도 프록시 객체를 생성하며, 프록시 객체를 사용하는 시점에서 실제 데이터 로딩을 시도합니다. getReference() 메서드는 프록시 객체를 생성하여 엔티티 매니저에 등록하며, 프록시 객체의 메서드를 호출하면 실제 데이터 로딩이 이루어집니다.

💥 주의점

getReference() 메서드를 사용할 때, 프록시 객체를 반환하므로 해당 객체의 메서드 호출 시 실제 데이터 로딩이 발생합니다. 이 때 데이터베이스 조회가 실패하면 EntityNotFoundException이 발생할 수 있습니다. getReference()로 얻은 프록시 객체는 즉시 사용하지 않고 영속성 컨텍스트 내에서 사용해야 합니다. 트랜잭션 컨텍스트가 종료된 후에 프록시를 사용하면 예외가 발생할 수 있습니다.

실제 데이터 로딩이 필요한지 여부에 따라 find()나 getReference()를 선택해야 합니다. 데이터를 즉시 로딩해야 하는 경우에는 find()를 사용하는 것이 적절하고, 데이터 로딩을 최대한 늦추고 싶을 때는 getReference()를 사용할 수 있습니다.

요약하면, find()는 실제 데이터를 즉시 로딩하여 엔티티를 가져오는 메서드이며, getReference()는 프록시 객체를 반환하여 실제 데이터 로딩을 최대한 늦추는 메서드입니다.

 

			
            
            Member member = new Member();
			member.setUsername("Hello");
			
			em.persist(member);
			
			em.flush();
			em.clear();
			
	
			Member findMember = **em.find**(Member.class, member.getId());
			
			-> 콘솔 출력물 (조회 시 즉시 쿼리문 생성)
            select
                m1_0.MEMBER_ID,
                m1_0.INSERT_MEMBER,
                m1_0.createdDate,
                m1_0.UPDATE_MEMBER,
                m1_0.lastModifiedDate,
                t1_0.TEAM_id,
                t1_0.INSERT_MEMBER,
                t1_0.createdDate,
                t1_0.UPDATE_MEMBER,
                t1_0.lastModifiedDate,
                t1_0.USERNAME,
                m1_0.USERNAME



		 	//proxy 지연 로딩을 시도
			Member findMember = **em.getReference**(Member.class, member.getId());
			
			-> 콘솔 출력물 (데이터베이스에 쿼리를 전송하지 않고, 프록시 객체를 반환)
				 값이 실제로 사용되는 시점(가져올 때)에 JPA가 DB에 쿼리를 전송합니다.
                 
			insert 
			    into
			        Member
			        (INSERT_MEMBER,createdDate,UPDATE_MEMBER,lastModifiedDate,USERNAME,MEMBER_ID) 
			    values
			        (?,?,?,?,?,?)

 

가짜 Proxy 객체가 생성됨을 볼 수 있습니다. ↓
(Member findMember = em.getReference(Member.class, member.getId());

 

 


 

 

 

✍️ Proxy의 특징

  1. 지연 로딩 (Lazy Loading): 프록시는 실제 데이터 로딩을 필요한 시점으로 늦추는 데 사용됩니다. 객체의 연관 관계나 컬렉션을 실제로 사용할 때까지 데이터베이스 조회를 지연시킵니다. 이는 성능 향상을 위해 사용됩니다.

  2. 동일한 인터페이스 구조: 프록시는 실제 객체와 동일한 인터페이스를 구현합니다. 따라서 클라이언트는 프록시와 실제 객체를 동일한 방식으로 다룰 수 있습니다.

  3. 투명성: 클라이언트는 프록시를 사용하는지 실제 객체를 사용하는지 알 수 없습니다. 프록시는 실제 객체를 대신하므로 클라이언트 코드를 변경하지 않고도 추가 기능을 제공하거나 제어할 수 있습니다.

  4. 디바이스 제어: 프록시는 실제 객체에 대한 접근을 제어하고 추가 동작을 수행할 수 있습니다. 이를 통해 접근 권한 관리, 로깅, 보안 검사 등을 구현할 수 있습니다.

  5. 성능 최적화: 프록시를 사용하여 실제 데이터 로딩을 지연시키면, 실제로 데이터가 필요한 시점에만 데이터베이스 조회를 수행하므로 성능이 향상될 수 있습니다.

  6. 캐싱: 프록시는 데이터베이스 조회 결과를 캐싱하여 빠른 액세스를 제공할 수 있습니다. 이를 통해 반복적인 조회 작업의 성능을 개선할 수 있습니다.

  7. 보안 및 로깅: 프록시를 사용하여 접근 권한을 관리하거나 메서드 호출 로깅을 수행할 수 있습니다. 실제 객체에 접근하기 전에 보안 검사를 수행하거나 로그를 남길 수 있습니다.

프록시는 주로 객체 지향 프로그래밍, AOP(Aspect-Oriented Programming), 원격 통신, 데이터베이스 ORM(Object-Relational Mapping) 등 다양한 분야에서 사용됩니다. 프록시 패턴은 객체의 동작을 변경하거나 보완할 때 유용하며, 코드의 재사용성과 유지보수성을 높일 수 있습니다. 

728x90
반응형

+ Recent posts