-
[Spring] Spring Data JPA에서 Auditing 사용하는 법Server/JPA 2021. 11. 9. 12:05728x90반응형
JPA AuditingEntityListener 알아보기
위의 코드는 제가 작성했던 코드인데요. 누군가 저에게 아래와 같이 물었습니다.
LocalDateTime.now() 코드는 왜 작성한거야?
위의 질문을 듣고
아.. BaseEntity를 통해서 생성시간, 수정시간을 저장하기 위해서 만들었는데now()코드는 없어도 되려나? 라는 생각이 들었습니다. 지금 생각하면 당연히 없어도 될 코드인데 왜 저렇게 작성했나 싶지만.. 어쨋든AuditingEntityListener가 어떻게 동작하는지 잘 모르고 사용하고 있는 거 같아서 이번 글에서는JPA AuditingEntityListener를 어떻게 사용하고 어떤 원리로 동작하는 것인지 알아보겠습니다.JPA Auditing 이란?
언제 만들어졌는지, 언제 수정되었는지는 중요한 정보이기 때문에 보통
Entity에는생성시간,수정시간을 포함합니다. 그런데 모든Entity에생성시간,수정 시간필드를 넣어서 생성하는 것을 상당히 비효율적일 것인데요. 이럴 때 사용하는 것이JPA Auditing입니다.
모든 엔티티에 중복된 필드를 적용할 때 사용하는 것이
@MappedSuperclass인데요. 위와 같이@MappedSuperclass애노테이션이 존재하면Entity가BaseEntity를 상속하면생성시간,수정시간도 컬럼으로 인식하게 됩니다. 즉, 위의 코드의 애노테이션을 정리하면 아래와 같습니다.@MappeedSuperClass:Entity가BaseEntity를 상속하면생성시간,수정시간도 컬럼으로 인식하게 됩니다.@CreatedDate:Entity가 생성될 때 자동으로 생성 시간이 저장됩니다.@LastModifiedDate:Entity가 수정될 때 자동으로 수정 시간이 저장됩니다.
EntityListeners
@EntityListeners는 엔티티를 DB에 적용하기전, 이후에 커스텀 콜백을 요청할 수 있는 어노테이션입니다.@EntityListeners의 인자로 커스텀 콜백을 요청할 클래스를 지정해주면 되는데, Auditing 을 수행할 때는 JPA 에서 제공하는AuditingEntityListener를 인자로 넘기면 됩니다.그래서
AuditingEntityListener내부 코드를 보면touchForCreate,touceForUpdate메소드가 존재하고, 그 위에@PrePersist,@PreUpdate애노테이션이 존재하는 것도 볼 수 있는데요. 이것을 통해서Entity에 생성, 수정이 일어나면 콜백이 실행되어 시간을 만들어주는 것입니다. 즉, 저처럼now()를 통해서 직접 시간 생성 코드를 넣지 않아도 됩니다.
그리고
JPA Auditing애노테이션들이 활성화할 수 있도록@EnableJpaAuditing애노테이션을 위와 같이 추가하겠습니다.@EnableJpaAuditing: JPA Auditing 애노테이션을 활성화시킵니다.
JPA Auditing 테스트 코드 작성하기
Member Entity를 저장했을 때JPA Auditing이 제대로 동작했다면생성시간,수정시간에 값이 존재할 것입니다. 즉, 현재 시간보다는 무조건 뒤일 것이기 때문에isAfter()를 사용해서 테스트 코드를 작성하였습니다.
그리고 실행해보면 테스트도 성공하여 제대로 동작하는 것을 볼 수 있고
Member Table이 만들어질 때 쿼리를 보면created_time,last_modified_time이 정상적으로 생성된 것도 확인할 수 있습니다.이번 글의 코드를 보고 싶다면 Github 에서 확인하실 수 있습니다.
반응형'Server > JPA' 카테고리의 다른 글
[JPA] Fetch Join 할 때 MultipleBagFetchException 해결하는 법 (0) 2021.11.24 [Spring] Spring Data JPA에서 Paging 간단하게 구현하는 법 (3) 2021.11.08