본문 바로가기
코딩 공부/web & Java

[JPA] JPA Auditing

by 현장 2024. 2. 11.

JPA Auditing

Java에서 ORM 기술인 JPA를 사용하여 도메인을 관계형 데이터베이스 테이블에 매핑할 때 공통적으로 도메인들이 가지고 있는 필드나 컬럼들이 존재합니다. 대표적으로 생성일, 수정일같은 필드 및 컬럼으로 데이터베이스에서 누가, 언제하였는지 기록을 잘 남겨놓아야 하기 때문에 이 컬럼은 대단히 중요한 데이터 입니다. 또한 도메인마다 공통으로 존재한다는 의미는 결국 코드가 중복된다는 말과 일맥상통합니다.

그래서 JPA에서는 Audit이라는 기능을 제공하고 있습니다. Audit은 감시하다, 감사하다라는 뜻으로 Spring Data JPA에서 시간에 대해서 자동으로 값을 넣어주는 기능입니다. 도메인을 영속성 컨텍스트에 저장하거나 조회를 수행한 후에 update를 하는 경우 매번 시간 데이터를 입력하여 주어야 하는데, audit을 이용하면 자동으로 시간을 매핑하여 데이터베이스의 테이블에 넣어주게 됩니다.

🏷️ 의존성

dependencies {
    compile('org.springframework.boot:spring-boot-starter-web')
    compile('org.projectlombok:lombok')
    compile('org.springframework.boot:spring-boot-starter-data-jpa')
}

기본적으로 스프링 부트에서 gradle로 의존성을 관리하게 될 경우 spring-boot-starter-data-jpa만 추가해도 Audit을 하는데는 문제가 없습니다.

🏷️ 사용 예제 코드

✅ AuditingFields 작성

@Getter
@ToString
@EntityListeners(AuditingEntityListener.class)
@MappedSuperclass
public abstract class AuditingFields {
    // 날짜와 시간을 표현하는 방식을 지정하는 애노테이션
    // ISO 8601 형식에 따라 날짜와 시간을 표현할 것임을 나타냅니다.
    @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME)
    @CreatedDate
    @Column(nullable = false, updatable = false)
    protected LocalDateTime createdAt; // 생성 일시

    @CreatedBy
    @Column(nullable = false, updatable = false, length = 100)
    protected String createdBy; // 생성자

    @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME)
    @LastModifiedDate
    @Column(nullable = false)
    protected LocalDateTime modifiedAt; // 수정 일시

    @LastModifiedBy
    @Column(nullable = false, length = 100)
    protected String modifiedBy; // 수정자
}

✔️ 어노테이션 설명

어노테이션 설명
@MappedSuperclass JPA Entity 클래스들이 해당 추상 클래스를 상속할 경우 createDate, modifiedDate를 컬럼으로 인식
@EntityListeners(AuditingEntityListener.class) 해당 클래스에 Auditing 기능을 포함
@CreatedDate Entity가 생성되어 저장될 때 시간이 자동 저장
@LastModifiedDate 조회한 Entity의 값을 변경할 때 시간이 자동 저장

✅ 클래스 상속

@Getter
@ToString
@Entity
public class UserAccount extends AuditingFields{

    @Id
    @Column(length = 50)
    private String userId;

    @Setter @Column(nullable = false) private String userPassword;

    @Setter @Column(length = 100) private String email;
    @Setter @Column(length = 100) private String nickname;
    @Setter private String memo;

    // 생략...
}

 Auditing 활성화

@EnableJpaAuditing 
@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

📖 Reference

준영이의 웹 까페

'코딩 공부 > web & Java' 카테고리의 다른 글

[Java] Lombok  (0) 2024.03.10
[JPA] findById와 getReferenceById  (0) 2024.03.09
[Java] Optional  (1) 2024.01.27
[Java] 함수형 인터페이스(Functional Interface)  (1) 2024.01.21
[Java] Stream  (0) 2024.01.20