Just Do IT!
[JPA] @EnableJpaAuditing 사용하기 본문
JPA를 공부하면서, 확실히 그냥 mybatis를 사용하는 것보다 훨씬 편하다는 걸 느낀다.
그렇지만 정해진 시간 내에 진도를 나가야 하니까 너무 정신 없어서...공부가 더 필요함을 느끼기도 한다(ㅋㅋㅋ)
아무튼,
오늘 블로그 CRUD 실습을 하면서 새로운 걸 배우게 되어서 블로그에 기록을 하려 한다.
어차피 계속 테이블을 생성하면서 쓸 거 같아서...
우선!
데이터를 생성하거나 수정할때 생성일과 수정일을 항상 포함시켜서 테이블을 설계한다.
수업에서 배웠던 실습을 예시로 들어서 설명해보자면,
글을 작성할 때 title, content, created_at, updated_at이 필요할 것이다.
(id는 필수이므로 굳이 언급하지 않겠다.)
그러면 테이블에는
- id
- title
- content
- created_at
- updated_at
- deleted_at
이런 필드가 필요한데, 여기서 생성/수정/삭제 관련은 항상 업데이트가 된다.
새롭게 글을 작성할 때마다 row가 추가되는데 그 때마다 시간을 정해주어야 하고, 만약 수정되면 수정된 날짜를 업데이트해줘야 하기 때문이다.
@EnableJpaAuditing를 사용하지 않는 경우?
그냥 구현할 수 있다.
간단하게 생성자를 생성하거나 setter 메소드를 활용하면 된다.
하지만 매번 코드로 작성하면 번거롭기도 하고 귀찮다.
지금은 하나지만 엔티티가 여러 개인 경우 일일히 정해줘야 하므로 코드의 양도 길어지고 비효율적이다.
그래서 @EnableJpaAuditing를 사용하는 것이다.
@EnableJpaAuditing 사용하기
엔티티 객체가 생성이 되거나 변경될 때 @EnableJpaAuditing 어노테이션을 활용하여 자동으로 값을 등록할 수 있다.
1. 의존성 추가
@EnableJpaAuditing 어노테이션은 Spring Data에서 제공하므로 build.grade 에 의존성을 추가해야 한다.
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
중간에 이 어노테이션을 사용하려면 추가하고 refresh gradle project를 하고 다시 시작하면 적용이 된다.
만약 프로젝트 생성할 때 추가했다면, 이미 적용되어 잇을 것이다.
2. entity 생성
package com.kosta.entity;
import java.time.LocalDateTime;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.EntityListeners;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import lombok.Builder;
import lombok.Data;
import lombok.RequiredArgsConstructor;
@Entity
// hibernate가 DB에 어떤 행위를 하는 시점이나 그 이후 등 호출될 수 있는 콜백함수를 제공
// DB에 엔티티를 저장하기 전에 특정 행위를 할 수 있게 해준다.
@EntityListeners(AuditingEntityListener.class)
@RequiredArgsConstructor
@Data
public class Article {
@Id // 기본키 설정
@GeneratedValue(strategy = GenerationType.IDENTITY) // 자동으로 증가
@Column(name = "id", updatable = false) // update 시에 id 컬럼은 제외한다
private long id;
@Column(name = "title", nullable = false) // not null
private String title;
@Column(name = "content", nullable = false)
private String content;
@CreatedDate
@Column(name = "created_at")
private LocalDateTime createdAt;
@LastModifiedDate
@Column(name = "updated_at")
private LocalDateTime updatedAt;
@Builder()
public Article(int id, String title, String content) {
this.id = id;
this.title = title;
this.content = content;
}
}
기존에는 title, content만 있었는데 createdAt과 updatedAt을 추가해주었다.
주석에도 적었다시피,
@EntityListeners(AuditingEntityListener.class) 는 JPA entity에 이벤트가 발생할 코드를 실행한다.
@CreatedDate : 생성 일자를 관리하는 필드에 현재 날짜를 주입하는 작업을 수행
@LastModifiedDate : 마지막으로 수정한 날짜를 주입하는 작업을 수행
3. JPA Auditing 활성화
그렇지만 위의 순서까지만 하면 적용되지 않는다.
해당 프로젝트에서 Auditing을 활성화를 하지 않았기 때문이다.
이걸 활성화하기 위해서는 가장 상단의 Application.java 파일에 추가해주어야 한다.
package com.kosta;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.data.jpa.repository.config.EnableJpaAuditing;
@EnableJpaAuditing
@SpringBootApplication
public class BlogProjApplication {
public static void main(String[] args) {
SpringApplication.run(BlogProjApplication.class, args);
}
}
위의 예시처럼,
@EnableJpaAuditing을 추가해주어야 DB에 테이블이 생성되고, 글을 작성할 때마다 함께 시간이 저장되는 걸 볼 수 있다.
이런 식으로 글을 작성한 시간이 creatd_at에 저장되고,
만약 수정한 경우에는 updated_at의 시간이 변경된다.
간단한 예시를 통해 적용해보았는데, 나중에 CRUD 작업을 할 때 무조건 필요하겠다 싶어서 기록해두었다.
이러한 순서를 바탕으로 꼭 알아두어야겠다.
'개발 공부 > Spring' 카테고리의 다른 글
[Spring Boot] 프로젝트 빌드해서 jar 파일 생성/실행해보기 (0) | 2024.08.30 |
---|---|
[Spring] Spring Security 기본 개념 정리 & 예시 (0) | 2024.08.23 |
SpringBoot, JPA 구조 이해하기 (0) | 2024.08.21 |
[Spring] 외부의 정적 리소스 요청 시 WebMvcConfigurer 사용하기 (0) | 2024.08.20 |
[Spring] ResponseEntity란? (0) | 2024.08.13 |