향로님의 "스프링부트로 웹 서비스 출시하기"에서 가져온 내용입니다! 자세한 내용 참고하고 싶으시면
https://jojoldu.tistory.com/251?category=635883
참고 부탁드립니다.
생성시간 / 수정시간 자동화 - JPA Auditing
보통 Entity에는 해당 데이터의 생성시간과 수정시간을 포함시킨다고 한다. 그 이유는 언제 만들어졌는지, 언제 수정되었는지에 대한 정보는 차후 유지보수에 있어 굉장히 중요한 정보가 되기 때문이다.
그래서 매번 데이터베이스에 insert하기 전, update 하기 전에 날짜 데이터를 등록 / 수정하는 코드가 여기저기 들어가게 된다고 한다.
// 생성일 추가 코드 예제
public void savePosts(){
...
posts.setCreateDate(new LocalDate());
postsRepository.save(posts);
...
}
위 같은 단순하고 반복적인 코드가 모든 테이블과 서비스 메서드에 포함된다면 코드는 매우 지저분해면서 좋지 못한 코드가 될 것이다. 그래서 이러한 문제를 해결하기 위해 JPA Auditing을 사용한다고 한다.
LocalDate 사용
날짜 데이터를 사용하기 위해 Java8부터는 LocalDate와 LocalDateTime을 사용한다.
BaseTimeEntity 생성
@Getter
@MappedSuperclass
/**
* JPA Entity 클래스들이 BaseTimeEntity을 상속할 경우 필드들(createdDate, modifiedDate)도 컬럼으로 인식하도록 합니다.
*/
@EntityListeners(AuditingEntityListener.class)
/**
* BaseTimeEntity클래스에 Auditing 기능을 포함시킵니다.
*/
public abstract class BaseTimeEntity {
@CreatedDate
private LocalDateTime createdDate;
@LastModifiedDate
private LocalDateTime modifiedDate;
}
BaseTimeEntity클래스는 모든 Entity들의 상위 클래스가 되어 Entity들의 createdDate, modifiedDate를 자동으로 관리하는 역할이다.
- @MappedSuperclass
- JPA Entity 클래스들이 BaseTimeEntity을 상속할 경우 필드들(createdDate, modifiedDate)도 컬럼으로 인식하도록 합니다.
- @EntityListeners(AuditingEntityListener.class)
- BaseTimeEntity클래스에 Auditing 기능을 포함시킵니다.
- @CreatedDate
- Entity가 생성되어 저장될 때 시간이 자동 저장됩니다.
- @LastModifiedDate
- 조회한 Entity의 값을 변경할 때 시간이 자동 저장됩니다.
그리고 데이터베이스에 저장되는 클래스들은 BaseTimeEntity을 상속받도록 해야 createdDate와 modifiedDate가 저장되니 잊지 말아야한다.
...
public class Posts extends BaseTimeEntity{
...
}
마지막으로 JPA Auditing 어노테이션들을 모두 활성화 시킬 수 있도록 Application클래스에 활성화 어노테이션 하나를 추가해야한다.
@EnableJpaAuditing // JPA Auditing 활성화
@SpringBootApplication
public class Application{
public static void main(String[] args){
SpringApplication.run(Application.class, args);
}
}
이제 테스트 코드를 작성하고 이를 시도하면
시간정보까지 추가된 데이터가 데이터베이스에 저장되는 것을 확인할 수 있다!
'Spring > Lombok' 카테고리의 다른 글
@PostConstruct @PreDestroy (0) | 2022.05.08 |
---|---|
@Data (0) | 2022.05.03 |
@RestController @Requestbody @Responsebody (0) | 2022.05.03 |
@Transactional (0) | 2022.04.29 |
롬복(Lombok), @AllArgsConstructor @NoArgsConstructor @RequiredArgsConstructor (0) | 2022.04.28 |