🏷️ DTYPE 컬럼

상속 매핑에서 사용하는 구분 컬럼 (Discriminator Column)

JPA에서는 엔티티 간에 상속 관계를 매핑할 수 있습니다. 그리고 이때 사용되는 특별한 컬럼이 바로 DTYPE입니다.
처음에는 생소할 수 있지만, 그 역할을 이해하면 굉장히 유용한 기능입니다.


1️⃣ DTYPE이란?

DTYPE은 JPA에서 상속 매핑 시, 어떤 하위 엔티티 타입인지 구분하기 위해 자동 생성되는 컬럼입니다.

쉽게 말해, 하나의 테이블에 여러 타입의 자식 엔티티 데이터를 함께 저장할 때, "이 레코드는 어떤 자식 클래스에 해당하는지 알려주는 표시"예요.

예를 들어:

@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
public abstract class Item {
    @Id @GeneratedValue
    private Long id;
    private String name;
}
@Entity
public class Book extends Item {
    private String author;
}
@Entity
public class Album extends Item {
    private String artist;
}

이렇게 상속 구조가 있을 때, JPA는 Item 테이블을 만들고, Book과 Album 데이터를 같은 테이블에 저장합니다.

이때 "이 데이터가 Book인지 Album인지 어떻게 구분할까?"
→ 그걸 위해 생기는 컬럼이 바로 DTYPE입니다.


2️⃣ 생성되는 테이블 예시

id name author artist DTYPE
1 자바의 정석 남궁성 null Book
2 힙합 앨범 null 박재범 Album
  • JPA가 자동으로 DTYPE 컬럼을 만들고, 해당 엔티티의 클래스 이름을 저장합니다.
  • 이 정보는 JPA가 조회할 때, 어떤 클래스로 데이터를 변환할지 결정하는 데 사용됩니다.

3️⃣ @DiscriminatorColumn으로 이름 변경 가능

기본적으로 DTYPE이라는 컬럼명이 생성되지만, 직접 이름을 지정할 수도 있어요.

@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "item_type")
public abstract class Item {
    ...
}

이렇게 하면 item_type이라는 이름으로 컬럼이 생성됩니다.


4️⃣ DTYPE이 사용되는 상속 전략

상속 전략 DTYPE 사용 여부 설명
SINGLE_TABLE (단일 테이블 전략) ✅ 사용함 모든 자식 엔티티를 한 테이블에 저장하므로 반드시 필요
JOINED (조인 전략) ✅ 사용함 테이블은 나뉘지만, 부모 테이블에 구분값이 필요함
TABLE_PER_CLASS (각자 테이블 전략) ❌ 사용 안 함 테이블이 완전히 분리되므로 필요 없음

 

5️⃣ 조회할 때 어떻게 쓰이나요?

Item item = entityManager.find(Item.class, 1L);
// DTYPE 컬럼이 Book이면 Book 객체로 자동 매핑됨
  • DTYPE 값이 Book이면 Book 객체로, Album이면 Album 객체로 자동 변환됩니다.
  • 즉, DTYPE은 JPA의 다형성 구현을 위한 핵심 키워드입니다.

✅ 요약

항목 내용
역할 상속 관계에서 실제 객체 타입을 구분하기 위한 컬럼
기본 컬럼명 DTYPE
커스터마이징 @DiscriminatorColumn(name = "구분값")
사용 전략 SINGLE_TABLE, JOINED 전략에서 사용됨
값의 의미 실제 저장된 자식 클래스 이름 (기본값)

 

✨ 마무리

JPA에서 DTYPE은 상속 매핑의 다형성 지원을 위한 중요한 컬럼입니다.

무심코 생성된 것처럼 보일 수 있지만, 실제로는 자식 엔티티를 구분하고 올바른 타입으로 조회하는 데 핵심적인 역할을 합니다.

실무에서 상속 매핑을 사용할 일이 있다면 꼭 알아두면 좋습니다.

 

 

+ Recent posts