JDBC / Spring JDBC 에 대해 알아보고, 어떻게 활용되는지 등의 차이점을 알아보도록 하자!
JDBC
먼저 JDBC(Java Database Connectivity)는 자바에서 데이터베이스에 접근하기 위한 표준 API이다.
JDBC의 역할
- SQL 쿼리를 실행하고,
- 트랜잭션을 처리할 수 있는 역할을 수행한다!
JDBC의 구성 요소
JDBC는 크게 5가지 요소로 나뉘어진다.
- DriverManager / DataSource: DB 설정을 관리하는 역할
- Connection: DB와 연결된 세션
- Statement / PreparedStatement: SQL 실행 객체
Statement는 간단한 SQL 실행
PreparedStatement는 파라미터화 된 SQL을 실행하며, 성능과 보안이 향상됨 - ResultSet: SQL 실행 결과를 담는 객체
- SQLException: DB 연동 중 발생하는 예외를 처리하는 클래스
JDBC의 특징
1. 표준 API
자바 언어에서 SQL을 수행할 수 있다!
다만, 한 쿼리를 수행할 때마다 많은 자바 코드가 필요하다. 예시를 살펴보자.
public static void main(String[] args) {
String url = "jdbc:mysql://localhost:3306/exampledb";
String user = "root";
String password = "1234";
String SELECT_QUERY = "SELECT id, name FROM member WHERE id = ?";
try (
Connection conn = DriverManager.getConnection(url, user, password);
PreparedStatement pstmt = conn.prepareStatement(sql);
) {
pstmt.setInt(1, 1);
try (ResultSet rs = pstmt.executeQuery()) {
while (rs.next()) {
int id = rs.getInt("id");
String name = rs.getString("name");
System.out.println("id = " + id + ", name = " + name);
}
}
} ...
}
}
위 sql을 실행하기 위해서는
- 커넥션(conn)과 sql 문장인 PreparedStatement를 생성한 뒤,
- executeQuery()로 쿼리를 실행해야 한다.
쿼리 실행 결과는 ResultSet으로 확인할 수 있다 !
2. 데이터베이스 독립성
즉, 드라이버만 바꾸면 다른 DB를 수행할 수 있다.
의존성에 DB 관련 설정을 바꾸어 주면,
MySQL, Oracle, PostgreSQL 등으로 DB를 바꿔서 쿼리를 실행시킬 수 있다.
3. 보안
PreparedStatement를 통해 SQL Injection 방지가 가능하다.
데이터를 바인딩하기 전에, 쿼리를 컴파일 하기 때문에 SQL의 쿼리 구조를 변경할 수 없다.
※ JDBC와 JDBC 드라이버의 차이
JDBC는 위에서 말했듯이, DB와의 상호작용을 도와주는 표준 API이다.
반면, JDBC 드라이버는 DB와 실제 통신을 구현하며, 특정 DB 연결에 종속적이다.
Spring JDBC
Spring JDBC는 Spring 프레임워크에서 제공하는 JDBC 모듈이다.
기존 JDBC에서 DB로 접근하는 코드를 추상화함으로써, 커넥션 관리나 예외 처리같은 반복적인 작업을 줄여준다.
JDBCTemplate
Spring JDBC에서 가장 중요한 JDBCTemplate 클래스는 Connection, Statement, ResultSet 등
기존 JDBC의 대부분의 작업을 내부에서 처리해준다.
RowMapper
RowMapper는 ResultSet에 담긴 데이터를 자바 객체로 매핑한다.
이외에도, Spring JDBC는 URL이나 비밀번호 같은 접속 정보들로 DataSource 객체를 생성하여 DB를 자동으로 관리해준다!
예제를 통해 Spring JDBC에 대해서 자세히 알아보자.
@Autowired
private JdbcTemplate jdbcTemplate;
private static String DELETE_QUERY = """
delete from member where id = ?;
""";
private static String SELECT_QUERY = """
select * from member where id = ?;
""";
public void deleteById(long id) {
jdbcTemplate.update(DELETE_QUERY, id);
}
public Member selectById(long id) {
Member member = jdbcTemplate.queryForObject(
SELECT_QUERY,
(rs, rowNum) -> new Member(rs.getInt("id"), rs.getString("name")),
id
);
return member;
}
- 먼저 DB 연결, ResultSet 등을 위한 JdbcTemplate를 jdbcTemplate으로 주입
- deleteById(): DB 데이터를 변경하는 메소드를 생성
- update 메소드는 insert, update, delete가 포함된 쿼리를 실행할 수 있다.
- selectById(): DB의 단건 데이터를 조회
- RowMapper로 id와 name의 column을 Member 클래스의 id, name field로 변환
- 단건 데이터 조회로 queryForObject 메소드를 불러옴
- 만약, 여러 건의 데이터를 조회하려면 query 메소드를 사용해야함
- 또한 조건에 맞는 데이터가 없다면 EmptyResultDataAccessException이 발생
이처럼 Spring JDBC의 예외 처리는 SQLException을 분석해서 구체적인 예외를 던져준다.
대표적인 Spring JDBC 예외에 대해 몇 개 소개해본다.
- EmptyResultDataAccessException: 단건 조회에 대해 데이터가 존재하지 않는 경우
- IncorrectResultSizeDataAccessException: 예상 조회 건수가 1건인데, 2건 이상의 데이터가 존재하는 경우
- DataIntegrityViolationException: 데이터 무결성 제약을 위반했을 때(중복된 PK 삽입 등)
- BadSqlGrammarException: SQL 문법이 틀렸을 때
이렇게 JDBC와 Spring JDBC에 대해서 알아보았다.
두 기술 모두 자바에서 DB에 접근하기 위한 API를 따르지만, 편의성 면에서 차이가 있음을 알 수 있다!
😊
참고
'Spring' 카테고리의 다른 글
| [Spring] 스프링 시큐리티(Spring Security) (0) | 2025.10.17 |
|---|---|
| [Spring] 서블릿(Servlet)/서블릿 컨테이너(Servlet Container) (0) | 2025.10.02 |