[SPRING] JPA Auditing

RuiN·2022년 7월 27일
0

Auditing

ORM(Object Relationship Mapping) 인 JPA는 Entity 와 데이터베이스의 Table을 서로 매핑하여 사용합니다.
여기서 데이터베이스(DB)는 어떠한 데이터를 누가, 언제 생성 또는 수정했는지 기록하는것이 중요합니다.

그 데이터들은 하나의 테이블이 아닌 많은 테이블에서 사용될 가능성이 높고, Entity가 생성 또는 수정될때 마다 개발자가 신경 써서 데이터를 입력해 줘야하는 귀찮은일이 생깁니다.

이때 편리하게 사용가능하게 만든 기술이 Auditing 이라는 것입니다.
Audit은 감독, 검사의 의미로 데이터를 지켜보면서 생성 또는 업데이트(수정)이 일어난다면 자동으로 그 값을 넣어주는 역할을 합니다.

Auditing Active

@SpringBootApplication
@EnableJpaAuditing
public class BookmanagerApplication {

    public static void main(String[] args) {
        SpringApplication.run(BookmanagerApplication.class, args);
    }

}

먼저 위와 같이 Spring Boot Application 에 @EnableJpaAuditing 이라는 어노테이션을 추가합니다.


BaseEntity Create

@Data
@MappedSuperclass
@EntityListeners(value = AuditingEntityListener.class)
public class BaseEntity {
    @CreatedDate
    private LocalDateTime createdAt;

    @LastModifiedDate
    private LocalDateTime updatedAt;
}

Auditing 기능을 사용할 Entity에서 상속받을 BaseEntity를 추가합니다.

  • @MappedSuperClass = 공통적인 매핑 정보가 필요할때 사용
  • @CreatedDate = 생성 날짜 자동 저장 어노테이션
  • @LastModifiedDate = 수정(업데이트) 날짜 자동 저장 어노테이션

Auditable Interface

public interface Auditable {
    LocalDateTime getCreatedAt();
    LocalDateTime getUpdatedAt();

    void setCreatedAt(LocalDateTime createdAt);
    void setUpdatedAt(LocalDateTime updatedAt);
}

추가로 위와 같은 Auditable 이라는 인터페이스를 생성해줍니다. (Get/Set)


Entity

@Entity
@NoArgsConstructor
@Data
@ToString(callSuper = true)
@EqualsAndHashCode(callSuper = true)
public class UserHistory extends BaseEntity implements Auditable {

    @Id
    @GeneratedValue
    private Long id;

    private Long userId;

    private String name;

    private String email;

BaseEntity와 Auditable 인터페이스를 모두 상속시켜주면 완성입니다.


Junit Test

   @DisplayName("5. userHistoryTest")
    @Test
    void userHistoryTest(){
        User user = new User();
        user.setEmail("martin-new@fastcampus.com");
        user.setName("martin-new");
        userRepository.save(user);

        user.setName("martin-new-new");

        userRepository.save(user);

        userHistoryRepository.findAll().forEach(System.out::println);
    }

위와 같이 테스트를 작성한 후 , 실행 결과를 보면

Hibernate: 
   
   create table user_history (
      id bigint not null,
       created_at timestamp,
       updated_at timestamp,
       email varchar(255),
       name varchar(255),
       user_id bigint,
       primary key (id)
   )

다음과 같이 Created_at 과 Updated_at 의 컬럼이 자동으로 추가 되고 기록되는것을 확인할 수 있습니다.

profile
어디까지 올라갈지 궁금한 하루

0개의 댓글