본문 바로가기
Web/스프링 부트와 aws로 구현하는 웹서비스

9. JPA Auditing으로 생성/수정시간 자동화

by 장인이 2021. 7. 20.

해당 게시물들은 이동욱 저자님의 "스프링 부트와 AWS로 혼자 구현하는 웹 서비스"를 공부하며 기록한 것입니다.

 

 엔티티에는 보통 데이터의 생성/수정 시간을 포함한다. 따라서 매번 DB에 insert, update할때 마다 날짜 데이터를 등록, 혹은 수정하는 코드가 들어가게 된다.

 

 문제는 이런 메소드를 만들어 필요할 때 마다 사용하면 모든 테이블과 서비스 메소드에 포함되며, 코드가 지저분해지게 된다. 따라서 이를 해결하고자 JPA Auditing을 사용한다.

 

 

 참고로 날짜를 기록하기 위해서 날짜 타입을 사용한다. 이때, Java 8 부터 등장한 LocalDate와 LocalDateTime을 사용한다. 이는 기존에 사용하던 Date와 Calendar 클래스의 문제를 해결하게 되었으며, 스프링부트 2.x 버전을 사용한다면 별다른 설정 없이 바로 적용시킬 수 있다.

 

 

 우선 domain 패키지에 BaseTimeEntity를 추가한다.

 

 

 @MappedSuperclass을 통해 JPA Entity 클래스들이 해당 클래스(BaseTimeEntity)를 상속할 경우, 이 클래스의 안의 칼럼들(createdDate, modifiedDate)도 칼럼으로 인식하게 하는 어노테이션이다.

 

 @EntityListeners(AuditingEntityListener.class)는 해당 클래스의 JPA의 Auditing 기능을 포함시킨다. 여기서 Auditing이란 JPA를 사용할 시 저장, 조회후 update시 시간을 자동으로 매핑하여 데이터베이스의 테이블에 넣어주는 기능을 말한다.

 

 @CreatedDate는 Entity가 생성되어 저장될 때 자동으로 시간이 저장되도록 하는 어노테이션이며, @LastModifiedDate은 조회한 Entity의 값을 변경할 경우 시간이 자동 저장되는 어노테이션이다.

 

 

 이제 Post 클래스가 BaseTimeEntity를 상속받도록 변경하고, Application 클래스에 활성화 어노테이션 하나를 추가하면 코드가 완성이 된다.

 

 

 

 

 이제 PostRepositoryTest 클래스에 메소드 하나를 추가하여, 테이블 저장 및 변경 시 시간을 잘 저장하는지 테스트 코드를 작성해 본다.

 

 

 

 현재 날짜/시간을 LocalDateTime으로 선언한 후, Posts에 하나의 게시물을 의미로 저장한다. 그 후, 해당 게시물의 createDate과 modifiedDate를 콘솔창으로 확인하고 앞서 선언한 now보다 뒤의 날짜/시간인지 체크한다.

 

 

 이제 앞으로 추가한 Entity들은 BaseTimeEntity 클래스만 추가하면 등록일/수정일을 알 수 있게 되었다.

 


- 학습 내용 저장할 github

https://github.com/imgzon3/imgzon3-springboot-test

 

imgzon3/imgzon3-springboot-test

Contribute to imgzon3/imgzon3-springboot-test development by creating an account on GitHub.

github.com

 

댓글