티스토리 뷰

 

ConnectionMaker에서 Datasource로 바꾸기

Toby Spring3에서 ConnectionMaker에서 DataSource로 넘어가는 과정이 있습니다.

 

SimpleDriverDataSource는 

'org.springframework:spring-jdbc:5.3.12'

가 필요 합니다.

public class DaoFactory {
    private ConnectionMaker connectionMaker(){
        BinaryConnectionMaker binaryConnectionMaker =  new BinaryConnectionMaker();
        return binaryConnectionMaker;
    }
    private DataSource dataSource() {
        SimpleDriverDataSource dataSource = new SimpleDriverDataSource();
        dataSource.setDriverClass(com.mysql.cj.jdbc.Driver.class);
        dataSource.setUrl("jdbc:mysql://database-2.clvwtbd3pi7c.ap-northeast-2.rds.amazonaws.com/bmwgs");
        dataSource.setUsername("admin");
        dataSource.setPassword("12345678");

        return dataSource;
    }
    public UserDao userDao(){
        UserDao userDao = new UserDao(connectionMaker());
        return userDao;
    }

}

 

DaoFactory에 직접 설정 하는 경우

SimpleDriverDataSource()에 접속정보를 넣고 만듭니다.

@Configuration
public class DaoFactory {

    @Bean
    public CarModelDao carModelDao(){
        return new CarModelDao(new JdbcContext(dataSource()));
    }

    @Bean
    public DataSource dataSource(){
        SimpleDriverDataSource dataSource = new SimpleDriverDataSource();
        dataSource.setDriverClass(com.mysql.cj.jdbc.Driver.class);
        dataSource.setUrl("jdbc:mysql://database-2.clvwtbd3pi7c.ap-northeast-2.rds.amazonaws.com/bmwgs");
        dataSource.setUsername("admin");
        dataSource.setPassword("12345678");

        return dataSource;
    }
}

 

 

 

application.yml에 설정하는 경우

 

DataSourceConfiguration.java

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.datasource.DriverManagerDataSource;

import javax.sql.DataSource;

@Slf4j
@Configuration
public class DataSourceConfiguration {

    @Value("$")
    private String dbDriverClassName;

    @Value("$")
    private String dbURL;

    @Value("$")
    private String userName;

    @Value("$")
    private String password;

    @Bean
    public DataSource dataSource() {
        log.info("Connecting to database...");
        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setDriverClassName(dbDriverClassName);
        dataSource.setUrl(dbURL);
        dataSource.setUsername(userName);
        dataSource.setPassword(password);

        return dataSource;
    }
}
application.yml
spring:
  datasource:
    driver-class-name: com.amazon.redshift.jdbc4.Driver
    url: jdbc:redshift://hello.host.redshift.amazonaws.com:5439/dev
    username: app
    password: 1234567890
UserEventsDao.java
@Component
@Slf4j
public class UserEventsDao {

    @Autowired
    private DataSource dataSource;

    public void add(User user) throws SQLException {
        Connection c = dataSource.getConnection();

        PreparedStatement ps = c.prepareStatement("insert into user(id, createdat, email) values(?,?,?)");
        ps.setString(1, user.getId());
        ps.setString(2, user.getCreatedat());
        ps.setString(3, user.getEmail());
       
        ps.executeUpdate();

        ps.close();
        c.close();

    }

 

Spring Data Jpa를 쓰다가 Aws Redshift로 Datawarehouse(데이터 웨어하우스)를 만드는데 ㅋㅋ 죄다 영어네요ㅋㅋ

 

aws 레드쉬프트는 jpa가 지원을 안해줍니다. 로딩 할 때 에러나서 되는 구간이 있긴 한데 잘 안돼서 정말 옛날 대딩때 해봤던 Connection, PreparedStatement등 거의 네이티브에 가까운 코드로 하니까 db io가 되어서 어쩔 수 없이 쓰기로 했습니다.

 

그런데 생각해보니 옛날에 토비의 스브링3 공부 할 때 jdbcTemplete등을 손으로 만드는 예제를 하면서 스프링을 공부 했었는데 정 안되면 이걸 써야겠다고 생각을 하고 작업을 하는데 DataSource가 생각나서 이 글을 씁니다.

 

거의 네이티브 코드는 Connection 오브젝트를 만들어서 쓰는데 자바에서 DataSource를 만들어주어서 이걸 쓰는게 좋다고 자바에서도 권장했습니다. DataSource를 만드는 코드가 위 코드입니다.

 

그냥 Connction Object를 쓰는것과 DataSource를 사용하는 차이점은 Pooling이 들어가고 안들어가고 차이라고 합니다. 폴링을 아주 오래전에 한번 접해본 적이 있는데 요즘은 프레임웍이 대체로 해줘서 그 세부 내용까지 신경을 안쓰고 서비스를 만들어도 천운인지 아니면 사용자가 그렇게 많지 않아서 그런지(1만명 쯤도 이걸로 됐음) 운영 하는데 크게 문제가 없었기 때문에 모르고 쓰다가 이번에 문서를 찾아보면서 알아보게 되었습니다.

 

@Autowired로 Di해서 Dao에서 사용했습니다.

 

이렇게 하면 DataSource를 빈으로 만들어서 한번만 띄워도 됩니다. 매번 Connection c = new Connection() 이걸 쿼리 날릴 때 마다 실행 안해도 됩니다.

 

end.

728x90
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함