✍️ 개발 기록

JPA Auditing으로 생성일/수정일 자동 갱신 (+date format이 동작하지 않는 문제 해결)

ming412 2024. 6. 14. 16:14

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