[springboot-webserivce] JPA Auditing을 통한 생성/수정 시간 자동화

Updated:

[2020.12.28] 부터 스프링 부트와 AWS로 혼자 구현하는 웹 서비스 책을 통해 스프링 공부를 시작했다.

공부한 내용을 글로 정리하려고 한다.

그래야 나중에 다시 찾아보며 공부 할 수 있을테니까 !!

⏰ JPA Auditing

보통의 Entity 는 언제 생성됐는지, 언제 수정됐는지 시간을 저장한다.

추후에 유지 보수에 있어 아주 중요한 정보이기 때문이다.

그렇다보니 데이터베이스에 저장을 하거나 갱신을 할 때 마다 시간을 저장하는 코드가 필요하다.

만약 데이터베이스에 테이블이 엄청 많다면 중복 코드가 많아질 것이다.

이때 JPA Auditing 을 사용하면 자동으로 시간을 관리해 준다.

💡 BaseTimeEntity

java/com/boks/springboot/domain/BaseTimeEntity 를 만들어주자.

이 클래스는 앞으로 모든 Entity 의 상위 클래스가 되어 시간을 자동으로 관리해 줄 것이다.

package com.boks.springboot.domain;

	...

@Getter
@MappedSuperclass  // JPA Entity들이 이 클래스를 상속받는 경우 필드값도 칼럼으로 인식
@EntityListeners(AuditingEntityListener.class)  // 시간에 대한 값을 자동으로 넣어주는 Auditing 기능 추가
public class BaseTimeEntity {

    @CreatedDate  // Entity가 생성되어 저장될 때 시간이 자동 저장 됨
    private LocalDateTime createdDate;

    @LastModifiedDate  // Entity가 조회되어 수정될 때 시간이 자동 저장 됨
    private LocalDateTime modifiedDate;
}

@MappedSuperclass

Entity 들이 BaseTimeEntity 클래스를 상속받는 경우 이 클래스의 칼럼들도 본인의 칼럼으로 인식한다.

전부 공통으로 가져야 할 칼럼이 있는 경우 사용하면 좋을 것 같다.


@CreatedDate, @LastModifiedDate

@EntityListener 를 통해 JPA Auditing 기능을 활성화 시킨 뒤 두 가지 어노테이션을 넣어주면 된다.

첫 번째는 생성 시간, 두 번째는 수정 시간이 저장된다.

🔧 JPA Auditing 테스트

기능을 추가했으니 테스트를 해 볼 시간이다.

우선 Posts Entity 에 BaseTimeEntity 를 상속하자.

그렇게 되면 Posts Entity 도 createdDate, modifiedDate 칼럼을 가지게 된다.

그리고 테스트를 위해 java/com/boks/springboot/domain/posts/PostsRepositoryTest 에 코드를 추가 한다.

package com.boks.springboot.domain.posts;

	...
    
@RunWith(SpringRunner.class)
@SpringBootTest
public class PostsRepositoryTest {

	...
  
    @Test
    public void BaseTimeEntityTest() {
        // given
        LocalDateTime now = LocalDateTime.now();
        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);
    }
}

image

로그를 보면 생성 시간과 수정 시간이 잘 저장되어 있는 것을 알 수있다.

테스트 통과 !

📕 정리

처음 스프링을 가지고 코딩을 할 때는 예제 코드를 전부 이해하고 넘어가야 한다고 생각했다.

하지만 일단 무작정 따라 하며 진도를 나가다 보니 이전에 이해가 가지 않았던 코드도 이해가 가는 경우가 있었다.

그렇다고 그냥 따라 쓰기만 하는 손 운동은 하면 안 되니 어느 정도 이해를 하면서 쭉쭉 진도를 나가봐야겠다.



Categories:

Updated:

Leave a comment