문제상황
역시 Spring 프로젝트 중 에러,,,,
해당 게시글 작성자만 수정이 가능하도록 하였는데
같은 사용자로 로그인이 되어있음에도 같은 사용자가 아니라고 에러가 떴다.
Service단 로직에서는 해쉬코드만 봐서는 똑같아보인다.
왜 자꾸 아니라는 거니..? ㅠㅠ
더 타고 들어가서 equals 함수를 보니 슬슬 답이 보이려고 한다ㅠ
여기서는 왜 다르니..?
힌트는 $HibernateProxy$
if문에서 비교하는 객체들을 살펴보자
찾았다 요놈^^.......
UserDetils에서 가져온 Member에 posting 값이 안들어가 있다. 왜?
Hibernate.Lazy 블라블라..Exception
즉 지연로딩으로 인한 문제
=> 해쉬코드가 같아서 이퀄스 쓰면 될줄알았는데
이퀄스를 타고 들어가보니 프록시 객체로 감싸져서 해쉬코드가 달랐다.
해쉬코드란?
: 객체를 식별하는 정수 값
- Hash를 사용하는 자료구조는 두 객체가 동일한지 판단하기 위해서 먼저 hashcode()메소드를 통해 두 객체의 해시값이 같은지를 판단하고, 만약 같다면 equals() 메소드를 통해 동일한지 판단한다.
- 부작용을 제거하기 위해서 웬만하면 equals() 메소드 뿐만아니라 hashCode() 메소드도 함께 재정의하여 사용하는 것이 좋다.
지연로딩과 프록시 객체
2022.09.02 - [SPRING] - [SPRING][JPA] Proxy / 지연로딩과 즉시로딩
참고 : https://blog.naver.com/adamdoha/222214494979
해결방법
Entity에 가보니 역시나 Lazy,,
PK값을 비교하는 것으로 두 객체가 같은 것으로 판단한다.
더보기
왜 PK 값으로만 판단하는가? 게시글안에 상세사항은 다를수도 있는 것 아닌가?
무슨 근거로 두 객체가 판단할 수 있을까?
=> JPA 영속성! 더티체킹이 되어서 두 값이 동일하다는 믿음...^^
^^