본문 바로가기

Programming/Spring Boot

[Spring Boot] JPA Auditing 으로 생성/변경일시 관리하기

반응형
안녕하세요. 남산돈가스입니다.

오늘은 Spring Boot + JPA 환경에서 Auditing을 이용하여 생성/변경일시를 관리하는 법에 대해 포스팅하겠습니다.

일반적으로 테이블을 설계할 때, 거의 필수적으로 관리되는 컬럼들이 있습니다. 대표적인 예로 생성일시, 변경일시 등이 있을 것이고, 또 최종 변경자, 최초 생성자도 있을 수 있겠네요.

JPA환경에서 Entity들을 관리할 때, 이 모든 Entity에서 위에서 언급한 컬럼들을 일일이 관리하기엔 번거로움이 있을 것 같습니다. 또한, 코드 레벨에서 이 데이터들의 값을 관리하기는 더 어려운 일이 아닐 수 없겠죠.

이런 불편함들을 해소하고자(?) 혹은 Spring Data JPA가 아닌 다른 프레임워크 환경에서의 ORM에서 기본적으로 제공되던 것(ex. Sequelize 등) 들을 대체해 줄 수 있는 것이 바로 Spring Data JPA의 Auditing 입니다.

Auditing을 사용하기 위해서는 간단한 설정이 필요합니다.

Auditing을 활성화하기 위한 적당한 이름의 Config 파일을 생성한 뒤,
@EnableJpaAuditing 어노테이션을 추가합니다.
@EnableJpaAuditing
@Configuration
public class JpaAuditingConfig {
}

Config를 생성한 뒤, 이제 Audity로 제공할 데이터들을 정의하는 클래스를 생성합니다.
@Getter
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public abstract class Audity {

@CreatedDate
@Column(name = "created_date", updatable = false)
private LocalDateTime createdDate;

@LastModifiedDate
@Column(name = "updated_date", updatable = true)
private LocalDateTime updatedDate;
}
Audity라는 추상클래스를 생성하였고, @MappedSuperclass 어노테이션, @EntityListeners(AuditingEntityListener.class) 를 추가하였습니다.

  • @MappedSuperclass : JPA Entity 클래스들이 해당 추상 클래스를 상속할 경우 createDate, modifiedDate를 컬럼으로 인식
  • @EntityListeners(AuditingEntityListener.class) : 해당 클래스에 Auditing 기능을 포함
  • @CreatedDate : Entity가 생성되어 저장될 때 시간이 자동 저장
  • @LastModifiedDate : 조회한 Entity의 값을 변경할 때 시간이 자동 저장

이제 위에서 생성한 Audity 추상클래스를 Entity에서 상속받아 사용하기만 하면 됩니다.

@Entity
@Table(name="post")
@Getter
public class Post extends Audity {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name="id")
private Long id;

@Column(name="title")
private String title;

@Column(length = 2000, name="content")
private String content;

@Column(length = 50, name="writer")
private String writer;
}

예제로 사용할 Post Entity이며, Audity를 상속받았습니다. 그러므로, 위에서 정의한 id, title 등 4개의 컬럼 이외에 우리가 Audity에서 정의한 createdDate / updatedDate가 미리 정의되어 있다고 생각하시면 됩니다.

이제 미리 테스트를 위해 만들어 놓은 Post 등록 API를 사용해보면,


위와 같이 createdDate, updatedDate가 내부적으로 생성되어 저장 된 것을 확인하실 수 있습니다.

본 예제에서는 다루지 않았지만, 이외에도 Spring Security를 이용하고 계신다면, 처음에 언급한 최초생성자 / 최종수정자 또한 Auditing을 이용하여 관리할 수 있습니다.

감사합니다.