Spring/Lombok

BaseTimeEntity - @MappedSuperclass @EntityListeners(AuditingEntityListener.class)

JWonK 2022. 4. 29. 00:39
728x90
반응형

향로님의 "스프링부트로 웹 서비스 출시하기"에서 가져온 내용입니다! 자세한 내용 참고하고 싶으시면

https://jojoldu.tistory.com/251?category=635883 

 

2) 스프링부트로 웹 서비스 출시하기 - 2. SpringBoot & JPA로 간단 API 만들기

이번 시간엔 SpringBoot & JPA로 간단한 API를 만들 예정입니다. Tip) 아직 SI 환경에선 Spring & MyBatis 를 많이 사용하지만, 쿠팡/우아한형제들/NHN Entertainment 등 자사 서비스를 개발하는 곳에선 SpringBoo..

jojoldu.tistory.com

참고 부탁드립니다.

 


 

생성시간 / 수정시간 자동화 - 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);
    }
}

 

이제 테스트 코드를 작성하고 이를 시도하면 

시간정보까지 추가되었다.

시간정보까지 추가된 데이터가 데이터베이스에 저장되는 것을 확인할 수 있다!

728x90
반응형

'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