• JDBC : Java DataBase Connectivity, 자바에서 데이터베이스에 접속할 수 있도록 하는 자바 API

JDBC 표준 인터페이스

  • 자바는 3가지 기능을 표준 인터페이스로 정의해 놓았다.
  1. Connection : 데이터베이스와 연결 java.sql.Connection
    • 주로 TCP/IP를 사용해 커넥션을 연결한다
  2. Statement : SQL 전달 java.sql.Statement
    • 애플리케이션 서버는 DB가 이해할 수 있는 SQL을 연결된 커넥션을 통해 DB에 전달한다
  3. ResultSet : 결과 응답 java.sql.ResultSet
    • DB는 전달된 SQL을 수행하고 그 결과를 응답한다

JDBC 드라이버

  • DBMS는 라이브러리를 통해 자신의 플랫폼에 맞는 구현체를 제공한다
    ex) MySQL JDBC 드라이버, H2 JDBC 드라이버 등
  • 각 드라이버는 JDBC의 Connection 인터페이스를 구현한 커넥션 구현체를 제공한다
    ex) org.h2.jdbc.JdbcConnection

퍼시스턴스 프레임워크

  • 데이터의 저장, 조회, 변경, 삭제를 다루는 클래스 및 설정 파일의 집합
  • 이를 사용함으로써 JDBC 프로그래밍의 복잡함이나 번거로움 없이 간단하게 DB와 연동할 수 있다

1. SQL Mapper

  • MyBatis, JDBCTemplate
  • Object와 SQL의 필드를 맵핑하여 데이터를 객체화

2. ORM

  • JPA
  • Object와 관계형 DB의 테이블을 맵핑하여 데이터를 객체화
  • 장점 : 반복적인 SQL 작성을 할 필요가 없어진다, DBMS에 종속적이지 않는다(Dialect 제공)
  • 단점 : 직접 SQL을 실행하는 것보다 성능이 떨어질 수 있다

DataSource

  • 커넥션을 획득하는 방법을 추상화한 인터페이스 javax.sql.DataSource
public interface DataSource {
    Connection getConnection() throws SQLException;
    ...
}

데이터소스 자동등록

  • 스프링부트는 DataSource를 스프링 빈으로 자동으로 등록한다
  • 이 때, 스프링부트는 설정파일을 통해 데이터소스를 판별하고 적절한 DataSourceTransactionManager를 빈으로 등록한다
spring.datasource.url=jdbc:h2:tcp://localhost/~/test
spring.datasource.username=sa
spring.datasource.password=

Spring Docs About DataSource

커넥션 풀

  • 매 요청마다 커넥션을 생성하면 시간과 리소스를 많이 소모하기 때문에 커넥션을 미리 생성해 두고 풀에 보관하며 사용하는 방법
  • 대부분의 커넥션 풀은 DataSource를 구현하고 있다

  • 사용자 요청마다 커넥션을 생성하면 커넥션은 세션을 만들고 세션은 트랜잭션을 시작한다

JdbcTemplate

  • Spring JDBC 접근 방법 중 하나, 템플릿을 제공해 간단하게 JDBC를 사용할 수 있다
  • SQL파라미터만 넣어주면 된다
  • 순서 기반 파라미터 바인딩을 지원
    • cf) NamedParameterJdbcTemplate: 이름 기반 파라미터 바인딩(권장)
  • 동적쿼리를 작성하기 힘들다
    • SQL String에 +=로 계속해서 추가해 나가야 한다
    • MyBatis를 사용하면 더 쉽게 작성할 수 있다


  • args : 파라미터 바인딩값(? 갯수만큼)
  • rowMapper : ResultSet으로부터 데이터를 읽어와 객체를 생성해주는 래퍼 
  1. query(String sql, Object[] args, RowMapper rowMapper)
    • select 문 수행 결과가 여러개일 경우
  2. queryForObject(String sql, Object[] args, RowMapper rowMapper)
    • select문 수행 결과가 1개일 경우
  3. queryForList(String sql, Object[] args, Class elementType)
    • select문 수행 결과의 속성이 1개일 경우
    • elementType : select한 칼럼 타입
  4. update(String sql, Object[] args)
    • insert, update, delete 문 수행

MyBatis

Mybatis 기초
Mybatis ResultMap, Association, Collection

JPA

ORM과 Hibernate 구현체
JPQL
Spring Data JPA
QueryDSL

선택 가이드

  1. 복잡한 SQL을 많이 사용하는 경우에는 SQL Mapper을 사용한다
    • JdbcTemplate, MyBatis
  2. 복잡하지 않거나 단순 반복 CRUD가 많은 경우 ORM을 사용할 수 있다
    • JPA, Spring Data JPA, QueryDSL
    • ORM을 주로 사용하다가 복잡한 SQL을 간간히 사용할 경우 JPA + JdbcTamplate이나 JPA + MyBatis 조합을 사용한다
  • 각 기술들은 각자의 플랫폼에서 제공하는 TransactionManager가 있다 (링크)
    • JDBC : DataSourceTransactionManager
    • JPA : JpaTransactionManager
  • 이 경우 JpaTransactionManager 하나만 사용하면 된다
    • JpaTransactionManager가 DataSourceTransactionManager이 제공하는 대부분의 기능을 갖고 있다
  • 주의점
    • 같이 사용할 경우 JPA의 flush 타이밍을 주의해야 한다
    • 하나의 트랜잭션 안에서 JPA로 데이터를 변경한 다음 commit을 하지 않고 JdbcTemplate로 호출하는 경우 변경이 반영되어 있지 않다
    • JPA의 호출이 끝난 다음 flush를 해 변경사항을 데이터베이스에 반영해야 한다