DEV ℧ Developer Diary

[JPA] @MappedSuperclass

해당 포스트는 인프런 김영한님의 자바 ORM 표준 JPA 프로그래밍 - 기본편 을 듣고 정리한 글입니다.

@MappedSuperclass

해당 어노테이션은 공통 매핑 정보가 필요할 때 사용한다 (id, name)

@MappedSuperClass

@MappedSuperclass 란?

  • 상속관계 매핑X
  • 엔티티X, 테이블과 매핑X
  • 부모 클래스를 상속 받는 자식 클래스에 매핑 정보만 제공
  • 조회, 검색 불가(em.find(BaseEntity.class) 불가)
  • 직접 생성해서 사용할 일이 없으므로 추상 클래스 권장

예제 코드

예시를 들어 간단하게 설명해보자

아래의 필드들은 주로 테이블에 공통적으로 자주 들어가는 필드들이다.

private String createdBy;
private LocalDateTime createDate;
private String lastModifiedBy;
private LocalDateTime lastModifiedDate;

위와 같은 필드를 Entity마다 넣어주는 것이 아니라. 아래와 같은 부모의 superclass로 만들어줄 수 있다.

@Getter @Setter
@MappedSuperclass
public class BaseEntity {

    private String createdBy;
    private LocalDateTime createDate;
    private String lastModifiedBy;
    private LocalDateTime lastModifiedDate;
}

그리고 아래와 같이 사용하고자 하는 Entity에 상속해 주면 된다.

@Entity
@Getter @Setter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class Member extends BaseEntity{

    @Id
    private Long id;

    private String name;

    public Member(Long id, String name) {
        this.id = id;
        this.name = name;
    }
}

그럼 BaseEntity를 상속받은 Member Entity를 사용해 보자.

Member member = new Member(101L, "Hello JPA");
member.setCreatedBy("mho");
member.setCreateDate(LocalDateTime.now());

entityManager.persist(member);

그럼 아래와 같이 BaseEntity를 상속받아 테이블이 만들어진다.

create table Member (
    id bigint not null,
    createDate timestamp,
    createdBy varchar(255),
    lastModifiedBy varchar(255),
    lastModifiedDate timestamp,
    name varchar(255),
    primary key (id)
)

정리

  • 테이블과 관계 없고, 단순히 엔티티가 공통으로 사용하는 매핑 정보를 모으는 역할
  • 주로 등록일, 수정일, 등록자, 수정자 같은 전체 엔티티에서 공통으로 적용하는 정보를 모을 때 사용
  • 참고: @Entity 클래스는 엔티티나 @MappedSuperclass로 지정한 클래스만 상속 가능