스프링 공부/JPA

[JPA] 9. 객체지향에서 연관관계를 만들어야 하는 이유

장아장 2022. 11. 2. 10:16

이전에서도 이야기했듯이, 패러다임에 차이가 있다. 

테이블 외래키로 다른 테이블과 연관관계를 맺는다.
객체 참조를 통해 다른 테이블을 불러온다. 

이는 엄연한 차이가 존재하는데, 쉽게 생각해보면 테이블을 '길'을 만들고, 객체는 건물의 내부에 다른 건물이 존재하는 것 같다. 

 

테이블의 길을 따라 가면 다른 테이블로 갈 수 있다. 

하지만, 건물 안의 건물만 불러와 확인한다면, 그 외부의 건물을 불러올 수 없다. 

 

이를 위해, 객체에도 테이블과 같이 외래키와 비슷한 것을 넣어주어야 한다. 

@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;
}

이런식으로 만들어 사용한다고 생각을 해보자. 

 

테이블 내에서도 참조 대신 외래키를 넣었다. 테이블로써 생각해보면 아무 이상이 없다. 

하지만 정말 귀찮은 일을 하게 된다. 여기에서 주문을 한 멤버를 불러온다면?

  1. Order을 불러온다. 
  2. Order의 member_id를 불러온다. 
  3. 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과 같은 어노테이션들을 연관관계 매핑임을 명시해준다.

이러한 연관관계의 매핑에는 몇가지 알아야 할 사항들이 있다.  

  • 방향성
    • 단방향
    • 양방향
  • 연관관계의 주인
    • 주 테이블
    • 대상 테이블
  • 연관관계 매핑
    • 다대일
    • 일대다
    • 일대일
    • 다대다

이런 부분이 존재하는데, 이를 방향성, 연관관계의 주인, 연관관계 매핑의 종류별 설명으로 나누어 더 정리해야겠다.