1. 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를 통해 데이터베이스와 상호작용하기 위해 사용되는 스타터 패키지이다.
- 이 스타터 패키지는 데이터베이스 작업을 수행하는 데 필요한 주요 의존성과 자동 구성 기능을 제공하여, 데이터베이스와의 연결을 쉽고 빠르게 구성할 수 있도록 도와준다.
- 주요 포함 내용
- JDBC API 지원: JDBC API를 통해 SQL 데이터베이스에 접근하고 작업을 수행할 수 있다.
- DataSource 구성: 데이터 소스 연결을 위한 기본적인 설정을 자동으로 구성한다.
- JdbcTemplate: SQL 쿼리 실행, 결과 세트 처리, 예외 처리 등을 단순화하여, JDBC 작업의 많은 번거로움을 줄여준다.
- 주요 장점
- 간소화된 데이터베이스 연결: DataSource 설정과 JdbcTemplate 사용을 통해 복잡한 JDBC 코드를 간소화할 수 있다.
- 자동 구성: Spring Boot의 자동 구성 기능은 개발자가 데이터베이스 연결에 필요한 대부분의 구성을 자동으로 처리할 수 있도록 한다.
- 효율적인 예외 처리: 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는 데이터베이스와의 연결을 간소화하고, 다양한 데이터베이스 간의 호환성을 높여주는 중요한 역할을 한다.
'🗂️ Study > 🌿Spring' 카테고리의 다른 글
IoC(제어의 역전) & DI(의존성 주입) (0) | 2024.05.21 |
---|---|
3 Layer Architecture (0) | 2024.05.21 |
Memo (CRUD 구현하기) (0) | 2024.05.21 |
DTO (0) | 2024.05.21 |
@ModelAttribute & @RequestBody (0) | 2024.05.21 |