litlight 2024. 5. 21. 17:53


1. JDBC의 등장 배경

JDBC의 등장배경
  • 애플리케이션 서버와 DB 연결 문제
    • 애플리케이션 서버에서 DB에 접근하기 위해서는 여러 가지 작업이 필요하다.
    • DB에 연결하기 위해 커넥션을 생성하고, SQL을 작성한 후 커넥션을 통해 SQL을 요청하고, 요청한 SQL에 대한 결과를 응답받는다.
  • DB 교체 시 문제점
    • 기존에 MySQL 서버를 사용하다가 PostgreSQL 서버로 변경한다면 커넥션을 연결하는 방법, SQL을 전달하는 방법, 결과를 응답받는 방법 등이 다를 수 있다.
    • 따라서 애플리케이션 서버에서 작성했던 DB 연결 로직들을 전부 수정해야 하는 불편함이 있다.
  • JDBC의 등장
    • 이러한 문제를 해결하기 위해 JDBC(Java Database Connectivity) 표준 인터페이스가 등장하였다.
    • JDBC는 자바 애플리케이션에서 데이터베이스에 접근할 수 있도록 하는 API로, DB 연결 로직을 변경할 필요 없이 DB를 변경할 수 있게 해준다.
    • DB 회사들은 JDBC 인터페이스를 구현한 후 라이브러리로 제공하며, 이를 JDBC 드라이버라고 한다.
    • 따라서, MySQL 드라이버를 사용해 DB에 연결하던 것을 PostgreSQL 서버로 변경할 때 드라이버만 교체하면 손쉽게 DB를 변경할 수 있다.

2. Spring Boot의 JDBC 라이브러리

  • Spring Boot와 JDBC
    • Spring Boot는 데이터베이스 연결을 쉽게 구성할 수 있도록 다양한 JDBC 드라이버를 지원한다.
    • spring-boot-starter-jdbc는 Spring Boot 프로젝트에서 JDBC를 통해 데이터베이스와 상호작용하기 위해 사용되는 스타터 패키지이다.
    • 이 스타터 패키지는 데이터베이스 작업을 수행하는 데 필요한 주요 의존성과 자동 구성 기능을 제공하여, 데이터베이스와의 연결을 쉽고 빠르게 구성할 수 있도록 도와준다.
  • 주요 포함 내용
    1. JDBC API 지원: JDBC API를 통해 SQL 데이터베이스에 접근하고 작업을 수행할 수 있다.
    2. DataSource 구성: 데이터 소스 연결을 위한 기본적인 설정을 자동으로 구성한다.
    3. JdbcTemplate: SQL 쿼리 실행, 결과 세트 처리, 예외 처리 등을 단순화하여, JDBC 작업의 많은 번거로움을 줄여준다.
  • 주요 장점
    1. 간소화된 데이터베이스 연결: DataSource 설정과 JdbcTemplate 사용을 통해 복잡한 JDBC 코드를 간소화할 수 있다.
    2. 자동 구성: Spring Boot의 자동 구성 기능은 개발자가 데이터베이스 연결에 필요한 대부분의 구성을 자동으로 처리할 수 있도록 한다.
    3. 효율적인 예외 처리: Spring의 DataAccessException을 통해 JDBC에서 발생하는 예외를 일관된 예외 체계로 변환한다.

3. JDBC의 사용

  • JDBC 드라이버란?
    • JDBC 드라이버는 자바 애플리케이션과 특정 데이터베이스 간의 연결을 가능하게 하는 API이다.
    • JDBC 드라이버는 네 가지 유형(Type 1, 2, 3, 4)이 있으며, 가장 일반적으로 사용되는 것은 Type 4 드라이버(순수 자바 드라이버)이다.
  • JDBC 실습 코드
    • DriverManager를 통해 커넥션을 생성하고, 쿼리를 요청하고, 결과를 받아오는 과정을 예제로 살펴보자.
// JdbcApplication.java
package com.thesun4sky.jdbc;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class JdbcApplication {

    public static void main(String[] args) throws SQLException {
        // 어플리케이션 실행 컨텍스트 생성
        SpringApplication.run(JdbcApplication.class, args);

        // 데이터베이스 연결정보
        String url = "jdbc:h2:mem:test";  // spring.datasource.url
        String username = "sa";           // spring.datasource.username

        // connection 얻어오기
        try (Connection connection = DriverManager.getConnection(url, username, null)) {
            try {
                // 테이블 생성 (statement 생성)
                String createSql = "CREATE TABLE USERS (id SERIAL, username varchar(255))";
                try (PreparedStatement statement = connection.prepareStatement(createSql)) {
                    statement.execute();
                }

                // 데이터 추가 (statement 생성)
                String insertSql = "INSERT INTO USERS (username) VALUES ('teasun kim')";
                try (PreparedStatement statement = connection.prepareStatement(insertSql)) {
                    statement.execute();
                }

                // 데이터 조회 (statement 생성 후 rs = resultSet 수신 & next() 조회)
                String selectSql = "SELECT * FROM USERS";
                try (PreparedStatement statement = connection.prepareStatement(selectSql)) {
                    var rs = statement.executeQuery();
                    while (rs.next()) {
                        System.out.printf("%d, %s", rs.getInt("id"), rs.getString("username"));
                    }
                }
            } catch (SQLException e) {
                if (e.getMessage().equals("ERROR: relation \"account\" already exists")) {
                    System.out.println("USERS 테이블이 이미 존재합니다.");
                } else {
                    throw new RuntimeException(e);
                }
            }
        }
    }
}

4. JdbcTemplate의 등장

  • JdbcTemplate의 필요성
    • JDBC의 등장으로 손쉽게 DB 교체가 가능해졌지만, 여전히 DB에 연결하기 위해 여러 가지 작업 로직들을 직접 작성해야 한다는 불편함이 남아 있었다.
    • 이러한 불편함을 해결하기 위해 커넥션 연결, statement 준비 및 실행, 커넥션 종료 등의 반복적이고 중복되는 작업들을 대신 처리해주는 JdbcTemplate이 등장하였다.
     

JdbcTemplate 사용 방법

1. application.properties에 DB 접근 정보를 작성

spring.datasource.url=jdbc:mysql://localhost:3306/memo
spring.datasource.username=root
spring.datasource.password={비밀번호}
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver​

2. build.gradle에 JDBC 라이브러리와 MySQL 등록

// MySQL
implementation 'mysql:mysql-connector-java:8.0.28'
implementation 'org.springframework.boot:spring-boot-starter-data-jdbc'

3. DB 연결이 필요한 곳에서 JdbcTemplate을 주입받아 사용

 


JDBC는 데이터베이스와의 연결을 간소화하고, 다양한 데이터베이스 간의 호환성을 높여주는 중요한 역할을 한다.