Spring JDBC 소개

최준영·2021년 9월 27일
0

Spring JDBC


  • JDBC를 이용해서 프로그래밍을 하면 반복적인 코드가 많이 발생한다. 반복적인 코드는 개발자의 생산성을 떨어트리는 주된 원인이다.
  • 이런 문제를 해결하기 위해 등장한 것이 Spring JDBC이다.
  • JDBC의 저수준 세부사항을 스프링 프레임워크가 처리해주고 개발자는 필요한 부분만 개발하면 된다.
  • JDBC 프로그래밍의 불편함을 해결하기 위해 등장한 기술인 Spring JDBC 외에도 JPA나 MyBatis 등이 존재한다. 각각 장단점이 존재하기 때문에 상황에 따라 사용하면 된다.

Spring JDBC 패키지

  • org.springframework.jdbc.core
    • JdbcTemplate 및 관련 Helper 객체 제공
  • org.springframework.jdbc.datasource
    • DataSource를 쉽게 접근하기 위한 유틸 클래스, 트랜젝션매니져 및 다양한 DataSource 구현을 제공
  • org.springframework.jdbc.object
    • RDBMS 조회, 갱신, 저장등을 안전하고 재사용 가능한 객제 제공
  • org.springframework.jdbc.support
    • jdbc.core 및 jdbc.object를 사용하는 JDBC 프레임워크를 지원

JDBC Template

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

실습코드

열의 수 구하기

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

변수 바인딩 사용하기

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;

    }

  });
  • 한 행에는 여러 컬럼으로 존재한다. 해당 컬럼들을 원하는 객체에 매핑해주기 위해서는
    row mapper를 사용한다.

중복 코드 제거 (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.setLastName(rs.getString("last_name"));

    return actor;

  }

}

INSERT 하기

  • insert, update, delete는 모두 update로 사용한다.
this.jdbcTemplate.update("insert into t_actor (first_name, last_name) values (?, ?)",  "Leonor", "Watling");

UPDATE 하기

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

DELETE 하기

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

JdbcTemplate외의 접근방법

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

0개의 댓글