Framework/SpringBoot

[Spring] MappedSuperclass 사용하기

  • -
MappedSuperclass에 대해 정리한 글입니다.

 

@MappedSuperclass란

@MappedSuperclass는 JPA에서 엔티티 클래스들 간에 공통된 매핑 정보를 재사용하기 위한 어노테이션입니다. 

이 어노테이션을 사용하면 여러 엔티티 클래스에서 동일한 매핑 정보를 공유하여 코드의 중복을 줄여줍니다.

 

가령 createdAt, updatedAt 등 모든 엔티티에 공통적으로 포함되는 필드가 있다면 @MappedSuperclass를 이용하여 공통된 필드를 포함하는 클래스를 다른 엔티티들이 상속받도록 하면 됩니다.

 

@MappedSuperclass 사용

아래 BaseEntity가 @MappedSuperclass로 지정되어있습니다.

import lombok.AccessLevel;
import lombok.Getter;
import lombok.NoArgsConstructor;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;

import javax.persistence.Column;
import javax.persistence.EntityListeners;
import javax.persistence.MappedSuperclass;
import java.time.LocalDateTime;

@MappedSuperclass
@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@EntityListeners(AuditingEntityListener.class)
public abstract class BaseEntity {

    @Column(nullable = false, columnDefinition = "TINYINT DEFAULT 0")
    private Integer isDeleted;

    @CreatedDate
    private LocalDateTime createdAt;

    @LastModifiedDate
    private LocalDateTime updatedAt;
}

 

BaseEntity를 상속받는 User 엔티티입니다.

import jakarta.persistence.*;

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

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(nullable = false)
    private String name;

    @Column(unique = true)
    private String email;

    @Column(nullable = false)
    private String password;

}

 

User는 BaseEntity를 상속받았기 때문에 BaseEntity의 칼럼을 모두 가지게 됩니다.

데이터베이스에서도 User는 isDeleted, createdAt, updatedAt 필드를 포함하고 있습니다.

 

알아둬야 할 점

기본적으로 MappedSuperclass로 지정된 클래스는 테이블로 매핑되지 않습니다. 

즉, MappedSuperclass로 지정된 클래스는 엔티티가 아닙니다.

 

대신, 이 클래스의 필드와 매핑 정보는 하위 엔티티 클래스에 상속됩니다.

 

그렇기 때문에 MappedSuperclass로 지정된 클래스는 추상 클래스로 정의하는 것이 좋습니다.

 


 

 

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.