본문 바로가기
Spring

JPA Auditing으로 Entity의 createdDate, modifiedDate 관리

by wadekang 2022. 2. 26.

JPA Auditing?

데이터를 관리하는데 있어서 생성시점, 수정시점 등 언제 데이터가 변경되었는지 기록해 두는 것은 매우 중요합니다. 그리고 이러한 것들은 한 엔티티에 국한된 것이 아니라 모든 엔티티에 적용됩니다. 중복을 편하게 해결하기 위해 Spring Data는 엔티티를 생성하거나 변경한 시점을 추적하기 위한 것들을 제공합니다. 이 기능을 이용하면 데이터를 생성하거나 수정할 때 따로 로직을 구현하지 않아도 자동적으로 시간 데이터를 관리해줍니다. 

 

예제로 확인하기 위해 먼저 간단하게 Entity, Controller, Repository, Service를 구현하였습니다.

 

User.java
package com.example.practice.impl;

import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;

import javax.persistence.*;

@Entity
@Getter
@NoArgsConstructor
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(nullable = false)
    private String name;

    @Column(nullable = false)
    private int age;

    @Builder
    public User(String name, int age) {
        this.name = name;
        this.age = age;
    }
}
UserController.java
package com.example.practice.impl;

import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;

@RequiredArgsConstructor
@RestController
public class UserController {

    private final UserService userService;

    @GetMapping("/user/{id}")
    public User getUser(@PathVariable Long id) {
        return userService.findById(id);
    }

    @PostMapping("/user")
    public Long save(@RequestParam String name, @RequestParam int age) {
        return userService.save(name, age);
    }
}
UserRepository.java
package com.example.practice.impl;

import org.springframework.data.jpa.repository.JpaRepository;

public interface UserRepository extends JpaRepository<User, Long> {
}
UserService.java
package com.example.practice.impl;

import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@RequiredArgsConstructor
@Service
public class UserService {

    private final UserRepository userRepository;

    public User findById(Long id) {
        return userRepository.findById(id).get();
    }

    @Transactional
    public Long save(String name, int age) {
        return userRepository.save(User.builder()
                .name(name)
                .age(age)
                .build()).getId();
    }
}

 

위의 구현에서 데이터를 저장하기 위해 Postman으로 POST 요청을 보내면 다음과 같습니다.

Postman POST 요청 보내기

리턴 값으로 User가 저장된 후 해당 User의 id인 1이 리턴된 것을 확인할 수 있고 아래와 같이 DB에 적용된 것도 볼 수 있습니다.

POST 요청 DB에 반영

이제 JPA Auditing 기능을 이용하기 위해 다음의 코드를 구현해 줍니다.

BaseTimeEntity.java
package com.example.practice.impl;

import lombok.Getter;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;

import javax.persistence.EntityListeners;
import javax.persistence.MappedSuperclass;
import java.time.LocalDateTime;

@Getter
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public abstract class BaseTimeEntity {

    @CreatedDate
    private LocalDateTime createdDate;

    @LastModifiedDate
    private LocalDateTime modifiedDate;
}

@MappedSuperClass : 다른 엔티티들이 BaseTimeEntity를 상속할 경우 BaseTimeEntity의 필드를 컬럼으로 인식

@EntityListeners(AuditingEntityListener.class) : Auditing 기능 포함

 

위의 엔티티를 구현하고 User 엔티티에서 위의 엔티티를 상속받아 줍니다.

User.java
package com.example.practice.impl;

import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;

import javax.persistence.*;

@Entity
@Getter
@NoArgsConstructor
public class User extends BaseTimeEntity {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(nullable = false)
    private String name;

    @Column(nullable = false)
    private int age;

    @Builder
    public User(String name, int age) {
        this.name = name;
        this.age = age;
    }
}

 

마지막으로 JPA Auditing 기능을 활성화하기 위해 main 메소드가 있는 클래스에 @EnableJpaAuditing 어노테이션을 추가합니다.

package com.example.practice;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.data.jpa.repository.config.EnableJpaAuditing;

@EnableJpaAuditing
@SpringBootApplication
public class PracticeApplication {

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

}

 

이제 애플리케이션을 실행하면 User 테이블에 created_date 컬럼과 modified_date 컬럼이 추가된 것을 확인할 수 있습니다.

Postman으로 POST 요청을 보내 데이터를 저장해보도록 하겠습니다.

데이터를 저장하기 위해 Postman으로 요청을 보내면 정상적으로 저장된 후 저장된 User의 Id 값인 1을 리턴 받고, 오른쪽과 같이 DB에 데이터가 시간과 함께 적용된 것을 확인하실 수 있습니다. 

 

구현한 API로도 데이터가 잘 조회되는 것을 확인하실 수 있습니다.

 

 

 

댓글