Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
jaeuk520 opened this issue Mar 11, 2024 · 2 comments
Labels
공부 정리 ✏️ 개인적으로 찾아보며 정리한 내용

Comments

@jaeuk520
Copy link
Contributor

jaeuk520 commented Mar 11, 2024

📝 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.


데이터 가져오는 방식

  • 지연로딩(Lazy Loading) : 엔터티를 실제로 사용할 때까지 데이터베이스 조회를 지연한다.
  • 실제 엔티티 객체가 필요한 시점에서는 Proxy 객체가 아닌 실제 엔터티를 반환한다. 처음에는 Proxy 객체로 가지고 있음.

🖊️ Conclusion

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

  • 다만 엔티티가 영속성 컨텍스트에 없으면 EntityNotFoundException가 발생할 수 있다는 점을 주의하자.

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



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

@jaeuk520 jaeuk520 added the 공부 정리 ✏️ 개인적으로 찾아보며 정리한 내용 label Mar 11, 2024
@jaeuk520 jaeuk520 changed the title ⚒️ [JPA] 연관관계를 가진 엔터티 저장 방식 - findById() vs. getReferenceById() [JPA] 연관관계를 가진 엔터티 저장 방식 - findById() vs. getReferenceById() Mar 11, 2024
@david-parkk
Copy link
Member

  • insert 전에 연관된 엔티티에 대해 select 쿼리가 나가는 경우가 어떤 경우에 있나요?
    insert하는 할때 pk 값을 따로 정의한 경우 select 쿼리로 해당 pk값을 가진 데이터를 찾는 경우 외에 select 쿼리가 나가는 경우를 경험해본 적이 없어서..

@jaeuk520
Copy link
Contributor Author

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
공부 정리 ✏️ 개인적으로 찾아보며 정리한 내용
Projects
None yet
Development

No branches or pull requests

2 participants