Spring이든 뭐든 프로젝트를 하다보면, 테이블의 생성기간과, 수정시간이 필요할 때가 있다.
오늘은 이 테이블에 생성, 수정시간을 기록할 수 있는 컬럼을 효율적으로 작성하는 법에 대해 공부해보자
단순하게 시간을 기록하는 컬럼을 각 테이블(Domain)에 추가해 줘도 되지만, 이렇게 하면 코드의 중복이 생긴다.
그렇다면, JAVA를 JAVA스럽게 사용하기위해서, 상속을 생각해보자
추상 클래스를 만들고 그 안에 멤버변수를 필요한 테이블에 컬럼을 받을 수 있지않을까?????
SPring에서는 이러한 기능을 JPA Auditing 이라고 한다!!@
JPA Auditing 이란
Auddit 이란 = 감시하다, 감사하다 --------- > 즉, 나는 계속해소 탐지하다로 이해를 하려한다.
Java에서 ORM 기술인 JPA를 사용하여 도메인을 관계형 데이터 베이스 테이블에 매핑할 때 공통적으로 도메인들이 가지고있는 필도나 컬럼들이 존재하고, 대표적으로는 생성일자, 수정일자, 식별자 같은 컬럼이 존재합니다.
JPA에서는 Audit이란, Spring Data JPA에서 시간에 대해서 자동으로 값을 넣어주는 기능이 존재합니다.
Audit 의 기능
Audit 은 주로 DB 값이 변경했을 때 누가 값을 변경했고,, 언제 변경했는지 감시(Audit)하는 용도로 사용됩니다.
Spring JPA는 @CreatedDate, @LastModifiedDate, @CreatedBy, @LastModifiedBy 와 같은 어노테이션을 제공합니다.
다시말해 JPA Auditing 이란,
Spring 에서 제공하는 JPA에서, DB 값이 변경되는 걸 감지하는 기능입니다.
JPA Auditing 사용하기
1. Project에 JPA Auditing 쓴다고 알려주기
먼저 Spring Project에 JPA Audit을 사용한다고 알려주어야합니다. (일종의 import)
@EnableJpaAuditing
- - JPA Auditing을 활성화 하기 위한 어노테이션
@SpringBootApplication
@EnableJpaAuditing
public class Week8SpringApplication {
public static void main(String[] args) {
SpringApplication.run(Week8SpringApplication.class, args);
}
}
- 최 상단 RootClass에 @EnableJpaAuditing을 추가함으로써 Audit 기능을 사용할 수 있습니다.
2. 공통적으로 들어가는 부모클래스 만들기
여기서는 일정의 중복 데이터를 명시하는 TimeStamp.class를 만듭니다.
추상화 클래스로써, Entity가 아닙니다.
- - 부모 클래스임을 명시하며 상속받는 클래스에서 멤버변수가 컬럼이 되도록 합니다.
- - 단순히 매핑정보를 상속할 목적으로만 사용됩니다.
@EntityListeners
- - spring 의 data-jpa 사용시 데이터 변경시 알림을 받는 방법이다.
- -@EntityListeners(class_name.class) 로 설정하면, 설정된 도메인의 값이 변경되었을 때를 체크한다.
- @EntityListeners(AuditingEntityListener.class)는 깂ㅇ; 변경되었을 때 자동으로 기록합니다.
@Setter
@Getter
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public abstract class Timestamped {
@CreatedDate
private LocalDateTime createAt;
@LastModifiedDate
private LocalDateTime modifiedAt;
}
@MappedSuperclass | JPA Entity 클래스들이 해당 추상 클래스를 상속할 경우 createDate, modifiedDate를 컬럼으로 인식 |
@EntityListeners(AuditingEntityListener.class | 해당 클래스에 Auditing 기능을 포함 |
@CreatedDate | Entity가 생성되어 저장될 때 시간이 자동 저장 |
@LastModifiedDate | 조회한 Entity의 값을 변경할 때 시간이 자동 저장 |
요롷게 중복으로 들어가는 값을 추상클래스로 만들어서 자식 클래스에 상속만 받으면
@MappedSuperClass로 인해 자동으로 컬럼이 된다!! 끝@
@Entity
@NoArgsConstructor
@Getter
@Setter
public class Article extends Timestamped {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@Column
private String title;
@Column
private String content;
public Article(ArticleRequestDto articleRequestDto){
this.title = articleRequestDto.getTitle();
this.content=articleRequestDto.getContent();
}
}
참조
https://velog.io/@conatuseus/2019-12-06-2212-%EC%9E%91%EC%84%B1%EB%90%A8-1sk3u75zo9
https://umanking.github.io/2019/04/12/jpa-audit/
https://webcoding-start.tistory.com/53
https://erim1005.tistory.com/entry/%EB%8D%B0%EC%9D%B4%ED%84%B0-%EB%B3%80%EA%B2%BD-%EC%95%8C%EB%A6%BC-EntityListeners - EntityLeasner
'Spring > Spring Boot' 카테고리의 다른 글
[@RequestParam Vs @PathVariable] - Spring URL 파라미터 값 받아오기 (0) | 2021.11.23 |
---|---|
[Spring] Controller에서 html page return rendering 하기 (@RestController VS @Controller) (0) | 2021.11.23 |
[Spring] 09. DI(의존성 주입) 과 IOC 컨테이너 (0) | 2021.11.12 |
[Spring] 08. Controller 만들기 - 스피링 API (Get, POST, PUT, DELETE) (0) | 2021.11.11 |
[Spring] 07. DTO를 사용하는 이유 - Data Transfer Object (0) | 2021.11.11 |