@MappedSuperclass
🧱 @MappedSuperclass
정의
@MappedSuperclass는 JPA에서 공통 필드를 자식 엔티티에 물려주기 위해 사용하는 애너테이션이다. 이 클래스 자체는 테이블과 직접 매핑되지 않고, 상속받는 엔티티에만 필드가 전파된다.
공통으로 쓰는 생성일, 수정일, 등록자 같은 필드를 중복 없이 재사용할 때 적합하다.
🧩 역할
- 공통 필드를 여러 엔티티에서 재사용한다
- 부모 클래스 자체는 테이블과 매핑하지 않는다
- 엔티티 설계를 단순하게 유지한다
- 감사 필드 같은 공통 속성에 자주 사용된다
🛠 사용법
공통 부모 클래스 정의
import javax.persistence.MappedSuperclass;
import javax.persistence.Column;
import java.time.LocalDateTime;
@MappedSuperclass
public abstract class BaseEntity {
@Column(updatable = false)
private LocalDateTime createdAt;
private LocalDateTime updatedAt;
}
상속하는 엔티티 클래스
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
@Entity
public class User extends BaseEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
}
🧩 특징
- 부모 클래스는 단독 엔티티가 아니다
- 부모 클래스에
@Id를 두지 않는 것이 일반적이다 - 자식 엔티티의 테이블에 필드가 합쳐져 매핑된다
- JPA Auditing과 함께 쓰면 생성일/수정일 관리에 유용하다
⚠️ 주의사항
@MappedSuperclass는@Inheritance와 다르다.- 이 애너테이션은 상속 구조를 데이터베이스 상속으로 매핑하는 것이 아니다.
- 부모 클래스 자체를 조회 대상으로 사용하지 않는다.
- 공통 필드만 공유하려는 경우에 적합하다.
📌 정리
@MappedSuperclass는 공통 필드를 자식 엔티티에 공유시키는 애너테이션이다.- 부모 클래스는 테이블과 직접 매핑되지 않는다.
- 단순한 공통 속성 재사용에는
@MappedSuperclass가 적합하다.
댓글남기기