[Spring Boot] 게시판 구현 3 - JPA Auditing으로 생성시간/수정시간 자동화하기

joyful·2021년 4월 30일
1

Java/Spring

목록 보기
12/28

보통 엔티티에는 생성하거나 수정주체시기에 대한 정보를 포함하는데, 이는 차후 유지보수에 있어서 중요한 역할을 한다. 따라서 이러한 정보는 모든 도메인에 공통으로 존재하며, 이를 처리하는 코드를 모든 도메인에 일일이 포함해주어야 한단 뜻이다. 이는 매우 비효율적인 작업이라고 할 수 있다.

그래서 JPA에서 제공하는 Audit이라는 기능을 사용하여 이러한 작업을 자동화 할 것이다. 이 기능은 자동으로 시간을 매핑하여 데이터베이스의 테이블에 넣어주는 역할을 수행한다.

📝 Date/Calendar 클래스

기존에 사용하던 DateCalendar 클래스는 다음과 같은 문제점들이 존재했다.

  1. 불변 객체가 아니다.
    • 멀티스레드 환경에서 문제 발생의 위험이 항상 존재
  2. Calendar의 잘못된 월(Month) 값 설계
    • 지정된 상수의 숫자 값이 월-1
      ex) Calendar.OCTOBER = 9

이러한 문제점들은 오픈소스를 사용하여 해결하다가, Java8부터는 문제점을 해결하여 등장한 LocalDateLocalDateTime 클래스를 사용하고 있다.


📝 JPA Auditing

LocalDateLocalDateTime이 데이터베이스에 제대로 매핑되지 않는 이슈는 Hibernate 5.2.10 버전에서 해결되었다. Spring Boot 2.x 버전부터는 기본적으로 해당 버전을 사용하므로 별다른 설정없이 바로 적용이 가능하다.

domain 패키지에 BaseTimeEntity 클래스를 생성한다.

BaseTimeEntity

@Getter
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public abstract class BaseTimeEntity {

    @CreatedDate
    private LocalDateTime created;

    @LastModifiedDate
    private LocalDateTime modified;
}

모든 Entity의 상위 클래스로 Entity들의 생성시간 및 수정시간을 자동으로 관리하는 역할을 수행한다.

💻 코드 분석

  1. @MappedSuperclass
    • JPA Entity 클래스들이 BaseTimeEntity를 상속할 경우 이 클래스의 필드들도 칼럼으로 인식하도록 설정
  2. @EntityListeners(AuditingEntityListener.class)
    • BaseTimeEntity 클래스에 Auditing 기능 포함
  3. @CreatedDate
    • Entity가 생성되어 저장될 때 시간 자동 저장
  4. @LastModifiedDate
    • 조회한 Entity의 값을 변경할 때 시간 자동 저장

Board 클래스가 BaseTimeEntity를 상속받을 수 있도록 변경한다.

	...
public class Board extends BaseTimeEntity {
	...
}

마지막으로 JPA Auditing 어노테이션들을 모두 활성화하기 위해 Application 클래스에 활성화 어노테이션을 추가한다.

@EnableJpaAuditing
@SpringBootApplication
public class Application {
	public static void main(String[] args) {
		SpringApplication.run(Application.class, args);
	}
}




📖 참고

  • 스프링 부트와 AWS로 혼자 구현하는 웹 서비스(이동욱 저)
profile
기쁘게 코딩하고 싶은 백엔드 개발자

0개의 댓글