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를 공유가능하도록 빈으로 등록해줬다.

아파치의 dbcp2setter메서드를 제공해주는 장점이 있다. 그래서 아래 코드와 같이 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());
	}

}