강의

멘토링

로드맵

인프런 커뮤니티 질문&답변

수성강님의 프로필 이미지
수성강

작성한 질문수

DataSource 자동 구성 클래스강의중 문의

작성

·

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;
    }
}

스크린샷 2024-09-07 오후 5.05.51.png스크린샷 2024-09-07 오후 5.06.07.png스크린샷 2024-09-07 오후 5.06.16.png 

 

 

답변 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 빈을 생성해줍니다.

질문하신 상황을 해결하기 위해 다음과 같은 점검 사항을 제안드립니다:

  1. application.properties 또는 application.yml 파일에 DataSource 관련 설정이 올바르게 들어있는지 확인하세요.
  2. 커스텀 @EnableMyAutoConfigurationProperties 어노테이션이 @ConfigurationProperties 어노테이션을 사용하여 프로퍼티 값을 빈에 바인딩하도록 올바르게 구현되어 있는지 점검하세요.

코드를 기반으로 한 정확한 해결 방법을 제시하기에는 제한된 정보로 인해 어려움이 있으나, 위의 점검 사항이 문제 해결의 실마리를 제공할 수 있기를 바랍니다.

수성강님의 프로필 이미지
수성강

작성한 질문수

질문하기