edwith_부스트코스_웹 프로그래밍

[부스트코스]{3. 웹 앱 개발: 예약서비스 1/4}(8. Spring JDBC - BE)_1. Spring JDBC 개념

pea_Nut 2020. 3. 19. 19:46

JDBC를 이용해서 프로그래밍을 하게 되면 반복적인 코드가 많이 발생한다. 이러한 반복적인 코드는 개발자의 생산성을 떨어트리는 주된 원인이다. 이러한 문제를 해결하기 위해 등장한 것이 Spring JDBC!

 

 

Spring JDBC란?

 

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

 

Data Access Layer

 

 

 

 

1. 개발자가 해야 할 일은?

 

동작 Spring 개발자
연결 파라미터 정의   O
연결 오픈 O  
SQL 문 지정   O
파라미터 선언과 파라미터 값 제공   O
statement 준비와 실행 O  
결과를 반복하는 루프 설정 O  
각 이터레이션에 대한 작업 수행   O
모든 예외 처리 O  
트랜잭션 제어 O  
연결, statement, result set 닫기 O  

 

 

 

 

2. 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 프레임워크를 지원

 

 

 

 

3. JDBC Template

 

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

 

 

 

 

4. JDBC Template 예제

 

#select 

1) 열의 수 구하기

 

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

 

2) 변수 바인딩 사용하기

 

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

 

3) String 값으로 결과 받기

 

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

 

4) 한 건 조회하기

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;

    }

  });

 

5) 여러 건 조회하기

 

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;

    }

  });

 

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

 

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

 

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));

 

 

 

 

 

 

5. JdbcTemplate외의 접근방법

 

1) NamedParameterJdbcTemplate

2) SimpleJdbcTemplate

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

SimpleJdbcInsert

 

 

 

 

 

 

 

 

#참고하면 좋은 사이트

https://gmlwjd9405.github.io/2018/12/19/jdbctemplate-usage.html

 

[Spring JDBC] JdbcTemplate의 기본 사용법 - Heee's Development Blog

Step by step goes a long way.

gmlwjd9405.github.io

 

 

 

#부스트코스 강의

https://www.edwith.org/boostcourse-web/lecture/20660/

 

[LECTURE] 1) Spring JDBC 소개 : edwith

들어가기 전에 JDBC를 이용해서 프로그래밍을 하게 되면 반복적인 코드가 많이 발생합니다. 이러한 반복적인 코드는 개발자의 생산성을 떨어트리는 주된 원인이 됩니다. 이러한 문제를 ... - moons

www.edwith.org