Equals, HashCode in Jpa Entity

이 글은 νŒ€μ› Junearrow-up-right μž‘μ„±ν–ˆμŠ΅λ‹ˆλ‹€.

ν…ŒμŠ€νŠΈ μ½”λ“œλ₯Ό μž‘μ„±ν•˜λ˜ 도쀑, 두 μ—”ν‹°ν‹°κ°€ 같은지 λΉ„κ΅ν•˜λŠ” μ½”λ“œκ°€ λ§Žμ•„ Javaμ—μ„œ μ“°μ΄λŠ” Equals, hahscodeκ°€ Jpaμ—μ„œ μ–΄λ–»κ²Œ μ‚¬μš©λ  수 μžˆλŠ”μ§€ μ•Œμ•„λ³΄μ•˜μŠ΅λ‹ˆλ‹€.

Member member = new Member("nickname", "email", "1234");
Member member2 = new Member("nickname", "email", "1234");

assertThat(member).isEqualTo(member2);

같은 ν•„λ“œλ₯Ό μ§€λ‹ˆκ³  μžˆλ‹€κ³  ν•΄μ„œ member == member2 μΌκΉŒμš”?

equals, hashcodeλ₯Ό overrideλ₯Ό ν•˜μ§€ μ•Šμ•˜λ‹€λ©΄ member, member2 각각의 μΈμŠ€ν„΄μŠ€λ₯Ό κ°€μ§€κ³  있기 λ•Œλ¬Έμ— μœ„ ν…ŒμŠ€νŠΈλŠ” ν†΅κ³Όν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

Jpaν™˜κ²½μ—μ„œλ„ μ•Œμ•„λ³΄κ³  μ‹ΆκΈ° λ•Œλ¬Έμ— μ˜μ†μ„± μ»¨ν…μŠ€νŠΈ μ•ˆμ—μ„œ 관리될 λ•Œ ν™•μΈν•΄λ³΄κ² μŠ΅λ‹ˆλ‹€.

@Autowired
MemberRepository memberRepository;

@Test
void EqualsAndHashCode() {
    memberRepository.save(new Member("nickname", "email", "1234"));
    Member member = memberRepository.findById(1L).get();
    Member member2 = memberRepository.findById(1L).get();
    em.clear();
    em.flush();

    assertThat(member).isEqualTo(member2);
}

μœ„ μ½”λ“œλ₯Ό 보면 μ–΄λ–€ κ²°κ³Όκ°€ λ‚˜μ˜¬κΉŒμš”?

member, member2λŠ” μ˜μ†μ„± μ»¨ν…μŠ€νŠΈμ—μ„œ κ΄€λ¦¬λ˜κΈ° λ•Œλ¬Έμ— μ°Έμ‘°κ°’μœΌλ‘œ 같은 μΈμŠ€ν„΄μŠ€μΈμ§€ 확인이 κ°€λŠ₯ν•©λ‹ˆλ‹€. λ”°λΌμ„œ ν…ŒμŠ€νŠΈλ₯Ό ν†΅κ³Όν•©λ‹ˆλ‹€.

μ˜μ†μ„± μ»¨ν…μŠ€νŠΈμ—μ„œ κ΄€λ¦¬λ˜μ§€ μ•ŠλŠ” memberλŠ” μ–΄λ–»κ²Œ λ κΉŒμš”?

μœ„ ν…ŒμŠ€νŠΈλŠ” μ‹€νŒ¨ν•©λ‹ˆλ‹€. em.detach(member)둜 memberλŠ” μ€€μ˜μ† μƒνƒœμ΄κΈ° λ•Œλ¬Έμ— member2와 λ‹€λ₯Έ μ°Έμ‘°λ₯Ό κ°€μ§€κ³  μžˆμŠ΅λ‹ˆλ‹€. member.getNickname() == member2.getNickname() λŠ” Trueμž…λ‹ˆλ‹€.

equals(), hashcode()

μœ„ 문제λ₯Ό ν•΄κ²°ν•˜λŠ” 방법은 3κ°€μ§€κ°€ μžˆμŠ΅λ‹ˆλ‹€.

  1. PK둜만 equals, hashCode κ΅¬ν˜„

  2. PKλ₯Ό μ œμ™Έν•˜κ³  equla둜 κ΅¬ν˜„

  3. λΉ„μ§€λ‹ˆμŠ€ ν‚€λ₯Ό μ‚¬μš©ν•œ 동등성 κ΅¬ν˜„

1. PK둜만 equls, hashCode κ΅¬ν˜„ν•˜κΈ°

μœ„ μ½”λ“œλŠ” Objectκ°€ Member인지 확인 ν›„, pk인 Idλ₯Ό λΉ„κ΅ν•˜μ—¬ 동등성을 λΉ„κ΅ν•˜λŠ” μ½”λ“œμž…λ‹ˆλ‹€.

이 방법은 repository.save() 즉 PKκ°€ μ§€μ •λœ ν›„μ—λ§Œ 비ꡐ할 수 μžˆλŠ” λ°©λ²•μž…λ‹ˆλ‹€.

즉, 객체의 동등성 비ꡐλ₯Ό μ˜μ†, μ€€μ˜μ† μƒνƒœμ—μ„œλ§Œ λΉ„κ΅ν•˜λŠ”κ²Œ κ°€λŠ₯ν•œ λ°©λ²•μž…λ‹ˆλ‹€.

2. PKλ₯Ό μ œμ™Έν•˜κ³  equals둜 κ΅¬ν˜„

PKλ₯Ό μ œμ™Έν•œ λͺ¨λ“  Fieldλ₯Ό λΉ„κ΅ν•˜λŠ” λ°©λ²•μž…λ‹ˆλ‹€.

ν•˜μ§€λ§Œ, Entity 내뢀에 join κ³Ό 같은 관계가 μžˆλ‹€λ©΄, λ‹€λ₯Έ ν…Œμ΄λΈ”κ³Ό 연관관계가 있기 λ•Œλ¬Έμ— ν¬ν•¨ν•΄μ„œλŠ” μ•ˆλ©λ‹ˆλ‹€.

μœ„ λ¬Έμ œλŠ” μ˜μ†μ„± Context 의 instance λ₯Ό μˆ˜μ •(λ§Œμ•½ λΉ„λ°€λ²ˆν˜Έλ₯Ό λ³€κ²½ν•œλ‹€λ©΄) λ‹€λ₯Έ μ˜μ†μ„± Context 의 instance μ™€λŠ” 더 이상 μΌμΉ˜ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

3. λΉ„μ§€λ‹ˆμŠ€ ν‚€λ₯Ό μ΄μš©ν•œ 동등성 κ΅¬ν˜„

PKλ₯Ό μ œμ™Έν•˜κ³  Uniqueλ₯Ό μ œμ•½ 쑰건을 κ°€μ§„ email, λ˜λŠ” λ³€κ²½ λΆˆκ°€λŠ₯ν•œ 속성 등을 μ‚¬μš©ν•˜λ©΄ μœ„μ˜ λ°©λ²•λ“€μ˜ 단점을 극볡할 수 μžˆμŠ΅λ‹ˆλ‹€.

Jpa ν™˜κ²½μ—μ„œ equals(), hashcode()둜 동등성 비ꡐ에 λŒ€ν•΄ μ•Œμ•„λ΄€μŠ΅λ‹ˆλ‹€.

Last updated