JPA | @MappedSuperclass

7843 단어 JPAJPA

👨‍💻 들어가기 앞서서

JPA 를 사용을 하다 보면 두가지 테이블에서 중복된 컬럼이 있고 추후에 중복이
될 수 있는 컬럼이 있을 수도 있다
그런 상황에서 사용을 하고자 이제는 @MappedSuperclass 을 사용을 하여서
클린 코드를 작성을 해보기 위한 글이다.

어노테이션 사용 전 Mapping

어노테이션 사용 후 Mapping

@MappedSuperclass

JPA 를 Entity 를 만들다 보면 중복 적인 컬럼을 만들 때가 있다
중복적인 매핑을 피하고자 @MappedSuperclass 를 사용을 한다.

@Getter
@MappedSuperclass
@EntityListeners(value = {AuditingEntityListener.class})
public abstract class BaseEntity {
 
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    protected Long id;
 
    @Column(name = "create_date" , nullable = false , updatable = false)
    protected LocalDate createDate;
 
    @Column(name = "update_date" , nullable = false)
    protected LocalDate updateDate;
 
    @PrePersist
    protected void onPersist() {
        this.createDate = this.updateDate = LocalDate.now();
    }
 
    @PreUpdate
    protected void onUpdate() {
        this.updateDate = LocalDate.now();
    }
 
}

id 의 경우 @GeneratedValue(strategy = GenerationType.IDENTITY) 로 설정시 시퀀스가 자동으로 증가한다.
createDate 의 경우 Row 데이터가 만들어질때 자동으로 들어간다
updateDate 의 경우 Row 데이터가 변경이될때 자동으로 들어간다
@PrePersist 의 경우 연속성관리하기 직전에 호출을 의미한다.
@PreUpdate 의 경우 flush , commit 시 호출 한다.

@Getter
@MappedSuperclass
@EntityListeners(value = {AuditingEntityListener.class})
public abstract class BoardBaseEntity extends BaseEntity{
 
    @Column(name = "create_by" , updatable = false)
    protected String createBy;
 
    @Column(name = "update_by")
    protected String updateBy;
 
}

아래와 같이 extends 를 사용을 하여서 BaseEntity 를 사용하면 클린하고 중복이 없는 코드를 작성 할 수 있을 것이다.

@Table(name="TEST")
@Entity
public class Test extends BaseEntity{
    ... 중략 ...
}

좋은 웹페이지 즐겨찾기