개발일기/TIL(Since24.04.19)

@Repository

w.llama 2025. 4. 17. 09:45

Repository를 인터페이스로 생성할때 JpaRepository 를 상속받게 되면 Repository어노테이션을 붙이지 않더라도 빈으로 주입된다. 이를 나는 JpaRepository내에 이미 어노테이션이 존재하기때문에 안붙여도 된다~~라고 들었기 때문에 그런줄 알고 지냈었다. 그렇게 팀원에게 어노테이션 안에 있어서 안붙여도 되요 라고 했지만 직접 들어가보니 어노테이션이 없엇다. 그럼 실제 어디서 빈등록을 해주는걸까???

 

정답은 @EnableJpaRepositories에서 처리를 해준다. 직접 코드를 들어가보면

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Import({JpaRepositoriesRegistrar.class})
public @interface EnableJpaRepositories {
    String[] value() default {};

    String[] basePackages() default {};

    Class<?>[] basePackageClasses() default {};

    ComponentScan.Filter[] includeFilters() default {};

    ComponentScan.Filter[] excludeFilters() default {};

    String repositoryImplementationPostfix() default "Impl";

    String namedQueriesLocation() default "";

    QueryLookupStrategy.Key queryLookupStrategy() default Key.CREATE_IF_NOT_FOUND;

    Class<?> repositoryFactoryBeanClass() default JpaRepositoryFactoryBean.class;

    Class<?> repositoryBaseClass() default DefaultRepositoryBaseClass.class;

    Class<? extends BeanNameGenerator> nameGenerator() default BeanNameGenerator.class;

    String entityManagerFactoryRef() default "entityManagerFactory";

    String transactionManagerRef() default "transactionManager";

    boolean considerNestedRepositories() default false;

    boolean enableDefaultTransactions() default true;

    BootstrapMode bootstrapMode() default BootstrapMode.DEFAULT;

    char escapeCharacter() default '\\';
}

@Impoert 부분에서 레지스터로 스프링이 처음 실행했을때 jpa를 읽어와 빈등록을 해준다 AOP같다 라는생각을 했다