연관관계 필요성
테이블에 맞춘 모델링
- 참조 대신 외래 키 사용 > 외래 키 식별자를 직접 다룸 > 식별자로 다시 조회
- 테이블은 외래 키로 조인된 테이블을 찾음
- 객체는 참조를 사용하여 연관된 객체를 찾음
단방향 연관관계
- 객체의 참조와 테이블의 외래 키를 매핑
- @ManyToOne / @OneToMany
- @JoinColumn
- 단방향 연관관계 설정
- 참조 저장 > 참조로 연관관계 조회(객체 그래프 탐색) > 연관관계 수정
양방향 연관관계
양방향 매핑
- Member 엔티티(n)에는 단방향과 동일하게 참조(Team) 저장
- Team 엔티티(1)에는 컬렉션 추가
객체와 테이블 관계 차이
- 객체 연관관계 : 2개
- 회원 -> 팀 (단방향)
- 팀 -> 회원 (단방향)
- 테이블 연관관계 : 1개
- 객체를 양방향으로 참조하려면 단방향 연관관계 2개 필요
연관관계의 주인(Owner)
- 객체의 두 관계 중 하나를 연관관계의 주인으로 지정
- 외래 키의 위치를 기준으로, 외래 키가 있는 곳을 주인으로 지정
- 연관관계의 주인만 외래 키 관리(등록 및 수정)
- 반대쪽은 mappedBy 속성으로 주인 지정, 읽기만 가능
- 양방향 매핑 시 연관관계 주인에도 값 입력해야 함(항상 양쪽에 입력)
- 편의 메소드 생성(생성자 또는 메소드 분리 설정 등)
- 무한 루프 조심(toString(), lombok, JSON 생성 라이브러리 등)
정리
- 단방향 매핑만으로도 연관관계 매핑 완료
- 단방향 매핑만 설정하고, 필요 시 양방향 추가
자바 ORM 표준 JPA 프로그래밍 기본편 - 김영한, 인프런