JDBC(Java Database Connectivity)
JDBC는 Java Database Connectivity로 Java 애플리케이션이 데이터베이스와 통신할 수 있도록 도와주는 표준 API이다. DB마다 사용하는 프로토콜과 방식이 다르기 때문에 Java 프로그램이 DB와 직접 대화가 불가능하다. 그래서 자바에서는 공통된 규칙을 만들어 두고 DB마다 그 규칙을 구현한 드라이버를 사용한다. 그리고 그 공통 규칙이 JDBC이다.

구조는 위 사진과 같다. 여기서 핵심 포인트는
⭐ JDBC는 인터페이스이다. 실제 DB와 통신하는 코드는 JDBC Driver가 담당한다. DB가 달라도 JDBC API는 동일하게 사용한다.
-> 그래서 DB를 MySQL에서 PostgreSQL로 바꿔도 자바 코드의 큰 구조는 거의 바뀌지 않는다.
JDBC 동작 흐름
JDBC로 DB 작업을 할 때는 항상 비슷한 흐름을 따른다.
1) JDBC 드라이버 로딩
2) DB 연결
3) SQL 실행
4) 결과 처리
5) 자원 해제
예시 코드
1) DB 연결
- Connection은 DB와의 연결 통로
- 연결에 성공하면 이후 SQL을 실행할 수 있다.
String url = "jdbc:mysql://localhost:3306/testdb";
String user = "root";
String password = "1234";
Connection connection = DriverManager.getConnection(url, user, password);
2) SQL 실행
`PreparedStatement`을 사용하는 이유
- SQL Injection 방지
- 가독성 및 성능 측면에서 유리
String sql = "SELECT id, name FROM member WHERE id = ?";
PreparedStatement pstmt = connection.prepareStatement(sql);
pstmt.setInt(1, 1);
3) 결과 조회
- ResultSet은 쿼리 결과 집합
- `rs.next()`로 한 행씩 조회
ResultSet rs = pstmt.executeQuery();
while (rs.next()) {
int id = rs.getInt("id");
String name = rs.getString("name");
System.out.println(id + " " + name);
}
4) 자원 해제
자원 해제는 반드시 필요한 작업이다.
rs.close();
pstmt.close();
connection.close();
JDBC의 단점
일단 반복되는 코드가 너무 많다. 그리고 SQL과 자바 코드가 섞여 복잡해진다. 그리고 객체와 테이블 매핑이 불편하다.
그래서, 순수 JDBC는 거의 직접 쓰지 않는다. JPA나 Spring JDBC (JdbcTemplate)을 사용한다. 하지만 중요한 점은 Spring JDBC도, JPA도 내부적으로는 JDBC를 사용한다.
Spring JdbcTemplate란?
반복되는 JDBC 코드를 없애준 도구이다.
JDBC를 사용하면 항상 반복되는 코드가 있다. (Connection 생성, PreparedStatement 생성, ResultSet 처리, 예외 처리, 자원 해제 ...) 하지만 매번 다른 부분은 사실 SQL과 결과 처리 부분이다. 그래서 Spring JdbcTemplate은 이런 반복되는 것들 대신 핵심 로직에만 집중하게끔 도와주는 템플릿 클래스이다.
-> Spring에서 JDBC 사용을 단순화해주는 템플릿 클래스
Spring JdbcTemplate의 동작 구조

JdbcTempalte도 결국 JDBC를 사용한다. 차이점은 '누가 관리하는가' 이며, JDBC는 개발자가 JdbcTemplate은 Spring이 관리한다.
예시 코드
1) 의존성 주입
@Autowired
private JdbcTemplate jdbcTemplate;
2) 조회 쿼리
String sql = "SELECT id, name FROM member";
`RowMapper` 사용
- ResultSet 한 줄을 객체로 변환하는 역할
- 객체 매핑 책임을 분리할 수 있음
List<Member> members = jdbcTemplate.query(sql, (rs, rowNum) ->
new Member(
rs.getLong("id"),
rs.getString("name")
)
);
3) 단건조회
String sql = "SELECT id, name FROM member WHERE id = ?";
Member member = jdbcTemplate.queryForObject(
sql,
(rs, rowNum) -> new Member(
rs.getLong("id"),
rs.getString("name")
),
1
);
JdbcTemplate의 장점 및 한계
장점은 개발자는 SQL만 짜면 되고 다른 것들은 다 스프링에서 하게끔 지원하는 것이다. 그러나, 이 JdbcTemplate도 완벽하지는 않다. SQL을 직접 작성해야 하며 테이블과 객체 매핑은 수동으로 해야한다.
-> 이런 테이블과 객체 매핑을 자동으로 해주는 것은 JPA가 있다.
'Spring' 카테고리의 다른 글
| [Spring] 액츄에이터 (Actuator) (0) | 2025.12.18 |
|---|---|
| [Spring] @RequestBody JSON 바인딩 원리 (0) | 2025.11.28 |
| [Spring] Spring AI와 LangChain4j 비교 (0) | 2025.11.24 |
| [Spring] 임베디드 타입 (@Embeddable, @Embedded) (0) | 2025.11.10 |
| [Spring] Lombok 이해하기 - @NoArgsConstructor, @AllArgsConstructor, @RequiredArgsConstructor (0) | 2025.11.04 |
