Spring Data JPA with Kotlin - Entity Auditing

DevSeoRex·2023년 4월 14일
3
post-thumbnail
post-custom-banner

🙊 갑자기 코틀린을? Why?

저번 게시글까지는 Spring Boot + JPA(Spring Data JPA) 기반으로 포스팅을 해왔습니다.
이미 두달전부터 코틀린을 공부하고 문법을 학습 중이였고, 최근에 코프링과 Querydsl을 공부중이였습니다.

코딩은 직접하면서 느끼는 부분이 많기 때문에 이왕 Spring Data JPA를 학습하고 포스팅 할 것이라면 앞으로 잘하고 싶은 코틀린을 가지고 해보자는 마음에서 시작하게 되었습니다.

😈 Entity Auditing이 무엇일까?

Auditing이라는 단어에서 힌트를 얻을 수 있습니다. 여기서 Auditing은 '감사하다. 감시하다.'라는 뜻을 가지고 있습니다. 이 Entity에 대해서 언제 수정하고, 언제 등록했는지 즉 시스템 컬럼을 다룰때 자동으로 값을 채워주는 역할을 합니다.

👀 시스템 컬럼이란? 등록자, 수정자, 등록일, 수정일과 같이 데이터의 변경이력을 추적하기 위한 컬럼들의 모음을 시스템 컬럼이라 부릅니다.

Entity Auditing을 이용해서 어떻게 등록일, 수정일을 자동으로 관리할 수 있는지 알아보겠습니다.

🐵 BaseEntity & BaseTimeEntity

처음에는 BaseEntity에 등록일, 수정일, 등록자, 수정자를 두고 한 클래스로 사용을 했습니다.
그랬더니 불편한점이 생기게 되었는데, 그 이유는 등록자와 수정자가 필요없는 엔티티도 꽤 나온다는 것이였습니다. 그러면 어떻게 해결해야 할까요?

모든 테이블의 데이터는 등록일과 수정일은 이력추적을 위해 필요합니다. 따라서 필수적으로 사용하는 BaseTimeEntity는 등록일과 수정일 필드만 생성하고, BaseEntity에서 BaseTimeEntity를 상속받아 나머지 컬럼인 등록자와 수정자를 관리하도록 작성하였습니다.

BaseTimeEntity

BaseEntity

EntityAuditing을 사용하기 위해서는 클래스의 위에 @EntityListeners(AuditingEntityListener::class)
명시해줘야합니다. @MappedSuperclass는 공통된 속성을 다루기 위해서 주로 사용합니다.

인스턴스를 생성하여 사용할 클래스가 아니므로, 인스턴스 생성을 하지 않도록 추상클래스로 생성하였습니다.

🐹 Entity Auditing 설정

@EntityListners 애너테이션을 붙였다고 해서 Auditing이 바로 동작하지는 않습니다.
동작을 위해서는 몇가지 일을 해주어야 합니다.

기존의 @PrePersist와 @PreUpdate를 사용하던 방식을 이용하면 따로 설정하지 않아도 잘 동작합니다.

데이터가 정상적으로 들어간 것을 볼 수 있습니다.

함수를 이용해 작성하는 방식은 직접 작성해줘야 하는 번거로움이 있습니다.
그래서 애너테이션 만으로 작성할 수 있는 방법을 오늘 다루려고 합니다.

필드위에 애너테이션만 붙인 상태로 Entity Auditing이 동작하게 하려면, 두가지 일을 해줘야 합니다.

Application 클래스 설정

Spring Boot 프로젝트를 생성하면 가장 루트에 있는 클래스가 있을 것입니다.

이 클래스에 @EnableJpaAuditing 애너테이션을 붙여줍니다.
여기까지 완료하면, 날짜는 정상적으로 삽입되는 것을 확인할 수 있습니다.


하지만 등록자, 수정자가 들어오지 않습니다. 등록자 수정자는 어떻게 넣어줄 수 있을까요?

Configuration 클래스 작성


Configuration 클래스를 작성하고, AuditorAware를 Bean으로 등록해주는 팩토리 함수를 작성해야 합니다.
이 클래스에서 작성한 DevRexSeo가 등록자와 수정자로 잘 등록되는지 확인해보겠습니다.

값이 잘 채워지고 있다는 것을 확인할 수 있습니다.
테스트용 예제이기때문에 직접 이름을 하드코딩했지만, 대부분의 애플리케이션에서 Spring Security를 사용할것이므로 SecurityContextHoler에서 회원의 정보를 빼서 자동으로 넣어주는 방식을 사용하면 될 것 같습니다.

🦣 마치면서..

JPA를 사용하면서 깊은 부분을 알아가게 될때마다 신기하기도 하고 놀랍기도 합니다.
이런 부분까지 고민해서 다양한 문제를 해결하려고 했던 선배 개발자분들의 수고에 감사하고, 또 그 기능의 편리함을 누리면서 앞으로 더 생산성있는 고민을 하겠다고 다짐하게 됩니다.

JPA 정복하는 날까지 쉬지않고 달리겠습니다! 아자!

출처 : 실전! Spring Data JPA(인프런 : 김영한)

post-custom-banner

0개의 댓글