Spring boot JPA 12/03

jjade·2025년 12월 3일

상속 관계 매핑 정리

기존 RDB 설계 방식의 문제

관계형 DB에서는 상속 개념이 없기 때문에, 공통된 속성이 있어도 테이블마다 반복해서 작성해야 한다.

기존 테이블 예시

상품번호(PK)이름가격저자출판사

상품번호(PK)이름가격사이즈색상브랜드

운동기구

상품번호(PK)이름가격무게사이즈브랜드

→ 공통 필드(상품번호, 이름, 가격)가 반복됨


슈퍼·서브 타입 모델링(ER 모델)

공통 속성을 부모(슈퍼) 테이블로 올리고 자식(서브)이 상속받는 구조

상품(슈퍼테이블)

상품번호(PK)이름가격상품타입
책 / 옷 / 운동기구를 구분

서브 테이블

  • 서브 테이블의 PK는 부모 테이블의 PK를 그대로 사용 → PK이자 FK

상품번호(PK, FK)저자출판사

상품번호(PK, FK)사이즈색상브랜드

운동기구

상품번호(PK, FK)무게사이즈브랜드

※ 이 구조는 논리적 모델이며, 실제 물리 구현은 전략에 따라 달라짐


JPA 상속 매핑 전략 3가지

1) 조인 전략(Joined)

  • 부모·자식 각각 테이블 생성
  • 자식 테이블은 부모 테이블의 PK를 받아 FK + PK로 사용
  • 조회 시 조인 연산이 자주 발생
  • 테이블 구조가 명확하여 정규화 관점에서 유리

2) 단일 테이블 전략(Single Table)

  • 하나의 테이블에 모든 엔티티 데이터를 저장
  • 공통 속성 외의 필드는 NULL 허용

상품(단일 테이블)

상품번호이름가격저자출판사사이즈색상브랜드무게상품타입
책/옷/운동기구 구분 칼럼 포함
  • 쿼리가 단순하지만, 불필요한 NULL 필드가 증가하여 공간 낭비

3) 구현 클래스마다 테이블 전략(Table Per Class)

  • 엔티티마다 테이블 생성
  • 일반적인 RDB 설계와 유사하지만
    중복 데이터가 많고 쿼리 비용이 높아 비추천

JPA 기본 Fetch 전략

연관관계기본 로딩 방식
@ManyToOne, @OneToOne즉시 로딩(EAGER)
@OneToMany, @ManyToMany지연 로딩(LAZY)

→ 특별히 항상 함께 조회되는 관계가 아니면 지연 로딩 권장


JPA 데이터 타입 종류

  1. 엔터티 타입

    • 식별자(PK)를 가지며 독립적으로 존재
  2. 임베디드 타입(복합 값 타입)

    • 개발자가 직접 정의한 타입
    • 예) 주소 정보
class Address {
    private String address;
    private String addressDetail;
    private String zipcode;
}

→ 엔터티에서 아래처럼 통합 표현 가능

private Address address;
  1. 컬렉션 값 타입
    • 값 타입을 컬렉션 형태로 보관하는 구조

핵심 정리

  • 기존 RDB는 상속 개념이 없어 중복된 설계를 피하기 어려움
  • JPA는 상속 매핑 전략을 통해 객체 모델과 DB 간 패러다임 차이를 해소
  • 사용 목적에 따라 상속 전략을 선택하면 설계 품질과 유지보수성이 향상됨
JPA 상속 매핑 = 객체지향 설계 + DB 물리 모델링 간 격차 해소
profile
끊임없는 에너지를 공유하는 핫스팟 같은 개발자 최준서입니다!

0개의 댓글