[SpringBoot][SpringDataJPA] 게시판 구현 (2)

윤경·2022년 1월 18일
0

Spring Boot

목록 보기
67/79

yu-jin-song님의 게시판 구현 게시물을 참고하였습니다.


JPA Auditing

: JPA(자바의 ORM기술)를 사용해 도메인을 관계형 DB 테이블에 매핑할 때 도메인들이 공통적으로 갖고 있는 필드나 컬럼들이 존재한다. (➡️ 생성일자, 수정일자, 식별자 ...)

도메인마다 공통으로 존재하기 때문에 코드의 중복이 발생한다. 그래서 JPA에서 Audit이라는 기능을 제공하고 있다.
SpringDataJPA에서 시간에 대한 값을 자동으로 넣어주는 기능이다.

원래라면 도메인을 영속성 컨텍스트에 저장하거나, 조회를 수행한 후 update를 하는 경우 매번 시간 데이터를 입력 해주어야 한다.

하지만 audit 기능을 이용하면 자동으로 시간을 매핑해 DB 테이블에 넣어준다.
(audit는 DB값이 변경되었을 때 누가, 언제 변경하였는지 감시한다.)

Auditing은 SpringData JPA에서만 사용할 수 있는 것은 아니다.

JPA 자체적으로도 Auditing 기능을 사용할 수 있지만 SpringData JPA에서 더 깔끔하고 쉽게 제공한다.

제공하는 어노테이션

  • @CreatedDate
  • @LastModifiedDate
  • @CreateBy
  • @LastModifiedBy
    ...

Audit 사용하기

1. @EnableJpaAuditing 추가하기

프로젝트 어플리케이션 파일에 @EnableJpaAuditing 어노테이션을 추가해준다.(Ex. @SpringBootApplication이 붙어있는 BoardApplication.java)

2. 필요한 Entity에 AuditingEntityListener 등록하기

등록하려는 엔티티 클래스에 @EntityListeners를 선언하고 AuditingEntityListner를 등록한다.
(Ex. @EntityListeners(AuditingEntityListener.class))

3. audit할 필드 정의하기

해당 엔티티에 audit할 필드를 정의한다.

@CreatedDate등록 날짜, @LastModifiedDate수정 날짜 필드에 어노테이션을 붙여주기

@CreatedBy작성자 필드, @LastModifiedBy수정자 필드에 어노테이션을 붙여주기


Date, Calendar 클래스 문제점

이 클래스들은 불변 객체가 아니기 때문에 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의 값을 변경할 때 시간 자동 저장

JPA Audit 참고1
JPA Audit 참고2
JPA Audit 참고3
게시판 구현 참고

profile
개발 바보 이사 중

0개의 댓글