JPA 연관관계 매핑

최도혁·2023년 7월 25일
0

Spring

목록 보기
7/8

연관 관계 매핑

객체와 관계형 데이터베이스 테이블을 서로 매핑하는 것


연관관계를 매필할 때 생각해야 할 3가지

  • 방향 : 단방향, 양방향(객체 간의 참조)
  • 다중성 : 일대일, 일대다, 다대일, 다대다
  • 연관관계의 주인 : 양방향일 때 연관관계에서 관리의 주체가 되는 곳

단방향, 양방향

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

하지만 객체는 참조용 필드가 있는 객체만이 다른 객체를 참조하는 것이 가능하다.
따라서 두 객체 사이에 하나의 참조용 필드만을 가지고 참고하게 되면 단방향 관계이고, 두 객체 모두가 참조용 필드를 갖고 참조하면 양방향 관계가 된다.

이러한 단방향, 양방향의 선택은 정해져있는게 아니라 비즈니스 로직에 맞게 개발자가 선택해서 정해야한다.

  • member.getReservations() 처럼 예약목록에 대한 참조가 필요하면
    Member -> Reservation 단방향 참조

  • reservation.getMember() 처럼 예약자에 대한 참조가 필요하면
    Reservation -> Member 단방향 참조

이런식으로 필요한 참조마다 설계를 해주면 된다. 위에서 두개 다 필요하다면 양방향이 되고, 한 회원이 한 개 이상의 예약을 할 수 있다면 다대일 양방향이 되는 것이다.


양방향의 무분별한 사용 지양

모든 객체간의 관계를 양방향으로 하면 걱정이 없을거라 생각할 수 있다.
하지만 회원과 같은 다른 객체와 관계를 정말 많이 맺을 경우에는 해당 객체가 매우 복잡해지는 문제가 발생한다. 또한 다른 객체들도 복잡성이 증가한다.
따라서 관계가 필요하다면 처음에는 단방향으로 설계하고 정말 양방향이 필요하면 그때 양방향으로 설계하는 것이 좋겠다.


다중성

데이터베이스에서 테이블 간 관계를 기준으로 결정된다.

  • 회원 : 마이페이지(1:1)
  • 회원 : 예약(1:N)
  • 회원 : 팀(N:1)

연관관계 주인

연관관계의 주인은 양방향 관계일 때 누가 이 관계의 주인으로서 외래키를 가지고, 테이블을 INSERT, UPDATE 권한을 갖는 것이며, 이를 지정하는 것은 JPA에게 누가 주인인지 알려주는 용도이다.

이때 주인이 아닌 객체는 SELECT만 수행해야 하고, mappedBy 속성을 통해 상대편이 주인임을 지정해줘야 한다.

profile
백엔드 개발자 지망생

0개의 댓글