Spring/공부
[Spring MVC] DataSource 이해하기
하루인생
2021. 2. 2. 17:36
Datasource란?
jdbc를 사용해서 mysql과 같은 데이터베이스를 사용하면, 데이터베이스에 접근할 때 마다 connection의 연결을 맺고 끊는 작업해줘야한다. 이러한 작업을 줄여주기 위해서 미리 connection을 생성해둔다.
이런 connection들을 모아두는 곳을 컨넥션 풀이라고 하고 이를 사용해주기 위해서 Datasource를 사용한다.
Datasource를 위한 pom.xml 설정
dbcp : Database Connection Pool의 약자
WAS가 실행되면서 미리 Connection을 생성하고 Pool이라는 곳에 저장한다. 이런한 Connection Pool은 아파치에서 제공해주는 오픈소스인 dbcp2를 사용하였다.
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-dbcp2</artifactId>
<version>2.1.1</version>
</dependency>
Database를 처리하기 위해서 트랜잭션을 사용해야한다. 그러기 위해서 pom.xml에 아래 설정을 추가하였다. 트랜잭션에 관한 내용은 mommoo.tistory.com/62 을 참고하자.
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>${spring.version}</version>
</dependency>
DB설정 클래스
@EnableTransactionManagement : 트랜잭션 관련 설정을 자동으로 해준다.
DataSource를 공유가능하도록 빈으로 등록해줬다.
아파치의 dbcp2는 setter메서드를 제공해주는 장점이 있다. 그래서 아래 코드와 같이 DriverClassName, userName 등 setter를 통해 등록하였다.
package kr.or.connect.guestbook.config;
import javax.sql.DataSource;
import org.apache.commons.dbcp2.BasicDataSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.TransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import org.springframework.transaction.annotation.TransactionManagementConfigurer;
@Configuration
@EnableTransactionManagement
public class DBConfig implements TransactionManagementConfigurer {
private String driverClassName = "com.mysql.jdbc.Driver";
private String url = "jdbc:mysql://localhost:3306/connectdb?useUnicode=true&characterEncoding=utf-8";
private String username = "user";
private String password = "1234";
// 컨넥션 풀과 관련된 빈을 생성
@Bean
public DataSource dataSource() {
BasicDataSource dataSource = new BasicDataSource();
dataSource.setDriverClassName(driverClassName);
dataSource.setUrl(url);
dataSource.setUsername(username);
dataSource.setPassword(password);
return dataSource;
}
@Override
public TransactionManager annotationDrivenTransactionManager() {
return transactionManager();
}
@Bean
public PlatformTransactionManager transactionManager() {
return new DataSourceTransactionManager(dataSource());
}
}