연관관계 매핑

홍찬기
4 min readMay 13, 2021

JPA에서 연관관계 매핑을 할때에는 객체와 테이블의 연관관계의 차이를 생각해야 한다. 테이블은 외래키를 사용해서 다른 테이블과의 연관관계를 맺는다. 객체는 참조를 사용해서 객체들과의 연관관계를 맺는다.

단방향 연관관계

Member객체는 team필드를 사용해 Team객체와의 연관괸계를 갖는다.
Member -> Team으로의 관계는 설정되었으나 Team -> Member로의 관계는 설정되지 않았다. 이렇게 한쪽으로만 참조하는 관계를 단방향 연관관계라고 한다.

Member테이블은 team_id(외래키)를 통해 Team 테이블과 연관관계를 맺는다. Member -> Team 관계는 외래키를 사용해 Member를 사용해 Team에 접근할 수 있다. 이때 객체와 다른점은 Team도 JOIN문법을 사용해 Member에 접근할 수 있다는 것이다. Select * from Team join Member onMember.team_id = Team.id

객체의 참조를 통한 연관관계 매핑은 단방향이다. 객체간의 연관관계를 양방향으로 만들려면 반대편 객체에서도 관계를 맺어줘야 한다. 서로 양쪽에서 관계를맺어 참조를 하는것을 양방향 연관관계이다. 양방향 연관관계는 사실 서로 다른 방향의 단방향 연관관계를 맺는것이다.

테이블의 외래키를 사용해 양방향에서 접근할 수 있다.

@Entity
public class Member {

@Id @GeneratedValue
@Column(name = "member_id")
private Long id;

private String username;

@ManyToOne
@JoinColumn(name = "team_id")
private Team team;

}
@Entity
public class Order {

@Id @GeneratedValue
@Column(name = "team_id")
private Long id;

private String name;

양방향 연관관계

Member객체는 team필드를 사용해 Team객체와의 연관괸계를 갖는다.
Team객체는 members필드를 사용해 Member객체와 연관관계를 갖는다.
Member -> Team 관계를 갖고 Team -> Member 관계도 갖는다. 이렇게 서로 양쪽으로 참조하는 관계를 양방향 연관관계라고 한다.

@Entity
public class Member {

@Id @GeneratedValue
@Column(name = "member_id")
private Long id;

private String username;

@ManyToOne
@JoinColumn(name = "team_id")
private Team team;

}

@Entity
public class Team {

@Id @GeneratedValue
@Column(name = "team_id")
private Long id;

private String name;
@OneToMany(mappedBy = "member")
private List<Member> members = new ArrayList()<>
}

연관관계 주인

테이블은 외래 키 하나로 테이블의 연관관계를 관리한다. Member.team_id
객체에서는 각 객체마다 관계를 맺는 필드가 있다. 이때 두 관계중 하나를 연관관계의 주인으로 지정해줘야 한다. 연관관계의 주인만이 외래 키를 관리(등록, 수정)할 수 있다. 주인이 아닌 쪽은 읽기만 가능하다.

연관관계 주인은 mappedBy속성을 사용하지 않는다. 주인이 아닌쪽은 mappedBy속성으로 연관관계 주인 필드를 지정해줘야 한다.

연관관계 주인은 외래 키가 있는곳으로 주인으로 정해줘야 한다. 예시에서는 Member테이블에 team_id 외래키가 있으므로 Member.team이 연관관계 주인이다.

Reference

자바 ORM 표준 JPA 프로그래밍

--

--