개발 일기

[섹션 6] 다양한 연관관계 매핑 본문

Back-End/자바 ORM 표준 JPA 프로그래밍

[섹션 6] 다양한 연관관계 매핑

개발 일기장 주인 2024. 4. 1. 22:36

연관관계 매핑시 고려사항 3가지 

모두 앞서 다룬 내용들이다. 그래도 한번 정리해보자면,

  1. 다중성
    다대일(@ManyToOne), 일대다(@OneToMany), 일대일(@OneToOne), 다대다(@ManyToMany)
  2. 단방향, 양방향
    테이블은 외래 키 하나로 양쪽 조인이 가능하여 방향이라는 개념이 없지만 객체는 참조용 필드가 있는 쪽으로만 참조 가능하다. 그래서 한쪽만 참조하면 단방향 양쪽으로 서로 참조하면 양방향이다.
  3. 연관관계의 주인
    객체 양방향 관계는 참조가 2군데 있어서 둘 중 테이블의 외래키를 관리할 곳을 지정해야하는데 이때 연관관계의 주인은 외래 키를 관리(등록 및 조회 등)하는 참조가 되고 주인의 반대편은 외래 키에 영향을 주지 않고 단순 조회만 가능하다.

다대일 [N:1]

다대일 단방향

 

앞서 다뤘던 것들로
다대일의 반대가 일대다 이다.

 

 

 

 

 

다대일 양방향

 

외래키가 있는 곳이 연관관계의 주인

양쪽이 서로 참조 되도록 개발.

 

 

 

 

!! 일대다를 쓰지 말고 다대일 단/양방향 매핑을 사용하자 !!

일대일 [1:1]

@OneToOne

일대일 관계는 그 반대도 일대일이다.

주 테이블이나 대상 테이블 중에 외래 키 선택 가능하다. 즉, 어디에다가 둬도 상관 없다는 뜻이다.

이때, 외래 키에 데이터베이스 유니크(UNI) 제약조건 추가되어야 한다.

 

아래에 회원이 하나의 Locker(사물함)을 가질때를 회원 한명 당 하나의 사물함을 가진다고 가정하는 예시이다.

주 테이블에 외래 키

주 테이블에 FK 단방향

다대일 단방향 매핑과 유사하며 member 테이블에 locker_id인 FK를 들고있으며 이때 UNIQUE 제약조건을 통해 일대일 대응을 이룰 수 있다.

 

 

 

 

 

 

 

주 테이블에 FK 양방향

다대일 양방향 매핑과 같이 외래 키가 있는 곳이 연관관계의 주인이 되고 그 반대편에 mappedBy를 적용해 준다.

 

 

 

 

 

 

 

대상 테이블에 외래 키

대상 테이블에 FK 단방향

 

단방향 관계는 JPA 지원X

 

 

 

 

 

 

 

 

대상 테이블에 FK 양방향

사실 일대일 주 테이블에 외래 키 양방향과 매핑 방법은 같음

 

 

 

 

 

 

 

 

일대일 관계에서 FK를 맴버, 락커 중 누가 들고 있는게 나을까?
당연히 무조건적인 정답은 없다.
만약 당장에는 일대일이지만 시간이 흘러 한사람이 2개 이상의 락커를 들고 있을 수 있다고 요구사항이 변경될 수 있는데 이 경우 locker 테이블에서 FK를 관리하는게 유리하지만
당장에 성능을 따지면 맴버에서 FK를 관리하는 것이 유리하다. 왜냐하면 웬만한 비즈니스 로직에서 멤버를 조회하는 경우가 대부분이기 때문에 맴버 조회하면 쿼리 한방으로 락커에 대한 정보까지 끌어올 수 있기 때문에 유리한 것이다.

위와 같이 각각에 Trade-Off가 존재한다.
그래서 영한님은 너무 먼 미래를 생각하지않고 당장의 성능을 우선 시 한다고 한다.

다대다 [N:M]

객체는 컬렉션을 사용해서 객체 2개로 다대다 관계가능

관계형 데이터베이스는 정규화된 테이블 2개로 다대다 관계를 표현할 수 없다.
연결 테이블을 추가해서 일대다, 다대일 관계로 풀어내야함

  • 단방향으로 하려면 한쪽에서 @ManyToMany 사용하고 @JoinTable로 연결 테이블을 지정하여 다대다를 이룰 수 있다. 양방향으로 하려면 반대쪽에도 똑같이 해주면 된다.
  • 이러한 방법은 편리해보이지만 실무에서는 사용하지 않는다. 단순히 연결이 문제가 아니라 주문시간, 수량 같은 데이터가 들어올 수 있다.
  • 그렇기 때문에 연결 테이블용 엔티티 추가(연결 테이블을 엔티티로 승격)
  • @ManyToMany -> @OneToMany, @ManyToOne

 

실전

(좌) 엔티티, (우) ERD