본문 바로가기
Clone Coding/스프링 부트와 AWS

[JPA Auditing] 생성/수정시간 자동화

by 연로그 2021. 1. 18.
반응형

보통 entity에는 언제 만들어졌는지, 언제 수정됐는지 등 유지보수를 위해 데이터의 생성/수정시간을 포함한다.

DB에 삽입 전, 갱신 전 날짜 데이터를 등록/수정하는 코드가 여기저기 들어가게 되는 단순하고 반복적인 코드를 매번 작성하는게 번거롭고 코드가 지저분해진다.

이를 해결하기 위한 것이 JPA Auditing이다.

 

시간을 구하는데  Date, Calendar, LocalDate 등 여러가지가 있다.

 

이슈

- Date와 Calendar는 몇 가지 문제가 있었는데, Java 8에서는 이를 개선하며 LocalDate가 등장했다. yeonyeon.tistory.com/24?category=916856 참고)

- LocalDate와 LocalDateTime이 db에 제대로 매핑되지 않는 이슈가 있었는데 이는 Hibernate 5.2.10 버전에서 해결했다.

Spring boot 1.x를 쓴다면 별도로 설정을 하고, 2.x 라면 상관없다. 

 

 

예제

com.spaws.book.springboot.domain패키지에 BaseTimeEntity.java 생성

@Getter
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public class BaseTimeEntity {
	@CreatedDate
	private LocalDateTime createdDate;
	
	@LastModifiedDate
	private LocalDateTime modifiedDate;
}

@MappedSuperclass

- JPA Entity 클래스들이 BaseTimeEntity를 상속할 경우 필드들도 컬럼으로 인식하도록 함

 

@EntityListeners(AuditingEntityListener.class)

- BaseTimeEntity 클래스에 Auditing 기능 포함

 

@CreatedDate

- Entity가 생성되어 저장 시간 자동 저장

 

@LastModifiedDate

- 조회한 Entity 값 변경 시 시간 자동 저장

 

 

domain.posts 안의 PostsBaseTimeEntity 상속시키게 한다.

public class Posts extends BaseTimeEntity{ ... }

Application.java에 어노테이션을 하나 추가해준다.

@EnableJpaAuditing 		// JPA Auditing어노테이션들 모두 활성화할 수 있게 함
@SpringBootApplication
public class Application { ... }

 

테스트 코드

기존의 PostsRepositoryTest.java에 메소드를 하나 추가했다.

@Test
public void BaseTimeEntity_등록() {
	//given
	LocalDateTime now = LocalDateTime.of(2019, 6,4,0,0,0);
	postsRepository.save(Posts.builder()
			.title("title")
			.content("content")
			.author("author")
			.build());
		
	// when
	List<Posts> postsList = postsRepository.findAll();
		
	// then
	Posts posts = postsList.get(0);
	System.out.println(">>>> createDate = " + posts.getCreatedDate() + ", modifiedDate = " + posts.getModifiedDate());
	assertThat(posts.getCreatedDate()).isAfter(now);
	assertThat(posts.getModifiedDate()).isAfter(now);
}

 

앞으로 추가될 엔티티들은 BaseTimeEntity만 상속받으면 등록일/수정일로 고민할 필요가 없게 된다.

 


해당 게시글은 [ 스프링 부트와 AWS로 혼자 구현하는 웹 서비스 / 이동욱 ] 책을 따라한 것을 정리하기 위한 게시글입니다. 요약, 생략한 부분이 많으니 보다 자세한 설명은 책 구매를 권장합니다.

 

반응형