[JPA] Audit 사용하기

오늘은 Spring Data JPA가 제공하는 Audit 기능을 알아보자. Audit은 주로 DB값이 변경했을 때 누가 값을 변경했고, 언제 변경했는지 Audit(감사)하는 용도로 사용한다. Spring Data JPA는 @CreatedDate, @LastModifiedDate, @CreatedBy, @LastModifiedBy 와 같은 어노테이션을 제공한다.

1. @EnableJpaAuditing 추가

@EnableJpaAuditing 어노테이션을 RootClass의 최 상단에 추가한다.

1
2
3
4
5
@SpringBootApplication
@EnableJpaAuditing
public class Application {
// 생략
}

2. 해당 Entity에 AuditingEntityListener 를 등록

해당 엔티티에 클래스 레벨에 @EntityListeners를 선언하고,AuditingEntityListner를 등록한다.

1
2
3
4
5
6
7
8
9
10
11
@Data
@Entity
// 엔티티 리스너 등록
@EntityListeners(AuditingEntityListener.class)
public class Comment {

@Id
@GeneratedValue
private Long id;
private String comment;

3. Audit할 날짜 필드를 정의한다.

해당 엔티티에 Audit을 할 필드를 정의한다. (생성일,수정일 )

1
2
3
4
5
6
7
// Audit 날짜 field를 정의한다.
@CreatedDate
private Date createdDate;

@LastModifiedDate
private Date lastModifiedDate;

4. Audit하는 작성자 필드를 정의한다.

1
2
3
4
5
6
7
8
9
// Audit 작성자 field를 정의한다.
@CreatedBy
@ManyToOne
private Account createdBy;

@LastModifiedBy
@ManyToOne
private Account updatedBy;

DB의 변경사항을 일으키는 Author를 Account클래스의 객체와 매핑했다.
Account 클래스는 다음과 같다.

1
2
3
4
5
6
7
8
9
10
11
@Entity
@Data
public class Account {

@Id
@GeneratedValue
private Long id;

private String username;
private String password;
}

@CreatedBy@LastModifiedBy 는 Spring Security의 ContextHolder안에 들어있는 Principal(신원정보)의 name값으로 매핑을 해준다.
만약에 Custom하게 구현할려면 아래와 같이 AuditorAware 인터페이스를 구현해야 한다.
Spring Security의 ContextHolder에 존재하는 Authentication 정보를 통해서 매핑한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
@Service
public class AccountAwareAudit implements AuditorAware<Comment> {

@Override
public Optional<Comment> getCurrentAuditor() {
// Spring Security를 통한 Auditor 매핑
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
if (authentication == null || !authentication.isAuthenticated()) {
return null;
}

return ((MyUserDetails) authentication.getPrincipal()).getUser();
}

이렇게 만든 빈(AccountAwareAudit)을 참조할 수 있도록 @EnableJpaAuditing의 auditorAwareRef 속성값으로 등록 해준다.

1
2
3
4
5
6
@SpringBootApplication
@EnableJpaAuditing(auditorAwareRef = "accountAwareAudit")
public class Application {

// 생략
}

정리

Spring Data Jpa가 제공하는 엔티티의 변화를 추적하는 Audit 기능에 대해서 알아보았다.
날짜 Audit은 제공해준 어노테이션 기반으로 구현할 부분이 없었지만, 작성자에 관한 부분은 대부분 Spring Security를 사용하기 때문에 ContextHolder를 통해서 신원정보를 가져와서 매핑해 주었다.

참고자료

[JPA]@Transactional를 통한 Optimization

Spring Data Jpa에서 제공하는 JpaRepository의 구현체인 SimpleJpaReposity@Transactional을 어떻게 사용하는지 살펴보고, 실제 우리 서비스에서 어떻게 적용하면 좋을지에 대해서 생각해보자.

자세히 보기

[JPA] QueryDSL 설정방법

JPA에서 QueryDsl를 사용하는 방법에 대해서 알아보자. QueryDSL은 쿼리 domain specific language로 도메인에 맞게 쿼리를 프로그링 할 수 있다는 것이다.

자세히 보기

[JPA] null 처리

JPA에서 null처리 하는 방법에 대해서 알아 보자.

자세히 보기

[JPA] 연관관계 매핑 기초(다대일, 연관관계 주인)

들어가며

JPA 연관관계 매핑중, 실무에서 가장 많이 쓰이는 1:N (일대다) 매핑에 대해서 알아보자.
일대다 매핑을 하기 위해서 하나의 팀에 여러명의 멤버가 속해있는, 1:N 관계를 생각해보자.
관계 매핑에는 방향성외래키의 주인 두 가지 상황이 발생 한다.(객체와 테이블간의 패러다임 불일치 때문에)
일반적으로 객체에서는 참조를 통해서 방향성을 갖는다.

자세히 보기