MappedSuperclass에 대해 정리한 글입니다.
@MappedSuperclass란
@MappedSuperclass는 JPA에서 엔티티 클래스들 간에 공통된 매핑 정보를 재사용하기 위한 어노테이션입니다.
이 어노테이션을 사용하면 여러 엔티티 클래스에서 동일한 매핑 정보를 공유하여 코드의 중복을 줄여줍니다.
가령 createdAt, updatedAt 등 모든 엔티티에 공통적으로 포함되는 필드가 있다면 @MappedSuperclass를 이용하여 공통된 필드를 포함하는 클래스를 다른 엔티티들이 상속받도록 하면 됩니다.
@MappedSuperclass 사용
아래 BaseEntity가 @MappedSuperclass로 지정되어있습니다.
import lombok.AccessLevel;
import lombok.Getter;
import lombok.NoArgsConstructor;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;
import javax.persistence.Column;
import javax.persistence.EntityListeners;
import javax.persistence.MappedSuperclass;
import java.time.LocalDateTime;
@MappedSuperclass
@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@EntityListeners(AuditingEntityListener.class)
public abstract class BaseEntity {
@Column(nullable = false, columnDefinition = "TINYINT DEFAULT 0")
private Integer isDeleted;
@CreatedDate
private LocalDateTime createdAt;
@LastModifiedDate
private LocalDateTime updatedAt;
}
BaseEntity를 상속받는 User 엔티티입니다.
import jakarta.persistence.*;
@Entity
@Getter
@Setter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class User extends BaseEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(nullable = false)
private String name;
@Column(unique = true)
private String email;
@Column(nullable = false)
private String password;
}
User는 BaseEntity를 상속받았기 때문에 BaseEntity의 칼럼을 모두 가지게 됩니다.
데이터베이스에서도 User는 isDeleted, createdAt, updatedAt 필드를 포함하고 있습니다.
알아둬야 할 점
기본적으로 MappedSuperclass로 지정된 클래스는 테이블로 매핑되지 않습니다.
즉, MappedSuperclass로 지정된 클래스는 엔티티가 아닙니다.
대신, 이 클래스의 필드와 매핑 정보는 하위 엔티티 클래스에 상속됩니다.
그렇기 때문에 MappedSuperclass로 지정된 클래스는 추상 클래스로 정의하는 것이 좋습니다.