-
Entity에 JPA Auditing 적용해서 중복코드 줄이기Project 2023. 6. 27. 17:12
현재 대부분의 Entity 마다 registerAt, updatedAt, deletedAt 컬럼이 중복으로 선언되어 있는 상태이다.
class Member{ //생략 @Column(name = "register_at") private Timestamp registeredAt; @Column(name = "updated_at") private Timestamp updatedAt; @Column(name = "deleted_at") private Timestamp deletedAt; @PrePersist void registeredAt() { this.registeredAt = Timestamp.from(Instant.now()); } @PreUpdate void updatedAt() { this.updatedAt = Timestamp.from(Instant.now()); } // 생략 }
새 엔티티를 만들어 줄 때마다 추가하는게 번거로우니 Spring data jpa에서 제공하는 Audit 기능을 활용하여 중복을 제거해보자.
# dependency 추가
dependencies { implementation 'org.springframework.boot:spring-boot-starter-data-jpa' }
# 엔트리 포인트에 @EnableJpaAuditing 추가
@SpringBootApplication @EnableJpaAuditing public class SnsApplication { public static void main(String[] args) { SpringApplication.run(SnsApplication.class, args); }
@EnableJpaAuditing를 통해 spring data jpa에서 제공하는 감사(Audit)기능을 활성화 시킨다.
# baseEntity 선언
@MappedSuperclass @EntityListeners(AuditingEntityListener.class) @Getter public abstract class BaseDateEntity { @CreatedDate @Column(name = "registed_at") private Timestamp registeredAt; @LastModifiedDate @Column(name = "updated_at") private Timestamp updatedAt; }
BaseEntity는 공통으로 사용되는 날짜 필드들을 제공하기 위한 클래스이기 때문에, 직접 인스턴스화할 필요가 없다. 따라서 추상 클래스로 선언하여 해당 클래스의 인스턴스를 생성하고 사용하는것을 방지했다.
그리고 @MappedSuperclass를 붙임으로 해당 클래스가 공통으로 사용되는 매핑정보를 정의했다는 의미를 나타냄과 동시에 해당 클래스를 상속받는 엔티티클래스에서 테이블과 매핑될 수 있도록 했다.
그리고 @EntityListeners를 붙여 해당 클래스의 Audit 기능을 감지하고 처리할 수 있도록 했다.
#Spring Data JPA가 Auditing 기능으로 제공하는 어노테이션
- @CreatedDate: 엔티티가 생성될 때 해당 필드에 현재 일시를 자동으로 저장
- @LastModifiedDate: 엔티티가 수정될 때 해당 필드에 현재 일시를 자동으로 저장
- @CreatedBy: 엔티티가 생성될 때 해당 필드에 생성한 사용자의 정보를 자동으로 저장
- @LastModifiedBy: 엔티티가 수정될 때 해당 필드에 수정한 사용자의 정보를 자동으로 저장
Spring Data JPA에서는 엔티티의 생명주기 관련 필드들을 편리하게 관리할 수 있도록 해당 어노테이션들을 제공한다.
@CreatedBy로 사용자의 정보를 저장하려면 AuditorAware 인터페이스를 구현하여 사용자 정보를 가져오는 로직을 추가로 작성해야한다.
# 사용할 Entity에 extends 추가
@Entity @Table(name = "\"post\"") @Getter @NoArgsConstructor @SQLDelete(sql = "UPDATE post SET deleted_at = NOW() where id = ?") @Where(clause = "deleted_at is NULL") public class Post extends BaseDateEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; //생략.. }
기존에 작성된 컬럼들은 지우고 extends로 BaseDateEntity를 상속받는다
2번 id를 가진 멤버가 JPA auditing 활성화 전, 4번 id를 가진 멤버가 활성화 이후 저장된 멤버이다.
DB를 확인해봤을때 register_at, updated_at이 입력되어 있음을 확인할 수 있다.
'Project' 카테고리의 다른 글
[배포자동화구축] 2-1. AWS EC2에 jenkins 설치하여 배포서버 구축하기 (0) 2023.10.14 [배포자동화구축] 1. Github Actions로 CI 구축하기 (2) 2023.10.13 [배포자동화구축] 0. 배포전략 세우기 (0) 2023.10.13 Spring REST API에 Swagger 3.0 적용하기 (0) 2023.07.02 spring boot 프로젝트에서 profile 분리하기 (local, prod, common 환경을 분리해서 구성하기) (0) 2023.04.08