엔티티 생성 시간/수정 시간 자동화 - JPA Auditing

1

JPA

목록 보기
14/16

엔티티에는 보통 데이터의 생성 시간과 수정 시간이 포함된다. 언제 만들어졌고 수정되었는지는 향후 유지보수에 있어서 굉장히 중요한 정보이기 때문이다.

그렇다 보니 매번 DB에 insert, 갱신 하기 전에 날짜 데이터를 등록/수정하는 코드가 들어가게 되어 코드가 복잡하고 길어진다.


LocalDate 사용

Java8 부터 등장한 LocalDate와 LocalDateTime은 그간 Java의 기본 날짜 타입인 Date의 문제점을 모두 고쳐서 Java 8 이상부터는 무조건 사용해야 한다고 생각하면 된다.

참고

자바 8이 나오기 전까지 사용되었던 Date와 Calendar 클래스는 다음과 같은 문제점들이 있었다.

  • 불변의 객체가 아니다. -> 멀티 스레드 환경에서 문제가 발생할 수 있다.
  • Calendar는 월(month) 설계가 잘못 되었다. -> 10월을 나타내는 Calendar.OCTOBER의 숫자 값은 '9'이다.

BaseTimeEntity

@Getter
@MappedSuperclass // 1
@EntityListeners(AuditingEntityListener.class) // 2
public class BaseTimeEntity {

    @CreatedDate // 3
    private LocalDateTime localDateTime;

    @LastModifiedDate // 4
    private LocalDateTime modifiedDate;
}
  • 1 : 모든 JPA 엔티티들이 BaseTimeEntity를 상속 받을 경우 필드도 컬럼으로 인식하도록 한다.

  • 2 : BaseTimeEntity 클래스에 Auditing 기능을 포함시킨다.

  • 3 : 엔티티가 생성될 때 생성된 시간이 자동 저장된다.

  • 4 : 조회한 엔티티가 수정될 때 수정된 시간이 자동 저장된다.


Posts

@Getter
@NoArgsConstructor
@Entity
public class Posts extends BaseTimeEntity {

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

    @Column(length = 500, nullable = false)
    private String title;

    @Column(columnDefinition = "TEXT", nullable = false)
    private String content;

    private String author;

위와 같은 식으로 BaseTimeEntity를 상속 받으면 엔티티의 생성, 수정 시간이 자동으로 데이터베이스에 등록된다.


Application

마지막으로 Application에 @EnableJpaAuditing를 써주어야 한다.

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

}

1~4번째는 생성/수정 시간을 적용하기 전이고 5번 째는 생성 수정 시간 컬럼이 추가되어 잘 적용된 모습을 볼 수 있다.

0개의 댓글