JPA에서 상속관계 매핑 방법에 대해 설명한 자료입니다.
RDB는 객체지향처럼 상속이 존재하지 않으며 대신 Super Type, Sub Type 이라는 개념이 존재한다. 슈퍼/서브 타입 논리모델을 물리적인 테이블로 변환할 때는 하나의 통합된 테이블로 표시(단일 테이블 전략)하거나, 각각 테이블로 별도로 두어 조회할 때 조인을 이용하거나 서브타입만 테이블로 변환을 하는 방법이 있다.
2. JPA 상속관계 매핑
RDB는 객체지향처럼 상속이 존재하지 않으며 대신 Super Type, Sub Type 이라는 개
념이 존재한다.
슈퍼/서브 타입 논리모델을 물리적인 테이블로 변환할 때는 하나의 통합된 테이블로
표시(단일 테이블 전략)하거나, 각각 테이블로 별도로 두어 조회할 때 조인을 이용하
거나 서브타입만 테이블로 변환을 하는 방법이 있다.
3. 별도 테이블 조인 전략
(INHERITANCETYPE.JOINED)
엔티티를 각각 테이블로 만들고 부모/자식 관계를 이용하여 표현하며 부모 쪽에 자식들의 타
입을 구분하는 칼럼(emptype)이 추가 되어야 한다. 테이블이 정규화의 원칙으로 편성되며 외
래키 관계를 사용할 수 있는 방법이며 조회시 테이블 조인을 해야하므로 복잡해지고 Insert
쿼리는 두번 실행되는 단점이 있는 방법이다.
@Entity
@Table(name=“EMP")
@Inheritance(strategy=InheritanceType.JOINED)
//EMPTYPE이라는 칼럼에 Programmer는 ‘P’, Designer는
‘D’라는 값이 입력된다.
@DiscriminatorColumn(name=“EMPTYPE",
discriminatorType=STRING, length=1)
public abstract class Emp {}
@Entity
@Table(name=“PROGRAMMER")
@DiscriminatorValue(value=“P”)
@PrimaryKeyJoinColumn(name=“EMPNO")
public class Programmer extends Emp { … }
@Entity
@Table(name=“DESIGNER")
@DiscriminatorValue(value=“D")
@PrimaryKeyJoinColumn(name=“EM
PNO")
public class Designer extends Emp
{ }
4. 단일 테이블 전략
(INHERITANCETYPE.SINGLE_TABLE)
상속 계층의 모든 테이블을 한 테이블로 통합, 구분칼럼(Discriminator Column)으로 객체를 구별하므
로 구분칼럼이 반드시 필요하다.
조인이 필요 없으므로 일반적으로 빠르지만 자식 칼러들이 NULL을 허용해야 하며 칼럼들이 널 값을
많이 가질 수 있다.
@DiscriminatorColumn를 반드시 설정해야 하고 @DiscriminatorValue를 지정하지 않으면 엔티티 이
름을 사용한다.
단일 테이블에 모든 것을 저장하므로 테이블이 커질 수 있지만 조회 쿼리는 간단해 진다.
@Entity
@Table(name=“EMPS")
@Inheritance(strategy=InheritanceType.SINGLE_
TABLE)
@DiscriminatorColumn(name= “ EMPTYPE",
discriminatorType=DiscriminatorType.STRING,
length=1)
public abstract class Emp { }
@Entity
@DiscriminatorValue(value=“P")
public class Programmer extends
Emp { }
@Entity
@DiscriminatorValue(value=“D")
public class Designer extends Emp { }
5. 구현 클래스마다 테이블 전략
(INHERITANCETYPE.TABLE_PER_CLASS)
자식 엔티티(PROGRAMMER, DESIGNER)들을 테이블로 만드는 방법.
@Entity
@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)
public abstract class Emp { }
@Entity
@Table(name=“PROGRAMMER")
public class Programmer extends Emp { }
@Entity
@Table(name=“DESIGNER")
public class Designer extends Emp { }
6. 구현 클래스마다 테이블 전략
(INHERITANCETYPE.TABLE_PER_CLASS)
부모 클래스는 @Entity로 매핑하지 않고 자식 클래스에서 매핑 정보만 제공
하려면 @MappedSuperclass를 사용하며 앞과 동일한 결과를 만들어 낸다.
즉 매핑정보만 자식한자 상속시킬 때 사용하는 방법이다.
@MappedSuperclass
public abstract class Emp { }
@Entity
@Table(name=“PROGRAMMER")
public class Programmer extends Emp { }
@Entity
@Table(name=“DESIGNER")
public class Designer extends Emp { }
7. THIS PRACTICE MAKES THE EXPERT!
Spring Framework & JPA
Spring Boot, JPA, Querydsl
실무프로젝트과정
JPA,쇼핑몰 프로젝트
실무과정