
이 그림은 Member와 Seller 엔티티 클래스를 나타내는 이미지이다. 여기서 우리는 두 엔티티는 서로 연관이 없다는 것과 각 엔티티가 ID, Name 속성을 공통으로 가지고 있는 것을 확인할 수 있다. 이 때 공통된 두 칼럼 ID와 Name을 부모 클래스로 모으고 객체 상속 관계로 만든 것을 확인할 수 있다. 이 때 부모 클래스인 BaseEntity는 자식들에게 상속을 통해 칼럼 정보를 제공하는 역할을 할 뿐이다. 즉 BaseEntity를 테이블로 매핑할 필요가 없고 칼럼 정보만 자식에게 제공해주면 된다.
@MappedSuperClass // @Entity 대신 사용
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는 테이블로 매핑할 필요가 없다.
이를 위해 @Entity 어노테이션 대신 @MappedSuperClass 를 사용하면 된다.
실제로 @MappedSuperclass 는 엔티티 리스너와 함께 등록일자, 수정일자, 등록자, 수정자와 같은 모든 테이블에 공통으로 필요한 칼럼을 효과적으로 관리하는데에 자주 사용된다.
✓ 엔티티 클래스는 @Entity 와 @MappedSuperclass 가 선언된 클래스만 상속할 수 있다!