본문 바로가기
  • 개발공부 및 일상적인 내용을 작성하는 블로그 입니다.
JPA

다양한 연관관계 매핑 - 1

by 방구석 대학생 2020. 10. 3.

"인프런 - 자바 ORM 표준 JPA 프로그래밍 강의를 듣고 작성한 글 입니다."

www.inflearn.com/course/ORM-JPA-Basic#

 

자바 ORM 표준 JPA 프로그래밍 - 기본편 - 인프런

JPA를 처음 접하거나, 실무에서 JPA를 사용하지만 기본 이론이 부족하신 분들이 JPA의 기본 이론을 탄탄하게 학습해서 초보자도 실무에서 자신있게 JPA를 사용할 수 있습니다. 초급 웹 개발 프로그

www.inflearn.com

 

- 다대일 연관관계는 앞전에 연관관계 매핑 기초 강의를 통해 충분히 정리가 되었으므로 넘어가도록 하자.

 

- 다대일 연관관계의 반대 -> 일대다 연관관계 매핑(1 : N)

일대다(1 : N) 단방향 연관관계는 일(1) 이 연관관계의 주인이 된다. (권장하지는 않는 모델)

(예제의 경우를 들어보면 Team 클래스에서는 Member 클래스의 데이터를 알고 싶은데, Member 클래스는 Team 클래스의 데이터를 알 필요가 없는 경우에 해당한다.)

그런데 여기서 일대다 연관관계라고 해도 데이터베이스 테이블 입장에서 보았을 때, 항상 다(N) 쪽에 외래 키가 들어가야 한다.

즉, Team 클래스의 List 값이 바뀌었을 때, 도메인 클래스 이름과는 다른 테이블에 update query 를 날려줘야 한다는 것이다.

 

 

- 객체와 테이블의 차이로 인해 반대편 테이블의 외래 키를 관리하는 특이한 구조의 연관관계이다.

- @JoinColumn 어노테이션을 꼭 사용해야 한다, 그렇지 않으면 @JoinTable 어노테이션 방식을 사용하게 된다.(중간에 테이블을 하나 추가하게 됨)

아래는 일대다 연관관계 단방향 매핑시 작성할 수 있는 코드이다.

- Team.java

@OneToMany
@JoinColumn(name = "TEAM_ID") // Team 클래스 본인의 기본 키 값을 가져와서 매핑한다.(Member 테이블 입장에서는 외래 키로 적용된다.)
private List<Member> members = new ArrayList<>();

 

일대다 단방향 매핑의 문제점

- entity 가 관리하는 외래 키가 다른 테이블에 있다.

- 연관관계 관리를 위해 추가로 UPDATE SQL 을 실행해주어야 한다.

 

* 일대다 매핑 이후 왜 hibernate SQL 에서 update query 가 추가로 나가게 되는걸까?

-> 도메인과 이름이 다른 테이블의 데이터를 바꿔야 하기 때문에 Member 테이블에 update query 가 추가로 전달되게 된다.

 

 

일대다 양방향 매핑

: 읽기 전용 필드를 사용해서 양방향 처럼 사용하는 방법이다.

아래는 일대다 연관관계에서 양방향으로 매핑을 해줄 경우의 코드이다.

- Member.java

@ManyToOne
@JoinColumn(name = "TEAM_ID", insertable = false, updateable = false)
private Team team;

-> 양쪽 클래스 모두 연관관계의 주인이 되는 경우를 막기 위해 연관관계의 주인이 아닌 Member 클래스에서 JoinColumn 어노테이션의 insertable, updateable 속성값을 false 로 지정하여 해당 객체를 읽기 전용으로 선언해 주어야 한다.

 

 

- 일대다 연관관계의 진짜 심각한 문제점?

실무에서는 사용하는 테이블만 수십개가 되는데, 일대다 매핑 때문에 운영이 힘들어질 수 있다.

그래서 되도록이면 다대일 단방향 관계에서 필요하면 양방향을 추가하는 전략으로 연관관계를 설계해야 한다.

괜히 일대다 같은거 쓰지 말고 그냥 다대일 양방향 연관관계를 쓰자.

 

다음 글에서는 일대일 연관관계 매핑에 대해 알아보자.

'JPA' 카테고리의 다른 글

다양한 연관관계 매핑 - 3  (0) 2020.10.05
다양한 연관관계 매핑 - 2  (0) 2020.10.04
연관관계 매핑 기초 - 4  (0) 2020.09.28
연관관계 매핑 기초 - 3  (0) 2020.09.28
연관관계 매핑 기초 - 2  (0) 2020.09.28