BaseTimeEntity

HwangJerry·2023년 5월 10일
0
post-custom-banner

Domain.Fragment

@Getter
@MappedSuperclass 
@EntityListeners(AuditingEntityListener.class) // auditing 기능 포함
public abstract class BaseTimeEntity {
    @CreatedDate
    @Column(updatable = false)
    private LocalDateTime createdDate;
    
    @LastModifiedDate
    private LocalDateTime modifiedDate;
}

객체는 모두 생성 시각과 업데이트 시각을 체크하는 것이 필요하다. 하지만 이를 모든 엔티티마다 똑같이 작성하는 것은 역시나 비효율적이므로 이를 자동화할 수 있는 방법이 필요하다.

위 코드를 설정해둔 뒤, 각각의 엔티티에서 이를 상속(extends BaseTimeEntity)받으면 이를 구현할 수 있다. 아래는 위 코드에 대한 항목별 설명이다.

@MappedSuperclass: 이 어노테이션은 이 클래스가 다른 엔티티에 의해 상속될 것임을 나타냅니다. 이 클래스 자체는 엔티티가 아니지만, 상속받은 하위 클래스는 엔티티로 취급됩니다. 이를 통해 공통 매핑 정보를 재사용할 수 있습니다.

@EntityListeners(AuditingEntityListener.class): 엔티티에 적용된 이벤트를 처리하기 위한 리스너 클래스를 설정합니다. 여기서는 JPA에서 제공하는 AuditingEntityListener를 사용하여 생성 및 수정 시간을 자동으로 관리할 수 있습니다.

@CreatedDate: 이 어노테이션은 해당 필드에 엔티티가 처음 생성되었을 때의 시간을 자동으로 할당합니다. 여기서는 createdDate 필드에 적용되어 있습니다.

@Column(updatable = false): 이 어노테이션은 엔티티가 저장될 때, 해당 열에 대한 속성을 정의합니다. 여기서는 updatable = false로 설정하여, 이 열의 값이 업데이트되지 않도록 합니다.

@LastModifiedDate: 이 어노테이션은 해당 필드에 엔티티가 수정될 때마다 시간을 자동으로 할당합니다. 여기서는 modifiedDate 필드에 적용되어 있습니다.

Auditing 활성화

@EnableJpaAuditing // JPA Auditing 활성화
@SpringBootApplication
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

또한 Auditing을 활성화하기 위해서는 @EnableJpaAuditing어노테이션을 클래스 레벨에 추가해줘야 합니다. 가장 단순하게는 main Application 클래스 레벨에서 추가해주면 됩니다.

하지만 이는 메인클래스가 실행되자마자 @EnableJpaAuditing이 작동하므로 이를 사용하기 위해서는 @Entity가 1개 이상이여야 합니다.

평소에는 문제가 되지 않지만, 만약 @WebMvcTest를 할 경우에는 Controller 관련 클래스만 스캔을 진행하므로 JPA와 관련된 클래스를 읽을 수 없다는 문제가 발생합니다. 따라서 이를 Config 패키지의 JpaConfig 클래스에 할당하면 해당 문제가 발생하지 않게 됩니다.

@Configuration
@EnableJpaAuditing // JPA Auditing 활성화
public class JpaConfig {
}
profile
알고리즘 풀이 아카이브
post-custom-banner

0개의 댓글