Light Blue Pointer
본문 바로가기
Developing/Trouble shooting

@EnableJpaAuditing 이 한 곳에서만 정의되어야 하는 이유

by Craft Fiend 2024. 9. 5.

습관처럼 QueryDsl을 사용하기 위해 JPAConfig를 만들려고 했다

@Configuration
@EnableJpaAuditing
public class JPAConfig {
    @PersistenceContext
    private EntityManager entityManager;

    @Bean
    public JPAQueryFactory queryFactory() {
        return new JPAQueryFactory(entityManager);
    }
}

 

 

그랬더니 다른 곳에서 이미 JPAAuditoing이 되고 있어서 안 된다는 에러가 떴다 overriding = true로 바꾸라는 제안도 있었지만 위험할 것 같아서 하지 않았다

 

찾아보니 동일한 모듈에 이게 있었다

@Configuration
@EnableJpaAuditing(auditorAwareRef = "auditorProvider")
public class JpaAuditConfiguration {
    @Bean
    public AuditorAware<String> auditorProvider(){
        return new LoginUserAuditorAware();
    }
}

 

그래서 여기다가 JPAQueryFactory Bean을 생성해주고 해결했는데 이유가 궁금해졌다

@Configuration
@EnableJpaAuditing(auditorAwareRef = "auditorProvider")
public class JpaAuditConfiguration {
    @Bean
    public AuditorAware<String> auditorProvider(){
        return new LoginUserAuditorAware();
    }

    @PersistenceContext
    private EntityManager entityManager;

    @Bean
    public JPAQueryFactory queryFactory() {
        return new JPAQueryFactory(entityManager);
    }

}

 

@EnableJpaAuditing

  • JPA의 Auditing 기능을 활성화하는 어노테이션
  • Entity의 생성 및 수정 시간 등을 자동으로 관리해주는 역할
  • 애플리케이션 컨텍스트에서 한 번만 선언되어야 한다
  • 스프링 부트는 하나의 컨텍스트에서 여러 설정 클래스를 자동으로 감지하고 관리하는데 @EnableJpaAuditing이 중복으로 선언되면 동일한 Auditing 설정을 여러 번 적용하려고 시도하다가 에러가 발생한다