2023. 6. 24. 12:09ㆍjpa
jpa의 연관매핑에 대해서 정리를 해보겠습니다.
연관관계 매핑시 고려해야 하는 사항은
1. 다중성
2. 단방향, 양방향
3. 연관관계의 주인
jpa에서 다중성 (양방향 매핑일 경우 앞에 나온게 주인이라고 가정)
1. 다대일(@ManyToOne)
2. 일대다(@OnetoMany) : 다대일을 사용하자.
3. 일대일(@OneToOne)
4. 다대다(@ManyToMany) : 실무에서 쓰면 안된다.
단방향, 양방향이란
테이블에서는 외래키 하나로 양쪽 조인 가능해서 방향이라는 개념이 없다.
객체에서는 참조형 필드가 있는 쪽으로만 참조 가능하다. 예를 들어 Team이라는 클래스와 Member라는 클래스가 있다.
Member클래스 안에 Team형 필드를 선언하면 Member클래스는 Team을 참조할 수 있다.
이 때 Team 클래스 안에 Member형 필드가 선언되어 있지 않다면 Team은 Member를 참조할 수 없다.
위와 같은 경우를 단방향이라고 한다.
이 상태에서 Team 클래스 안에 Member형 필드를 선언하면 Team에서도 Member를 참조할 수 있게 되는데 양쪽이 서로 참조가 가능하다. 이러한 경우를 양방향이라고 한다.
연관관계의 주인
양방향 관계일 경우 Member -> Team, Team -> Member처럼 참조가 2군대가 생긴다.
테이블은 외래 키 하나로 두 테이블이 연관관계를 맺는다.
따라서 객체 양방향 관계일 경우 외래키를 관리할 곳을 지정해줘야 한다.
즉 연관관계의 주인은 외래키를 관리하는 참조이다. 주인의 반대편은 외래키에 영향을 주지 않고 단순조회만 가능하다.
예를 들면 Member와 Team은 다대일 관계이고 테이블 관점에서 외래키는 Member에 있다.
Member클래스 안에 Team형 필드를 선언한 후 @ManyToOne으로 연관관계 다중성에 대해 알려주고 @JoinColumn을 통해 테이블의 외래키와 객체를 매핑한다. 즉 연관 관계의 주인만이 외래키를 관리(등록, 수정)이 가능하다.
다대일 단방향

테이블을 먼저 보면 Member와 Team이 다대일 관계이고 Member테이블 안에 Team_id라는 외래키가 있다는 것을 알 수 있다. Member클래스 안에 Team형 필드 team을 선언하고 team과 team_id를 연관관계 매핑을 해준다.
@ManyToOne
@JoinColumn(name = "TEAM_ID")
private Team team;
다대일 양방향

테이블을 먼저보면 단방향일 때와 동일하다. 객체 연관관계에서 Team에서 Member를 참조할 수 있는 필드만 추가되었더는 것을 확인할 수 있다.
@OneToMany(mappedBy = "team")
private List<Member> members = new ArrayList<>();
외래키가 있는 쪽이 연관관계의 주인 즉 Member 클래스안에 있는 team이라는 필드가 연관관계의 주인이다.
일대다 단방향

일대다를 권장하지 않는다.
테이블에서는 항상 다쪽에 외래키가 있기 때문에 패러다임 충돌이 있다.
일대일 관계
- 주 테이블에 외래키(개발자 선호)
- 대상 테이블에 외래키(dba 선호)
외래키에 데이터베이스 유니크 제약조건 추가
일대일 : 주 테이블에 외래키 단방향

테이블을 보면 Member에 locker_id라는 외래키, 유니크 설정을 해주고 Member클래스 안에 Locker 필드를 만들고 @OnetoOne으로 다중성을 알려주고 @JoinColumn을 활용해 연관관계 매핑을 맺어준다.
@OneToOne
@JoinColumn(name = "LOCKER_ID")
private Locker locker;
일대일 : 주 테이블에 외래키 양방향

단방향에서 Locker클래스에 Member 필드를 추가를 해주면 양뱡향이 된다.
@OneToOne(mappedBy = "locker")
private Member member;
일대일 : 주테이블에 외래키 양방향 정리
다대일 양방향 매핑처럼 외래키가 있는 곳 연관관계의 주인이다.
반대편은 mappedBy 적용

주테이블과 달리 Locker 테이블에 외래키를 가지고 있다.
일대일: 대상 테이블에 외래키 단방향 정리
- 단방향 관계는 jpa 지원 x
- 양방향 관계는 지원(말이 조금 안되는 감이 있다.)
일대일: 대상 테이블에 외래키 양방향

일대일 : 대상 테이블에 외래키 양방향 정리
일대일 주 테이블에 외래키 양방향과 매핑 방법은 같다.
일대일 정리
주 테이블에 외래키
- 주 객체가 대상 객체의 참조를 가지는 것처럼 주 테이블에 외래키를 두고 대상 테이블을 찾는다.
- 객체지향 개발자 선호
- jpa 매핑 편리
- 장점 : 주 테이블만 조회해도 대상 테이블에 데이터가 있는지 확인 가능
- 단점: 값이 없으면 외래 키에 null 허용
대상 테이블에 외래키
- 대상 테이블에 외래키가 존재
- 데이터베이스 개발자 선호
- 장점 : 주 테이블과 대상 테이블을 일대일에서 일대다 관계로 변경할 떄 테이블 구조 유지
- 단점: 프록시 기능의 한계로 지연 로딩으로 설정해도 항상 즉시 로딩됨
다대다 관계
- 실무에서 쓰이지 않는다.
- @ManyToOne -> @OnetoMany, @ManyToOne으로 사용한다.

예를 들어 Member와 Product가 다대다 관계라고 하면 연결 테이블용 엔티티를 추가하여 일대다, 다대일로 풀어준다.
'jpa' 카테고리의 다른 글
| h2 테이블 삭제 안되는 오류 - maven (0) | 2023.06.24 |
|---|---|
| jpa - 고급매핑 정리 (0) | 2023.06.24 |
| jpa 연관매핑 기초 - 단방향, 양방향 (0) | 2023.06.22 |
| java: Compilation failed: internal java compiler error (0) | 2023.06.20 |
| jpa 엔티티 매핑 정리 (0) | 2023.06.20 |