본문 바로가기

TIL

[Spring][JPA][EntityMapping][JPA 연관 관계]

728x90

JPA에서 가장 중요한 것은 "객체와 관계형 데이터베이스 테이블이 어떻게 매핑되는지 이해하는 것"이다 엔티티 클래스 간의 관계를 만들어주는 것이 바로 연관 관계 매핑이다. 엔티티 간에 참조할 수 있는 객체의 수에 따라 일대다, 다대일, 다대다, 일대일의 연관 관계로 나눌 수 있다. 

연관 관계 정의 규칙 3가지

방향 : 단방향, 양방향 (객체 참조)

연관 관계의 주인 : 양방향, 연관 관계에서 관리 주체

다중성 : 일대다, 다대일, 다대다,일대일

 

 

단방향 연관 관계

Member가 Order를 참조할 수 있는 단방향 관계

Member 클래스가 Order 객체를 원소로 포함하고 있는 List 객체를 가지고 있으므로 Order를 참조할 수 있다. 따라서 Member는 Order의 정보를 알 수 있다. 하지만 Order 클래스는 member클래스에 대한 참조 값이 없으므로 Order입장에서는 Member정보를 알 수 없다.

 

Order가 Member를 참조할 수 있는 단방향 관계

Order 클래스가 Member 객체를 가지고 있으므로, Member클래스를 참조할 수 있다. 따라서 Order는 Member의 정보를 알 수 있다. 하지만 Member클래스는 Order클래스에 대한 참조값이 없으므로 Member입장에서는 Order정보를 알 수 없다. 이처럼 한쪽 클래스만 다른 쪽 클래스의 참조 정보를 가지고 있는 관계를 단방향 연관 관계라고 한다

데이터 베이스 테이블은 외래 키 하나로 양쪽 테이블 조인이 가능하다 따라서 데이터베이스는 단방향인지 양방향인지 나눌 필요가 없다.

그러나 객체는 참조용 필드가 있는 객체만 다른 객체를 참조하는 것이 가능하다. 그렇기 때문에 두 객체 사이에 하나의 객체만 참조용 필드를 갖고 참조하면 양방향 관계라고 한다.

 

양방향 연관 관계

Order와 Member가 서로 참조할 수 있는 양방향 관계

Member클래스가 Order 객체를 원소로 포함하고 있는 List객체를 가지고 있고, Member 클래스를 참조할 수 있다. 따라서 Order는 Member의 정보를 알 수 있다 그리고 Order 클래스 역시 Member 객체를 가지고 있으므로, Member 클래스를 참조할 수 있다.

결론적으로 두 클래스가 모두 서로의 객체를 참조할 수 있으므로, Member는 Order 정보를 알 수 있고, Order는 Member 정보를 알 수 있다. 이처럼 양쪽 클래스가 서로의 참조 정보를 가지고 있는 관계를 양방향 연관 관계라고 한다

JPA는 단방향 연관 관계와 양방향 연관 관계를 모두 지원하는 반면 Spring Data JDBC는 단방향 연관 관계만 지원한다.

 

일대 다 단방향 연관 관계

Member와 Order의 일대다 단방향 관계

일대다의 관계란 일에 해당하는 클래스가 다에 해당하는 객체를 참조할 수 있는 관계를 의미한다 한 명의 회원이 여러 건의 주문을 할 수 있으므로 Member와 Order는 일대다 관계이다 그리고 Member만 List를 참조할 수 있으므로 단방향 관계이다.

즉 일대다 단방향 연관 관계를 가지고 있다. 하지만 일대다 단방향 매핑은 잘 사용하지 않는다.

 

MEMBER 테이블과 ORDERS 테이블의 관계

Member 테이블과 Orders 테이블의 관계를 나타낸 다이어그램이다. 테이블 간의 관계에서는 일대다 중에서 '다'에 해당하는 테이블에서 '일'에 해당하는 테이블의 기본키를 외래 키로 가진다. 따라서 Orders 테이블이 Member테이블의 기본키인 Member_id를 외래키로 가진다.

위의 그림에서는 Oreder 클래스가 '테이블에 저장하더라도 외래 키에 해당하는 member클래스의 memberId값이 없는 채로 저장된다 이러한 문제 때문에 일대다 단방향 매핑은 잘 사용하지 않는다.

일대다 단방향 매핑 하나만 사용하는 경우는 드물고, 다대일 단방향 매핑을 먼저 한 후 필요한 경우 일대다 단방향 매핑을 추가해서 양방향 연관관계를 만드는 것이 일방적이다.

 

다대일 연관 관계

Order와 Member의 다대일 단방향 관계

다대일 관계란 '다'에 해당하는 클래스가 '일'에 해당하는 객체를 참조할 수 있는 관계를 의미한다. 그림과 같이 여러 건의 주문은 한 명의 회원에 속할 수 있으므로 Order와 Member는 다대일 관계이다 그리고 Order만 member객체를 참조할 수 있으므로 단방향 관계이다.

다대일 단방향 매핑은 Orders 테이블이 member 테이블의 member_Id를 외래 키로 가지듯이 Order클래스가 Member 객체를 외래 키처럼 가지고 있다.

즉, 다대일 단방향 매핑은 테이블 간의 관계처럼 자연스러운 매핑 방식이기 때문에 JPA의 엔티티 연관 관계 중에서 가장 기본으로 사용되는 매핑 방식이다. 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

728x90

'TIL' 카테고리의 다른 글

[Spring][Hamcrest]  (0) 2022.11.09
[Spring MVC][Testing]  (0) 2022.11.08
[Spring MVC][Transaction]  (0) 2022.11.04
[Spring MVC][DTO]  (0) 2022.11.03
[Java][Interface]  (1) 2022.11.02