[스프링부트] Auditing을 이용한 공통컬럼 설정하기

minji·2021년 8월 8일
0

우리가 상품을 사고 팔 수 있는 커머스를 구축한다고 생각해보자.
판매자가 상품을 등록할 때, 소비자가 가입할 때, 상품에 대한 문의를 남길때 등 많은 경우에 해당 엔티티의 등록 시간 즉 insert 시점을 기록해야 할 것이다.

**이처럼 테이블이나 서비스에 특정 기능이 반복될 때 주로 사용하는 것이 Auditing 기능이다.

참고로 Auditing 기능은 JPA에서 제공한다.

그럼 생성시간수정시간 두가지를 Auditing 설정하여 DB에 등록되도록 해보자.

1. Application 클래스에 @EnableJpaAuditing 추가하기

스프링 프로젝트를 실행할 때 기본이 되는 것이 @SpringBootApplication 어노테이션이 들어있는 Application 클래스이다.
Auditing 기능을 사용하기 위해서는 아래와 같이 해당 클래스에 @EnableJpaAuditing 어노테이션을 추가해주어야 한다.

2. 공통으로 사용할 추상 클래스 생성

다음으로, 공통으로 사용할 컬럼들을 정의할 추상 클래스를 생성한다.

아래와 같이 생성시간에 해당하는 createdDate, 수정시간에 해당하는 modifiedDate 필드를 각각 작성해주었다.
이후, 생성시간에는 @CreatedDate를, 수정시간에는 @LastModifiedDate 어노테이션을 설정해준다.

JPA는 이를 확인하고, @CreatedDate 가 선언되어있는 필드는 각 튜플이 생성될 때 그 시간을 기록해주며, @LastModifiedDate 가 선언되어있는 경우, 각 튜플이 수정될 때마다 업데이트 시간을 기록해준다.

- @MappedSuperclass
: 엔티티들이 CommonTime을 상속할 경우, 해당 클래스의 필드(createdDate, modifiedDate) 도 자동으로 컬럼으로 함께 생성되도록 해준다.

- @EntityListeners(AuditingEntityListener.class)
: CommonTime 클래스가 Auditing이 가능하도록 설정해준다.

- @Getter
: 이후에 생성시간, 수정시간 값을 가져오기 위함이다. Getter가 없을경우 private 필드이므로 값을 가져올 수 없다.

- updatable=false, insertable=false
: updatable을 false로 설정할 경우, 해당 컬럼은 수정되지 않는다는 의미이다. 생성시간의 경우, 한 번 생성이 된 후에는 변할 일이 없으므로(실수로라도 변하지 않아야 하므로) false로 설정해주어야 한다.
다음으로, insertable을 false로 설정할 경우, 해당 컬럼은 삽입에서 제외된다는 의미이다. 쉽게 말하면 DB의 insert문에서 제외되는 것이다. 수정시간의 경우, 엔티티 삽입 시점에서는 비워져있어야하므로 false로 설정해주어야 한다.

3. 사용을 원하는 클래스에서 상속하기

public class Gallery extends CommonTime {...}

마지막으로, 위와 같이 상속을 원하는 클래스들마다 CommonTime을 상속해주기만 하면 완료된다.
실제로 해당 엔티티 클래스에는 createdDt와 updatedDt가 정의되어있지 않지만, DB에는 함께 올라가는 것을 확인할 수 있다.

profile
SW Engineer

0개의 댓글