ORM(Object Relationship Mapping) 인 JPA는 Entity 와 데이터베이스의 Table을 서로 매핑하여 사용합니다.
여기서 데이터베이스(DB)는 어떠한 데이터를 누가, 언제 생성 또는 수정했는지 기록하는것이 중요합니다.
그 데이터들은 하나의 테이블이 아닌 많은 테이블에서 사용될 가능성이 높고, Entity가 생성 또는 수정될때 마다 개발자가 신경 써서 데이터를 입력해 줘야하는 귀찮은일이 생깁니다.
이때 편리하게 사용가능하게 만든 기술이 Auditing 이라는 것입니다.
Audit은 감독, 검사의 의미로 데이터를 지켜보면서 생성 또는 업데이트(수정)이 일어난다면 자동으로 그 값을 넣어주는 역할을 합니다.
@SpringBootApplication
@EnableJpaAuditing
public class BookmanagerApplication {
public static void main(String[] args) {
SpringApplication.run(BookmanagerApplication.class, args);
}
}
먼저 위와 같이 Spring Boot Application 에 @EnableJpaAuditing 이라는 어노테이션을 추가합니다.
@Data
@MappedSuperclass
@EntityListeners(value = AuditingEntityListener.class)
public class BaseEntity {
@CreatedDate
private LocalDateTime createdAt;
@LastModifiedDate
private LocalDateTime updatedAt;
}
Auditing 기능을 사용할 Entity에서 상속받을 BaseEntity를 추가합니다.
public interface Auditable {
LocalDateTime getCreatedAt();
LocalDateTime getUpdatedAt();
void setCreatedAt(LocalDateTime createdAt);
void setUpdatedAt(LocalDateTime updatedAt);
}
추가로 위와 같은 Auditable 이라는 인터페이스를 생성해줍니다. (Get/Set)
@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 인터페이스를 모두 상속시켜주면 완성입니다.
@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 의 컬럼이 자동으로 추가 되고 기록되는것을 확인할 수 있습니다.