반응형

JPA Auditing

Java 표준 ORM 기술 JPA를 사용할 때 데이터 생성일자, 수정일자 등 어떤 테이블이든 공통으로 갖고 있는 컬럼을 관리하기 위해 제공하는 기능입니다. 이 기능을 사용하면 테이블과 매핑하여 데이터 입력 시 자동으로 시간을 관리할 수 있습니다.

 

BaseTimeEntity 생성

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

}

 

@MappedSuperClass : JPA에서 관리하는 Entity 클래스가 해당 추상 클래스를 상속하면 createdDate와 updateDate를 컬럼으로 인식하게 해 줍니다.

 

@EntityListeners(AuditingEntityListener.class) : 해당 클래스가 Auditing 기능을 포함하게 됩니다.

 

@CreatedDate : 데이터가 입력될 때 자동으로 시간을 저장해줍니다.

 

@LastModifiedDate : 데이터의 값이 변경될 때 자동으로 시간을 저장해줍니다.

 

Article

@Getter
@NoArgsConstructor
@Entity
public class Member extends BaseTimeEntity {

    ... 내용 생략

}

 

위처럼 @Enitity로 지정된 클래스가 BaseTimeEntity를 상속받으면 사용 가능합니다. 

 

BoardApplication

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

 

마지막으로 해당 프로젝트의 Application 클래스에 @EnableJpaAuditing 어노테이션을 추가함으로써 어플리케이션 내에서 Auditing 기능을 활성화할 수 있습니다.

 

UserRepositoryTest

@SpringBootTest
public class MemberRepositoryTest {

    @Autowired
    private UserRepository UserRepository;

    @Test
    public void insert() {
        String userId = "test01";

        // 실행 시간보다 전으로 임의 시간 지정
        LocalDateTime currentTime = LocalDateTime.of(2022, 2, 14, 0, 0, 0);

        User user = User.builder()
                .userId(userId)
                .userPass("test01")
                .userName("test01")
                .userEmail("test01@gmail.com")
                .build();

        userRepository.save(user);

        // 11행에서 선언한 currentTime보다 테이블에서 새로 입력된 값의 시간이 뒤인지 확인
        assertThat(userRepository.findAll().get(0).getCreatedDate()).isAfter(currentTime);

    }
}

 

Test 클래스를 하나 만들어서 board 테이블에 실행한 시간을 잘 저장했는지 테스트해봅니다.

 

MySQL Workbench에서 확인한 결과 작성일자와 수정일자이 현재 시간으로 저장된 것을 볼 수 있습니다.

반응형

'Java Web > JPA' 카테고리의 다른 글

[JPA] persistence.xml 작성 예시  (0) 2022.03.02
[JPA] 연관 관계 편의 메소드  (0) 2022.02.28
[JPA] 양방향 관계 매핑 @OneToMany, @ManyToOne 그리고 mappedby  (1) 2022.02.16
[JPA] findAll 정렬  (0) 2021.07.23
[JPA] JPA란?  (0) 2021.05.13

+ Recent posts