🧱 @MappedSuperclass

정의

@MappedSuperclassJPA에서 공통 필드를 자식 엔티티에 물려주기 위해 사용하는 애너테이션이다. 이 클래스 자체는 테이블과 직접 매핑되지 않고, 상속받는 엔티티에만 필드가 전파된다.

공통으로 쓰는 생성일, 수정일, 등록자 같은 필드를 중복 없이 재사용할 때 적합하다.

🧩 역할

  • 공통 필드를 여러 엔티티에서 재사용한다
  • 부모 클래스 자체는 테이블과 매핑하지 않는다
  • 엔티티 설계를 단순하게 유지한다
  • 감사 필드 같은 공통 속성에 자주 사용된다

🛠 사용법

공통 부모 클래스 정의

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가 적합하다.

연결문서

태그: ,

카테고리:

업데이트:

댓글남기기