728x90

 

@MappeSuperclass란❓

@MappedSuperclass 어노테이션은 객체-관계 매핑에서 부모 클래스가 공통적으로 제공하는 매핑 정보를 자식 클래스들이 상속받을 수 있도록 해주는 기능입니다.

 

이를 통해 여러 엔티티에서 반복적으로 사용되는 필드들을 한 곳에서 관리할 수 있으며, 코드의 재사용성과 유지보수성을 향상시킬 수 있습니다.

 

주로 createdAt, createdBy, updatedAt, updatedBy와 같은 감사(auditing) 필드나 기타 공통적으로 사용되는 필드들을 정의할 때 사용합니다.

 

 

프로젝트에 @MappeSuperClass 적용하기

@Setter
@Getter
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
@Slf4j
public abstract class Timestamped {

  @CreatedDate
  @Column(updatable = false)
  @Temporal(TemporalType.TIMESTAMP)
  private LocalDateTime createdAt;

  @CreatedBy
  @Column(updatable = false)
  private Long createdBy;

  @LastModifiedDate
  @Column
  @Temporal(TemporalType.TIMESTAMP)
  private LocalDateTime updatedAt;

  @LastModifiedBy
  @Column(updatable = false)
  private Long updatedBy;


  @Column
  @Temporal(TemporalType.TIMESTAMP)
  private LocalDateTime deletedAt;

  @Column(updatable = false)
  private Long deletedBy;
  
  
  // 코드 생략
  
  }

 

먼저 추상클래스와 @MappedSuperClass 어노테이션을 함께 사용했습니다. @MappedSuperclass와 추상 클래스를 함께 사용하여 아래와 같은 이점이 있습니다.

 

 

강제 상속

  • 추상 클래스는 인스턴스를 직접 생성할 수 없기 때문에, 자식 클래스가 반드시 상속받아야 합니다.
  • 이를 통해 코드 구조를 명확하게 유지할 수 있습니다.

공통 기능 구현

  • 추상 클래스는 공통적인 필드메서드를 구현하고, 자식 클래스에 해당 기능을 제공할 수 있습니다.

객체-관계 매핑에서 활용

  • @MappedSuperclass를 추상 클래스와 함께 사용하면, 공통적인 매핑 정보(예: createdAt, updatedAt)를 여러 엔티티에 쉽게 적용할 수 있습니다.

 


지금 하고 있는 프로젝트에서 감사(auditing)필드가 각 도메인별로 필요했기 때문에 추상클래스와 @MappedSuperClass를 함께 사용했습니다.

 

또한 Spring Data JPA와 함께 사용할 경우, @EntityListeners(AuditingEntityListener.class)를 통해 생성 및 수정 시간 정보자동으로 관리할 수 있습니다.

 

이렇게 각 도메인별에서 해당 추상클래스를 상속받으면 간단하게 사용할 수 있게 되었습니다!!!😁