다양한 연관관계 매핑

Ahn yi·2022년 10월 17일

jpa

목록 보기
5/7

연관관계

  • 연관관계의 특징
    • 다중성

      • 다대일 [N:1] - @ManyToOne
      • 일대다 [1:N] - @OneToMany
      • 일대일 [1:1] - @OneToOne
      • 다대다 [N:M] - @ManyToMay (실무에서 거의 사용하지 않음)
    • 단방향/양방향

      • 테이블은 외래키 하나로 조인이 가능하여 방향 개념이 없다.
      • 객체는 참조용 필드가 있는 쪽으로만 참조가 가능하여 단방향, 양방향으로 구분지을 수 있다.
    • 연관관계의 주인

      • 객체 방향의 관계는 참조가 두 군데 존재하여 외래키를 관리할 곳을 지정해야 한다.
      • 연관관계의 주인 : 외래키를 관리하는 객체

다대일 [N:1] - @ManyToOne

  • 가장 많이 사용하는 연관관계
  • '다'의 객체쪽에 외래키가 가야한다.
  • '다대일'의 반대는 '일대다'이다.

일대다 [1:N] - @OneToMany

  • 권장하지 않는 방법
  • '일'이 연관관계의 주인이다.
  • 객체와 테이블의 차이 때문에 반대편 테이블의 외래 키를 관리하는 구조이다. (비추천의 이유)
  • @JoinColumn 필수, 그렇지 않으면 중간에 조인 테이블을 하나 추가하여 사용해야 한다.
  • 단점
    • 엔티티가 관리하는 외래키가 다른 테이블에 있다.
    • 연관관계 관리를 위해 추가로 UPDATE 쿼리를 실행해야 한다.
  • 읽기 전용 필드를 사용해서 양방향처럼 사용할 수 있다.

일대일 [1:1] - @OneToOne

  • 외래키 선택에 자유가 있다.
  • 다대일(@ManyToOne) 단방향 매핑과 유사하다.
  • 다대일 양방향 매핑처럼 외래키가 있는 곳이 연관관계의 주인이며, 반대편은 mapperBy를 적용해줘야 한다.
  • JPA에서는 대상 테이블에 단방향 관계는 지원하지 않으며, 양방향 관계만 지원한다.
  • 주 테이블에 외래키 지정
    • JPA매핑이 편리하다.
    • 주 테이블만 조회해도 대상 테이블에 데이터 유무 확인이 가능하다.
    • 값이 없으면 외래키에 null이 허용된다.
  • 대상 테이블에 외래키 지정
    • 주 테이블과 대상 테이블을 일대일에서 일대다 관계로 변경할 때 테이블 구조가 유지된다.
    • 프록시 기능의 한계로 지연 로딩으로 설정해도 항상 즉시 로딩된다.

다대다 [N:M] - @ManyToMany

  • 관계형 데이터베이스는 정규화된 테이블 2개로 다대다 관계를 표현할 수 없다.
  • 테이블 하나를 추가하여 일대다, 다대일 관계로 풀어야한다.
  • 실무에서는 사용하지 않는다.
profile
소통을 잘하고싶은 백엔드 개발자

0개의 댓글