[JPA] BaseEntity 구현

limhyeonwoo·2023년 4월 2일
0
post-thumbnail

프로젝트를 구현하다 보면 정말 많은 엔티티가 필요합니다. 그런데 각각의 엔티티를 관리하기 위해서는 생성시간과 수정시간을 저장하며 엔티티를 관리해야할 필요성을 느꼈습니다. 그래서 모든 엔티티의 기본 속성인 생성시간과 수정시간을 가지는 BaseEntity를 구현했습니다.

먼저 제가 구현한 BaseEntity입니다.

1. @MappedSuperClass

  • 객체의 입장에서 공통된 부분(지금은 생성시간, 수정시간)이 계속 나올때 사용하는 어노테이션입니다.
  • 상속관계가 아닌 자식 클래스에 매핑 정보만 정해주는 역할을 합니다.
  • JPA에서는 엔티티가 해당 어노테이션을 선언한 엔티티를 상속받아 상속하지만 DB에서 각각의 엔티티는 매핑정보를 각각 가지고 있기때문에 DB와는 전혀 상관이 없는 엔티티입니다.

-> 그러므로 위 객체는 실제로 선언해서 사용할일이 없는 엔티티기 때문에 추상클래스(abstract class)로 선언해서 사용하는것이 바람직합니다.

2. @EntityListeners(AuditingEntityListener.class)

  • AuditingEntityListener을 callback listener로 선정하는 어노테이션입니다.

2-1) AuditingEntityListener 확인해보기


제일 위에 적힌 설명을 보면 AuditingEntityListener은 엔티티가 저장되거나 수정될때 정보를 auditing하는 Jpa Entity Listener라고 적혀있습니다. 즉 해당 클래스가 callback listener로 정해지면 엔티티가 수정되거나 저장될때 특정 로직을 수행함을 알수있습니다.

2-2) @EnableJpaAuditing

설명을 쭉 읽어보면 jpa auditing을 위해서는 xml파일이나 어노테이션으로 설정을 해야함을 알려주고 있습니다. 나는 어노테이션을 이용해서 설정을 해줬습니다.

만일 BaseEntity를 잘 작성하고 엔티티를 저장/수정하는데 DB의 생성시간, 수정시간에 NULL이 들어간다면 해당 어노테이션을 선언했는지 확인해야합니다.

3. @CreatedDate / @LastModifiedDate

  • 위 두 어노테이션은 Spring Data Jpa에서 제공하는 어노테이션입니다.
  • 공식 Docs를 보면 @CreatedDate, @LastModifiedDate를 이용해서 엔티티의 변화가 있을때 생성시간/수정시간을 저장할수있음을 알수있습니다.
  • 또한 @CreatedBy, @LastModifiedBy를 이용하면 저장/수정한 유저를 저장할수 있는 기능이 있다고 합니다. 해당 기능은 사용해 본적은 없지만 한번 사용해볼만한 가치가 있는것 같습니다.

만일 엔티티를 생성/수정할때 단순히 시간만 저장하는것 이상으로 특정 로직을 수행하고 싶을때는 어떻게 하면 될까?

4. @PrePersist / @PreUpdate

  • 바로 해당 어노테이션을 이용하면 엔티티 저장/수정때 로직을 수행할수 있습니다.
  • 구현때 저장되는 시간의 형식을 내가 직접 정하고 싶어서 해당 어노테이션을 이용해서 저장했습니다.
  • 해당 BaseEntity를 보면 @CreatedDate, @LastModifiedDate를 제거하고 직접 @PrePersist / @PreUpdate를 이용해서 직접 로직을 구현했습니다.

결론적으로 단순히 시간값만 저장하고 싶을때는 @CreatedDate / @LastModifiedDate를 사용하고 따로 로직을 실행하고 싶을때는 @PrePersist / @PreUpdate를 사용하는게 올바른 방법입니다.

profile
안녕하세요

0개의 댓글