김영한님의 자바 ORM 표준 JPA 프로그래밍 - 기본편 정리
1. 단방향 연관관계
- 객체를 테이블에 맞춰 모델링(연관관계가 없는 객체)
- 객체를 테이블에 맞춰 데이터 중심으로 모델링하면, 협력 관계를 만들 수 없음
(1)테이블은 외래키로 조인하여 연관된 테이블을 찾는다.
(2) 객체는 참조를 사용해서 연관된 객체를 갖는다.
- 객체 지향 모델링(객체 연관 관계 사용)
- 객체와 테이블의 차이는 이렇게 해결 가능
// Member와 Team 클래스가 Entity 애노테이션을 붙였다고 가정
@Entity
public class Member {
// 다른 필드 생략
/*
@Column(name="TEAM_ID")
private Long teamId;
위는 객체를 테이블에 맞추어 모델링 한 것인데
협력 관계를 만들 수 없다.
*/
@ManyToOne // 항상 자기 자신을 기준으로
@JoinColumn(name="TEAM_ID")
private Team team;
}
- @ManyToOne 어노테이션으로 테이블의 연관관계를 지정
- @JoinColumn 생략해도 One의 PK가 Many의 FK로 매핑
- 양방향 관계에서는 mappedBy를 사용해 연관관계의 주인을 지정해주기 때문에 굳이 @JoinColumn를 사용할 필요가 없지만 name 속성을 사용하면 FK 이름을 지정이 가능하다.
2. 양방향 연관관계와 연관관계의 주인
- 양방향 매핑
@Entity
public class Team {
@id
@GeneratedValue
private Long id;
@OneToMany(mappedBy = "team")
private List<Member> members = new ArrayList<>();
}
- Team과 Member는 일대다 관계이므로 @OneToMany 애노테이션을 사용
- 연관관계의 주인은 FK를 관리하는 쪽
- 양방향 연관관계에서는 mappedBy가 연관관계의 주인을 지정하는 어노테이션
3. 객체와 테이블이 관계를 맺는 차이
- 객체 연관관계 = 2개
회원 -> 팀 연관관계 1개(단방향)
팀 -> 회원 연관관계 1개(단방향)
- 테이블 연관관계 1개
회원 <-> 팀의 연관관계 1개(양방향)
- 객체의 양방향 관계
객체의 양방향 관계는 사실 양방향 관계가 아니라 서로 다른 단방향 관계 2개다.
객체를 양방향으로 참조하려면 단방향 연관관계를 2개 만들어야 한다.
A -> B (a.getB())
B -> A (b.getA())
- 테이블의 양방향 관계
테이블은 외래 키 하나로 두 테이블의 연관관계를 관리
MEMBER.TEAM_ID 외래 키 하나로 양방향 연관관계를 가짐(양쪽으로 조인할 수 있다.)
둘 중 하나로 외래 키를 관리해야 한다.
4. 연관관계의 주인
- 양방향 매핑 규칙
(1) 객체의 두 관계중 하나를 연관관계의 주인으로 지정
(2) 연관관계의 주인만이 외래키를 관리(등록, 수정)
(3) 주인이 아닌쪽은 읽기만 가능
(4) 주인은 mappedBy 속성 사용 X
(5) 주인이 아니면 mappedBy 속성으로 주인 지정
- 연관관계의 주인은 FK를 관리하는 쪽
- 양방향 연관관계 N:1에서 주인을 N으로 만들면 된다. -> N:1에서 1에다가 mappedby 사용
5. 양방향 연관관계 주의
- 순수 객체 상태를 고려해서 항상 양쪽에 값을 설정하자
- 연관관계 편의 메소드를 생성하자
- 양방향 매핑시에 무한 루프를 조심하자(toString, lombok, JSON 생성 라이브러리에서 무한 루프를 주의해야 한다.)
- 양방형 매핑 시 연관관계의 주인에 값을 입력해야 한다.(순수한 객체 관계를 고려하면 항상 양쪽 다 값을 입력해야 한다.)
'개발 > Java & Kotlin' 카테고리의 다른 글
[JPA] 다양한 연관관계 매핑 (0) | 2022.07.14 |
---|---|
[Java] 정렬 (2) (0) | 2022.07.13 |
[Java] 정렬 (1) (0) | 2022.07.12 |
[JPA] 기본 엔티티 매핑 (0) | 2022.07.12 |
[JPA] 기본 영속성 관리 - 내부 동작 방식 (0) | 2022.07.11 |