본문으로 바로가기

[SpringBoot] 6. JPA Auditing 적용하기

category Web/SpringBoot 2020. 3. 10. 17:29

1. JPA Auditing이란?

보통 엔티티에는 데이터의 생성, 수정 시간을 포함하게 되는데

매번 DB에 삽입하기 전, 갱신하기 전에 날짜 데이터를 등록, 수정하는 코드가 여러번 들어가게 됩니다.

반복적인 코드를 줄이기 위해 JPA Auditing을 활용한다.

 

spring-data-jpa에서 제공하는 기능으로 생성시간, 수정시간을 자동으로 넣어주는 기능을 제공합니다.

 

2. 적용

1) BaseTimeEntity 생성

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

위치

import lombok.Getter;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;

import javax.persistence.EntityListeners;
import javax.persistence.MappedSuperclass;
import java.time.LocalDateTime;

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

    @LastModifiedDate
    private LocalDateTime modifiedDate;
}

모든 엔티티의 상위 클래스가 되어 엔티티들의 createdDate, modifiedDate를 자동으로 관리하는 역할을 합니다.

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

생성한 BaseTimeEntity를 상속받도록 Posts클래스를 변경합니다.

public class Posts extends BaseTimeEntity {
	...
}

Application클래스에 활성화 어노테이션을 추가합니다.

@EnableJpaAuditing // JPA Auditing 활성화
@SpringBootApplication
public class Application {

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

 

3. 테스트 코드 작성

PostsRepositoryTest 클래스에 테스트 메소드를 추가합니다.

    @Test
    public void BaseTimeEntity_등록(){
        //given
        LocalDateTime now = LocalDateTime.of(2020,2,5,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));
    }

테스트 코드를 수행해보면 잘 수행되는 것을 확인할 수 있습니다.

결과


이렇게 jpa를 적용하고 api까지 구현하는 과정을 책을 따라 해보았는데

화면을 구성하는 부분에 대해서는 따로 복습하고 정리할 필요가 없을거 같아 넘어가려 합니다ㅇㅅㅇ

 

다음 포스팅부터

스프링 시큐리티와 OAuth2.0으로 로그인기능을 만들고 배포, CI, CD를 적용하는 것 까지 복습해보면

책을 두번 완독하는게 되네욤