관계 매핑(Relationship Mapping)
방향 : 단방향, 양방향(객체참조)
DB 테이블은 외래 키(Foreign key)하나로 조인(Join)을 사용해서 양방향으로 쿼리가 가능
따라서 DB에는 방향의 개념이 없습니다.
그러나 객체의 경우, 참조용 필드를 가지고 있는 객체만
연관된 객체를 조회할 수 있으므로 방향의 개념이 존재합니다.
객체 관계에서 한 쪽만 반대쪽을 참조하는 관계를 단방향,
양 쪽 모두 서로를 참조하는 관계를 양방향이라고 합니다.
연관관계 주인 : 양방향일 때 , 연관관계에서 관리 주체
데이터베이스는 외래 키(FK) 하나로 두 테이블이 연관관계를 맺습니다.
즉 연관관계를 관리하는 포인트는 외래 키 하나입니다.
반면 객체에서는 양방향 관계로 매핑하면 A -> B, B -> A,
두 곳에서 서로를 참조하므로 연관관계를 관리하는 포인트는 두 곳이 됩니다.
따라서 JPA는 두 객체 중 하나를 정해서 외래 키를 관리하게 만들어야 하는데,
여기서 외래 키를 관리하는 객체를 연관관계의 주인이라고 합니다.
보통 외래 키를 가진 테이블과 매핑되는 엔티티가 외래 키를 관리하는 것이 효율적이므로,
연관관계의 주인이 됩니다.
주의할 점은 외래 키를 관리하는 연관관계의 주인만이 외래 키를 변경할 수 있으며,
주인이 아닌 곳은 읽기만 가능하다는 것입니다.
다중성 :다대일(N:1), 일대다(1:N), 일대일(1:1), 다대다(N:M)
데이터베이스는 무조건 다(N)쪽이 외래 키를 가짐
다대일 단방향에서는 다 쪽에서
@ManyToOne만 추가해줌반대로 일쪽에서는 참조하지 않습니다. (단방향이기 때문)
다대일 양방향으로 만드려면 일쪽에
@OneToMany를 추가하고양방향 매핑을 사용했으니 연관 관계의 주인을
mappedBy로 지정해줍니다.mappedBy로 지정할 때 값은 대상이 되는 변수명을 따라 지정하면 됨일대다(1:N) : 단방향, 양방향
일대다의 기준은 연관관계의 주인을 일(1)쪽에 둔 것
데이터베이스에서는 무조건 다(N)쪽에서 외래키를 관리함
일대다는 일쪽 객체에서 다(N) 쪽 객체를 조작(생성,수정,삭제)하는 방법임
→ 매핑한 객체가 관리하는 외래 키가 다른 테이블에 있다는 점(관리어려움)
→ 연관관계처리를 위해 UPDATE SQL을 추가로 발생시킴
단, 일대다 단방향 매핑 하나만 사용하는 경우는 드물고,
다대일 단방향 매핑을 먼저 한 후에 필요한 경우,
일대다 단방향 매핑을 추가해서 양방향 연관 관계를 만드는 것이 일반적
@OneToMany와@JoinColumn을 이용해서 조인을 함mappedBy가 없음→ 양방향이 아니기 때문일대다 양방향은 쓰지 않음(= 다대일 양방향)
@JoinColumn(updatable = false, insertable = false)이지만,일대다 양방향을 사용해야할 때는 다대일 양방향 사용하하는게 더 좋음
일대일 관계는 양쪽이 서로 하나의 관계만을 가짐
일대일 관계의 반대도 일대일 관계이며,
일대일 관계는 두 테이블 중 어느곳에서든 외래 키를 가질 수 있음
주테이블에 외래키 주 테이블에 외래 키를 두고 대상 테이블을 찾음 객체지향 개발자 선호 • 장점 ◦ 주 테이블만 조회해도 대상 테이블에 데이터가 있는지 확인이 가능하다. • 단점 ◦ 값이 없으면 외래 키에 NULL을 허용해야 한다. 일대일(1:1) 단방향 →
@OneToOne와@JoinColumn을 이용일대일(1:1) 양방향→
@OneToOne와mappedBy설정대상 테이블에 외래키
- 데이터베이스 개발자들이 선호하는 방식
- NULL을 허용해야 하는 문제도 없다.
장점:
- 주 테이블과 대상 테이블을 일대일에서 일대다 관계로 변경할 때, 테이블 구조를 유지할 수 있다.
단점:
@OneToOne양방향 매핑 시 지연 로딩으로 설정하여도 지연 로딩(LAZY)이 동작하지 않고, 즉시 로딩(EAGER)이 동작함.- N+1 쿼리가 발생함.
- 프록시 기능의 한계 때문에 연관관계 주인이 아닌 테이블에서는 프록시로 만들 객체가
null인지 아닌지 알 수 없기 때문에 조회하는 쿼리가 실행됨.
일대일(1:1) 단방향 → JPA지원 안함
일대일(1:1) 양방향 →
@OneToOne와mappedBy설정중간에 테이블을 하나 추가해서 두 개의 일대다 관계를 만들어주는 것이 일반적인 방법