ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 13. 스프링부트와 AWS - JPA Auditing으로 시간 자동 등록하기
    실습/AWS 2021. 5. 8. 04:28

    지금까지 API를 만들면서 게시글 기능에서 빠져있는게 있다.

     

    바로 시간이다.

     

    보통 인터넷 게시판을 이용해보면 알겠지만 시간이 표기되어있다.

     

    하지만 우리가 작성한 코드에는 내용이 없는데, 이에 대해서 JPA Auditing 기능을 사용해보자.

    JPA Auditing이란?

    모든 게시물에는 일반적으로 시간 개념을 넣어준다.

     

    그렇다보니 게시물을 등록, 수정할 때 매번 같은 코드를 필연적으로 넣어야 한다.

     

    이로 인해 같은 코드를 매번 넣어줘야해서 귀찮아지고 코드가 지저분해지기 마련이다

     

    이럴 때 JPA가 제공하는 Auditing이란 기능을 사용하면 된다.

     

    Auditing은 데이터가 입력, 수정 될 때마다 감시해 자동으로 시간을 입력해주는 기능을 한다.

    BaseTimeEntity클래스 생성

     

     

    우선 "/src/main/java/com/my/practice00/springboot/domain"에 "BaseTimeEntity"클래스를 만든다.

     

    이때 "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;
    
    }

     

    그 다음은 위와 같이 추상 클래스에 코드를 입력한다.

     

    간단히 클래스를 설명하면 다음과 같다.

     

    - @MappedSuperClass:

    JPA Entity클래스들이 BaseTimeEntity를 상속할 때 입력한 필드변수가 칼럼으로 인식하도록 함.

     

    - @EntityListeners(AuditingEntityListener.class)

    BaseTimeEntity클래스에 Auditing 기능을 포함시킴.

     

    - @CreatedDate

    Entity가 생성되어 저장될 때 시간이 자동 저장됨.

     

    - @LastModifiedDate

    조회한 Entity의 값을 변경할 때 시간이 자동 저장됨.

    Posts와 Application 클래스 수정하기

     

     

    Posts 클래스로 이동한다음 BaseTimeEntity를 상속받도록 코드를 추가해준다.

     

     

     

     

    이제 마지막으로 Application 클래스로 이동한다.

     

    그 다음 Application 클래스 상단에 @EnableJpaAuditing 어노테이션을 추가한다.

    JPA Auditing 테스트 코드 작성하기

     

     

    @Test
        public void BaseTimeEntity_등록(){
    
            LocalDateTime now = LocalDateTime.of(2021,05,8,0,0,0);
    
            postsRepository.save(
                    Posts.builder()
                            .title("제목")
                            .content("내용")
                            .author("글쓴이")
                            .build()
            );
    
            List<Posts> postsList = postsRepository.findAll();
    
            Posts posts = postsList.get(0);
    
            System.out.println(">>>>>>>>>>>>> 테스트: 등록시간: "+posts.getCreatedDate()+", 수정시간: "+posts.getModifiedDate());
    
            assertThat(posts.getCreatedDate()).isAfter(now);
            assertThat(posts.getModifiedDate()).isAfter(now);
    
        }

     

    PostsRepositoryTest 클래스로 이동한 다음 위와 같이 메서드를 추가해준다.

     

    코드를 간단히 설명하면 다음과 같다.

     

    - 임의의 시간대인 now를 설정해준다.

     

    - 우선 Auditing이 제대로 작동하는지 글을 하나 등록한다.

     

    - 해당 글이 등록될 때 등록시간, 수정시간도 잘 등록이 됐는데 콘솔에 출력해 확인한다.

     

    - isAfter() 메서드를 통해 now보다 현재 게시글 등록 및 수정 시간이 뒤일 경우 테스트를 통과한다.

     

    이때 isAfter()는 임의로 설정한 시간대보다 현재 등록된 글의 시간이 뒤일 경우 테스트를 통과한다.

     

    반대로 isBefore()도 있는데 임의 설정 시간보다 현재 등록된 글의 시간이 앞일 경우 테스트를 통과한다.

     

     

     

    테스트가 잘 됐다면 위와 같이 콘솔창에서 테스트 결과를 출력할 수 있고 테스트도 무사히 통과하게 된다.

Designed by Tistory.