ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [SPRINGBOOT] JPA Auditing
    SPRINGBOOT 2022. 4. 24. 22:49

    참조 : 스프링부트와 AWS로 혼자 구현하는 웹 서비스(이동욱 저)

     

    보통 엔티티에는 해당 데이터의 생성시간과 수정시간을 포함한다.

    그렇기에 매번 DB에 삽입하기 전, 갱신하기 전에 날짜 데이터를 등록, 수정하는 코드가 반복된다.

    이러한 문제를 해결하기 위해 JPA Auditing을 사용한다.

     

     

    1. LocalDate

     

    java8부터는 LocalDate와 LocalDateTime이 나왔다.

    그간 java의 Date의 문제점을 고친 타입이다.

    하지만 데이터베이스에 제대로 매핑되지 않는 이슈가 존재했었다.

    스프링부트 1.x 버전을 사용한다면 Hibernate 5.2.10버전 이상을 사용하도록 설정이 필요했다.

    하지만 스프링부트 2.x버전을 사용하면 기본적으로 해당 버전을 사용 중이라 바로 적용이 가능하다.

     

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

    package com.study.crystal.test.domain;
    
    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
    //JPA Entity 클래스들이 BaseTimeEntity를 상속할 경우 필드들도 컬럼으로 인식하도록 함
    @MappedSuperclass
    //BaseTimeEntity 클래스에 Auditing 기능을 포함시킴 
    @EntityListeners(AuditingEntityListener.class)
    public class BaseTimeEntity {
        
        @CreatedDate // Entity가 생성되어 저장될 때 시간이 자동 저장
        private LocalDateTime createdDate;
        
        @LastModifiedDate // 조회한 Entity의 값을 변경할 때 시간이 자동 저장
        private LocalDateTime modifiedDate;
    }

     

    ② Entity클래스인 Posts 클래스가 BaseTimeEntity를 상속받도록 한다.

    public class Posts extends BaseTimeEntity {

     

    ③ JPA Auditing 어노테이션들을 모두 활성화할 수 있도록 Applcation 클래스에 활성화 어노테이션을 추가해준다.

    @EnableJpaAuditing // JpA Auditing 활성화
    @SpringBootApplication
    public class Application {
        public static void main(String[] args) {
            SpringApplication.run(Application.class, args);
        }
    }

     

     

    2. 테스트

     

    테스트를 위해 컨트롤러와 서비스의 등록 기능을 수정하였다.

     //컨트롤러 PostApiController
     @PostMapping("/api/v1/posts")
        public Posts save(@RequestBody PostSaveRequestDto requestDto){ //리턴타입을 Entity로 변경
            return postsService.save(requestDto);
        }
    //서비스 클래스 PostsService
    @Transactional
        public Posts save(PostSaveRequestDto requestDto){ //리턴타입을 Entity로 변경
            return postsRepository.save(requestDto.toEntity()); //.getId()를 삭제하여 Entity 자체를 return
        }

     

    등록을 하면 자동으로 현재 날짜로 저장되는 것을 확인할 수 있다.

Designed by Tistory.