부스트코스 강의를 듣고 정리한 내용.

Spring JDBC

JDBC 프로그래밍을 하다보면 반복되는 개발 요소가 있다. 스프링 프레임워크는 이러한 JDBC의 모든 저수준 세부사항을 처리해준다.

동작 스프링 애플리케이션 개발자
연결 파라미터 정의 (어떤 DB에 접속할 것인지 등등)   O
연결 오픈 O  
SQL문 지정   O
파라미터 선언과 파라미터 값 제공   O
statement 준비와 실행 O  
(존재한다면) 결과를 반복하는 루프 설정 O  
각 이터레이션에 대한 작업 수행   O
모든 예외 처리 O  
트랜잭션 제어 O  
연결, statement, resultset 닫기 O  

Spring JDBC 패키지

  • org.springframework.jdbc.core: JDBC 템플릿 및 관련 helper 객체 제공 (JDBC 템플릿의 콜백 인터페이스 등등)
  • org.springframework.jdbc.datasource: DataSource를 쉽게 접근하기 위한 util 클래스, 트랙잭션 매니저 및 다양한 DataSource 구현 제공
  • org.springframework.jdbc.object: RDBMS 조회, 갱신, 저장 등을 thread-safe하고 재사용 가능한 객체 제공
  • org.springframework.jdbc.support: jdbc.core 및 jdbc.object를 사용하는 JDBC 프레임워크를 지원

JDBC Template

  • org.springframework.jdbc.core에서 가장 중요한 클래스
  • 리소스 생성, 해지를 처리함으로써 연결을 닫는 것을 잊어 발생하는 문제 등을 피할 수 있도록 함
  • statement의 생성과 실행 처리
  • SQL 조회, 업데이트, 저장 프로시저 호출, ResultSet 반복 호출 등을 실행
  • JDBC 예외가 발생할 경우 org.springframework.dao 패키지에 정의돼 있는 일반적인 예외로 변환시킴

jdbcTemplate SELECT 예제

열의 수 구하기

int rowCount = this.jdbcTemplate.queryForInt("select count(*) from t_acor");

변수 바인딩 사용하기

int countOfActorsNamedJoe = this.jdbcTemplate.queryForInt("select count(*) from t_actor where first_name=?", "Joe");

String 값으로 결과 받기

String lastName = this.jdbcTemplate.queryForObject("select last_name from t_actor where id=?", new Object[]{1212L}, String.class);

한 건 조회하기

Actor actor = this.jdbcTemplate.queryForObject(
  "select first_name, last_name from t_actor where id=?",
  new Object[]{1212L},
  new RowMapper<Actor>() {
    public Actor mapRow(ResultSet rs, int rowNum) throws SQLException {
      Actor actor = new Actor();
      actor.setFirstName(rs.getString("first_name");
      actor.setLastName(rs.getString("last_name");
      return actor;
    }
  }
);

여러 건 조회하기

List<Actor> actor = this.jdbcTemplate.query(
  "select first_name, last_name from t_actor where id=?",
  new RowMapper<Actor>() {
    public Actor mapRow(ResultSet rs, int rowNum) throws SQLException {
      Actor actor = new Actor();
      actor.setFirstName(rs.getString("first_name");
      actor.setLastName(rs.getString("last_name");
      return actor;
    }
  }
);

중복 코드 제거 (1건 구하기와 여러 건 구하기가 같은 코드에 있을 경우)

public List<Actor> findAllActors() {
	return this.jdbcTemplate.query("select first_name, last_name from t_actor", new ActorMapper());
}

private static final class ActorMapper implements RowMapper<Actor> {
  public Actor mapRow(ResultSet rs, int rowNum) throws SQLException {
    Actor actor = new Actor();
    actor.setFirstName(rs.getString("first_name");
    actor.setFirstName(rs.getString("last_name");
    return actor;
  }
}

jdbcTemplate INSERT 예제

INSERT, UPDATE, DELETE는 모두 update() 메소드를 이용해 실행한다.

this.jdbcTemplate.update("insert into t_actor(first_name, last_name) values (?, ?)", "Leonor", "Watling");

jdbcTemplate UPDATE 예제

this.jdbcTemplate.update("update t_actor set=? where id=?", "Banjo", 5276L);

jdbcTemplate DELETE 예제

this.jdbcTemplate.update("delete from t_actor where id=?", Long.valueOf(actorId);

JdbcTemplate 이외의 접근 방법

  • NamedParameterJdbcTemplate
    • JdbcTemplate에서 JDBC statement 인자를 ?를 사용하는 대신 파라미터명을 사용하여 작성하는 것을 지원
  • SimpleJdbcTemplate
    • JdbcTemplate과 NamedParameterJdbcTemplate 합쳐 놓은 템플릿 클래스
    • 이제 JdbcTemplate과 NamedParameterJdbcTemplate에 모든 기능을 제공하기 때문에 삭제 예정될 예정(deprecated)
  • SimpleJdbcInsert
    • 테이블에 쉽게 데이터 insert 기능을 제공