Skip to content

Comments

[fix] JPA 엔티티 동일성(EqualsAndHashCode) 및 영속성 관련 버그 수정#150

Merged
saokiritoni merged 2 commits intodevelopfrom
feat/#147-approveAlarm
Nov 5, 2025
Merged

[fix] JPA 엔티티 동일성(EqualsAndHashCode) 및 영속성 관련 버그 수정#150
saokiritoni merged 2 commits intodevelopfrom
feat/#147-approveAlarm

Conversation

@saokiritoni
Copy link
Member

@saokiritoni saokiritoni commented Sep 30, 2025

🌱 관련 이슈

🌱 작업 사항

  • 다수의 엔티티에서 EqualsAndHashCode 구현이 잘못되었거나 누락된 것을 수정했습니다.
  • Could not set value... (setter) 에러를 수정합니다!

🌱 참고 사항

🤔 기존 @EqualsAndHashCode 사용 이유

  • 컬렉션(Set, Map)을 정상 동작시키기 위해: Set은 원소 중복 여부를 hasCode(), equals()로 판단하기 때문에 사용했습니다.
  • JPA 영속성 컨텍스트 관리: 캐싱하고 관리할 때 equals(), hashCode()를 사용해 동일성을 식별하기 때문에 사용했습니다.

🐞 에러 원인 분석

@GeneratedValue ID를 기준으로 한 불안정한 hashCode: 자동 생성되는 ID를 기준으로 구현하면서 에러 발생

  1. Group 객체 생성 (이때 groupId가 null)
  2. hasCode()가 null을 기반으로 계산
  3. 이 객체가 Request의 Set 에 추가
  4. 트랜잭션을 커밋하면서 JPA가 Group을 DB에 저장 -> groupId에 실제 값이 할당
  5. Set에 있던 Group의 hasdCode()값이 중간에 변경
  6. Hibernate가 이걸 보고 어지러워서 JpaSystemException를 던져버림.

성급한 flush() 호출로 인한 생명주기 충돌

  • 서비스 중간에 flush()를 명시적으로 호출했었는데, 아직 관계가 안정되지 않은 상태에서 강제 동기화를 시키면서 JPA 생명 주기에 혼란을 줌.

🔧 수정사항

  1. 안정적인 비즈니스 키 기반으로 EqualsAndHashCode 재정의
  • 영속화 전부터 값이 존재하고 && 변하지 않는 비즈니스 키를 기준으로 삼자 : email, ubuntuUsername...
  1. flush() 호출 제거 : approveRequest메서드에서 제거

🔗 참고

https://velog.io/@nmrhtn7898/JPA-Entity%EC%97%90%EC%84%9C-equals-hashcode-%EC%82%AC%EC%9A%A9%EC%8B%9C-%EB%B0%9C%EC%83%9D%ED%95%A0-%EC%88%98-%EC%9E%88%EB%8A%94-%EB%AC%B8%EC%A0%9C%EC%A0%90

Set을 사용하면 List보다 논리적 & 성능적으로 좋지만

  • 논리적: 중복 허용 X, Request에 똑같은 Group이 두 번 연결되는 일 절대 없음.
  • 성능적: List를 OneToMany에서 사용하면 순서를 유지하기 위해 추가적인 작업, delete하나 하면 지우고 다시 남은 원소들 insert해야 함. set은 순서 없으니 당여니 상관이 없음.
  • Set 사용할 때는 equals, hashCode 주의하자.

@saokiritoni saokiritoni requested a review from a team as a code owner September 30, 2025 04:37
@saokiritoni saokiritoni merged commit 410d26c into develop Nov 5, 2025
@saokiritoni saokiritoni self-assigned this Jan 1, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants