티스토리 뷰

1) Spring JDBC 소개

Spring JDBC

  • JDBC 프로그래밍을 보면 반복되는 개발 요소가 있습니다.
    이러한 반복적인 요소는 개발자를 지루하게 만듭니다.
    개발하기 지루한 JDBC의 모든 저수준 세부사항을 스프링 프레임워크가 처리해줍니다.
    개발자는 필요한 부분만 개발하면 됩니다.

Spring JDBC - 개발자가 해야 할 일은?

  • 어떤 데이터베이스에 접속하게 할 건지, 어떤 테이블에 query 문을 보내고 싶은 건지와 같은 반드시 개발자가 알려줘야 되는 정보들만 애플리케이션 개발자들이 개발을 하면 됩니다.
  • 실제 정보를 가지고 자동으로 만들어낼 수 있는 이런 부분들은 다 스프링 프레임워크가 대신해준다고 생각을 하시면 됩니다.

동작

설명

스프링

개발자

연결 파라미터 정의

어떤 데이터베이스에 접속할 건지 등의 정보 제공

 

O

연결 오픈

 

O

 

SQL문 지정

쿼리 설정

 

O

파라미터 선언과 파라미터 값 제공

파라미터가 어떤 값들을 가지고 query 문을 수행할 건지에 대한 정보 제공

 

O

statement 준비와 실행

 

O

 

(존재한다면) 결과를 반복하는 루프 설정

 

O

 

각 이터레이션에 대한 작업 수행

 

 

O

모든 예외 처리

 

O

 

트랜잭션 제어

 

O

 

연결, statement, resultset 닫기

 

O

 

 

Spring JDBC 패키지

org.springframework.jdbc.core

JDBC 템플릿 클래스와 JDBC 템플릿의 다양한 콜백 인터페이스를 포함하고 있고 추가로 여러 가지 관련 클래스를 포함하고 있습니다.

org.springframework.jdbc.datasource

데이터 소스의 접근을 쉽게하는 유틸리티 클래스와 javaEE 컨테이너 외부에 수정되지 않고 운영되는 JDBC 코드와 테스트에서 사용할 수 있는 여러 가지 간단한 데이터 소스 구현체를 포함하고 있습니다.

org.springframework.jdbc.object

RDBMS의 조회, 갱신, 저장 프로시저를 스레드 세이프하고 재사용 가능한 객체로 나타내는 클래스를 포함하고 있습니다.

org.springframework.jdbc.support

SQL Exception 변환 기능과 약간의 유틸리티 클래스를 제공하고 있습니다.

 

JDBC Template

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

실습코드

JdbcTemplate select 예제1 - 열의 수 구하기(queryForInt)

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

 

JdbcTemplate select 예제2 - 변수 바인딩 사용하기(queryForInt)

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

 

JdbcTemplate select 예제3 - String값으로 결과 받기(queryForObject)

  • 세 번째 파라미터에 리턴받기 원하는 클래스를 적으면 됩니다.

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

 

JdbcTemplate select 예제4 - 한 건 조회하기(queryForObject)

  • 한 행에는 여러 개의 컬럼이 존재하죠. 해당 컬럼들을 원하는 객체에 매핑을 해줘야 하는데요. 그때 사용하는 객체가 RowMapper라고 하는 객체입니다.
  • RowMapper를 상속받은 이름 없는 객체를 이용해서 mapRow()라는 메서드를 오버라이딩 하고 있는 것을 볼 수 있습니다. 한 건의 결과가 ResultSet에 담겨있기 때문에 해당 ResultSet의 값을 Actor에 담아서 리턴을 하고 있는 모습을 볼 수 있습니다. 이렇게 실행하면 한 행의 데이터를 조회해서 이런 객체에 담아서 리턴을 해줄 수 있습니다.

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;

    }

  });

 

JdbcTemplate select 예제5 - 여러 건 조회하기(query)

List<Actor> actors = this.jdbcTemplate.query(

  "select first_name, last_name from t_actor",

  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;

    }

  });

 

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

  • 한 건 select와 여러 건 select 모두 동일한 RowMapper를 사용하는데요. 그 부분을 별도의 메서드로 추출함으로써 코드의 중복을 막을 수 있습니다.

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;

  }

}

 

JdbcTemplate insert 예제

  • insert, update, delete는 모두 update()라는 메서드를 이용해서 실행합니다. ?의 개수만큼 SQL 문 뒤 파라미터에 ?에 들어갈 값을 넣어주면 됩니다.

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 actor where id = ?", Long.valueOf(actorId));

 

JdbcTemplate외의 접근방법

  • 아래의 클래스들을 이용한다면 좀 더 편하게 프로그래밍할 수 있습니다.

NamedParameterJdbcTemplate

JdbcTemplate에서 JDBC statement 인자를 ?를 사용하는 대신 파라미터명을 사용하여 작성하는 것을 지원합니다.
NamedParameterJdbcTemplate 예제

 

SimpleJdbcTemplate

JdbcTemplate과 NamedParameterJdbcTemplate 합쳐 놓은 템플릿 클래스로 이제 JdbcTemplate과 NamedParameterJdbcTemplate에 모든 기능을 제공하기 때문에 삭제 예정될 예정입니다.(deprecated)
SimpleJdbcTemplate 예제

SimpleJdbcInsert

이블에 쉽게 데이터 insert 기능을 제공합니다.
SimpleJdbcInsert 예제

 

생각해보기

  • JDBC 프로그래밍이 불편해서 이를 해결하기 위해서 등장한 기술에는 Spring JDBC 외에도 다양한 기술들이 존재합니다. 대표적으로 JPA MyBatis가 그러한 기술입니다. 문제를 해결하는 방법이 왜 여러 가지가 존재할끼요?

참고 자료

[참고링크] Data Access
https://docs.spring.io/spring/docs/current/spring-framework-reference/data-access.html#jdbc

 

'부스트코스 웹 프로그래밍 > 3. 웹 앱 개발: 예약서비스 1' 카테고리의 다른 글

9. Spring MVC - BE (1)  (0) 2019.08.06
8. Spring JDBC - BE (2)  (0) 2019.08.04
7. Spring Core - BE (4)  (0) 2019.08.04
7. Spring Core - BE (3)  (0) 2019.08.03
7. Spring Core - BE (2)  (0) 2019.08.03
Comments