본문 바로가기

Spring

JPA 생성 날짜, 수정 날짜 자동으로 넣어주기

JPA에서 ORM을 이용해 데이터베이스의 컬럼과 매핑할 때 공통적으로 들어가는 기능들이 있다.

대표적으로 생성 일자나 수정 일자 등이 있는데, 비즈니스 로직상 들어가지 않는 경우도 있겠지만 대부분 공통적으로 들어간다.

그래서 미리 만들어 놓은 기능이 있다. Autiting(감시) 옵션인데, 엔티티들의 변경을 감지하여 필드를 갱신하게 된다.

이러한 변경 감지 옵션을 사용하기 위해선 스프링부트에서 활성화하려면 @EnableJpaAuditing 어노테이션을 붙여줘야 한다.

@SpringBootApplication
@EnableJpaAuditing
public class BookshopApplication {
	public static void main(String[] args) {
		SpringApplication.run(BookshopApplication.class, args);
	}
}

JPA는 엔티티 연결 관계를 객체 간의 관계로 생각하여야 한다. 따라서 상속을 이용하여 중복된 기능들을 추상화 할 수 있는데, @MappedSuperclass 어노테이션을 붙이면 해당 엔티티는 오로지 상속을 위한 클래스로 인식하게 된다.

@MappedSuperclass
@EntityListeners(AuditingEntityListener.class) //이 어노테이션을 붙여야 Auditing 기능을 사용가능
public abstract class BaseEntity {
    @CreatedDate
    private LocalDateTime createAt; //생성 날짜
    @LastModifiedDate
    private LocalDateTime modifiedAt; //마지막 수정 날짜
}

@EntityListeners 어노테이션이 붙은걸 확인할 수 있는데 엔티티의 변경을 감지하기 위해 붙여주어야 하며, 상속 받은 클래스에도 적용된다.

또한 @CreateDate, @LastModifiedDate는 JPA에서 생성 날짜, 수정 날짜를 넣기 위한 어노테이션이다. 

 

이제 실제 사용할 엔티티 클래스를 선언해보겠다.

@Entity
@Table(name = "post")
@Getter
public class Post extends BaseEntity{
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    @Column(name = "title")
    private String title;
    @Column(name = "content")
    private String content;
}

사용법은 간단하다. 아까 만들어두었던 BaseEntity 클래스를 상속하기만 하면 된다. 이제 개발자가 번거롭게 생성, 수정 날짜를 넣지 않아도 엔티티를 필드를 수정하기만 하면 엔티티 매니저가 변경을 감지하여 BaseEntity의 필드를 갱신하게 된다.

 

사실 이 변경의 의미는 모호하다. 왜냐하면 변경은 엔티티를 수정하는 것이 변경이 될 수도 있고, 삭제하는 것도 엔티티 매니저 입장에선 변경이기 때문이다. 또한 변경의 시점도 변경 전, 후로 다를 수 있다.

이것에 대한 내용은 아래 링크로 대체한다.

https://www.baeldung.com/jpa-entity-lifecycle-events

+추가 날짜외에도 생성자, 수정자를 넣을 수 있는 기능도 있는데 나의 경우 아직 로그인 기능까지 구현하지 않아 제외하였다.