이전에서도 이야기했듯이, 패러다임에 차이가 있다.
테이블 | 외래키로 다른 테이블과 연관관계를 맺는다. |
객체 | 참조를 통해 다른 테이블을 불러온다. |
이는 엄연한 차이가 존재하는데, 쉽게 생각해보면 테이블을 '길'을 만들고, 객체는 건물의 내부에 다른 건물이 존재하는 것 같다.
테이블의 길을 따라 가면 다른 테이블로 갈 수 있다.
하지만, 건물 안의 건물만 불러와 확인한다면, 그 외부의 건물을 불러올 수 없다.
이를 위해, 객체에도 테이블과 같이 외래키와 비슷한 것을 넣어주어야 한다.
@Entity
@Table(name = "ORDERS")
public class Order {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "ORDERS_ID")
private Long id;
@Column(name = "MEMBER_ID")
private Long member_id;
}
이런식으로 만들어 사용한다고 생각을 해보자.
테이블 내에서도 참조 대신 외래키를 넣었다. 테이블로써 생각해보면 아무 이상이 없다.
하지만 정말 귀찮은 일을 하게 된다. 여기에서 주문을 한 멤버를 불러온다면?
- Order을 불러온다.
- Order의 member_id를 불러온다.
- Member중 member_id를 가지는 객체를 불러온다.
자바 객체의 특성인 참조를 사용한다면, 불러온 객체 내부에 존재하기에 아무 문제가 없다.
하지만 테이블로 생각하면 이렇게 해야한다. 이를 위한 매핑이 필요하다.
@Entity
@Table(name = "ORDERS")
public class Order {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "ORDERS_ID")
private Long id;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "MEMBER_ID")
@OnDelete(action = OnDeleteAction.CASCADE)
private Member member;
}
이런식으로 객체 자체를 집어넣고, 이를 @JoinColumn과 같은 어노테이션들을 연관관계 매핑임을 명시해준다.
이러한 연관관계의 매핑에는 몇가지 알아야 할 사항들이 있다.
- 방향성
- 단방향
- 양방향
- 연관관계의 주인
- 주 테이블
- 대상 테이블
- 연관관계 매핑
- 다대일
- 일대다
- 일대일
- 다대다
이런 부분이 존재하는데, 이를 방향성, 연관관계의 주인, 연관관계 매핑의 종류별 설명으로 나누어 더 정리해야겠다.
'스프링 공부 > JPA' 카테고리의 다른 글
[JPA] 11. 다대일, 반대로 말하면 일대다 (0) | 2022.11.03 |
---|---|
[JPA] 10. 연관관계 매핑의 방향성, 그리고 주인 (0) | 2022.11.02 |
[JPA] 8. 데이터베이스 스키마 자동생성 (0) | 2022.10.20 |
[JPA] 7. 필드와 컬럼 매핑 (0) | 2022.10.20 |
[JPA] 6. 기본키 매핑 (0) | 2022.10.20 |