본문 바로가기
lang/java web

[Spring] Spring JDBC 설명/실습

by Wordbe 2020. 1. 4.
728x90

본 게시글은 edwith boostcourse를 공부하고 정리한 내용입니다.

1. Spring JDBC

JDBC를 이용해서 프로그래밍을 하게 되면 반복적인 코드가 많이 발생하고,

이는 개발자의 생산성을 떨어뜨립니다.

이를 위해 Spring JDBC가 등장했습니다.

JdbcTemplate

RowMapper


Spring JDBC에서 개발자가 할 일

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

Spring JDBC 패키지

org.springframework.jdbc.core : 콜백 인터페이스, jdbcTemplate 관련 Helper 객체 제공

org.springframework.jdbc.datasource : DataSource를 쉽게 접근하기 위한 유틸 클래스, 트랜잭션매니저 및 다양한 datasource 구현체 제공

org.springframework.jdbc.object : RDBMS 저장, 조회, 갱신 절차를 안전하고 재사용 가능한 객체로 표현하는 클래스 포함

org.springframework.jdbc.support : core, object 를 사용하는 JDBC 프레임워크 지원.


JdbcTemplate

  • org.springframework.jdbc.core에서 가장 중요한 클래스
  • 리소스 생성, 해지를 처리해서 연결을 닫는 것을 잊어 발생하는 문제 피할 수 있습니다.
  • statement의 생성, 실행을 처리합니다.
  • SQL 조회, 갱신, 저장 절차의 호출, ResultSet 반복호출 등을 실행합니다.
  • JDBC 예외 발생 시 org.springframework.dao 패키지이에 정의되어 있는 일반적인 예외로 변환시킵니다.

# 예제

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) 한 건 조회하기

→ 한 행 데이터 조회, mapRow 함수 오버라이딩

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

JdbcTemplate 외의 접근방법

1) NamedParameterJdbcTemplate

  • JdbcTemplate에서 JDBC state 인자 ?를 사용하는 대신 파라미터명을 작성하는 것을 지원

2) SimpleJdbcTemplate

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

3) SimpleJdbcInsert

  • 테이블에 쉽게 데이터 insert기능 제공

2. Spring JDBC 실습

1) DTO

  • Data Transfer Object
  • 계층 간 데이터 교환을 위한 java bins입니다.
  • 계층이란 controller view, business 계층, persistence(잔상) 계층을 의미합니다.
  • 일반적으로 DTO는 로직을 가지지 않는 순수한 데이터 객체입니다.
  • 필드와 getter, setter를 가지며, toString(), equals(), hashCode() 등 object 메소드를 오버라이딩 할 수 있습니다.
// DTO 예시
public class ActorDTO {
    private Long id;
    private String firstName;
    private String lastName;
    public String getFirstName() {
        return this.firstName;
    }
    public String getLastName() {
        return this.lastName;
    }
    public Long getId() {
        return this.id;
    }
    // ......
}

2) DAO

  • Data Access Object
  • 데이터를 조회, 조작하는 기능을 전담하도록 하는 객체입니다.
  • 데이터베이스를 조작하는 것이 목적입니다.

3) Connection Pool

  • DB 연결은 비용이 많이 발생(시간이 오래걸림)
  • Connection pool에 connection을 여러개를 미리 맺어둡니다.

4) DataSource

  • 커넥션 풀을 관리하는 목적으로 사용되는 객체 입니다.
  • DataSource를 이용해 커넥션을 얻어오고 반납하는 등의 작업을 수행합니다.

Spring JDBC를 이용한 DAO작성 실습

1) Maven 프로젝트 생성 (프로젝트명: daoexam)

2) pom.xml 라이브러리, 프레임워크, my sql 드라이버 추가

3) Maven > Update project

4) 깔끔한 정리를 위한 패키지 생성

kr.or.connect.daoexam.config

kr.or.connect.daoexam.main

5) Config 파일 생성

ApplicationCofing.java

DBConfig.java

6) Test 파일 생성

DataSourceTest.java

▶ DB 접속 성공 여부 확인.


7) 데이터 저장 객체, 쿼리 생성

Role.java

RoleDaoSqls.java

RoleDao.java

BeanPropertyRowMapper는 role_id, roleId 등 다른 표기법을 하나로 통일해줍니다.

8) dao 패키지를 ApplicationConfig 에 ComponentScan 설정

9) Test 파일 생성 및 실행

SellectAllTest.java

▶ DB에서 해당 쿼리의 데이터를 list에 가져와서 출력 확인


INSERT, UPDATE 실습

INSERT 문은 쿼리문이 필요하지 않습니다.

▶ INSERT, UPDATE 쿼리문 실행, 결과 출력


한 건 조회, 삭제 실습

▶ DELETE, SELECT 쿼리문 실행, 결과 출력


실습코드 정리

https://github.com/Wordbe/TIL/tree/master/Web/7.%20Spring/spring-jdbc


Reference

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

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

728x90

댓글