JPA연관관계 란?

JangUT·2025년 3월 5일

📌연관관계

  • 엔티티(Entity) 간의 관계를 정의하는 방법이다. Jpa에서는 관계형 데이터베이스의 외래 키(Foreign key)를 객체지향적으로 매핑하여 객체 간의 관계를 관리합니다.


📌연관관계의 종류

  • jpa에서 엔티티 간의 관계는 방향성과 다중성에 따라 다음과 같이 나뉩니다.

1. 방향성에 따른 분류

  • 단방향 연관관계

    • 한 엔티티가 다른 엔티티를 참조하지만, 반대 방향은 참조하지 않는 관계입니다.
    • 예시 : 멤버(Member) 엔티티가 팀(Team) 엔티티를 참조하지만, 팀은 멤버를 참조하지 않습니다.

    단방향 예시

  • 양방향 연관관계

    • 두 엔티티가 서로를 참조하는 관계입니다. 이는 복잡성을 증가시킬 수 있지만, 더 효율적인 데이터 접근을 제공합니다.
    • 예시 : 멤버(Member) 엔티티와 팀(Team) 엔티티가 서로를 참조합니다.

    양방향 예시

2. 다중성에 따른 분류

  • 1 : 1 (One To One) : 하나의 엔티티가 다른 하나의 엔티티와 1:1로 매핑되는 관계입니다.
  • 1 : N (One To Many) : 여러 개의 엔티티가 하나의 엔티티를 참조하는 관계입니다.
  • N : 1 (Many To One) : 하나의 엔티티가 여러 개의 엔티티를 관리하는 관계입니다.
  • N : M (Many To Many) : 여러 개의 엔티티가 여러 개의 엔티티를 참조하는 관계입니다.

📌연관관계 Fetch 전략

LAZY 로딩 (지연 로딩):

  • 개념:
    • LAZY 로딩은 연관된 엔티티를 실제로 사용할 때까지 로드하지 않는 전략입니다. 즉, 필요할 때까지 해당 데이터에 대한 쿼리(SQL)를 실행하지 않습니다.
  • 장점:
    • 불필요한 데이터 로드를 피하여 성능을 최적화할 수 있습니다.
  • 적용 사례:
    • 대규모 데이터와 복잡한 연관관계가 있는 경우에 유리합니다.
  • 주의점:
    • 지연 로딩으로 인해 발생하는 LazyInitializationException에 주의해야 합니다.

EAGER 로딩 (즉시 로딩):

  • 개념:
    • EAGER 로딩은 연관된 엔티티를 최초 로드 시점에 즉시 함께 로드하는 전략입니다. 관계가 설정된 모든 데이터를 처음부터 가져옵니다.
  • 장점:
    • 데이터 접근 시 추가적인 쿼리가 필요 없어 애플리케이션의 응답 시간이 단축될 수 있습니다.
  • 적용 사례:
    • 데이터가 상대적으로 적고, 항상 사용되는 경우에 적합합니다.
  • 주의점:
    • 불필요한 데이터까지 로드되어 성능 저하를 일으킬 수 있습니다.

실제 코드 예시:

  • @ManyToOne@OneToMany와 같은 관계 매핑 애너테이션에서 fetch 속성을 통해 로딩 전략을 설정할 수 있습니다.
  • 예: @ManyToOne(fetch = FetchType.LAZY)

지연 로딩 VS 즉시 로딩

비교지연로딩즉시로딩
로딩 시점데이터 사용시데이터 조회
쿼리 실행 방식필요한 순간 추가 SQL실행한번에 SQL로 모든 데이터 로드
성능최적화불필요한 데이터 로딩 방지추가적인 SQL 실행 없음
N+1 문제발생발생 X (하지만, 불필요한 데이터까지 로딩)
profile
평범한 개발자

0개의 댓글