๐คฃ ๋ฐฐ๊ฒฝ
ํ๋ก์ ํธ๋ฅผ ๋ง์น๊ณ ๋๋ฉด ํญ์ ์ฝ๋ ์ธ์คํ์ ๊ณผ์ ์ ํตํด ํ๋ก๊ทธ๋จ์ ๋ํ ์ทจ์ฝ์ ์ด๋ ์ฅ์ ๊ฐ ์๋์ง ํ์ธ์ ํ๊ฒ ๋๋๋ฐ, ๊ฐํน equals์ hashcode๊ฐ ๊ตฌํ๋์ง ์์ ์ํฐํฐ์ ๋ํด ๊ฒฝ๊ณ ๋ก ์ง์ ์ ๋นํ๊ฒ ๋๋ ๊ฒฝ์ฐ๊ฐ ์ข ์ข ์๋ค.
์ฒ์์๋ Lombok์์ ์ ๊ณตํ๋ @EqualsAndHashCode๋ฅผ ์จ์ ๊ฐํธํ๊ฒ ํด๊ฒฐํ๋ ค๊ณ ํ๋ค. ๊ทธ๋ฐ๋ฐ ๋์ค์ ํ๋ก๊ทธ๋จ ์ฌ์ฉ ์ค์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ฉด์ Lombok ์ฌ์ฉ์ด ๋ฌธ์ ๋ผ๋ ๊ฒ์ ์๊ฒ ๋์๊ณ , ๋ค๋ฅธ ๋ฌธ์ ๋ ์์์ง JPA์ Lombok์ ์ฌ์ฉํ ๋ ์ฃผ์ํ ์ ์ ๋ํด ์์๋ณด๊ฒ ๋์๋ค.
๋ฌธ์ ์ 1. HashMap, HashSet ์ฌ์ฉ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค.
- Shiba ์ํฐํฐ
@Entity
@Table(name = "tb_shiba_holic")
@EqualsAndHashCode
public final class Shiba {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "seq", nullable = false)
private Long seq;
private String name;
}
- ํ ์คํธ ์ฝ๋
@Test
@DisplayName("๊ฐ์ ๊ฐ์ฒด์ธ์ง ํ์ธํ๋ค.")
void sameValue() {
Shiba shiba = new Shiba();
Set<Shiba> shibaSet = new HashSet<>();
shibaSet.add(shiba);
shibaRepository.save(shiba);
assertThat(shibaSet.contains(shiba)).isTrue();
}
๋์ผํ ๊ฐ์ฒด์ด๊ธฐ๋ฅผ ๊ธฐ๋ํ๋ ์ ํ ์คํธ๋ ์ค์ ๋ก ์คํํด ๋ณด๋ฉด ์คํจํ๋ค.
JPA์ ์ ์ฅํ๋ ๊ณผ์ ์์ ID๊ฐ ์์ฑ๋๋ฉด์ Hashcode๊ฐ ๋ณ๊ฒฝ๋์ด HashSet/HashMap ์ ์ฅ๋ ๊ฐ์ฒด๋ ๋ณ๋์ ๊ฒ์ผ๋ก ์ธ์งํ๊ธฐ ๋๋ฌธ์ด๋ค.
๋ฐ๋ผ์ @EqualsAndHashCode๋ ์ง์ ๊ตฌํํด์ ์ฌ์ฉํ๊ฑฐ๋ of ์ต์ exclude ์ต์ ์ ์ฌ์ฉํด์ ํน์ ํ๋๋ง ํด๋น๋๋๋ก ์ ์ํด์ ์ฌ์ฉํ๋ค.
(+ @Data์๋ @EqualsAndHashCode๊ฐ ํฌํจ๋์ด ์์ผ๋ฏ๋ก ์ฃผ์ํ์)
๋ฌธ์ ์ 2. Lazy ์ฐ๊ด ๊ด๊ณ ํ๋๊ฐ ์๋์ผ๋ก ํธ์ถ๋๋ค.
@EqualsAndHashCode, @ToString์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ํฐํฐ์ ์ ์ธํ ๋ชจ๋ ํ๋๊ฐ ํฌํจ๋๋ค.
๋ฐ๋ผ์ ์๋น์ค ์ฝ๋ ๋ด์ ์ํฐํฐ๋ฅผ ๋ค๋ฃจ๋ ๊ณผ์ ์์ toString(), equals(), hashCode() ๋ฑ์ด ํธ์ถ๋๋ ๊ฒฝ์ฐ Lazy ํ๋๊ฐ ์๋์ผ๋ก ํธ์ถ๋ ์ ์๋ค.
Lazy ์ฐ๊ด ๊ด๊ณ๋ฅผ ์ ์ธํ ํ๋๊ฐ ํธ์ถ๋๋ ๊ฒฝ์ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ฑ๋ฅ์ ์ํฅ์ ์ค ์ ์์ผ๋ฉฐ, ํธ์ถ์ด ํธ๋์ญ์ ์ธ๋ถ์์ ์ผ์ด๋๋ ๊ฒฝ์ฐ์๋ LazyInitializationException ์์ธ๊ฐ ๋ฐ์ํ ์๋ ์์ด์ ์ฃผ์ํด์ผ ํ๋ค.
- Shiba ์ํฐํฐ
@Entity
@Table(name = "tb_shiba_holic")
@ToString
@Getter
public final class Shiba {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "seq", nullable = false)
private Long seq;
@OneToMany(fetch = FetchType.LAZY, mappedBy = "shiba")
private List<Item> itemList = new ArrayList<>();
}
- ํ ์คํธ ์ฝ๋
@Test
@DisplayName("toString()์ ํธ์ถํ๋ค.")
void callToString() {
Shiba shiba = new Shiba();
Shiba savedShiba = shibaRepository.save(shiba);
Item item1 = Item.builder()
.shiba(savedShiba)
.build();
itemRepository.save(item1);
Item item2 = Item.builder()
.shiba(savedShiba)
.build();
itemRepository.save(item2);
// ์ํฐํฐ ๋งค๋์ ๋ฅผ ์ด๊ธฐํ ํ๋ค.
entityManager.flush();
entityManager.clear();
Shiba shibaEntity = shibaRepository.findById(savedShiba.getSeq()).get();
System.out.println(shibaEntity);
}
shibaEntity์ toString()์ ํธ์ถํ๋ค.
๊ทธ ๊ฒฐ๊ณผ ์๋ํ์ง ์์ item ๋ชฉ๋ก์ ์กฐํํ๋ select ์ฟผ๋ฆฌ๊ฐ ์ถ๊ฐ๋ก ๋๊ฐ๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
์๋ฐฉํฅ ์ฐ๊ด๊ด๊ณ์์ ์๋ก @ToString์ด ์ฌ์ฉ๋๋ ๊ฒฝ์ฐ์๋, ์๋ก๊ฐ ์๋ก๋ฅผ ํธ์ถํ๊ฒ ๋๋ฉด์ StackOverflowError ์์ธ๊น์ง ๋ฐ์ํ๋ค.
@ToString์ ์ฌ์ฉํ๊ณ ์ถ๋ค๋ฉด, ์ง์ ๊ตฌํํ๊ฑฐ๋ exclude ์ต์ ๋๋ onlyExplicitlyIncluded ์ต์ ์ ์ฌ์ฉํด์ Lazy ๊ด๋ จ ํ๋๋ ์ ์ธ์์ผ์ผ ํ๋ค.
(+ @Data์๋ @ToString์ด ํฌํจ๋์ด ์์ผ๋ฏ๋ก ์ฃผ์ํ์)
'Spring > JPA' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
@Lob ์ฌ์ฉ์ DB์ ์ํฐํฐ ํ๋ ํ์ ์ด ๋ค๋ฅธ ๊ฒฝ์ฐ ๋ฐ์ํ๋ ๋ฌธ์ ์ ํด๊ฒฐ๋ฐฉ๋ฒ (0) | 2024.01.07 |
---|---|
JPA @Lob ์ดํดํ๊ธฐ (with MariaDB) (0) | 2024.01.06 |
[JPA] PK๊ฐ ์๋ ํ๋์ Auto Increment ์ฌ์ฉํ๊ธฐ (0) | 2023.12.09 |
Querydsl Paging & Count Query ์ต์ ํ (0) | 2023.11.11 |
[JPA] orphanRemoval ์ต์ ์ ์ฌ์ฉํ ๋ Update ์ฃผ์์ฌํญ (0) | 2023.10.28 |
๋๊ธ