연관 관계 Mapping

개발하는 도비·2023년 4월 28일

JPA

목록 보기
5/13
post-thumbnail

연관관계 필요성

  • table은 외래 키로 join을 사용해서 연관된 테이블을 찾음
  • 객체는 참조를 통해 연관된 객체를 찾음.

양방향 연관관계와 연관관계의 주인

  • table은 단방향이랑 다르지 않음. 외래키를 사용하기에 사실상 방향이란 개념이 없음.

객체와 테이블의 관계를 맺는 차이

  • 객체 연관관계(회원, 팀 예제)
    • 회원 -> 팀 연관 관계(단방향)
    • 팀 -> 회원 연관 관계(단방향)
    • 사실상 양방향이라기 보다는 단반향 두개
  • 테이블 연관관계
    • 회원 <-> 팀 연관관계 (양방향)

연관관계의 주인(Owner)

  • 위의 문제를 해결하기 위해 양방향 중 하나를 주인으로 지정
    • 주인
      • 외래 키 관리(등록, 수정)
    • 주인 X
      • 읽기
      • mappedBy 사용해 주인 지정

설계시 주의

  • 단방형으로만 설계하는 것으로 연관관계는 완료. -> 양방향은 반대방향으로 조회할 일이 생길 때 추가된 것임.
  • 따라서 단방향 설계 -> 참조가 필요할 때마다 양방향 추가.

다양한 연관관계 mapping

  • mapping 시 고려사항
    • 다중성 (다대일, 일대다, 일대일, 다대다)
    • 단방향, 양방향
    • 연관관계 주인

다대일 [N:1]

  • 단방향
    • 다대일 반대는 일대다
    • 다(N)쪽에 외래키가 있음.
  • 양방향
    • 외래키가 있는 곳이 주인 -> 다(N)이 주인

일대다 [1:N]

  • 단방향
    • 일(1)이 연관관계 주인
    • table에서는 다(N)에 외래키가 있음. -> 패러다임 차이로 발생
    • @JoinColumn 필수
      • 안 쓸 경우 중간에 테이블 생김.
    • 단점
      • entity가 관리하는 외래 키가 다른 테이블에 있음
      • 다대일 양방향 매핑을 사용을 권장.
  • 양방향
    • 공식적인 방법은 X
    • @JoinColumn(insertable=false, updatable=false)
      • insert과 update를 막아 읽기 전용으로 강제로 만듬.

일대일 [1:1]

  • 주 테이블이나 대상 테이블 중에 외래 키 선택 가능
  • 주 테이블 외래키
    • 단방향
      • 다대일(@ManyToOne) 단방향과 유사(코드적으로)
    • 양방향
      • 다대일 양방향처럼 외래 키가 있는 곳이 연관관계의 주인
      • 반대편은 mappedBy 적용
  • 대상 테이블에 외래 키
    • 단방향
      • JPA 지원X
    • 양방향
      • 사실상 주 테이블과 같음.

다대다 [N:M]

  • 객체는 다대다 가능, 관계형 데이터베이스의 정규화된 테이블 다대다 불가능
  • 연결 테이블을 추가해서 일대다, 다대일 관계로 풀어내야함
  • @JoinTable로 연결 테이블 지정
  • 실무에서 사용 X
  • 다대다 한계 극복
    • 연결 테이블 -> entity

상속관계 mapping

  • 관계형 데이터베이스는 상속관계 X
  • 슈퍼타입 서비타입 관계 모델링 기법이 유사한 함
  • 상속 mapping = 슈퍼타입 서브타입 mapping

조인 전략

  • 개념
    • entity 각각을 테이블로 만들고 자식 테이블이 부모 테이블의 기본 키를 받아 기본 키 + 외래 키로 사용하는 전략
    • 자식 테이블 중 어느 테이블을 조회해야하는지 구분하기 위해 DTYPE이란 구분 컬럼을 사용한다
  • @Inheritance(strategy=InheritanceType.JOINED)
  • 정석적인 방법
  • 장점
    • 테이블 정규화
    • 외래 키 참조 무결성 제약조건 활용가능
    • 저장공간 효율화
  • 단점
    • 조회시 조인을 많이 사용 -> 성능저하
    • 조회 쿼리가 복잡함
    • 데이터 저장시 INSERT SQL 2번 호출

단일 테이블 전략

  • 개념
    • 하나의 table에 구분 컬럼(DTYPE)을 활용해 데이터를 활용하는 전략
  • @Inheritance(strategy=InheritanceType.SINGLE_TABLE)
  • 장점
    • 조인이 필요 X -> 조회 성능이 빠름
      • pk만 넣으면 됨.
    • 조회 쿼리가 단순함
  • 단점
    • 자식 entity가 매핑한 컬럼은 모두 null 허용
    • 단일 테이블에 모든것을 저장 -> 테이블이 커짐 -> 조회 성능이 느려질 수 있음.

구현 클래스마다 테이블 전략

  • 개념
    • 구현 entity를 모두 테이블로 만듬.
    • 쓰면 안 되는 전력
  • @Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)
  • 장점
    • 서브 타입을 명확하게 구분해서 처리할 때 효과적
    • not null 제약조건 사용 가능
  • 단점
    • 여러 자식 테이블을 함께 조회할 때 성능이 느림(UNION SQL 필요)
    • 자식 테이블을 통합해서 쿼리하기 어려움

@MappedSuperclass

  • 공통 mapping 정보가 필요할 때 사용 -> 공통적인 컬럼이 정보
  • 특징
    • 상속관계 매핑X
    • entity X, 테이블과 mapping X -> 테이블이 생기지 않음.
    • 부모 클래스를 상속 받는 자식 클래스에 mapping 정보만 제공
    • 조회, 검색 불가
    • 추상 클래스 권장
    • @Entity, @MappedSuperclass가 있어야 상속 가능

참조

  • 인프런 : 자바 ORM 표준 JPA 프로그래밍 - 기본편
  • 링크
profile
도비의 양말을 찾아서

0개의 댓글