@MappedSuperclass

Coen·2022년 10월 23일
1

blog-project

목록 보기
1/1

오늘부터 틈틈히 블로그를 만드는 프로젝트를 시작하려고 한다.

그러던 와중 엔티티에서 공통적으로 사용되는 컬럼을 따로 빼야 하는 일이 있었다.

  • 따로 빼려면 어떻게 해야할까?
    - JPA는 이러한 상황에 사용할 수 있는 MappedSuperclass라는 어노테이션을 만들어놔 공통적인 컬럼들을 상속을 통해 쉽게 사용할 수 있게 만들어놨다.

BaseTimeEntity.java

@EntityListeners(value = AuditingEntityListener.class)
@Getter
@MappedSuperclass
public abstract class BaseTimeEntity {

    @CreatedDate
    @Column(updatable = false, nullable = false)
    private LocalDateTime createTime;
    @LastModifiedDate
    @Column(nullable = false)
    private LocalDateTime updateTime;
    
}

@MappedSuperclass

  • 이러한 방식으로 사용할 수 있는데, MappedSuperclass가 선언되어 있는 클래스는 엔티티가 아니다.
  • @MappedSuperclass가 선언되어 있는 클래스를 직접 호출하여 사용하는 일이 없기때문에 abstract class로 생성(하는 것을 권장)한다.

@EntityListeners(value = AuditingEntityListener.class)

  • JPA에서 제공하는 AuditingEntityListener를 사용하면 @CreatedBy(작성자) @CreatedDate(작성일) @LastModifiedDate(수정일) @LastModifiedBy(수정자)을 자동으로 넣어주게 된다.

필자는 BaseEntity와 BaseTimeEntity를 따로 만들어 Entity <- BaseEntity <- BaseTimeEntity 와 같은 방법으로 서로 연결해주는 구조로 만들었다.

BaseEntity.java

@MappedSuperclass
@Getter
@EntityListeners(value = AuditingEntityListener.class)
public abstract class BaseEntity extends BaseTimeEntity {

    @CreatedBy
    @Column(nullable = false, updatable = false)
    private String createBy;

    @LastModifiedBy
    @Column(nullable = false)
    private String updateBy;

}

사용할 때 BaseEntity만 상속받으면 된다.

자주 사용하게 될 컬럼들이라 따로 만들었지만 많이 사용하지 않는다면 필요한 엔티티에 위의 어노테이션을 붙여 사용하면 된다.


잘못된 내용이 있거나 수정이 필요한 부분이 있다면 bht9011@gmail.com 으로 연락주시거나 댓글 남겨주시면 감사하겠습니다.
읽어주셔서 감사합니다.

profile
백엔드 프로그래머

0개의 댓글