연관관계 매핑 1
시나리오 가정
- 회원과 팀이 있다.
- 회원은 하나의 팀에만 소속될 수 있다.
- 회원과 팀은 다대일 관계.
객체를 테이블에 맞추어 모델링
Member Entity
@Entity
public class Member {
@Id @GeneratedValue
@Column(name="member_id")
private Long id;
private String name;
@Column(name = "team_id")
private Long teamId;
}
Team Entity
@Entity
public class Team {
@Id @GeneratedValue
@Column(name="team_id")
private Long id;
private String name;
}
각자의 table에 맞게만 객체가 생성된 상태이지 별다른 연관관계는 보이지 않습니다!
이렇게 별도의 연관관계 매핑 없이 만들어진 Entity는 외래키를 가지고 있는 쪽에서 외래키를 직접 다뤄줘야 합니다.
ex)
// 팀 먼저 저장
Team team=new Team();
...
em.persist(team);
//회원 저장
Member member-new Member();
...
member.setTeamId(team.getId()); //외래 키를 직접 다룸
em.persist(member);
외래키를 가지고 있는 쪽 Member객체에서 Team의 객체를 참조하는 것이 아닌 team_id만을 갖고 있기 때문에 엔티티 매니저로 따로 따로 조회를 할 수 밖에 없습니다.
즉, 객체를 DB 테이블에만 맞추어 모델링하면 협력 관계를 만들 수 없다는 뜻이 됩니다.
단방향 연관관계
위 처럼 외래 키를 가지고 있는 객체에서 키를 아닌 객체를 직접 참조하게 만들어 봅시다!
Member Entity
@Entity
public class Member {
@Id @GeneratedValue
@Column(name="member_id")
private Long id;
private String name;
/* @Column(name = "team_id")
private Long teamId; */
@ManyToOne
@JoinColumn(name="team_id")
private Team team; //객체를 직접 참조
}
Meber Entity의 코드만 이런 식으로 수정하게 되면 단방향 연관관계가 성립되게 됩니다!
ex) 저장
// 팀 먼저 저장
Team team=new Team();
...
em.persist(team);
//회원 저장
Member member-new Member();
...
member.setTeam(team); //객체를 저장
em.persist(member);
외래 키를 가지고 있는 쪽에서 객체를 직접 참조하고 있기 때문에 엔티티 매니저로 Member만 조회하게 되면 member.getTeam()과 같은 코드로 따로 조회할 필요 없이 참조를 사용해서 조회를 할 수 있게 됩니다.
양방향 연관관계와 연관관계의 주인
단방향 연관관계에서는 Member Entity에서만 Team Entity를 참조하였습니다.
양방향 연관관계에서는 Member와 Team이 N:1관계 이므로 Member Entity에서는 Team객체 하나만 참조하면 됐지만, Team 객체에서는 연관된 Member들을 모두 참조하고 있어야 합니다. 즉, Member객체를 List형태로 여러개 참조합니다.
Team Entity
@Entity
public class Team {
@Id @GeneratedValue
@Column(name="team_id")
private Long id;
private String name;
@OneToMany(mappedBy="team")
private List<Member> members- new ArrayList<Member>()
}
Team Entity의 코드만 이런 식으로 수정하면 됩니다.
- 객체의 양방향 관계
객체의 양방향 관계는 완전한 양방향 관계가 아닌 객체끼리의 단 방향 관계가 2개 매핑 된 것입니다. 위의 코드에서도 확인하실 수 있습니다. - 테이블의 양방향 관계
테이블은 외래 키 하나로 두 테이블의 연관관계를 관리하죠. 즉, 외래 키 하나로 서로 Join이 가능하다는 말 입니다. - 그럼 연관관계에서 외래키의 주인으로는 누구를 설정해야 할까요?!?!?!
- 양방향 매핑 규칙
- 객체의 두 관계중 하나를 연관관계의 주인으로 지정
- 연관관계의 주인이 외래 키를 관리
- 외래 키가 있는 곳을 연관관계의 주인 입니다.
- 외래키의 주인은 보통 연관관계 1:N에서 N쪽에 있는 객체를 주인으로 설정하거나 1:1상태라면 비즈니스 로직을 더 많이 활용하는 쪽을 주인으로 설정 해야 합니다.
외래키의 주인을 N쪽에 넣는 이유는 생각해보면 간단합니다. 위 처럼 Member와 Team의 관계에서 만약 1쪽인 Team에 외래 키가 있다고 생각하여 봅시다. 그럼 DB 테이블에 저장될 때 Team 테이블에서 외래 키인 Member_id만 다른 중복된 인스턴스들이 생기게 될 것입니다..
그리하여 외래 키의 주인은 N쪽 객체로 설정하여야 합니다!!
- 양방향 매핑 규칙
이상으로 포스팅을 마치겠습니다. 감사합니다:)
이 글은 인프런 김영한님의 '자바 ORM 표준 JPA 프로그래밍 - 기본편'을 수강하고 작성합니다.
출처:https://www.inflearn.com/course/ORM-JPA-Basic
Author And Source
이 문제에 관하여(연관관계 매핑 1), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@sungjin0757/JPA-연관관계-매핑-1저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)