연관관계 매핑 고려사항 3가지
다중성
- 다대일 (ManyToOne)
- 일대다 (OneToMany)
- 일대일 (OneToOne)
- 다대다 (ManyToMany)
단방향, 양방향
- 테이블
- 방향 개념이 없음
- FK 하나로 양쪽 조인이 가능함
- 객체
- 참조용 필드가 있는 쪽으로만 참조 가능
- 한 쪽만 참조하면 단방향
- 양쪽이 서로 단방향으로 참조하면 양방향
연관 관계의 주인
- 테이블은 FK 하나로 두 테이블의 연관관계를 관리
- 객체는 참조가 2가지 (양방향)
- 외래키 관리를 맡을 객체를 선정해야함
- 주인 : 외래키 관리, 반대 : 단순 조회
다대일 (N:1)
- 단방향 : 가장 많이 사용됨, 반대는 일대 다
- 양방향 : 외래키 있는 쪽이 주인, 양 쪽이 서로참조
일대다 (1:N)
- 단방향 : 1이 연관 관계의 주인이 됨, N 쪽에 외래키 존재함, 객체와 테이블의 차이 때문에 반대편 테이블에서 키를 관리, @JoinColumn 사용, 그렇지 않으면 조인 테이블이 생성
- 단점: 엔티티가 관리하는 외래키가 다른 테이블에 존재함, 연관관계 관리를 위해 추가로 update SQL 쿼리가 생성됨, 다대일 양방향 사용을 권장
- 양방향 : 공식 스펙상 존재하지 않음, @JoinColumn(insertable=false, updatable=false) 사용, 읽기 전용 필드를 사용하여 양방향을 구현
일대일 (1:1)
주 테이블이나 대상 테이블에 외래키 선택이 가능함, 외래키에 UNI 제약 조건이 걸려있는 상태
- 주 테이블 외래키
- 단방향 : 다대일 단방향과 유사
- 양방향 : 외래키 있는 쪽이 주인, 반대는 @MappedBy 사용
- 대상 테이블 외래키
- 단방향 : 지원 X
- 양방향 : 매핑 방법이 주테이블 외래키 + 양방향의 정확히 반대
일대일 연관관계 정리
- 주테이블 외래키
- 주 객체가 대상 참조를 갖는 것처럼 주 테이블에 FK 를 두고 대상 테이블을 찾음
- 객체 지향 개발자 선호
- JPA 매핑이 편리함
- 장점: 주 테이블만 조회해도 대상 테이블 데이터 확인이 가능
- 단점: 값이 없으면 외래키에 NULL 을 허용하게 됨
- 대상 테이블 외래키
- 대상 테이블에 외래키가 존재함
- 전통적 DB 개발자들이 선호
- 장점: 주 테이블과 대상 테이블은
일대일 -> 일대다 로 변경 시 테이블 구조를 유지할 수 있음
- 단점: 프록시 기능의 한계로 지연 설정에도 무조건 즉시로딩 하게 되어있음
다대다 (N:M)
RDB 는 구조 상 정규회된 테이블 2개로 다대다를 표현할 수가 없음
- 연결 테이블을 추가해 일대다, 다대일로 풀어내야함
- 객체는 컬렉션을 사용해서 다대다를 구현할 수 있음
- @ManyToMany 사용, @JoinTable 로 연결 테이블 지정
- 다대다 매핑 : 단방향, 양방향이 모두 가능함
다대다의 한계
- 실무 사용 X
- 연결 테이블은 단순 연결만 하고 끝나지 않음 (다른 데이터가 추가될 수 있음)
다대다 단점의 극복
- 연결 테이블용 엔티티를 추가 ( 연결 테이블을 엔티티로 승격시킴 )
- @ManyToMany -> @OneToMany, @ManyToOne 으로 변경