연관관계 매핑

Ahn yi·2022년 10월 16일

jpa

목록 보기
4/7

연관관계 매핑

  • 객체의 참조와 테이블의 외래 키를 매핑한다.

연관관계의 필요성

  • 객체를 테이블에 맞추어 데이터 중심으로 모델링하면, 협력 관계를 만들 수 없다.
    • 테이블은 외래 키로 조인을 사용해서 연관된 테이블을 찾는다.
    • 객체는 참조를 사용해서 연관된 객체를 찾는다.
  • 객체간의 관계 및 조인에 필요한 Column을 지정해주면 참조할 수 있다. (@ManyToOne, @JoinColumn)

연관관계

  • 객체는 웬만하면 단방향 연관관계가 좋다.
  • 양방향 연관관계는 반대 방향으로도 객체 탐색이 가능하다.
  • 양방향 연관관계의 주인과 mappedBy
    • mappedBy : 객체와 테이블간에 연관관계를 맺는 차이
    • 테이블간의 연관관계는 외래키 하나로 가능하지만 객체는 각각의 데이터가 따로 존재해야 한다.
    • 객체간의 단방향 연관관계가 두 개일 경우 양방향 연관관계가 된다.
    • 외래키를 하나로 관리해야하기 때문에 연관관계의 주인을 정해야한다.

연관관계의 주인

  • 연관관계의 주인

    • 객체의 두 관계중 하나를 연관관계의 주인으로 지정한다.
    • 연관관계의 주인이 외래 키를 관리한다. (등록, 수정)
    • 주인이 아닌쪽은 조회만 가능하다.
    • 주인은 mappedBy 속성을 사용하지 않는다.
    • 주인이 아니면 mappedBy 속성으로 주인을 지정해줘야 한다.
    • 테이블 기준으로 외래키가 있는 곳을 주인으로 정하는게 좋다.
      • 반대일 경우 성능면으로 혹은 객체와 테이블간의 매핑이 애매모호하다. (외래키가 없는 객체의 데이터가 update 되면 실제로는 연관관계의 다른 테이블의 외래키 값이 update 된다)
    • 주로 N대1일 경우 N쪽을 주인으로 지정한다.
  • 주의점

    • 양방향 연관관계에 있는 양 쪽의 데이터에 모두 값을 넣어주어야 한다.
      • 1차 캐시 상태에서 양 쪽 값이 하나라도 없으면 조회가 되지 않아 에러가 발생할 수 있다.
      • 연관관계의 데이터를 둘 다 넣을 수 있는 메소드를 생성하면 좋다.
    • 무한 루프를 조심해야 한다.
      • toString(), lombok, JSON 생성 라이브러리 생성시 발생할 수 있다.
    • 단방향 매핑만으로도 이미 연관관계 매핑은 끝나며, 테이블에 영향을 주지 않으므로 단방향 매핑을 한 뒤에 양방향 매핑은 필요에 의해 추가해도 된다.
profile
소통을 잘하고싶은 백엔드 개발자

0개의 댓글