🚨에러노트

[22.08.27] JPA 지연로딩 프록시 에러

디카페인라떼 2022. 8. 27. 04:18
문제상황

역시 Spring 프로젝트 중 에러,,,,

해당 게시글 작성자만 수정이 가능하도록 하였는데

같은 사용자로 로그인이 되어있음에도 같은 사용자가 아니라고 에러가 떴다.

 

 

Service단 로직에서는 해쉬코드만 봐서는 똑같아보인다.

왜 자꾸 아니라는 거니..? ㅠㅠ

 

더 타고 들어가서 equals 함수를 보니 슬슬 답이 보이려고 한다ㅠ

여기서는 왜 다르니..? 

힌트는 $HibernateProxy$

 

if문에서 비교하는 객체들을 살펴보자

 

찾았다 요놈^^.......

UserDetils에서 가져온 Member에 posting 값이 안들어가 있다. 왜?

Hibernate.Lazy 블라블라..Exception

즉 지연로딩으로 인한 문제

 

 

=> 해쉬코드가 같아서 이퀄스 쓰면 될줄알았는데

이퀄스를 타고 들어가보니 프록시 객체로 감싸져서 해쉬코드가 달랐다. 

 


해쉬코드란?

 : 객체를 식별하는 정수 값

  • Hash를 사용하는 자료구조는 두 객체가 동일한지 판단하기 위해서 먼저 hashcode()메소드를 통해 두 객체의 해시값이 같은지를 판단하고, 만약 같다면 equals() 메소드를 통해 동일한지 판단한다.
  • 부작용을 제거하기 위해서 웬만하면 equals() 메소드 뿐만아니라 hashCode() 메소드도 함께 재정의하여 사용하는 것이 좋다.

지연로딩과 프록시 객체

2022.09.02 - [SPRING] - [SPRING][JPA] Proxy / 지연로딩과 즉시로딩

 

[SPRING][JPA] Proxy / 지연로딩과 즉시로딩

참고 블로그 JPA에서 프록시는 연관된 객체들을 데이터베이스에서 조회하기 위해서 사용 프록시를 사용하면 연관된 객체들을 처음부터 데이터베이스에서 조회하는 것이 아니라 실제 사용하는

wearegolden.tistory.com

참고 : https://blog.naver.com/adamdoha/222214494979

 

@OneToOne 무한 참조 문제 또는 hibernateLazyInitializer 또는 byteBuddy~ 문제

대략 다음과 같이 연관관계가 맺어진 Order와 Delivery가 있다. (나머지 엔티티는 생략, 느낌만 확인) O...

blog.naver.com


해결방법

 

Entity에 가보니 역시나 Lazy,,

PK값을 비교하는 것으로 두 객체가 같은 것으로 판단한다.

더보기

왜 PK 값으로만 판단하는가? 게시글안에 상세사항은 다를수도 있는 것 아닌가?

무슨 근거로 두 객체가 판단할 수 있을까?

 

=> JPA 영속성! 더티체킹이 되어서 두 값이 동일하다는 믿음...^^

^^