JPA ‐ JPA 연관관계 매핑 - dnwls16071/Backend_Study_TIL GitHub Wiki
📚 양방향 연관관계의 주인
- 연관관계의 주인 - 외래 키가 있는 곳을 주인으로 설정한다.
- 연관관계 편의 메서드를 생성 - 무한루프 주의
- 단방향 매핑을 우선적으로 고려, 양방향 매핑은 필요할 때만 추가
📚 다대일(N:1) - @ManyToOne
- 다대일 연관관계의 경우 다(N) 측이 연관관계의 주인
📚 일대다(1:N) - @OneToMany
- 일대다 연관관계의 경우 일(1) 측이 연관관계의 주인
- 불필요한 업데이트 쿼리가 발생
- 일대다 단방향보다는 다대일 양방향 권장
여기까지 결론을 정리해본다면? → 다대일 단방향을 권장하나 양방향이 필요한 경우라면 일대다 단방향말고 다대일 양방향으로 설계
📚 일대일(1:1) - @OneToOne
- 주 테이블에 외래 키를 두는지 아니면 대상 테이블에 외래 키를 두는지를 결정
- 어느 쪽에 두는지 상관은 없지만 외래 키를 설정할 때 다음과 같은 요구사항을 두고 결정하는 것이 좋다고 본다.
예를 들어, 학생과 사물함이 있다고 가정하자. 학생 한 명당 사물함 한 개를 배정받아 사용할 수 있다면 이는 일대일 관계이다. 하지만 학생교칙이 바뀌어 학생 한 명당 여러 사물함을 사용할 수 있다고 한다면 일대다 관계로 변화하게 된다. 일대다 연관관계로 요구사항을 변화시켰을 때, 다(N) 측에 해당하는 테이블에 외래 키를 설정하는 방법을 고려한다.
📚 다대다(N:M) - @ManyToMany
- 해당 연관관계는 실무에서의 사용을 지양한다.
- 연결 테이블이 단순히 연결만 하고 끝나지 않음(추가되는 데이터가 들어올 수 있음)
- 따라서 다대다는 일대다와 다대일 관계로 풀어내야만 한다.
📚 상속 관계 매핑
- RDB의 경우 상속 관계라는 개념이 존재하지 않는다.
- 객체의 상속 구조와 DB의 슈퍼타입 - 서브타입 관계를 매핑
- 슈퍼타입 - 서브타입 논리 모델을 물리 모델로 구체화하는 전략 3가지
- 조인 전략(JOINED)✅
- 장점 : 테이블 정규화, 외래 키 참조 무결성 제약조건 활용 가능, 저장공간 효율화
- 단점 : 조회시 조인을 많이 사용, 성능 저하, 조회 쿼리가 복잡, 데이터 저장시 INSERT 쿼리가 2번 호출
- 단일 테이블 전략(SINGLE_TABLE)
- 장점 : 조인이 필요 없으므로 일반적으로 조회 성능이 빠름, 조회 쿼리가 비교적 단순함
- 단점 : 자식 엔티티가 매핑한 컬럼은 모두 NULL 허용, 단일 테이블에 모든 것을 저장하므로 테이블이 커질 수 있고 상황에 따라 조회 성능이 저하될 우려가 있다.
- 구현 클래스마다 테이블 전략(TABLE_PER_CLASS)
- 조인 전략(JOINED)✅
📚 @MappedSuperclass
- 공통 매핑 정보가 필요할 때 사용
- 부모 클래스를 상속 받는 자식 클래스에 매핑 정보만 제공
- 조회, 검색 불가 →
EntityManager.find()
불가 - 직접 생성해서 사용할 일이 없으므로 추상 클래스를 권장