You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
JPA를 사용하면서 연관관계를 갖는 엔터티를 DB에 insert하기 위해 연관된 엔터티를 먼저 조회해오는 경우가 많았다. 이 때, 연관된 엔터티를 조회할 때마다 DB에는 select 쿼리가 나가게 되는데 해당 과정이 불필요하다고 생각하였다.
DB에서 insert 쿼리를 직접 짜서 날릴 때는 FK만 넣어줘도 되는데 JPA에서는 매번 연관 엔터티 조회를 위한 select 쿼리가 날라감!
트래픽이 적은 프로젝트에서는 크게 문제 될 것은 없겠지만 방대한 양의 트래픽을 경험하게 된다면 꽤 많은 성능 저하 문제로 인해 골치아파지지 않을까...
📦 Solution: getReferenceById()
Documentation
[T] getReferenceById (IDid)
Returns a reference to the entity with the given identifier. Depending on how the JPA persistence provider is implemented this is very likely to always return an instance and throw an EntityNotFoundException on first access. Some of them will reject invalid identifiers immediately.
Parameters:
id - must not be null.
Returns:
a reference to the entity with the given identifier.
데이터 가져오는 방식
지연로딩(Lazy Loading) : 엔터티를 실제로 사용할 때까지 데이터베이스 조회를 지연한다.
실제 엔티티 객체가 필요한 시점에서는 Proxy 객체가 아닌 실제 엔터티를 반환한다. 처음에는 Proxy 객체로 가지고 있음.
🖊️ Conclusion
연관된 엔터티의 내부의 값은 필요로 하지 않고 insert하고자 하는 엔터티 객체에 할당하고자 하는 목적으로만 사용하고자 하기 때문에 getReferenceById()를 통해 연관 엔터티의 프록시 객체만을 가져와서 불필요한 select 쿼리를 날리지 않을 수 있다!
다만 엔티티가 영속성 컨텍스트에 없으면 EntityNotFoundException가 발생할 수 있다는 점을 주의하자.
어떠한 객체의 ID 값이 DB에 반드시 존재하고 ID를 제외한 다른 필드에 접근하지 않을 때 사용하게 되면 좋을 것 같다.
+ 추가 solution) 쿼리를 직접 짜서 날리는 방식도 있다..
The text was updated successfully, but these errors were encountered:
jaeuk520
changed the title
⚒️ [JPA] 연관관계를 가진 엔터티 저장 방식 - findById() vs. getReferenceById()
[JPA] 연관관계를 가진 엔터티 저장 방식 - findById() vs. getReferenceById()
Mar 11, 2024
아 그 적어주신 경우를 말하는게 맞을거에요
insert 쿼리를 직접 작성하는 경우에는 FK 값을 넣어주기만 하면 되는데 JPA에서는 해당 FK를 PK로 가지고 있는 엔터티를 먼저 조회해 온 다음에 insert 하고자 하는 엔터티의 필드에 주입해줘야 하니 연관관계 엔터티 조회를 위한 select 쿼리를 굳이 날려야할까 ...에 대한 의문이 들어 정리해보았습니다.
📝 Issue
JPA를 사용하면서 연관관계를 갖는 엔터티를 DB에
insert
하기 위해 연관된 엔터티를 먼저 조회해오는 경우가 많았다. 이 때, 연관된 엔터티를 조회할 때마다 DB에는select
쿼리가 나가게 되는데 해당 과정이 불필요하다고 생각하였다.DB에서
insert
쿼리를 직접 짜서 날릴 때는FK
만 넣어줘도 되는데JPA
에서는 매번 연관 엔터티 조회를 위한select
쿼리가 날라감!📦 Solution:
getReferenceById()
Documentation
Returns a
reference
to the entity with the given identifier. Depending on how the JPA persistence provider is implemented this is very likely to always return an instance and throw anEntityNotFoundException
on first access. Some of them will reject invalid identifiers immediately.Parameters:
id - must not be null.
Returns:
a reference to the entity with the given identifier.
데이터 가져오는 방식
지연로딩(Lazy Loading)
: 엔터티를 실제로 사용할 때까지 데이터베이스 조회를 지연한다.Proxy
객체가 아닌 실제 엔터티를 반환한다. 처음에는Proxy
객체로 가지고 있음.🖊️ Conclusion
연관된 엔터티의 내부의 값은 필요로 하지 않고
insert
하고자 하는 엔터티 객체에 할당하고자 하는 목적으로만 사용하고자 하기 때문에getReferenceById()
를 통해 연관 엔터티의 프록시 객체만을 가져와서 불필요한select
쿼리를 날리지 않을 수 있다!EntityNotFoundException
가 발생할 수 있다는 점을 주의하자.어떠한 객체의 ID 값이 DB에 반드시 존재하고 ID를 제외한 다른 필드에 접근하지 않을 때 사용하게 되면 좋을 것 같다.
+ 추가 solution) 쿼리를 직접 짜서 날리는 방식도 있다..
The text was updated successfully, but these errors were encountered: