Home > Spring > πŸƒ[Spring] 연관관계λ₯Ό μ‚¬μš©ν•˜λ©΄ 무엇이 μ’‹μ„κΉŒμš”?

πŸƒ[Spring] 연관관계λ₯Ό μ‚¬μš©ν•˜λ©΄ 무엇이 μ’‹μ„κΉŒμš”?
Spring Framework

πŸƒ[Spring] 연관관계λ₯Ό μ‚¬μš©ν•˜λ©΄ 무엇이 μ’‹μ„κΉŒμš”?

  • JPAμ—μ„œ 연관관계λ₯Ό μ‚¬μš©ν•˜λ©΄ 객체 μ§€ν–₯적인 λ°©λ²•μœΌλ‘œ λ°μ΄ν„°λ² μ΄μŠ€μ˜ ν…Œμ΄λΈ” κ°„ 관계λ₯Ό ν‘œν˜„ν•˜κ³ , λ°μ΄ν„°μ˜ 일관성을 μœ μ§€ν•˜λ©° 효율적으둜 관리할 수 μžˆμŠ΅λ‹ˆλ‹€.
  • JPA μ—°κ΄€κ΄€κ³„λŠ” μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œ μ—”ν‹°ν‹°λ“€ κ°„μ˜ 관계λ₯Ό 객체 λͺ¨λΈλ‘œ κ·ΈλŒ€λ‘œ ν‘œν˜„ν•˜λ―€λ‘œ, SQL μ€‘μ‹¬μ˜ λ°μ΄ν„°λ² μ΄μŠ€ 접근보닀 직관적이고 μœ μ§€λ³΄μˆ˜κ°€ μ‰¬μš΄ μ½”λ“œ μž‘μ„±μ„ λ•μŠ΅λ‹ˆλ‹€.

1️⃣ JPA 연관관계λ₯Ό μ‚¬μš©ν–ˆμ„ λ•Œμ˜ μž₯점.

1️⃣ 객체 μ§€ν–₯적인 데이터 λͺ¨λΈλ§.

  • 연관관계λ₯Ό 톡해 엔티티듀이 μ‹€μ œ λΉ„μ¦ˆλ‹ˆμŠ€ λ„λ©”μΈμ—μ„œμ™€ μœ μ‚¬ν•˜κ²Œ μ—°κ²°λ˜μ–΄ ν‘œν˜„λ˜λ―€λ‘œ, 객체 μ§€ν–₯적인 데이터 λͺ¨λΈλ§μ΄ κ°€λŠ₯ν•©λ‹ˆλ‹€.
    • User와 Order의 κ΄€κ³„μ²˜λŸΌ μ—”ν‹°ν‹°κ°€ μ„œλ‘œ μ°Έμ‘°ν•˜λ©° 관계λ₯Ό ν‘œν˜„ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • 이λ₯Ό 톡해 λΉ„μ¦ˆλ‹ˆμŠ€ λ‘œμ§μ„ μ½”λ“œλ‘œ 더 μžμ—°μŠ€λŸ½κ²Œ ν‘œν˜„ν•  수 있으며, κ°œλ°œμžκ°€ λ°μ΄ν„°λ² μ΄μŠ€ ꡬ쑰에 λŒ€ν•œ 고민보닀 λΉ„μ¦ˆλ‹ˆμŠ€ λ‘œμ§μ— 더 집쀑할 수 μžˆμŠ΅λ‹ˆλ‹€.

2️⃣ μžλ™μœΌλ‘œ SQL을 μƒμ„±ν•˜μ—¬ 관리 λΆ€λ‹΄ κ°μ†Œ.

  • JPAλŠ” 연관관계λ₯Ό μ„€μ •ν•˜λ©΄ ν•„μš”ν•œ SQL을 μžλ™μœΌλ‘œ μƒμ„±ν•˜κ³  μ‹€ν–‰ν•΄μ£Όλ―€λ‘œ, 연관관계λ₯Ό 직접 SQL둜 κ΄€λ¦¬ν•˜λŠ” 뢀담을 λœμ–΄μ€λ‹ˆλ‹€.
    • 예λ₯Ό λ“€μ–΄, User와 Order κ°„μ˜ 관계가 μ„€μ •λ˜μ–΄ 있으면, User κ°μ²΄μ—μ„œ Order 객체λ₯Ό μ‘°νšŒν•  λ•Œ JPAκ°€ μžλ™μœΌλ‘œ SQL을 생성해 λ°μ΄ν„°λ² μ΄μŠ€μ—μ„œ ν•„μš”ν•œ 데이터λ₯Ό κ°€μ Έμ˜΅λ‹ˆλ‹€.

3️⃣ 일관성과 무결성 μœ μ§€.

  • 연관관계와 Cascade μ˜΅μ…˜, orphanRemoval μ˜΅μ…˜μ„ 톡해 객체 κ°„ 관계λ₯Ό JPAκ°€ 관리해 μ£Όλ―€λ‘œ, λΆ€λͺ¨μ™€ μžμ‹ μ—”ν‹°ν‹° κ°„ 일관성을 μ‰½κ²Œ μœ μ§€ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • λΆ€λͺ¨ μ—”ν‹°ν‹°κ°€ μ‚­μ œλ˜λ©΄ μžμ‹ 엔티티도 μžλ™μœΌλ‘œ μ‚­μ œλ˜κ±°λ‚˜ μ—°κ΄€λœ μžμ‹ μ—”ν‹°ν‹°κ°€ Orphan Object(κ³ μ•„ 객체)둜 남지 μ•Šλ„λ‘ 관리할 수 μžˆμ–΄ 데이터 무결성을 μœ μ§€ν•˜λŠ” 데 μœ λ¦¬ν•©λ‹ˆλ‹€.

4️⃣ μ„±λŠ₯ μ΅œμ ν™” 지원.

  • JPAλŠ” 연관관계 섀정을 톡해 μ§€μ—° λ‘œλ”©(Lazy Loading), μ¦‰μ‹œ λ‘œλ”©(Eager Loading), 페치 쑰인(Fetch Join) 등을 μ‚¬μš©ν•˜μ—¬ ν•„μš”ν•  λ•Œλ§Œ 데이터λ₯Ό μ‘°νšŒν•  수 μžˆμŠ΅λ‹ˆλ‹€.
    • 예λ₯Ό λ“€μ–΄, fetch = FetchType.LAZY둜 μ„€μ •ν•˜λ©΄ λ°μ΄ν„°λ² μ΄μŠ€μ—μ„œ κ΄€λ ¨λœ 데이터λ₯Ό μ¦‰μ‹œ λ‘œλ“œν•˜μ§€ μ•Šκ³  μ‹€μ œλ‘œ ν•„μš”ν•  λ•Œ μ‘°νšŒν•˜κ²Œ λ˜μ–΄ μ„±λŠ₯ μ΅œμ ν™”κ°€ κ°€λŠ₯ν•©λ‹ˆλ‹€.

5️⃣ λΉ„μ¦ˆλ‹ˆμŠ€ 둜직의 응집도 ν–₯상.

  • 연관관계λ₯Ό μ‚¬μš©ν•˜λ©΄ 도메인 객체 κ°„μ˜ 관계λ₯Ό 객체지ν–₯적인 λ°©μ‹μœΌλ‘œ μΊ‘μŠν™”ν•˜μ—¬ λΉ„μ¦ˆλ‹ˆμŠ€ λ‘œμ§μ„ μž‘μ„±ν•  수 μžˆμ–΄ 응집도가 λ†’μ•„μ§‘λ‹ˆλ‹€.
    • 예λ₯Ό λ“€μ–΄, Order 객체에 addOrderItem() λ©”μ„œλ“œλ₯Ό μ •μ˜ν•΄ OrderItem을 μΆ”κ°€ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
      • Order 객체에 μ—°κ΄€λœ λͺ¨λ“  OrderItem이 μžλ™μœΌλ‘œ κ΄€λ¦¬λ˜λ―€λ‘œ, λΉ„μ¦ˆλ‹ˆμŠ€ 둜직이 보닀 일관성 있게 μœ μ§€λ©λ‹ˆλ‹€.

6️⃣ λ³΅μž‘ν•œ 쿼리 μž‘μ„± μ΅œμ†Œν™”.

  • 연관관계λ₯Ό 톡해 객체 κ°„μ˜ μ°Έμ‘°λ₯Ό μ‰½κ²Œ μ‚¬μš©ν•  수 μžˆμœΌλ―€λ‘œ, 직접 쑰인을 μž‘μ„±ν•˜λŠ” λ³΅μž‘ν•œ 쿼리λ₯Ό 쀄일 수 μžˆμŠ΅λ‹ˆλ‹€.
  • 특히 μ–‘λ°©ν–₯ 연관관계λ₯Ό 톡해 μ—”ν‹°ν‹° κ°„ 관계λ₯Ό μ‰½κ²Œ 탐색할 수 μžˆμ–΄ λΉ„μ¦ˆλ‹ˆμŠ€ λ‘œμ§μ„ κ΅¬ν˜„ν•  λ•Œ μ½”λ“œκ°€ λ‹¨μˆœν•΄μ§‘λ‹ˆλ‹€.

2️⃣ 연관관계λ₯Ό μ‚¬μš©ν•œ 예제의 μž₯점.

  • 예λ₯Ό λ“€μ–΄, Teamκ³Ό Memberκ°€ μ–‘λ°©ν–₯ 연관관계λ₯Ό κ°€μ§€λŠ” 경우, Team κ°μ²΄μ—μ„œ Member 객체λ₯Ό μ‰½κ²Œ μ‘°νšŒν•  수 μžˆμŠ΅λ‹ˆλ‹€.
    Team team = entityManager.find(Team.class, teamId);
    List<Member> members = team.getMembers();
    
  • μœ„μ™€ 같이 Teamμ—μ„œ Memberλ₯Ό μ‰½κ²Œ μ‘°νšŒν•  수 있으며, λ³΅μž‘ν•œ SQL을 μž‘μ„±ν•  ν•„μš” 없이 JPAκ°€ 연관관계λ₯Ό κ΄€λ¦¬ν•˜μ—¬ ν•„μš”ν•œ 데이터λ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€.

3️⃣ μš”μ•½.

  • JPAμ—μ„œ 연관관계λ₯Ό μ‚¬μš©ν•˜λ©΄ 객체 μ§€ν–₯적으둜 데이터 λͺ¨λΈμ„ ν‘œν˜„ν•˜κ³ , SQL을 μžλ™μœΌλ‘œ μƒμ„±ν•˜λ©°, 데이터 무결성과 일관성을 μ‰½κ²Œ μœ μ§€ν•  수 μžˆμŠ΅λ‹ˆλ‹€. λ˜ν•œ, μ§€μ—° λ‘œλ”©κ³Ό 같은 κΈ°λŠ₯으둜 μ„±λŠ₯을 μ΅œμ ν™”ν•˜κ³ , λ³΅μž‘ν•œ λΉ„μ¦ˆλ‹ˆμŠ€ λ‘œμ§μ„ 더 직관적이고 응집λ ₯ 있게 관리할 수 있게 ν•©λ‹ˆλ‹€.