JPA Auditing이란?
보통 엔티티는 해당 데이터의 생성 시간과 수정 시간을 포함한다. 그래서 매번 DB를 insert, update 할 때 날짜 데이터를 등록/수정하는 코드가 들어간다. 하지만, 이런 단순한 코드가 모든 서비스 메서드에포함된다고 생각하면 귀찮고 코드가 지저분해진다.
그래서 쓰는 것이 JPA Auditing이다.
`BaseTimeEntity.java`
BaseTimeEntity 클래스는 이를 상속하는 엔티티의 상위 클래스가 되어 created, updated를 자동으로 관리하는 역할을 한다.
@Getter
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public abstract class BaseTimeEntity {
@Column(updatable = false)
@CreatedDate
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm")
private String created;
@LastModifiedDate
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm")
private String updated;
}
| 어노테이션 | 설명 |
| @MappedSupperclass | BaseEntity를 상속한 엔티티들은 아래 필드들을 컬럼으로 인식하게 된다. |
| @EntityListeners | Auditing(자동으로 값 매핑) 기능 추가 |
| @CreatedDate | Entity가 생성되어 저장될 때 시간이 자동 저장된다. |
| @LastModifiedDate | 조회한 Entity가 값을 변경할 때 시간이 자동 저장된다. |
`Member.java`
public class Member extends BaseTimeEntity { ... }
`Application.java`
마지막으로 JPA Auditing 어노테이션을 모두 활성화하기 위해서 Application 클래스에 활성화 어노테이션을 붙여준다.
@EnableJpaAuditing //JPA Auditing 활성화
@SpringBootApplication
public class Application {
public static void main(String[] args){ SpringApplication.run(Application.class, args); }
}
하지만,
데이터베이스를 확인해보니 아래처럼 date format이 동작하지 않음을 확인할 수 있었다.

`@DateTimeFormat`, `@JsonFormat` 들도 Auditing에선 작동하지 않은 것인데, 이럴 때 찾은 방법은 아래와 같다.
@Getter
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public abstract class BaseTimeEntity {
@Column(updatable = false)
private String created;
private String updated;
@PrePersist //해당 엔티티 저장하기 전
void onPrePersist(){
this.created = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm"));
this.updated = created;
}
@PreUpdate //해당 엔티티 수정 하기 전
void onPreUpdate(){
this.updated = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm"));
}
}
| 어노테이션 | 설명 |
| @PrePersist | Entity가 영속화되기 직전에 JPA Provider에 의해 자동으로 호출됩니다. |
| @PreUpdate | Entity의 변경 사항이 데이터베이스와 동기화 되기 전에 JPA Provider에 의해 자동으로 호출됩니다. |

성공적으로 적용된 모습을 확인할 수 있다!
참고
https://velog.io/@lsj8367/Spring-JPA-Auditing
'✍️ 개발 기록' 카테고리의 다른 글
| Access Token과 Refresh Token을 어떻게 전달하고 클라이언트는 어디에 저장할까? (0) | 2024.06.21 |
|---|---|
| authenticate에서 발생하는 '자격 증명에 실패하였습니다' 문제 해결 (0) | 2024.06.19 |
| redis 분산락으로 동시성 제어하기 (0) | 2024.05.21 |
| synchronized 키워드를 사용하여 임계 영역 지정하기 (1) | 2024.05.17 |
| 동시성 문제 발생 확인 (0) | 2024.05.17 |