HyeLog

[κΉ€μ˜ν•œ_μžλ°” ORM ν‘œμ€€ JPA ν”„λ‘œκ·Έλž˜λ° - 기본편] 7. ν”„λ‘μ‹œμ™€ 연관관계 관리 λ³Έλ¬Έ

μ›Ή 개발/Spring Boot

[κΉ€μ˜ν•œ_μžλ°” ORM ν‘œμ€€ JPA ν”„λ‘œκ·Έλž˜λ° - 기본편] 7. ν”„λ‘μ‹œμ™€ 연관관계 관리

shj718 2022. 6. 17. 17:54

πŸ‘©‍πŸ’» μ¦‰μ‹œ λ‘œλ”©κ³Ό 지연 λ‘œλ”©

πŸ’‘μ§€μ—° λ‘œλ”©(ν”„λ‘μ‹œ)의 ν•„μš”μ„±

νšŒμ› : νŒ€ = N : 1 κ΄€κ³„μ—μ„œλŠ” μ•„λž˜μ™€ 같이 Member 엔티티에 @ManyToOne 으둜 Team ν•„λ“œκ°€ λ“€μ–΄κ°€κ²Œ λœλ‹€.

@Entity
public class Member extends BaseEntity {

    @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "MEMBER_ID")
    private Long id;

    @Column(name = "USERNAME")
    private String username;

    @ManyToOne
    @JoinColumn(name = "TEAM_ID")
    private Team team;
}

μ΄λ•Œ, 멀버λ₯Ό μ‘°νšŒν•΄λ³΄λ©΄ νŒ€κΉŒμ§€ μ‘°νšŒλ˜λŠ” 것을 λ³Ό 수 μžˆλ‹€.

Member findMember = em.find(Member.class, member.getId());

λ§Œμ•½, μš°λ¦¬κ°€ 멀버 μ •λ³΄λ§Œ μ‘°νšŒν•˜λŠ” λ‘œμ§μ„ μ‚¬μš©ν•œλ‹€λ©΄, 이것은 맀우 큰 낭비이닀.

κ·Έλž˜μ„œ μ‚¬μš©ν•˜λŠ” 것이 지연 λ‘œλ”© LAZYλ₯Ό μ‚¬μš©ν•΄μ„œ ν”„λ‘μ‹œλ‘œ μ‘°νšŒν•˜λŠ” 방법이닀.

 

🌟 지연 λ‘œλ”©

지연 λ‘œλ”©μ€ μœ„μ™€ 같은 μƒν™©μ—μ„œ, λ©€λ²„μ˜ 'νŒ€'을 ν”„λ‘μ‹œλ‘œ μ‘°νšŒν•˜λŠ” 것이닀. 즉, em.find()둜 멀버λ₯Ό κ°€μ Έμ˜¬ λ•Œ λ©€λ²„λ§Œ κ°€μ Έμ˜€κ³  νŒ€μ€ κ°€μ Έμ˜€μ§€ μ•ŠλŠ”λ‹€.

지연 λ‘œλ”© μ„€μ • 방법은 μ•„λž˜μ™€ 같이 @ManyToOne의 fetch 속성을 LAZY둜 μ„€μ •ν•˜λŠ” 것이닀.

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "TEAM_ID")
private Team team;

ν”„λ‘μ‹œλ‘œ μ‘°νšŒν•œλ‹€λŠ” κ²ƒμ˜ μ˜λ―ΈλŠ”, μ•„λž˜μ™€ 같이 find()λ₯Ό ν•˜λŠ” μ‹œμ μ—μ„œλŠ” λ©€λ²„λ§Œ κ°€μ Έμ˜€κ³ (νŒ€μ€ ν”„λ‘μ‹œ 객체) 이후 getTeam()을 톡해 νŒ€μ„ μ‘°νšŒν•˜λŠ” μ‹œμ μ—μ„œμ•Ό μ‹€μ œλ‘œ νŒ€μ„ κ°€μ Έμ˜€λŠ” 것이닀.

Member findMember = em.find(Member.class, member.getId());
System.out.println("member.username = " + findMember.getUsername());
System.out.println("member.team.name = " + findMember.getTeam().getName()); // μ‹€μ œ Team DB 쑰회 (ν”„λ‘μ‹œ 객체 μ΄ˆκΈ°ν™”)

 

🌟 μ¦‰μ‹œ λ‘œλ”©

μ¦‰μ‹œ λ‘œλ”©μ€ μ•„λž˜μ™€ 같이 fetch 속성을 EAGER둜 μ„€μ •ν•˜λ©΄ λœλ‹€. 그러면 멀버λ₯Ό μ‘°νšŒν•  λ•Œ νŒ€κΉŒμ§€ μ „λΆ€ μ‘°νšŒλ˜λŠ” 쿼리가 λ‚˜κ°„λ‹€.

 

@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "TEAM_ID")
private Team team;

 

πŸ‘©‍πŸ’» ꢌμž₯ 사항

@ManyToOne, @OneToOne의 λ””ν΄νŠΈλŠ” μ¦‰μ‹œ λ‘œλ”©μ΄λ‹€. (@OneToMany의 λ””ν΄νŠΈλŠ” 지연 λ‘œλ”©)

ν•˜μ§€λ§Œ, μ¦‰μ‹œ λ‘œλ”©μ€ μ˜ˆμƒμΉ˜ λͺ»ν•œ 쿼리가 λ°œμƒν•  수 있기 λ•Œλ¬Έμ— μ‹€λ¬΄μ—μ„œλŠ” λͺ¨λ“  연관관계에 지연 λ‘œλ”©μ„ μ‚¬μš©ν•΄μ•Ό ν•œλ‹€. μ¦‰μ‹œ λ‘œλ”©μ€ μ‚¬μš©ν•˜μ§€ 말자! μ¦‰μ‹œ λ‘œλ”©μ΄ ν•„μš”ν•œ 상황이면 JPQL fetch 쑰인 or μ—”ν‹°ν‹° κ·Έλž˜ν”„ κΈ°λŠ₯을 μ‚¬μš©ν•˜μž.