요구사항
BaseEnetity 클래스의 createdAt 필드와 lastModifiedAt 필드를 자동화 하는 것!
모든 테이블에 공통으로 들어가는 필드인 createdAt
과 lastModifiedAt
필드를 다음과 같이 BaseEntity에 작성했다.
@Getter
@MappedSuperclass
public abstract class BaseEntity {
@Column(name = "created_at")
private LocalDateTime createdAt;
@Column(name = "last_modified_at")
private LocalDateTime lastModifiedAt;
}
그리고 이 필드들이 다른 테이블에 들어갈 수 있게 아래와 같이 작성했다.
// 상위 어노테이션 생략 (ex. @Entity, @Table 등)
class Member extends BaseEntity { .. }
해당 필드들이 테이블에 들어가 있긴 하지만 내가 만든 API로 호출 시 자동으로 값이 생성되지 않는 문제가 있었다. 당연한 것이였다.. ㅎㅎ;;
구현
BaseEntity를 다음과 같이 작성한다.
@Getter
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public abstract class BaseEntity {
@CreatedDate
@Column(name = "created_at")
private LocalDateTime createdAt;
@LastModifiedDate
@Column(name = "last_modified_at")
private LocalDateTime lastModifiedAt;
}
@EntityListeners(AuditingEntityListener.class)
는 JPA (Java Persistence API)에서 엔티티의 생명주기 이벤트를 처리하기 위한 어노테이션이다. 특정 엔티티 클래스에 적용되며, AuditingEntityListener 클래스를 사용하여 해당 엔티티의 생성, 수정, 삭제 등의 생명주기 이벤트를 감지하고 처리한다. AuditingEntityListener는 주로 엔티티의 생성 시간과 수정 시간을 자동으로 기록하는 데 사용된다. 이 기능을 사용하기 위해서는 JPA Auditing을 활성화해야 하는데, 이와 관련해서는 아래 Main 클래스에서 설명하겠다.
@CreatedDate
는 엔티티가 생성되고 저장될 때의 시간을 자동으로 기록한다. 엔티티의 특정 필드에 이 어노테이션을 적용하면, 엔티티가 처음으로 저장될 때 해당 필드에 현재 시간이 저장된다. 이 필드의 값은 엔티티가 생성된 후에는 변경되지 않는다.
@LastModifiedDate
는 엔티티가 수정될 때마다 해당 필드의 시간을 현재 시간으로 갱신한다. 엔티티의 특정 필드에 이 어노테이션을 적용하면, 엔티티가 생성될 때뿐만 아니라 업데이트될 때마다 해당 필드의 값이 현재 시간으로 업데이트 된다.
메인 클래스인 SumNoteApplication에는 @EnableJpaAuditing
어노테이션을 붙여준다.
@EnableJpaAuditing
@SpringBootApplication
public class SumNoteApplication {
public static void main(String[] args) {
SpringApplication.run(SumNoteApplication.class, args);
}
}
아까 JPA Auditing을 활성화하는 설정이 필요하다고 했는데, 이것을 메인 클래스에 붙여주면 된다.
@EnableJpaAuditing
은 JPA Auditing 기능을 사용하기 위한 필수적인 설정이며, 이를 통해 엔티티의 생명주기에 따른 자동 기록 기능을 활성화할 수 있다. 이 기능은 특히 엔티티의 생성 및 수정 시간을 추적하거나, 사용자의 행동을 감사(audit)하는 데 유용하게 사용된다.
다음은 @EnableJpaAuditing을 사용 시 주의해야 할 사항이다.
- @EnableJpaAuditing 어노테이션은 한 애플리케이션 내에서 한 번만 선언되어야 한다. 여러 설정 클래스에 이 어노테이션을 중복해서 선언하면 예상치 못한 동작이 발생할 수 있다.
- Auditing을 위한 필드(ex. @CreatedDate, @LastModifiedDate)는 JPA 엔티티 클래스 내에 선언되어야 하며, 이 필드는 데이터베이스 테이블의 컬럼과 매핑된다.
해결 완료
아무것도 없던 테이블에
다음과 같이 데이터를 보내니
아래와 같이 응답을 잘 받았고
테이블에 값도 잘 들어갔다!
'TIL' 카테고리의 다른 글
[BadSqlGrammarException] StatementCallback; bad SQL grammar [TRUNCATE TABLE members] (0) | 2024.05.21 |
---|---|
[Kotlin + SpringBoot] JaCoCo 추가하기 (0) | 2024.05.21 |
[Ubuntu] git에서 SpringBoot 프로젝트 받아오고 jar 파일 빌드 후 Script 로 jar 파일 배포하기 (0) | 2024.02.11 |
[SpringBoot] 에러 응답 형식 통일 (0) | 2024.01.02 |
[SpringBoot] RequestParam 검증하기 및 오류 메시지 커스터마이징 (2) | 2024.01.01 |