스프링 공부/JPA 기본

[고급 매핑] @MappedSuperClass

hyun_12 2023. 9. 18. 21:08

@MappedSuperClass는 공통 매핑 정보가 필요할 때 사용한다.

테이블에 매핑되지 않고, 단순히 엔티티가 공통으로 사용하는 매핑 정보를 모으는 역할을 한다.

 

예를 들어 모든 엔티티에 생성 시간, 수정 시간이 들어간다고 해보자.

각 엔티티에 해당 필드를 추가한다면 코드 중복이 발생한다.

 

이때 부모 클래스를 선언하고 속성만 상속받아 사용할 수 있다.

 

BaseEntity에 @MappedSuperClass를 선언 후 필드들을 넣고 다른 엔티티들이 상속받도록 하자.

BaseEntity는 상속해주는 클래스라 단독으로 쓰지 않으므로 추상 클래스로 만드는 것이 좋다.

 

객체와 테이블의 필드명을 다르게 사용하고 싶다면 @Column의 name 속성을 사용하면 된다.

@MappedSuperClass
public abstract class BaseEntity {
    private LocalDateTime createdAt;
    private LocalDateTime updatedAt;
}

 

Book은 BaseEntity를 상속 받아 위에서 정의한 속성들을 가진다.

참고로 @Entity 클래스는 @Entity나 @MappedSuperClass로 지정한 클래스만 상속받을 수 있다.

@Entity
public class Book extends BaseEntity{
    @Id @GeneratedValue(startegy = GenerationType.IDENTITY)
    @Column(name = "book_id")
    private Long id;
    private String title;
    private String author;
}

 

@MappedSuperClass가 붙은 클래스는 엔티티와 다르기 때문에 테이블과 매핑되지 않는다.

실제로 DDL에서 BaseEntity 테이블을 출력되지 않는다.

create table Book (
book_id bigint not null,
title varchar(255),
author varchar(255),
createdAt timestamp,
updatedAt timestamp )

 

 

이러한 점에서 상속관계 매핑과는 확연한 차이를 보인다.