Java Persistence API 다양한 연관관계

개붕이·2025년 1월 7일

JavaPersistenceAPI

목록 보기
5/6
post-thumbnail

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

  • 다중성
  • 단방향, 양방향
  • 연관관계의 주인

다중성

  • 다대일 (ManyToOne)
  • 일대다 (OneToMany)
  • 일대일 (OneToOne)
  • 다대다 (ManyToMany)

단방향, 양방향

  • 테이블
    • 방향 개념이 없음
    • FK 하나로 양쪽 조인이 가능함
  • 객체
    • 참조용 필드가 있는 쪽으로만 참조 가능
    • 한 쪽만 참조하면 단방향
    • 양쪽이 서로 단방향으로 참조하면 양방향

연관 관계의 주인

  • 테이블은 FK 하나로 두 테이블의 연관관계를 관리
  • 객체는 참조가 2가지 (양방향)
  • 외래키 관리를 맡을 객체를 선정해야함
  • 주인 : 외래키 관리, 반대 : 단순 조회

다대일 (N:1)

  • 단방향 : 가장 많이 사용됨, 반대는 일대 다
  • 양방향 : 외래키 있는 쪽이 주인, 양 쪽이 서로참조

일대다 (1:N)

  • 단방향 : 1이 연관 관계의 주인이 됨, N 쪽에 외래키 존재함, 객체와 테이블의 차이 때문에 반대편 테이블에서 키를 관리, @JoinColumn 사용, 그렇지 않으면 조인 테이블이 생성
    • 단점: 엔티티가 관리하는 외래키가 다른 테이블에 존재함, 연관관계 관리를 위해 추가로 update SQL 쿼리가 생성됨, 다대일 양방향 사용을 권장
  • 양방향 : 공식 스펙상 존재하지 않음, @JoinColumn(insertable=false, updatable=false) 사용, 읽기 전용 필드를 사용하여 양방향을 구현

일대일 (1:1)

주 테이블이나 대상 테이블에 외래키 선택이 가능함, 외래키에 UNI 제약 조건이 걸려있는 상태

  • 주 테이블 외래키
    • 단방향 : 다대일 단방향과 유사
    • 양방향 : 외래키 있는 쪽이 주인, 반대는 @MappedBy 사용
  • 대상 테이블 외래키
    • 단방향 : 지원 X
    • 양방향 : 매핑 방법이 주테이블 외래키 + 양방향의 정확히 반대

일대일 연관관계 정리

  • 주테이블 외래키
    • 주 객체가 대상 참조를 갖는 것처럼 주 테이블에 FK 를 두고 대상 테이블을 찾음
    • 객체 지향 개발자 선호
    • JPA 매핑이 편리함
    • 장점: 주 테이블만 조회해도 대상 테이블 데이터 확인이 가능
    • 단점: 값이 없으면 외래키에 NULL 을 허용하게 됨
  • 대상 테이블 외래키
    • 대상 테이블에 외래키가 존재함
    • 전통적 DB 개발자들이 선호
    • 장점: 주 테이블과 대상 테이블은 일대일 -> 일대다 로 변경 시 테이블 구조를 유지할 수 있음
    • 단점: 프록시 기능의 한계로 지연 설정에도 무조건 즉시로딩 하게 되어있음

다대다 (N:M)

RDB 는 구조 상 정규회된 테이블 2개로 다대다를 표현할 수가 없음

  • 연결 테이블을 추가해 일대다, 다대일로 풀어내야함
  • 객체는 컬렉션을 사용해서 다대다를 구현할 수 있음
  • @ManyToMany 사용, @JoinTable 로 연결 테이블 지정
  • 다대다 매핑 : 단방향, 양방향이 모두 가능함

다대다의 한계

  • 실무 사용 X
  • 연결 테이블은 단순 연결만 하고 끝나지 않음 (다른 데이터가 추가될 수 있음)

다대다 단점의 극복

  • 연결 테이블용 엔티티를 추가 ( 연결 테이블을 엔티티로 승격시킴 )
  • @ManyToMany -> @OneToMany, @ManyToOne 으로 변경

profile
based on the records

0개의 댓글