Open jaeuk520 opened 3 months ago
insert
전에 연관된 엔티티에 대해 select
쿼리가 나가는 경우가 어떤 경우에 있나요?
insert
하는 할때 pk 값을 따로 정의한 경우 select
쿼리로 해당 pk값을 가진 데이터를 찾는 경우 외에 select
쿼리가 나가는 경우를 경험해본 적이 없어서..아 그 적어주신 경우를 말하는게 맞을거에요 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) 쿼리를 직접 짜서 날리는 방식도 있다..