작성
·
67
·
수정됨
0
안녕하세요. 테스트과정중 테스트가 일반적으로 작동하지않아 글을 남깁니다.
package tobyspring.helloboot;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.TestPropertySource;
import org.springframework.test.context.junit.jupiter.SpringExtension;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;
@ExtendWith(SpringExtension.class)
@ContextConfiguration(classes = HellobootApplication.class)
@TestPropertySource("classpath:/application.properties")
public class DataSourceTest {
@Autowired DataSource dataSource;
@Test
void connect() throws SQLException {
Connection connection = dataSource.getConnection();
connection.close();
}
}
package tobyspring.config.autoConfig;
import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.jdbc.datasource.SimpleDriverDataSource;
import tobyspring.config.ConditionalMyOnClass;
import tobyspring.config.EnableMyAutoConfigurationProperties;
import tobyspring.config.MyAutoConfiguration;
import javax.sql.DataSource;
import java.sql.Driver;
@MyAutoConfiguration
@ConditionalMyOnClass("org.springframework.jdbc.core.JdbcOptions")
@EnableMyAutoConfigurationProperties(MyDataSourceProperties.class)
public class DataSourceConfig {
@Bean DataSource dataSource(MyDataSourceProperties properties) throws ClassNotFoundException {
SimpleDriverDataSource dataSource = new SimpleDriverDataSource();
dataSource.setDriverClass((Class<? extends Driver>) Class.forName(properties.getDriverClassName()));
dataSource.setUrl(properties.getUrl());
dataSource.setUsername(properties.getUsername());
dataSource.setPassword(properties.getPassword());
return dataSource;
}
}
package tobyspring.config.autoConfig;
import tobyspring.config.MyConfigurationProperties;
@MyConfigurationProperties(prefix = "data")
public class MyDataSourceProperties {
private String driverClassName;
private String url;
private String username;
private String password;
public String getDriverClassName() {
return driverClassName;
}
public void setDriverClassName(String driverClassName) {
this.driverClassName = driverClassName;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
답변 1
0
안녕하세요, 인프런 AI 인턴입니다.
kss8014님의 문의 사항에 대한 답변입니다.
문제의 원인은 DataSource
의 자동 구성이 올바르게 이루어지지 않아 발생하는 것 같습니다. 자동 구성을 위해서는 application.properties
또는 application.yml
파일에 DataSource
관련 설정이 존재해야 하고, 그 설정이 올바르게 DataSource
빈으로 등록되어 있어야 합니다.
다만 제시한 코드만으로는 application.properties
파일의 내용을 알 수 없으며, @EnableMyAutoConfigurationProperties(MyDataSourceProperties.class)
와 같은 커스텀 어노테이션이 정상적으로 구성 클래스를 인식하여 DataSource
빈을 등록하는지 확인하기 어렵습니다.
Spring Boot에서 DataSource
를 자동 구성하는 기본 방법은 application.properties
에 다음과 같이 설정하는 것입니다:
spring.datasource.url=jdbc:mysql://localhost/test
spring.datasource.username=dbuser
spring.datasource.password=dbpass
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
위 설정에서 spring.datasource.*
프로퍼티를 통해 데이터베이스 연결 정보를 명시하면, Spring Boot가 자동으로 DataSource
빈을 생성해줍니다.
질문하신 상황을 해결하기 위해 다음과 같은 점검 사항을 제안드립니다:
application.properties
또는 application.yml
파일에 DataSource
관련 설정이 올바르게 들어있는지 확인하세요.@EnableMyAutoConfigurationProperties
어노테이션이 @ConfigurationProperties
어노테이션을 사용하여 프로퍼티 값을 빈에 바인딩하도록 올바르게 구현되어 있는지 점검하세요.코드를 기반으로 한 정확한 해결 방법을 제시하기에는 제한된 정보로 인해 어려움이 있으나, 위의 점검 사항이 문제 해결의 실마리를 제공할 수 있기를 바랍니다.