## JDBC 단점 보완
커넥션을 여닫고 에러핸들링을 하는 등 JDBC에서 반복적인 코드를 줄이기 위해 템플릿 메서드 패턴과 전략 패턴을 함께 사용해 구현한 것이 JdbcTemplate이다.
스프링은 거기에 @Transactional 애노테이션을 제공하여 트랜잭션 관리를 쉽게 했다.
예제 코드 작성을 위해서는 세 개의 디펜던시를 추가하면 된다.
1. spring-jdbc: JdbcTemplate 등 JDBC 연동에 필요한 기능 제공
2. tomcat-jdbc: DB 커넥션풀 기능 제공
3. mysql-connector-java: MySQL 연결에 필요한 JDBC드라이버 제공
아래 코드로 DataSource를 빈으로 등록할 수 있다.
tomcat의 데이터소스는 커넥션풀 기능을 제공하는 데이터소스 구현 클래스이다.
```
import org.apache.tomcat.jdbc.pool.DataSource;
@Configuration
public class DbConfig {
@Bean
public DataSource dataSource() {
DataSource ds = new DataSource();
ds.setDriverClassName("com.mysql.jdbc.Driver");
ds.setUrl("jdbc:mysql://localhost/ ... / characterEncoding=utf8");
ds.setUsername("ss");
ds.setPassword("ss");
return ds;
}
}
```
### Transaction
Transaction을 적용하고 싶은 메서드에 스프링이 제공하는 @Transaction을 붙이면 된다.
이 애노테이션이 제대로 동작하려면 다음 두 가지 설정을 추가해야 한다.
1. 플랫폼 트랜잭션 매니저(PlatformTransactionManager)빈 설정
2. @Transactional 애노테이션 활성화 설정
```
@Configuration
@EnableTransactionManagement // @Transaction이 붙은 메서드를 트랜잭션 범위 내에서 실행하는 기능 활성화
public class AppCtx {
@Bean
public DataSource dataSource() {
DataSource ds = new DataSource();
...
return ds;
}
@Bean
public PlatformTransactionManager transactionManager() { //구현 기술에 상관없이 동일한 방법으로 트랜잭션을 처리하기 위한 인터페이스
DataSourceTransactionManager tm = new DataSourceTransactionManager();
tm.setDataSource(dataSource()); //트랜잭션 연동에 사용할 데이터소스 지정
return tm;
}
}
```
### Transaction과 Proxy
스프링은 트랜잭션 애노테이션이 적용된 빈 객체를 찾아와 알맞은 프록시 객체를 생성한다.
별도 설정이 없다면 트랜잭션 도중 RuntimeException이 발생할 때 롤백된다. DataAccessException 또한 RuntimeException을 상속받고 있다. 만약 다른 Exception에도 롤백하고 싶다면 @Transactional(rollbackFor = SQLException.class)처럼 익셉션을 추가해주면 된다.