@MappedSuperclass
@Getter
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public abstract class BaseTimeEntity {
@CreateDate
private LocalDateTime createdDate;
@LastModifiedDate
private LocalDateTime modified;
}
위 코드에서 @MappedSuperclass 애노테이션이 사용된 것처럼 엔티티끼리 공통 매핑 정보가 필요할 때 @MappedSuperclass를 사용합니다.
상속관계 매핑과는 전혀 관련 없고, 단순히 엔티티가 공통으로 사용하는 매핑 정보를 모으는 역할을 합니다. 주로 등록일, 수정일, 등록자, 수정자와 같은 전체 엔티티에서 공통으로 적용해야 하는 정보를 BaseEntity로 모아서 사용합니다. 그리고 나머지 엔티티 클래스에서 BaseEntity 클래스를 상속받아 사용합니다.
위 그림처럼 @MappedSuperclass를 붙인 부모 클래스를 상속하더라도 테이블 구조에 영향을 주지 않습니다.
@MappedSuperclass를 사용한 클래스는 위의 BaseTimeEntity처럼 추상(abstract) 클래스로 구현하는 것을 추천합니다. 직접 BaseTimeEntity 객체를 생성해서 사용할 일이 없기 때문입니다.
또한 BaseTimeEntity를 상속받은 자식 클래스를 부모 타입인 BaseTimeEntity로 조회할 수 없습니다.
em.find(BaseEntity);
위 코드처럼 @MappedSuperclass를 채택한 클래스를 부모 클래스로 상속받았더라도 @MappedSuperclass를 채택한 부모 클래스로는 엔티티를 조회할 수 없습니다. @MappedSuperclass 부모 클래스를 상속받은 자식 클래스는 부모 클래스로부터 매핑 정보만 제공받습니다.
결론적으로 @MappedSuperclass를 사용하여 여러 테이블에 중복해서 들어갈 공통 속성들을 한 클래스에서 관리할 수 있게 됩니다.
'Spring > JPA' 카테고리의 다른 글
즉시 로딩과 지연 로딩 (0) | 2024.10.21 |
---|---|
프록시 (Proxy) (0) | 2024.10.21 |
상속관계 매핑 (2) | 2024.10.17 |
일대일 연관관계 매핑 (1) | 2024.10.17 |
연관관계 매핑 기초 (1) | 2024.10.17 |