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 요청을 보내면 다음과 같습니다.
리턴 값으로 User가 저장된 후 해당 User의 id인 1이 리턴된 것을 확인할 수 있고 아래와 같이 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로도 데이터가 잘 조회되는 것을 확인하실 수 있습니다.
'Spring' 카테고리의 다른 글
[Spring][Error] Spring Security 적용할 때 circular reference, dependency가 cycle 형성하는 것 해결하기 (2) | 2022.03.14 |
---|---|
AWS RDS(MariaDB)와 IntelliJ Database 연동하기 - [스프링 부트와 AWS로 혼자 구현하는 웹 서비스] (0) | 2022.03.05 |
SpringBoot 간단한 CRUD REST API 구현 및 JUnit5로 테스트하기 (0) | 2022.02.26 |
Spring Data JPA & H2 데이터베이스 연결하기(인메모리, TCP) (0) | 2022.02.24 |
Spring Initializr로 Spring Boot 프로젝트 생성하고 IntelliJ에서 GitHub 연동하기 (0) | 2022.02.22 |
댓글