728x90
연관관계 매핑 구성
- 방향 : 단방향 / 양방향이 있음, 방향은 객체관계에서만 존재함, 테이블 관계같은 경우 항상 양방향
- 다중성 : 다대일, 일대다, 일대일, 다대다와 같은 다중성이 존재
- 연관관계의 주인 : 객체를 양방향 관계로 만들시, 주인을 지정해야함
연관관계는 객체들의 협력 공동체를 만들기 위하여 필요함, JPA에서 가장 중요한 것은 객체와 테이블을 어떻게 매핑되는지 이해하는 것이므로 연관관계는 중요함
테이블 중심의 설계의 문제
- 객체를 테이블에 맞추어서 모델링할 경우, 협력관계를 만드릭가 어려움
- 테이블은 외래키로 조인을 사용하여, 연관된 테이블을 찾고, 객체는 참조를 사용하여 연관된 객체를 찾음
- 테이블과 객체사이의 이러한 차이로 인한 제약조건이 생김
단방향 연관관계
객체 연관관계
- 회원 객체는 Member.team 필드로 팀 객체와 연관관계를 맺음
- 회원 객체와 팀 객체는 단방향 관계 (회원객체에서 팀으로 member.getTeam()으로 가능하지만 Team은 접근필드가 없음 불가)
테이블 연관관계
- 회원 테이블은 TEAM_ID 외래키로 팀테이블과 연관관계
- 회원 테이블과 팀 테이블은 양방향 관계 (TEAM_ID를 조인해서 회원에서 TEAM로 조회, Team에서 회원 조회)
객체, 테이블 연관관계 차이
- 객체는 참조를 통한 연관 관계이므로 단방향관계이기 때문에 양방향으로 만들려면 반대쪽에도 필드추가가 필요함, 테이블은 양쪽다 외래키를 통한 조인으로 접근이 가능하기 때문에 양방향관계
양방향 연관관계
- 단방향 관계에서 예시를 보면 Member에서 Team으로 접근이 가능하지만 Team에서 Member로 접근이 불가함, 하지만 참조를 넣어두면 양쪽에서 접근이 가능하게됨
- 이러한 양쪽에서 접근이 가능하도록 양쪽다 관계를 설정하면 양방향 연관관계가 됨
- JPA 설계를 진행할 때는 단방향으로 설계를 진행하고, 추후에 JPQL을 통하여 역방향으로 조회할 일이 많기 때문에 해당 부분이 필요한 경우에 양방향으로 설정해 주는 것이 좋음
- 무조건 양방향으로 매핑할 경우는 추후에 비즈니스적으로 매우 복잡해짐
객체 관계 매핑 예시
@Entity
@Getter
@Setter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@ToString(of = {"id", "username", "age"})
public class Member {
@Id
@GeneratedValue
@Column(name = "member_id")
private Long id;
private String username;
@ManyToOne //다대일 관계 매핑 정보 설정 (회원과 팀은 다대일 관계)
@JoinColumn(name = "team_id") //외래키 매핑 설정
private Team team;
public void setTeam(Team team) {
this.team = team;
}
}
@Entity
@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@ToString(of = {"id", "name"})
public class Team {
@Id
@GeneratedValue
@Column(name = "team_id")
private Long id;
private String name;
}
단방향 관계를 매핑 할 때 둘 중 어떤 것을 사용해야하는 지는 반대편 관계에 달려있음. 반대편이 일대다이면 다대일 관계 일대일관계면 일대일 관계 사용하면 됨
연관관계 주인
- 객체의 두 관계 중 하나의 연관관계를 주인으로 지정
- 연관관계의 주인이 외래키를 관리 (등록, 수정)
- 연관관계의 주인이 아닌 경우 단순 조회만 가능함
- 주인이 아닌 경우 mappedBy로 주인을 지정해야함
- 외래키가 있는 곳으로 주인으로하는 규칙을 하는경우 설계가 깔끔해져서 외래키가 있는 테이블에서 관리가 됨 (DB의 N에 해당하는 경우 연관관계의 주인으로 함, 외래키가 없는경우 무조건 다대일에서 일에 해당됨)
연관관계 요약
- 단방향 매핑만으로도 이미 연관관계 매핑은 완료된 것임
- 양방향 매핑은 반대방향으로 조회 기능이 추가된 것
- 단방향 매핑을 잘하고 양방향 매핑을 필요할 때 추가해도 됨
- 연관관계 주인을 정하는 기준은 외래키의 위치를 기준으로 정해야함
'SPRING' 카테고리의 다른 글
[SPRING] DISPATCHER-SERVLET (0) | 2021.06.07 |
---|---|
[SPRING] Bean (0) | 2021.05.23 |
[SPRING] 컨테이너 (Container) (0) | 2021.05.23 |
[SPRING] 의존성 주입 (0) | 2021.05.17 |
[SPRING] JPA 영속성 컨텍스트 (0) | 2021.05.16 |