이청춘아
143
2015-07-29 13:39:53
4
17231

Spring Boot, JPA사용시 Datasource를 정의하지 않으면 에러가 나는데...


org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private javax.sql.DataSource org.springframework.boot.autoconfigure.orm.jpa.JpaBaseConfiguration.dataSource; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSource' defined in class path resource [org/springframework/boot/autoconfigure/jdbc/DataSourceAutoConfiguration$NonEmbeddedConfiguration.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [javax.sql.DataSource]: Factory method 'dataSource' threw exception; nested exception is org.springframework.beans.factory.BeanCreationException: Cannot determine embedded database driver class for database type NONE. If you want an embedded database please put a supported one on the classpath.
	at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:334)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1210)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:537)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:476)
	at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:303)
	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)


Spring Boot Project에서 JPA 추가하고 실행시키면 위와 같은 에러가 발생합니다.

Datasource를 정의하지 않은 상태인데, 초기화를 시도해서 발생하는게 아닌가 합니다.

Application 구동 후 Database 정보를 입력받아 초기화 하려고 하는건데, 여기부터 발목 잡히네용;


1. Datasource초기화 하는 설정을 바꿀수 없을까요?
2. 궁극적으로 하려는건 사용자로부터 Database 정보를 입력받아서 초기화 하려는데.. DataSource Bean을 동적으로 반영해줄 수 있을까요?







0
  • 답변 4

  • Q u i c K
    2k
    2015-07-29 13:56:31
    동적으로 입력 받을 수 있는 화면을 만들어서 생성해주려면 내장된 DB를 통해 먼저 띄우시고, 그 뒤에 입력 받은 정보를 생성해주셔야 합니다. 
  • 이청춘아
    143
    2015-07-29 14:06:57

    Application 구동시 무조건 1개 DB를 가져가야 한다는건지요?

    그렇군요.... 답변 감사합니다.

    다른 선택의 여지가 없는건지...

  • 제타건담
    7k
    2015-07-29 17:23:26

    SpringFramework는 Context가 구동되어 올라갈때 모든 Bean이 초기화 되서 올라갑니다..

    DataSource도 하나의 spring bean이기 때문에 구동될때 Bean이 초기화 되서 올라가는거죠..

    이걸 외부에서 요청시에 초기화되게끔 할려면 bean에 lazy-init 속성을 사용해서 요청시 초기화되도록 해야 합니다..

    그러나 이 상황과는 맞지가 않은 부분이 lazy-init 속성을 이용해서 Bean 초기화를 늦추게 하는 경우도 이미 프로퍼티 값들이 미리 셋팅된 상태에서 요청대기를 하는 것이어서..

    외부의 입력을 받아 이를 이용해서 하는 식으로 하는 것에는 맞지 않는 구석이 있습니다..

    또한 lazy-init 속성을 이용하여 초기화를 늦춘 bean을 사용하는 bean도 같이 lazy-init 속성을 주어서 걔도 사용이 늦춰져야 합니다..

    예를 들어서 DataSource만 lazy-init 속성을 true로 주어서 Bean 초기화를 늦춘다 해도 이것을 사용하는 TansactionManager가 Spring Context구동시에 DataSource를 요청해버리기 때문에 결국 Context 구동시 같이 올라가버리는 상황이 벌어지죠..

    그리고 갠적으로 궁금한건..이러한 기능을 넣게 되면 DataSource를 구성하는 프로퍼티 값을 입력해서 DataSource를 Spring Context가 구동되어 있는 동안 동적으로 바꾸겠다는 의도가 있는건데..

    이 기능은 처음만 유효할뿐 두번째부터는 안됩니다..즉 파라미터를 외부에서 입력받아 DataSource를 구성해서 올려도 다시 파라미터를 입력받아서 DataSource를 재구성을 할 수는 없다는거죠..

    Spring Bean은 Context 구동될때 일단 올라가면 Context가 내려가기 전까지는 해제되질 못합니다..

    즉 Bean이 Reload되는 기능은 없다는거죠..

    예를 들어 외부에서 오라클 DataSource를 구성하는 파라미터값을 주어 오라클 DataSource를 구성하게끔 올린 뒤에 다시 외부에서 Mysql DataSource를 구성하는 파라미터값을 주어 Msql DataSource로 재활용되어서 올라가게 할 수는 없다는거죠..

    만약 여러 DB를 동적으로 사용해야 한다면 어차피 사용해야 할 DB는 정해져 있으니 그 DB 수만큼 DataSource와 이와 연결된 TansactionManager를 만든 뒤에 용도별로 이용하는 것이 나을겁니다.. 

  • 이청춘아
    143
    2015-07-29 18:37:25

    Spring context 구동 후에는 Bean을 재구성 할 수 없다는 거군요.

    흐흐...자세한 설명과 조언 감사합니다.

  • 로그인을 하시면 답변을 등록할 수 있습니다.