반응형

1:1, 1:N, N:M 관계란?

  • 두 엔티티가 서로 관계를 맺을 때, 1:1, 1:N, N:M 형태의 관계를 맺을 수 있음
  • 1:1 (일대일) 관계 : 국가-수도, 남편-아내 등과 같은 관계
    • 한 국가가 여러 수도를 가질 수 없고 한 도시는 여러 국가의 수도일 수 없음
  • 1:N (일대다) 관계 => 부모-자식, 학생-학교 등과 같은 관계
    • 한 부모는 여러 자식을 가질 수 있지만 자식은 여러 부모를 가질 수 없음
  • N:M (다대다) 관계 => 고객-상품, 학생-학원 등과 같은 관계
    • 한 고객은 여러 상품을 시킬 수 있고, 한 상품은 여러 고객에게 시켜질 수 있음

연관관계 매핑이란?

  • 객체의 참조와 테이블의 외래키를 매핑하는 것
  • ex) X팀에 선수 A, B, C가 속한 상황
    • Java에서의 관점
      • Team Class, Player Class 생성
      • Team에 List<Player> players 이런 식의 리스트 생성 후 Player A, B, C를 넣어주면 됨
      • 반대로 Player에서는 Team team 이런 식의 객체 생성 후 Team X를 넣어주면 됨
    • DB에서의 관점
      • 하지만 DB에서는 객체 자체를 넣을 수 없음
      • 따라서 이런 상황에서 DB에 값을 넣기 위해서 연관관계 주인과 방향, 다중성(1:1, 1:N, N:M)을 정해줘야 함
      • 위에서 가정한 상황에서는 Player Table에 team_id 라는 column을 만들어 Team X의 id를 넣는 방식 등을 사용할 수 있음

방향

  • 연관관계 매핑 시에는 아래와 같이 2가지 방향이 존재
    1. 단방향 매핑 : 하나의 Entity만 다른 Entity를 참조
    2. 양방향 매핑 : 두개의 Entity가 서로 참조
  • 방향은 객체 관계에서만 존재하고, 테이블은 항상 양방향
  • ex) X팀에 선수 A, B, C가 속한 상황
    • 이 상황에서 단방향 매핑을 한다면 Team X에 Player A, B, C를 넣어주거나 Player A, B, C에 각각 Team X를 넣어줌
    • 이 상황에서 양방향 매핑을 한다면 Team X에 Player A, B, C를 넣어주고 Player A, B, C에도 각각 Team X를 넣어줌
  • 양방향 매핑 시 Team -> Player 조회, Player -> Team 조회가 모두 가능하다는 장점이 있지만 더 많은 연관관계를 맺게 되어서 더 복잡해 질 수 있다는 단점도 존재

연관관계 주인

  • 양방향 연관관계로 매핑 시 연관관계 주인을 정해야 함
  • 연관관계를 맺는 두 객체 중 한 객체를 연관관계 주인으로 지정
  • 연관관계의 주인만이 외래키 관리 (등록, 수정)
    • 주인은 mappedBy 속성 사용 X
    • @JoinColumn을 통해 주인이 아닌 객체의 id를 FK로 받을 때 사용될 column명 지정
  • 주인이 아닌 쪽은 읽기만 가능
    • 주인이 아닌 쪽에서 mappedBy 속성 사용
  • 보통 연관관계 주인은 외래키가 있는 객체를 주인으로 지정
  • ex) X팀에 선수 A, B, C가 속한 상황
    • 이 상황에서 Team과 Player가 양방향 매핑을 했다고 가정
    • 연관관게 주인을 정해야 함
    • Team Table에 Player의 id들을 넣는 것 보다는 Player에 Team id를 넣어 주는것이 더 좋음 => Player Table에 team_id column 생성
    • 따라서 이 상황에서는 Player가 연관관계 주인이 됨

예제

반응형

↓ 클릭시 이동

복사했습니다!