Be ready to study forever - 개발자 꿈나무

[JPA] 연관관계 매핑 기초 - 1 본문

Programming/JPA

[JPA] 연관관계 매핑 기초 - 1

루눌룹 2021. 1. 23. 16:42

연관관계 매핑

JPA 소개에서도 이야기 했지만,객체와 엔티티의 가장 큰 차이점 중 히나가 바로 연관관계이다. 객체는 단뱡향 연결을 양쪽에서 해야 양방향 연결 이지만, 엔티티는 외래키를 이용해서 양방향으로 엔티티 끼리 연결이 가능하다. 따라서, 객체를 양방향으로 연결 한다면, 객체의 주인을 정해 주어야 한다.

그림을 보면서 이해하자면 객체MemberTeam은 서로 참조해서 양방향으로 연결 되어 있다. 이경우에는 사실 Memeber객체에 Team필드를 setTeam()으로 설정한다 해도 Team객체에 List members 필드에는 반영되지 않는다. 반대로 Team객체에 membersmembers.add()한다해도 Memeber객체에 team필드가 업데이트 되지 않는다. 그러므로 연관관계 주인을 정해서 JPA에게 그쪽 업데이트만 DB에 반영하고 반대쪽은 조회만 가능하도록 해야한다.

 

그럼 연관관계 주인은 어떻게 정하지?

이것도 역시 어노테이션으로 표현한다. 연관관계를 나타내는 어노테이션은:

-      @JoinColumn

-      @ManyToOne

-      @OneToMany

-      @OneToOne

-      @ManyToMany

등이 있다.

@JoinColumn

@JoinColumn이 붙은 필드는 연관관계의 주인이 된다. , 해당 필드가 변경이 생기면 DB에도 반영이 된다. 그리고 name속성을 칼럼의 외래키 값을 직접 지정해 줄 수도 있다. 예를 들어

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

 

그렇다면 반대편인 Team객체에는 어떤 처리를 해주어야 하지?

@OneToMany(mappedBy = "team")
List members = new ArrayList();

에처럼 @OneToMany속성에 (mappedBy = “team”)을 넣어 연관관계의 주인인 Team에 의해 매핑된다는 것을 알려주어야 한다. mappedBy가 붙게 되면 조회만 가능하고 member.add()로 추가 하더라도 DB에는 반영되지 않는다.

**여기서 우리가 생각해 볼 점은, 누구를 주인으로 정하고 누구를 mappedBy시키냐는 것인데, 직관적으로 보면 @ManyToOne 쪽에서 가져가는 것이 바람직하고 직관적이다. 이유는 DB엔티티에는 Many쪽이 외래키를 가지고 참조를 하기 때문에 이쪽이 훨씬 직관적이고 보기 좋다.

다이아그램과 같이 DB에서 봤을 때는 @ManyToOneMember쪽에 외래키를 가지게 된다.

 

'Programming > JPA' 카테고리의 다른 글

[JPA] 고급 매핑 - 3  (0) 2021.01.23
[JPA] 다양한 연관관계 매핑-2  (0) 2021.01.23
[JPA] 영속성 컨텍스트란?  (0) 2021.01.23
[JPA]실행하기  (0) 2021.01.22
[JPA] JPA란?  (0) 2021.01.22
Comments