목차

JPA의 연관관계와 즉시로딩 이슈

🗓️

연관관계 매핑

테이블과 객체의 연관관계에 대한 패러다임의 차이가 있다. 테이블은 연관관계라고 할 만한 것이 없다 (constraint 제외) 테이블간 연관관계가 필요하면 JOIN을 통해 관계를 갖는 방법 뿐이다. 반면 객체는 참조용 필드가 있으면 그쪽으로 참조가 가능하다. 클래스 내 멤버의 참조를 통해 이뤄진다. 이를 통해 양방향과 단방향 모두 관계를 정립할 수 있다.

연관관계의 주인

  • 테이블은 외래 키 하나로 두 테이블이 연관관계를 맺는다.
  • 객체는 양방향 관계가 필요할 경우 양 객체에서 각각 참조가 필요하다.

N:1

외래키를 들고있는 쪽이 연관관계의 주인. 이것은 다(N)인 쪽에서 필요로 한다

1:1

N:1 의 매핑 처럼 외래키를 들고있는 쪽이 연관관계의 주인. 반대편은 mappedBy 를 사용한다

주 테이블에 외래 키

  • 주 객체가 대상 객체의 참조를 가지는 것 처럼, 주 테이블에 외래 키를 두고 대상 테이블을 찾음
  • JPA 매핑 편의성
  • 장점 : 주 테이블만 조회해도 대상 테입르에 데이터 유무 확인 가능
  • 단점 값이 없으면 외래키에 null 허용

대상 테이블에 외래 키

  • 대상 테이블에 외래 키 존재
  • 장점 : 주 테이블과 대상 테이블을 1:1에서 1:N으로 변경할 때 테이블 구조 유지
  • 단점 : 프록시 기능의 한계로 지연 로딩으로 설정해도 항상 즉시로딩 됨

N:M

  • @JoinTable 사용
  • 사용하지 않음. 매핑 테이블이 매핑으로 끝나는 경우가 없음.
  • N:M은 보텅 1:N과 N:1의 관계로 풀어나감

프록시

즉시 로딩과 지연 로딩

  • 연관관계 중 N:1을 들고 있는 객체를 조회했을 경우 N:1의 필드까지 조회됨.
  • 이것을 방지 하기 위해 fetch 전략을 FetchType.LAZY 로 가져간다.
  • 이렇게 하면 객체 조회시 프록시로 로딩됨. 그러면 실제 필드를 사용하는 단계에서 쿼리가 나간다.

🏷️