티스토리 뷰

JPA

상속 관계 매핑 - @MappedSuperclass

pyounani 2024. 6. 6. 18:14

앞서서 다양한 상속 관계의 전략들을 살펴봤습니다. 

이번에는 객체 간 상속을 이용하지만 실제로는 Entity나 Table과 관계가 전혀 없을 경우를 살펴보도록 하겠습니다. 

 

앞서서 봤던 슈퍼 타입 - 서브타입은 데이터베이스 테이블에도 상속 관계를  반영하기 위해 3가지 전략을 살펴봤습니다. 

이번에는 부모 객체가 가진 속성을 상속하는 자식 클래스를 사용하는 것은 동일하지만 오직 공통된 매핑된 정보만 제공하는 방식입니다.  따라서 부모 클래스는 독립적인 테이블 매핑이 없으며 추상 클래스로 직접 인스턴스화를 하거나 검색은 불가합니다. 

 

예시를 통해 자세하게 살펴보겠습니다.

Member 클래스와 Seller 클래스가 있다고 가정해 보겠습니다. 

객체에서는 공통 속성을 추상 객체로 이동시키고 자식 객체들이 해당 속성을 공통으로  사용하는 것은 흔히 있는 일입니다. 

 

테이블을 확인하면 공통 속성을 가지고 있는 부모 클래스인 BaseEntity는 테이블이 생성되지 않았음을 확인할 수 있습니다. 

 

특징을 정리하자면

1. 단순히 공통으로 사용하기 위한 매핑 정보

     주로 생성일, 수정일, 등록자, 수정자 같은 정보입니다. 

2. 테이블과 관계가 없는 데이터

 

 

이제 실제로 구현해보도록 하겠습니다. 

@MappedSuperclass
public abstract class BaseEntity {

    @Id @GeneratedValue
    private Long id;
    private String name;
   
}

@Entity
public class Member extends BaseEntity {
    // ID 상속
    // NAME 상속
    private String email;
}

@Entity
public class Seller extends BaseEntity {
    // ID 상속
    // NAME 상속
    private String shopName;
}

1. BaseEntity는 공통 속성을 묶기 위한 부모 클래스로 @MappedSuperclass를 통해 자식 클래스에게 매핑 정보만 제공합니다. 

2. BaseEntity는 독립적인 엔티티가 아니며, 데이터베이스 테이블에 매핑되지 않습니다.

3. 따라서 EntityManager의 find 메서드나 JPQL에서 직접 BaseEntity를 대상으로 쿼리를 실행할 수 없습니다.

4. 직접 생성해서 사용할 일이 없기 때문에 추상 클래스로 구현하기를 권장합니다. 

 

 

본 포스팅은 자바 ORM 표준 JPA 프로그래밍을 참고하여 작성했습니다. 

'JPA' 카테고리의 다른 글

영속성 컨텍스트의 특징  (0) 2024.06.07
엔티티의 생명주기  (0) 2024.06.07
상속 관계 매핑 - 상속 전략  (0) 2024.06.05
다양한 연관관계 매핑  (0) 2024.05.01
연관관계의 주인  (0) 2024.04.25