본문으로 바로가기

spring boot datasource만들기

category Spring/Toby의 스프링3 따라하기 2018.06.15 15:50

spring boot datasource만들기


DataSourceConfiguration.java

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
31
32
33
34
35
36
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("${spring.datasource.driver-class-name}")
    private String dbDriverClassName;
 
    @Value("${spring.datasource.url}")
    private String dbURL;
 
    @Value("${spring.datasource.username}")
    private String userName;
 
    @Value("${spring.datasource.password}")
    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;
    }
}
cs


application.yml

1
2
3
4
5
6
spring:
  datasource:
    driver-class-name: com.amazon.redshift.jdbc4.Driver
    url: jdbc:redshift://hello.host.redshift.amazonaws.com:5439/dev
    username: app
    password: 1234567890
cs

UserEventsDao.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
@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();
 
    }
 
cs


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() 이걸 쿼리 날릴 때 마다 실행 안해도 됨. ㅋㅋ


jdbcTemplete를 실전에 쓸 줄이야 ㅋㅋㅋㅋ


end.







댓글을 달아 주세요