연관관계 매핑
테이블과 객체의 연관관계에 대한 패러다임의 차이가 있다. 테이블은 연관관계라고 할 만한 것이 없다 (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
로 가져간다. - 이렇게 하면 객체 조회시 프록시로 로딩됨. 그러면 실제 필드를 사용하는 단계에서 쿼리가 나간다.