일반적으로 DB 테이블을 설계할 때, 데이터에 대한 (등록일 / 수정일), 더 나아가 (등록자 / 수정자) 컬럼을 포함하는 경우가 많다. 해당 컬럼을 추가함으로써 서비스 운영시 데이터를 추적하거나, 문제가 발생했을 때 원인을 찾는데 이점이 있기 때문이다.
그런데 그렇게 되면, 모든 엔티티에 위 컬럼에 해당하는 정보들이 들어가고, 등록이나 수정이 발생할 때 마다, 해당 필드에 값을 넣어주는 로직이 필요할 것이다.
JPA 는 이를 위해 Auditing
이라는 편의를 제공한다.
먼저 예시를 확인해보기 전에, (등록일 / 수정일) 을 가지는 모든 엔티티에 해당 변수들을 중복해서 작성하는 것은 효율적이지 않다. 따라서 중복되는 필드를 별도의 클래스로 분리해서 각 엔티티에서 상속받고, @MappedSuperclass
를 통해 공통 매핑 정보로 사용되도록 했다.
@MappedSuperclass
public class BaseEntity {
@Column(updatable = false)
private LocalDateTime createdDate;
private LocalDateTime lastModifiedDate;
}
public class Member extends BaseEntity {
@Id
@GeneratedValue
@Column(name = "member_id")
private Long id;
private String username;
}
스프링 데이터 JPA 를 통해 Auditing
을 적용하기 위해서는 다음 두 설정이 필요하다.
@EnableJpaAuditing
: 스프링 부트 설정 클래스에 적용@EnableJpaAuditing
라는 애노테이션을 적용해야 Auditing
기능이 동작한다.AuditorAware
는 ( 등록자 / 수정자 ) 처리를 위해 필요하다.@CreatedBy
와 @LastModifiedBy
에서 해당 메서드를 호출해서 결과물을 꺼내간다. 따라서 실무에서는 위 예시처럼 UUID
가 아닌, 현재 사용자의 세션 정보 등에서 적절한 값을 반환하면 된다.@EnableJpaAuditing(modifyOnCreate = false)
옵션을 사용하면 된다.@EntityListeners(AuditingEntityListener.class)
: 엔티티에 적용@CreatedDate
)@LastModifiedDate
)@createdBy
)@LastModifiedBy
)이제 필요한 엔티티에서 이것들을 상속해서 사용하면 된다.
강의를 듣고 정리한 글입니다. 코드와 그림 등의 출처는 김영한 강사님께 있습니다.