프로젝트/씈크럼 프로젝트

공통으로 가지는 생성시간, 수정시간을 상속으로 이용해보자.

indeep 2024. 2. 19. 22:20

JPA를 사용하면서 @CreatedDate, @LastModifiedDate 어노테이션을 유용하게 사용했었습니다.

Entity를 생성하면 자동으로 생성 시간을 넣어주고, Update가 발생하면 자동으로 수정 시간을 변경해주었습니다.

 

현재 Scrum, User 엔티티에서 해당 어노테이션을 사용하는데 전부 Entity마다 각각 지정을 해주었었습니다.

@CreatedDate
@Column(nullable = false)
private LocalDateTime createdDate;

@LastModifiedDate
@Column(nullable = false)
private LocalDateTime updatedDate;

모든 테이블마다 이렇게 동일한 코드를 사용하는 것은 너무 비효율적이라는 생각이 들었습니다.

 

그래서 찾아보다가 시간만 넣어주는 Class를 만들어서 해당 클래스를 상속하는 방법으로 컬럼 지정이 가능한 걸 보았습니다.

바로 적용시켜보겠습니다.

 

우선 시간을 가지고 있을 Class가 필요합니다.

@Getter                                                                   
@MappedSuperclass // 해당 Entity를 상속한 Entity는 아래 필드를 컬럼으로 가짐.               
@EntityListeners(AuditingEntityListener.class)                            
public abstract class BaseTimeEntity {                                    
                                                                          
    @CreatedDate                                                          
    private LocalDateTime createdDate;                                    
                                                                          
    @LastModifiedDate                                                     
    private LocalDateTime lastModifiedDate;                               
}

@MappedSuperclass를 사용하면 해당 클래스가 가지고 있는 필드를 매핑 정보로 사용합니다.

즉 BaseTimeEntity를 상속받은 클래스는 createdDate, lastModifiedDate 컬럼을 사용하게 됩니다.

이 방법을 통해 똑같은 컬럼을 계속해서 생성하지 않아도 돼서 중복 코드를 줄일 수 있습니다.

단 해당 BaseTimeEntity로 직접 인스턴스를 만들 일은 없으므로 abstract를 달아서 추상 클래스라고 명시해두길 권장합니다.!

public class User extends BaseTimeEntity {

이후 해당 클래스를 상속받아 사용하면 동일한 효과를 누릴 수 있습니다.

 

보통은 시간을 설정할 때 많이 쓰지만 id, name처럼 모두가 가지고 있는 중복 정보들이 있으면 이렇게 추상 클래스로 묶는 것이 훨씬 유지보수하기 편하다는 생각이 듭니다.

반응형