ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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이 입력되어 있음을 확인할 수 있다. 

Designed by Tistory.