# JPA 양방향 연관관계
양방향 연관관계는 객체를 양 방향으로 연결해주는 것을 의미한다. 사용을 하는 이유는 한 쪽에서는 수정과 삭제가 가능하다면, 다른 한쪽에서는 단순히 참조만 하기 위해서 사용된다.
Order 와 Member는 Order가 n Member가 1인 연관관계를 갖는다.
이때 JPA에서는 양방향으로 연관시켜주기 위해 객체로 각 정보를 갖게 된다.
//Member Class
@Entity
public class Member {
@Id
@GeneratedValue()
@Column(name = "MEMBER_ID")
private Long id;
@OneToMany(mappedBy = "member")
private List<Order> orders = new ArrayList<>();
}
//Order Class
@Entity
public class Order {
@Id @GeneratedValue
@Column(name ="ORDER_ID")
private Long id;
@ManyToOne
@JoinColumn(name = "MEMBER_ID")
private Member member;
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Member가 1의 연관관계이므로 @OneToMany로 Order는 @ManyToOne이 된다.
이렇게 구현을 하여도 DB의 테이블에는 전혀 변화가 없다. 즉 Many쪽인 Order에 외래키가 존재한다.
# 연관관계 주인
양방향으로 연관관계를 구현하면, Member에서 변경되는 정보를 DB에 넣어줄지 Order에서 변경되는 정보를 DB에 넣어줄지가 애매하게 된다. 그 정보는 mappedBy를 사용해서 나타내게 된다. mappedBy를 가지고 있는 객체는 단순히 조회만 가능하다. 변경을 하게 되어도 DB에 영향을 끼치지 않는다.
연관관계의 주인은 되도록 외래키를 보유한 곳이 하는 것이 좋다.(성능적인 면이나 코드를 이해하는 부분에서)
# 연관관계 편의 메소드
연관관계 편의 메소드는 연관관계의 주인이 아닌 부분에서 데이터를 변경하거나 할 때 적용을 할 수 있도록 해주는 메소드이다. 혹은 로직을 처리함에 있어, 값이 변경되어야하는 경우 사용한다. 연관관계 편의 메소드를 양 방향에서 동시에 사용할 경우 무한루프에 빠질 수 있으므로 되도록 한곳에서 구현해주어야한다.
# 주의 사항
연관관계의 주인을 변경해야만 변경된다는 점을 알고 있어야한다.
단방향으로 연결을 하고 양방향 연결은 추후 필요하다고 판단되면 하도록 하자.