문제 상황
createdAt, updatedAt과 같은 감사 로그는 공통적으로 사용되는 필드가 많기 때문에 BaseEntity를 자주 사용한다.
그런데 이를 모듈에 추가하고, 메인 프로젝트에서 이 모듈로 추가한 BaseEntitiy를 상속하면 잘 될까?
그리고 위와 같이, BaseEntity를 사용하기 위한 엔티티 및 설정을 추가해주었다.
처음엔 안 될거라고 생각했다.
왜냐하면 우선 Component Scan의 대해 생각해보았다.
Component Scan 범위는 @SpringbootApplication 에서 기본적으로 이 어노테이션이 적용된 클래스를 포함한 하위 패키지인데,
추가한 모듈은 범위 밖에 있기 때문에 Bean 을 못 찾고, 마찬가지로 JPA Audit 관련 기능도 BaseEntity를 찾지 못하겠지? 란 생각을 했다.
@EntityListeners(AuditingEntityListener.class)는 Component Scan 메커니즘에 의존하지 않는다.
@EntityListeners는 JPA 메커니즘이므로 Spring의 Component Scan에 의해 감지될 필요가 없다.
Listener는 엔티티의 애노테이션(@EntityListeners(AuditingEntityListener.class))을 기반으로 JPA에 의해 등록되고 호출되므로, 엔티티가 다른 모듈에 위치해 있더라도 JPA는 이를 처리할 수 있다.
따라서 Spring Boot가 @EnableJpaAuditing을 통해 JPA 감사를 설정했다면, 엔티티의 위치와 상관없이 감사 기능이 작동한다.
단, 엔티티는 class path에 존재해야 하며, 이는 Gradle 의존성으로 처리된다.
느낀 점
생각해보면 BaseEntity는 Bean에 등록되는 클래스가 아니다.
Component Scan을 떠올린 것으로 안 될 것이라 판단한 것은 다소 깊게 생각하지 못했던 부분 같다. 흐흐..