TravelMate-KU / TravelMate-Server

0 stars 1 forks source link

[JPA] 연관관계를 가진 엔터티 저장 방식 - findById() vs. getReferenceById() #26

Open jaeuk520 opened 3 months ago

jaeuk520 commented 3 months ago

📝 Issue

JPA를 사용하면서 연관관계를 갖는 엔터티를 DB에 insert하기 위해 연관된 엔터티를 먼저 조회해오는 경우가 많았다. 이 때, 연관된 엔터티를 조회할 때마다 DB에는 select 쿼리가 나가게 되는데 해당 과정이 불필요하다고 생각하였다.


DB에서 insert 쿼리를 직접 짜서 날릴 때는 FK만 넣어줘도 되는데 JPA에서는 매번 연관 엔터티 조회를 위한 select 쿼리가 날라감!


트래픽이 적은 프로젝트에서는 크게 문제 될 것은 없겠지만 방대한 양의 트래픽을 경험하게 된다면 꽤 많은 성능 저하 문제로 인해 골치아파지지 않을까...


📦 Solution: getReferenceById()

Documentation

[T] getReferenceById (ID id)

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.


데이터 가져오는 방식


🖊️ Conclusion

연관된 엔터티의 내부의 값은 필요로 하지 않고 insert하고자 하는 엔터티 객체에 할당하고자 하는 목적으로만 사용하고자 하기 때문에 getReferenceById()를 통해 연관 엔터티의 프록시 객체만을 가져와서 불필요한 select 쿼리를 날리지 않을 수 있다!

어떠한 객체의 ID 값이 DB에 반드시 존재하고 ID를 제외한 다른 필드에 접근하지 않을 때 사용하게 되면 좋을 것 같다.



+ 추가 solution) 쿼리를 직접 짜서 날리는 방식도 있다..

david-parkk commented 3 months ago
jaeuk520 commented 3 months ago

아 그 적어주신 경우를 말하는게 맞을거에요 insert 쿼리를 직접 작성하는 경우에는 FK 값을 넣어주기만 하면 되는데 JPA에서는 해당 FK를 PK로 가지고 있는 엔터티를 먼저 조회해 온 다음에 insert 하고자 하는 엔터티의 필드에 주입해줘야 하니 연관관계 엔터티 조회를 위한 select 쿼리를 굳이 날려야할까 ...에 대한 의문이 들어 정리해보았습니다.