[JPA] @Inhertance 조인 전략 / 상속관계 매핑

2022. 7. 30. 13:44·💻 개발/JPA, Querydsl
728x90
반응형

JPA 테이블 논리형과 물리형을 공부하던 중 싱글 테이블 전략과 조인 테이블 전략에 대한 내용을 실무에서 접한 적이 있어 정리하게 되었다.

팀원들과 커피챗을 하던 중 다른 부서에서 개발 중인 페이지에 대한 DB를 전달받은 적이 있는데 "팀장님이 뭐 이리 테이블 수를 많이 생성했지?" 라며 의문을 재기했던 적이 있다. 그 당시 나는 뭐... 필요하니까 만든 거 아닐까..? 라며 대수롭지 않게 넘겼는데 김영한 강사님의 스프링 상속관계 매핑 영상을 보며 싱글 테이블 전략과 조인 테이블 전략이 그 당시 내가 궁금했던 내용에 대한 내용이라고 생각이 들어 정리해보았다.

우리 부서는 싱글테이블 전략을 활용하여 테이블 수를 줄이고 백업 테이블 or log 테이블을 이용하고
타 부서는 싱글테이블이 아닌 조인 테이블을 활용하여 더 많은 테이블이 생성되었다... 고 추측해본다.

 

 

1. 상속관계 매핑


논리 모델을 실제 물리모델로 구현하는 방법

 

상속관계 매핑에서 다루는 3가지 전략이다.

[조인 전략]

각각 테이블로 변환

[단일 테이블 전략]

통합 테이블로 변환

[서브타입 테이블로 변환]

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

 

 

2. 상속관계 매핑으로 사용되는 주요 어노테이션


[@Inheritance(strategy = InheritanceType.JOINED)]

조인 전략

[@Inheritance(strategy = InheritanceType.SINGLE_TABLE)]

단일 테이블 전략

[@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)]

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

 

 

2-1. 조인 전략


[조인 전략 장단점]

장점

테이블 정규화 

외래 키 참조 무결성 제약조건 활용 가능

저장공간 효율화

 

단점

조회 시 조인을 많이 사용 

성능 저하

조회 쿼리 복잡

데이터 저장 시  INSERT SQL 2번 호출

 

2-2. 단일 테이블 전략


[단일 테이블 전력의 장단점]

장점

조인이 필요 없으므로 일반적으로 조회 성능이 빠름

조회 쿼리가 단순함

 

단점

자식 엔티티가 매핑한 칼럼은 모두가 null 허용

단일 테이블에 모든 걸 저장 -> 테이블이 커질 수 있음 

상황에 따라 조회 성능이 오히려 감소할 수 있음

 

 

2-3. 구현 클래스마다 테이블 전략


해당 전략은 데이터베이스 설계자와 ORM 전문가 둘 다 추천하지 않은 전략이다.

[구현 클래스마다 테이블의  장단점]

장점 

서브 타입을 명확하게 구분해서 처리할 때 효과적

not null 제약조건 사용 가능

단점

여러 자식 테이블을 함께 조회할 때 성능이 느림 (UNIQUE SQL 필요)

자식 테이블을 통합해서 쿼리 하기 어려움

 

 

위 글은 김영한 강사님의 JPA 강의를 보고 작성되었습니다.

 

 

잘못된 내용이 있거나 피드백은 댓글로 부탁드립니다.  감사합니다.

728x90
반응형
저작자표시 비영리 변경금지 (새창열림)

'💻 개발 > JPA, Querydsl' 카테고리의 다른 글

[JPA] JPA의 OSIV란? OSIV 적용예제, OSIV 성능최적화 방법  (0) 2022.08.29
[Querydsl] 연관관계가 없는 테이블 연결 하기 / 연관관계 없는 엔티티 외부조인  (0) 2022.08.16
[JPA] 양방향 연관관계 주인 @ManyToOne / @OneToMany / MappedBy 선언위치  (0) 2022.07.11
[JPA] @Entity란? / @Entity주의사항 / 리플랙션  (0) 2022.07.10
[JPA] 영속성 컨텍스트 | JPA 내부에서 어떻게 동작하는가?  (0) 2022.07.09
'💻 개발/JPA, Querydsl' 카테고리의 다른 글
  • [JPA] JPA의 OSIV란? OSIV 적용예제, OSIV 성능최적화 방법
  • [Querydsl] 연관관계가 없는 테이블 연결 하기 / 연관관계 없는 엔티티 외부조인
  • [JPA] 양방향 연관관계 주인 @ManyToOne / @OneToMany / MappedBy 선언위치
  • [JPA] @Entity란? / @Entity주의사항 / 리플랙션
foodev
foodev
이것저것 개발과 이것저것 리뷰 합니다.
    반응형
    250x250
  • foodev
    개발 개맛집
    foodev
  • 전체
    오늘
    어제
    • 분류 전체보기 (109)
      • 🌟🙇🏻‍♂️ 꼭 읽어봤으면 하는 글 (4)
      • 💻 개발 (72)
        • 설정 및 세팅 (4)
        • DB&서버&네트워크&암호 (11)
        • React (0)
        • JPA, Querydsl (13)
        • 알고리즘 (7)
        • 언어 (15)
        • 프레임워크 (12)
        • HTML, CSS (10)
      • ✍🏻 (33)
        • 회고록 (15)
        • 독서록 (7)
        • 일지록 (10)
        • 세미나 (1)
      • 💡 리뷰 (0)
        • 제품리뷰 (0)
  • 블로그 메뉴

    • 홈
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    스냅샷방식
    di의존성
    githubaction 라벨 배포
    azure ci/cd
    githubaction 라벨 ci/cd
    스냅샷과 히스토리
    db 날림
    해피해킹 키매핑
    스냅샷과로그성
    nestjs pipe
    typedi 동작원리
    디비스냅샷
    창업패키지후기
    di동작원리
    해피해킹 커스텀
    QueryDSL
    typedi란
    해피해킹 꿀팁
    토이프로젝트개발일지
    nestjs pipe body
    해피해킹 카라비너
    서이추
    해피해킹 방향키
    JPA
    di란
    db 초기화
    스냅샷과히스토리성 차이
    db 날린 썰
    개발썰
    validation failed (numeric string is expected)
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
foodev
[JPA] @Inhertance 조인 전략 / 상속관계 매핑
상단으로

티스토리툴바