2020-4-22 스프링 Data common (6) 빈탐색원리

스프링데이터 JPA

JpaRepository<Entity, Id> 인터페이스

  • @Repository 없이도 빈으로 등록해준다.

@EnableJpaRepositories

  • Configuration에 같이 붙여야되지만 SpringBoot에서는 자동으로 해준다.

빈으로 등록하는 원리

@Import({JpaRepositoriesRegistrar.class})
public @interface EnableJpaRepositories {
   }



/**
 * {@link ImportBeanDefinitionRegistrar} to enable {@link EnableJpaRepositories} annotation.
 *
 * @author Oliver Gierke
 */
class JpaRepositoriesRegistrar extends RepositoryBeanDefinitionRegistrarSupport {

	/*
	 * (non-Javadoc)
	 * @see org.springframework.data.repository.config.RepositoryBeanDefinitionRegistrarSupport#getAnnotation()
	 */
	@Override
	protected Class<? extends Annotation> getAnnotation() {
		return EnableJpaRepositories.class;
	}

	/*
	 * (non-Javadoc)
	 * @see org.springframework.data.repository.config.RepositoryBeanDefinitionRegistrarSupport#getExtension()
	 */
	@Override
	protected RepositoryConfigurationExtension getExtension() {
		return new JpaRepositoryConfigExtension();
	}
}   
  • @Import의 value는 Class<?> []로 되어있다. 따라서 JpaRepositoriesRegistrar.class라는 클래스를 import한다.
  • JpaRepositoriesRegister를 보면 ImportBeanDefinitionRegistrar가 최상위 인터페이스로 있는것을 확인할 수 있다.
  • ImportBeanDefinitionRegister는 빈을 프로그래밍으로 등록할 수 있게 해준다.
public class JimmyRegister implements ImportBeanDefinitionRegistrar {
    @Override
    public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
        GenericBeanDefinition beanDefinition = new GenericBeanDefinition();
        beanDefinition.setBeanClass(Jimmy.class);
        beanDefinition.getPropertyValues().add("name", "jimmy");
        registry.registerBeanDefinition("jimmyBean", beanDefinition);
    }
}

public class Jimmy {
    private String name;
    private Long id;
}

@SpringBootApplication
@Import({JimmyRegister.class})
public class DemoApplication {
	public static void main(String[] args) {
    ...
	}
}

@Component
@Transactional
public class JpaRunner implements ApplicationRunner {
    @Autowired
    private ApplicationContext context;

    @Override
    public void run(ApplicationArguments args) throws Exception {
        System.out.println("----");
        System.out.println(context.getBean("jimmyBean"));
        System.out.println("====");
    }
}

//result
me.jimmy.springmvc.jpa.Jimmy@d7dd13a
  • ImportBeanDefinitionRegistar에서 class기반의 빈을 등록한다.
  • @Import{register.class}를 통해 빈등록하는 register를 import하면 빈 어노테이션을 안붙인 클래스들도 빈으로 등록된다.
  • 위의 원리로 JpaRepository가 빈으로 등록된다.

로깅

logging.level.org.hibernate.SQL=debug // show-sql=true와 유사
logging.level.org.hibernate.type.descriptor=trace // values (?, ?, ?)에 값을 보여준다.
  • Show-query=true를 하면 들어가는 values(?, ?)로 나온다. 값을 보기 위해서는 위의 코드들을 넣자. descriptor=trace레벨로 하자.
Written on April 22, 2020