김영한의 ORM 표준 JPA 프로그래밍(기본편) - 다대일, 일대다, 일대일, 다대다

2025. 2. 5. 23:12·김영한의 ORM 표준 JPA 프로그래밍(기본편)

Question

  • 연관관계 맵핑할 때 주로 몇대몇 관계를 사용하는가?
  • 양방향 관계에서 연관관계의 주인은 어느 테이블이 가져가야 하는가
  • 다대다 관계는 어떻게 해결이 가능한가?

 

 

연관관계 맵핑시 고려해야할 점 3가지

  • 다중성
    • 다대일, 일대다, 일대일, 다대다
  • 단방향 양방향
    • 테이블은 외래키 하나로 양쪽 조인이 가능하며, 사실상 방향성이라는 개념이 없음
    • 객체는 참조용 필드가 있는 쪽으로만 참조 가능
  • 연관관계의 주인
    • 테이블은 외래 키 하나로 두 테이블의 관계를 맺어 주인이 따로 필요 없음
    • 객체는 양방향일 경우 A->B, B->A 처럼 참조가 2군데
    • 연관관계의 주인은 외래키를 관리하는 곳이 해야 함
    • 주인의 반대편은 외래키에 영향을 주지 않고 단순 조회만 가능

 

다대일 단방향

  • 가장 많이 사용하는 연관관계
  • 왠만하면 이 관계를 사용하는게 가장 깔끔하고 안전

 

다대일 양방향

  • 다대일 단방향으로 해결이 안될 때 추가로 사용 가능
  • 외래 키가 있는 쪽이 연관관계의 주인이 되어야 함

 

일대다 단방향

  • 다대일과 비슷해보이지만 실제로는 다름
  • 일대다 단방향은 일대다에서 "일"이 연관관계의 주인이 됨
  • 하지만, 테이블에서는 항상 "다"쪽에 외래키가 있음
  • 객체와 테이블 패러다임이 정확하게 일치할 수가 없기 때문에, 반대편 테이블의 외래 키를 관리해야 하는 특이한 구조가 생김
  • @JoinColumn을 꼭 사용해야 하며, 그렇지 않을 경우 조인 테이블 방식을 사용하게 됨(중간에 테이블 두는 구조)
  • 연관관계 정리를 위해 추가로 UPDATE SQL을 실행함
  • 구조가 복잡해 왠만하면 다대일을 사용해야 함

 

일대다 양방향

  • 공식적으론 존재하지 않는 방법
  • @JoinColumn(insertable=false, updatetable=false)
  • 읽기 전용 필드를 사용해 양방향처럼 사용하는 방법
  • 다대일 양방향을 사용하자

 

일대일 단방향

  • 주 테이블과 대상 테이블이 같은 관계라 둘 중 아무나 외래 키 선택 가능
  • 외래 키에 데이터베이스 유니크(UNI) 제약조건 추가(1:1이기 때문에)
  • 다대일 단방향 맵핑과 유사하게 동작

 

일대일 양방향

  • 다대일 양방향 맵핑처럼 외래키가 있는 곳이 연관관계의 주인
  • 반대편은 mappedBy 적용

 

다대다

  • 관계형 데이터베이스는 정규화된 테이블 2개로 다대다 관계를 표현할 수 없음
  • 연결 테이블을 추가해서 일대다, 다대일 관계로 풀어내야 함
  • @ManyToMany를 사용하면 자동으로 중간 테이블을 만들어서 다대다 관계처럼 만들어주지만 좋은 방법이 아니므로 사용하지 말 것
  • 결국 중간에 있는 테이블을 따로 만들어 주고, 다대일 관계 두 개를 만들어서 관리해야 함

'김영한의 ORM 표준 JPA 프로그래밍(기본편)' 카테고리의 다른 글

김영한의 ORM 표준 JPA 프로그래밍(기본편) - 프록시, 지연로딩, Cascade, 고아 객체  (1) 2025.02.07
김영한의 ORM 표준 JPA 프로그래밍(기본편) - 상속관계 맵핑과 - @MappedSuperclass  (1) 2025.02.06
김영한의 ORM 표준 JPA 프로그래밍(기본편) - 연관관계 단방향 맵핑, 양방향 맵핑  (1) 2025.02.05
김영한의 ORM 표준 JPA 프로그래밍(기본편) - 연관관계맵핑과 Primary Key  (2) 2025.02.05
김영한의 ORM 표준 JPA 프로그래밍(기본편) - 영속성 컨텍스트와 플러시  (2) 2025.02.05
'김영한의 ORM 표준 JPA 프로그래밍(기본편)' 카테고리의 다른 글
  • 김영한의 ORM 표준 JPA 프로그래밍(기본편) - 프록시, 지연로딩, Cascade, 고아 객체
  • 김영한의 ORM 표준 JPA 프로그래밍(기본편) - 상속관계 맵핑과 - @MappedSuperclass
  • 김영한의 ORM 표준 JPA 프로그래밍(기본편) - 연관관계 단방향 맵핑, 양방향 맵핑
  • 김영한의 ORM 표준 JPA 프로그래밍(기본편) - 연관관계맵핑과 Primary Key
5jyan5
5jyan5
  • 5jyan5
    jyan
    5jyan5
  • 전체
    오늘
    어제
    • 분류 전체보기 (242)
      • 김영한의 스프링 핵심 원리(기본편) (8)
      • 김영한의 스프링 핵심 원리 - 고급편 (11)
      • 김영한의 스프링 MVC 1편 (1)
      • 김영한의 스프링 DB 1편 (3)
      • 김영한의 스프링 MVC 2편 (3)
      • 김영한의 ORM 표준 JPA 프로그래밍(기본편) (9)
      • 김영한의 스프링 부트와 JPA 활용2 (2)
      • 김영한의 실전 자바 - 중급 1편 (1)
      • 김영한의 실전 자바 - 고급 1편 (9)
      • 김영한의 실전 자바 - 고급 2편 (9)
      • Readable Code: 읽기 좋은 코드를 작성.. (2)
      • 김영한의 실전 자바 - 고급 3편 (9)
      • CKA (118)
      • 개발 (37)
      • 경제 (4)
      • 리뷰 (1)
      • 정보 (2)
  • 블로그 메뉴

    • 링크

    • 공지사항

    • 인기 글

    • 태그

      자바
      JPQL
      조회 성능 최적화
      cglib
      hibernate5module
      고급
      프록시 팩토리
      log trace
      @discriminatorvalue
      WAS
      프록시
      단방향 맵핑
      양방향 맵핑
      reentarantlock
      페치 조인
      Thread
      typequery
      @args
      @within
      스레드
      Target
      @discriminatorcolumn
      requset scope
      락
      jpq
      버퍼
      김영한
      빈 후처리기
      jdk 동적 프록시
      gesingleresult
    • 최근 댓글

    • 최근 글

    • hELLO· Designed By정상우.v4.10.2
    5jyan5
    김영한의 ORM 표준 JPA 프로그래밍(기본편) - 다대일, 일대다, 일대일, 다대다
    상단으로

    티스토리툴바