스프링 공부/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 )
이러한 점에서 상속관계 매핑과는 확연한 차이를 보인다.