카테고리 없음

[초보 웹 개발자를 위한 스프링5 프로그래밍 입문] 08. DB연동

## 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)처럼 익셉션을 추가해주면 된다.