yu-jin-song님의 게시판 구현 게시물을 참고하였습니다.
: JPA(자바의 ORM기술)를 사용해 도메인을 관계형 DB 테이블에 매핑할 때 도메인들이 공통적으로 갖고 있는 필드나 컬럼들이 존재한다. (➡️ 생성일자, 수정일자, 식별자 ...)
도메인마다 공통으로 존재하기 때문에 코드의 중복이 발생한다. 그래서 JPA에서 Audit이라는 기능을 제공하고 있다.
SpringDataJPA에서 시간에 대한 값을 자동으로 넣어주는 기능이다.
원래라면 도메인을 영속성 컨텍스트에 저장하거나, 조회를 수행한 후 update를 하는 경우 매번 시간 데이터를 입력 해주어야 한다.
하지만 audit 기능을 이용하면 자동으로 시간을 매핑해 DB 테이블에 넣어준다.
(audit는 DB값이 변경되었을 때 누가, 언제 변경하였는지 감시한다.)
Auditing은 SpringData JPA에서만 사용할 수 있는 것은 아니다.
JPA 자체적으로도 Auditing 기능을 사용할 수 있지만 SpringData JPA에서 더 깔끔하고 쉽게 제공한다.
@CreatedDate
@LastModifiedDate
@CreateBy
@LastModifiedBy
프로젝트 어플리케이션 파일에 @EnableJpaAuditing
어노테이션을 추가해준다.(Ex. @SpringBootApplication
이 붙어있는 BoardApplication.java)
등록하려는 엔티티 클래스에 @EntityListeners
를 선언하고 AuditingEntityListner
를 등록한다.
(Ex. @EntityListeners(AuditingEntityListener.class)
)
해당 엔티티에 audit할 필드를 정의한다.
@CreatedDate
는 등록 날짜, @LastModifiedDate
는 수정 날짜 필드에 어노테이션을 붙여주기
@CreatedBy
는 작성자 필드, @LastModifiedBy
는 수정자 필드에 어노테이션을 붙여주기
이 클래스들은 불변 객체가 아니기 때문에 multi thread 환경에서 문제 발생의 위험이 항상 존재한다.
Calendar
의 월(month)의 숫자 값은 -1 되어있는 값이다.(Ex. 5월이라면 4)
➡️ Java8부터는 LocalDate
, LocalDateTime
으로 문제 해결
추후 수정
@MappedSuperclass
: JPA Entity 클래스들이 BaseTimeEntity를 상속할 경우 이 클래스의 필드들도 column으로 인식함@EntityListeners(AuditingEntityListener.class
: BaseTimeEntity 클래스에 Auditing 기능 포함@CreatedDate
: Entity가 생성되어 저장될 때 시간 자동 저장@LastModifiedDate
: 조회한 Entity의 값을 변경할 때 시간 자동 저장