연관관계가 필요한 이유
객체를 테이블에 맞추어 데이터 중심으로 모델링하면, 협력 관계를 만들 수 없다.
테이블은 외래 키로 조인을 사용해서 연관된 테이블을 찾지만 객체는 참조를 이용해서 연관된 객체를 찾기 때문에 테이블과 객체는 이러한 큰 차이가 있다.
용어 정리
방향(Direction)
다중성(Multiplicity)
연관관계 주인(Owner) : 객체 양방향 연관관계는 연관관계의 주인을 필수로 정해야한다.

먼저 회원과 팀의 관계를 이용해서 다대일 관계를 알아보면 회원은 하나의 팀에만 소속될 수 있으며, 이러한 관계는 회원과 팀이 다대일 관계입니다.
객체 연관관계
테이블 연관관계
select * from TEAM t JOIN MEMBER m ON t.tema_id = m.team_id
//둘 다 가능
select * from MEMBER m JOIN TEAM t ON m.team_id = t.tema_id;
@Entity
public class Member {
@Id @GeneratedValue
private Long id;
@Column(name = "USERNAME")
private String name;
private int age;
@ManyToOne //연관관계 매핑
@JoinColumn(name = "TEAM_ID") //join해야하는 컬럼명
private Team team;
}
Member 입장에서 자신은 Many이고, Team이 One이기 때문에 다대일 관계는 @ManyToOne으로 매핑한다.
앞서 말한 것과 같이 양방향 연관관계는 단반향이 2개 있는 것이다.
회원과 팀을 양방향 관계로 하고 싶다면?
Team 엔티티에도 참조용 필드를 추가해주어야한다.
회원엔티티는 단방향과 동일하게 그대로 작성해두고,
@Entity
public class Member {
@Id @GeneratedValue
private Long id;
@Column(name = "USERNAME")
private String name;
private int age;
@ManyToOne //연관관계 매핑
@JoinColumn(name = "TEAM_ID")
private Team team;
}
@Entity
public class Team {
@Id @GeneratedValue
private Long id;
private String name;
@OneToMany(mappedBy = "team") //연관관계 매핑
List<Member> members = new ArrayList<Member>();
}
일(1)인 Team에 @OneToMany를 추가해 준 것을 확인할 수 있다.
그리고 또한 연관관계의 주인을 mappedBy로 지정해준다.
mappedBy로 지정할 때 값은 대상이 되는 변수명을 따라 지정하면 된다.
객체와 테이블간에 연관관계를 맺는 차이를 이해하도록 하자.

객체 연관관계는 아래와 같이 2개이다.
테이블 연관관계는 아래와 같이 1개이다.
그럼 여기서 MEMBER의 team 값을 바꿀지, TEAM의 members의 값을 바꿀지 의문이 생긴다.
둘 중 하나를 정해서 외래 키를 관리해야하는 것이다.
답은 외래 키가 있는 곳을 주인으로 정해자!

//Member의 setTeam에 이런 식으로 편의 메서드를 생성하자
public void setTeam(Team team){
this.team = team;
team.getMember().add.(this);
}
setTeam()보단 changeTeam()으로 만들어서 작성하는 것도 괜찮다.
참고 : https://www.inflearn.com/course/ORM-JPA-Basic/dashboard 김영한 님의 JPA 프로그래밍 강의
https://book.naver.com/bookdb/book_detail.nhn?bid=9252528 자바 ORM 표준 JPA 프로그래밍
위의 책을 참고하고, 강의를 수강하면서 작성한 글입니다.
틀린 부분 등 다양한 피드백 환영합니다.