미운 오리 새끼의 우아한 개발자되기

[JPA] 고급 매핑 (2) @MappedSuperclass 본문

Spring & Spring Boot

[JPA] 고급 매핑 (2) @MappedSuperclass

Serina_Heo 2023. 5. 9. 12:19

(1) 상속관계  매핑은 부모 클래스와 자식 클래스를 모두 DB 테이블과 매핑한 것.

부모 클래스는 테이블과 매핑하지 않고 부모 클래스를 상속받는 자식 클래스에게 매핑 정보만 제공하고 싶으면 @MappedSuperclass 를 사용하면 됨. 실제 DB 테이블과 매핑되는 @Entity 와는 다르게 @MappedSuperclass 는 단순히 매핑 정보를 상속할 목적으로만 사용 됨.

 

@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;
    ...
    
}

객체들이 주로 사용하는 공통 매핑 정보는 BaseEntity 에 정의함. 

자식 엔티티는 상속을 통해 BaseEntity 의 매핑 정보를 물려받음. 

 

만약 부모로 부터 물려받은 매핑 정보를 재정의하려면 @AttributeOverrides 나 @AttributeOverride 를 사용하고 ,

연관관계를 재정의하려면 @AssociationOverrides 나 @AssociationOverride 를 사용.

아래 코드는 부모에게 상속받은 id 속성의 컬럼명을 MEMBER_ID 로 재정의 한 예시코드.

둘 이상을 재정의하려면 @AttributeOverrides 를 사용.

@Entity
@AttributeOverride(name = "id", column = @Column(name = "MEMBER_ID"))
public class Member extends BaseEntity { ... }

 

@MappedSuperclass 의 특징

  • 테이블과 매핑되지 않고 자식 클래스에 엔티티의 매핑 정보를 상속하기 위해 사용
  • MappedSuperclass 로 지정한 클래스는 엔티티가 아니므로 em.find() 나 JPQL 에서 사용불가
  • 이 클래스를 직접 생성해서 사용할 일을 거의 없으므로 추상 클래스로 만드는 것을 권장함

-> @MappedSuperclass 는 테이블과는 관계가 없고, 단순히 엔티티가 공통으로 사용하는 매핑 정보를 모아주는 역할을 할 뿐.

이를 이용하여 등록일자, 등록자, 수정일자, 수정자 등 여러 엔티티에서 공통으로 사용하는 속성을 효과적으로 관리할 수 있음.

 

Reference : 자바 ORM 표준 JPA 프로그래밍 (김영한 저)