연관관계 매핑
- 테이블에서의 매핑
- 외래 키 하나로 양쪽 조인이 가능하기에 방향 개념이 없다.
- 객체에서의 매핑
- 참조용 필드가 있는 쪽으로만 참조가 가능하다
- 한쪽만 참조하면 단방향, 양쪽이 서로 참조하면 양방향(단방향 2개)이다.
- 객체에서 양방향의 경우 참조가 두 군데 있기 때문에 테이블 외래 키를 관리할 곳(연관관계 주인)을 지정해야한다.
- 연관관계 주인 : 외래 키를 관리하는 참조
- 주인 반대편 : 외래 키에 영향을 주지 않고 단순 조회만 가능하다.
다대일 관계 (N:1)
- 다대일 관계 (N:1) 단방향
- 가장 많이 사용하는 연관관계
- N 쪽에서 외래키를 관리하는 경우이다.
- 다대일(N:1)의 반대는 일대다(1:N)이다.
- 다대일 관계 (N:1) 양방향
- 외래 키가 있는 쪽이 연관관계의 주인이다. => N 쪽이 연관관계의 주인
- 양쪽을 서로 참조할 수 있도록 개발한 것이다.
- N:1 관계 테이블에서 외래 키는 항상 N 쪽에 있어야한다.
- 객체에서도 마찬가지로 참조는 N:1 단방향일 때 N쪽에서 1쪽의 참조를 가지고 있어야한다.
- 참조에 @ManyToOne으로 명시, @Column(name=...)으로 테이블 외래 키와 매핑해준다.
- N:1 양방향일 때 테이블은 수정할 필요 없으며 객체 N:1 단방향 방식 + 상대쪽에도 참조를 추가해준다.
- 상대쪽에는 참조에 @OneToMany(mappedBy = ...)로 명시해주면서 반대쪽 참조명을 적어준다.
- 객체에서도 마찬가지로 참조는 N:1 단방향일 때 N쪽에서 1쪽의 참조를 가지고 있어야한다.
일대다 관계 (1:N)
- 일대다 관계 (1:N) 단방향
- 1:N에서 1 쪽에서 외래 키를 관리하는 경우이다. => 1이 연관관계의 주인이다.
- 참조에 @OneToMany와 @JoinColumn 사용해서 매핑해야 한다.
- @JoinColumn을 사용하지 않으면 조인 테이블 방식을 사용한다.
=> 테이블 사이에 중간 테이블을 생성해서 동작하는 방식
- 테이블 1:N 관계는 항상 N 쪽에 외래키가 있다.
- 객체와 테이블의 차이로 반대편 테이블의 외래 키를 관리하는 특이한 구조이다.
- ex) MEMBER 테이블의 외래 키 TEAM_ID를 TEAM 클래스의 members 객체에서 관리한다.
- 권장하지 않는 방식이다.
- 1:N에서 1 쪽에서 외래 키를 관리하는 경우이다. => 1이 연관관계의 주인이다.
- 일대다 관계 (1:N) 단방향의 단점
- 엔티티가 관리하는 외래 키가 다른 테이블에 있다.
- 연관관계 관리를 위해 추가로 UPDATE SQL을 실행해야 한다.
- 일대다 단방향 매핑보다 다대일 양방향 매핑을 사용하는 것이 좋다.
- 일대다 관계 (1:N) 양방향
- 공식적으로 존재하는 매핑은 아니다.
- 상대(N)쪽에 @JoinColumn(insertable = false, updatable = false)으로 참조와 매핑해줘야 한다.
- 읽기 전용 필드를 사용해서 양방향처럼 사용하는 방식이다.
- 일대다 양방향 말고 다대일 양방향을 사용하자
일대일 관계
- 일대일 관계
- 일대일 관계의 반대는 일대일 관계이다.
- 주 테이블이나 대상 테이블 중 외래 키 선택 가능하다. (어느쪽에 넣든 상관x)
- 외래 키에 데이터베이스 유니크 제약조건 추가
- 다대일 관계의 단방향, 양방향 관계 매핑과 유사하다.
- 일대다 관계처럼 반대편 테이블의 외래 키를 관리하는 것은 불가능하다.
- 주 테이블 : 해당 관계에서 주체가 될 수 있는 대상 ex) 회원, 게시판
- 대상 테이블 : 해당 관계에서의 주체에 의해 관계가 맺어지는 대상 ex) 사물함, 첨부파일
- 주 테이블에 외래 키
- 주 객체가 대상 객체의 참조를 가지는 것처럼 주 테이블에 외래 키를 두고 대상 테이블을 찾는다.
- 객체지향 개발자가 선호하는 방식
- JPA 매핑이 편리하다.
- 장점: 주 테이블만 조회해도 대상 테이블에 데이터가 있는지 확인 가능
- 단점: 값이 없으면 외래 키에 null을 허용해야 한다.
- 대상 테이블에 외래 키
- 대상 테이블에 외래 키가 존재
- 전통적인 데이터베이스 개발자가 선호하는 방식
- 장점: 주 테이블과 대상 테이블을 일대일에서 일대다 관계로 변경할 때 테이블 구조가 유지
- 단점: 프록시 기능의 한계로 지연 로딩으로 설정해도 항상 즉시 로딩된다.
다대다 관계 (M:N)
- 다대다 관계 (M:N)
- 관계형 데이터베이스는 정규화된 테이블 2개로 다대다 관계를 표현할 수 없다.
다대다 관계를 표현하기 위해서는 연결 테이블(조인 테이블)을 추가해서 일대다, 다대일 관계로 풀어내야한다. - 객체에서는 객체 2개로 다대다 관계를 표현할 수 있다.
- @ManyToMany를 사용하며 @JoinTable로 연결 테이블을 지정할 수 있다.
- 다대다 관계에서도 단방향과 양방향이 모두 존재한다.
- 관계형 데이터베이스는 정규화된 테이블 2개로 다대다 관계를 표현할 수 없다.
- 다대다 매핑의 한계
- 편리해보이지만 실무에서 사용할 수 없다.
- 연결 테이블이 단순히 연결만 하고 끝나지 않는다.
- 이 경우 매핑 정보만 포함되고 추가적인 정보 (주문시간, 수량)같은 정보를 추가할 수 없다.
- 다대다 한계 극복
- 연결 테이블용 엔티티 추가
- @ManyToMany를 -> @OneToMany, @ManyToOne으로 변경
- 연결 테이블
- 연결 테이블(엔티티)를 만들 때 PK를 FK들을 묶어서 사용하는 경우가 많다.
- FK를 묶어서 PK를 사용하기 보다 의미없는 것을 PK로 사용하는 것이 좋다.(GenerateValue로 ID값 자동 생성...)
- 일관성과 유지보수 등 여러 측면에서 좋다.
- 다대다 (N:M) 관계는 일대다(1:N), 다대일(N:1) 관계로
- 테이블의 N:M 관계는 중간(연결, 조인) 테이블을 이용해서 1:N, N:1로 설계해야한다.
- @ManyToMany 제약 => 필드 추가x, 엔티티 테이블 불일치가 발생한다.
- 실전, 실무에서는 @ManyToMany 사용x
출처: [인프런 김영한 자바 ORM 표준 JPA 프로그래밍 - 기본편]
https://www.inflearn.com/course/ORM-JPA-Basic/dashboard
자바 ORM 표준 JPA 프로그래밍 - 기본편 강의 | 김영한 - 인프런
김영한 | JPA를 처음 접하거나, 실무에서 JPA를 사용하지만 기본 이론이 부족하신 분들이 JPA의 기본 이론을 탄탄하게 학습해서 초보자도 실무에서 자신있게 JPA를 사용할 수 있습니다., 실무에서도
www.inflearn.com
'Spring > [인프런 김영한 자바 ORM 표준 JPA 프로그래밍 - 기본편]' 카테고리의 다른 글
[인프런 김영한 자바 ORM 표준 JPA 프로그래밍 - 기본편] 프록시와 연관관계 관리 (0) | 2024.08.23 |
---|---|
[인프런 김영한 자바 ORM 표준 JPA 프로그래밍 - 기본편] 고급 매핑 (0) | 2024.08.22 |
[인프런 김영한 자바 ORM 표준 JPA 프로그래밍 - 기본편] 연관관계 매핑 기초 (0) | 2024.08.20 |
[인프런 김영한 자바 ORM 표준 JPA 프로그래밍 - 기본편] 엔티티 매핑 (1) | 2024.08.20 |
[인프런 김영한 자바 ORM 표준 JPA 프로그래밍 - 기본편] 영속성 관리 (1) | 2024.08.19 |