Programming/JPA(KYH)

JPA - 다양한 연관관계 매핑

잇(IT) 2023. 7. 14. 17:36

- 연관관계 매핑시 고려사항 3가지

1. 다중성

2. 단방향, 양방향

3. 연관관계의 주인


- 다중성

1. 다대일 : @ManyToOne

2. 일대다 : @OneToMany

3. 일대일 : @OneToOne

4. 다대다 : @ManyToMany

 

- 단방향, 양방향

1. 테이블

1.1. 외래 키 하나로 양쪽 조인 가능

1.2. 사실 방향이라는 개념이 없다.

2. 객체

2.1. 참조용 필드가 있는 쪽으로만 참조 가능

2.2. 한쪽만 참조하면 단방향

2.3. 양쪽이 서로 참조하면 양방향

 

- 연관관계의 주인

1. 테이블은 외래 키 하나로 두 테이블이 연관관계를 맺는다.

2. 객체 양방향 관계는 A->B, B->A처럼 참조가 2군데이다.

3. 객체 양방향 관계는 참조가 2군데 있다. 둘 중 테이블의 외래 키를 관리할 곳을 지정해야한다.

4. 연관관계의 주인 : 외래 키를 관리하는 참조

5. 주인의 반대편 : 외래 키에 영향을 주지 않는다. 단순 조회만 가능하다.


- 다대일 [N:1]

 

- 다대일 단방향

1. 가장 많이 사용하는 연관관계다.

2. 다대일 <-> 일대다

 

- 다대일 양방향

1. 외래 키가 있는 쪽이 연관관계의 주인

2. 양쪽을 서로 참조하도록 개발해야 한다.

 

Team team1 = new Team();
team1.setName("TeamA");
em.persist(team1);

Member member = new Member();
member.setUsername("member1");

em.persist(member);

team1.addMember(member);

------------------------------

public void addMember(Member member) {
        member.setTeam(this);
        members.add(member);
    }
   
// 양쪽을 서로 참조해야 하므로 양방향 참조에 대한 메서드를 생성하여 사용한다.

- 일대다 [1:N]

 

- 일대다 단방향

1. 일대다 단방향은 일대다(1:N)에서 일(1)이 연관관계의 주인이다.

2. 테이블 일대다 관계는 항상 다(N)쪽에 외래 키가 있다.

3. 객체와 테이블의 차이 때문에 반대편 테이블의 외래 키를 관리하는 특이한 구조다.

4. JoinColumn을 꼭 사용해야 한다. 그렇지 않으면 조인 테이블 방식을 사용한다.

 

- 정리

1. 일대다 단방향 매핑의 단점

1.1. 엔티티가 관리하는 외래 키가 다른 테이블에 있다.

1.2. 연관관계 관리를 위해 추가로 UPDATE SQL 실행한다.

2. 일대다 단방향 매핑보다는 다대일 양방향 매핑을 사용하는 것이 좋다.


- 일대일 [1:1]

 

- 일대일 관계

1. 일대일 관계는 그 반대도 일대일이다.

2. 주 테이블이나 대상 테이블 중에 외래 키 선택이 가능하다.

2.1. 주 테이블에 외래 키

2.2. 대상 테이블에 외래 키

3. 외래 키에 데이터베이스 유니크(UNI) 제약조건 추가

 

- 일대일 : 주 테이블에 외래 키 단방향

 

- 다대일 단방향 매핑과 유사하다.

 

- 일대일: 주 테이블에 외래 키 양방향

- 다대일 양방향 매핑처럼 외래 키가 있는 곳이 연관관계의 주인이다.

- 반대편은 mappedBy를 적용한다.

 

- 일대일: 대상 테이블에 외래 키 단방향

- 단방향 관계는 JPA 지원을 하지 않는다.

- 양방향 관계는 지원한다.

 

- 일대일: 대상 테이블에 외래 키 양방향

- 일대일 주 테이블에 외래 키 양방향과 매핑 방법이 같다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

출처 : 인프런 - 우아한 형제들 기술이사 김영한의 스프링 완전 정복 (자바 ORM 표준 JPA 프로그래밍 - 기본편)

728x90

'Programming > JPA(KYH)' 카테고리의 다른 글

JPA - 프록시  (0) 2023.07.17
JPA - 고급 매핑  (0) 2023.07.14
JPA - 연관관계 매핑 기초  (0) 2023.07.14
JPA - 엔티티 매핑  (0) 2023.07.14
JPA - 영속성 관리  (0) 2023.07.14