2025. 8. 4. 17:42ㆍ백엔드/Spring Framework
JDBC(Java Database Connectivity) 프로그래밍이란?
Java에서 데이터베이스에 연결하고 SQL을 실행해 데이터를 읽고 쓰는 기능을 구현하는 것
- JDBC 드라이버 로드
- 데이터베이스 연결
- 쿼리문 작성
- 쿼리문(Statement 계열) 객체 생성
- 쿼리 실행
- 실행 결과 처리
- 연결 해제
Connection
⇒ DB와의 연결 담당
⇒ 연결 성공시 Connection 객체 반환됨
⇒ DriverManager 클래스의 getConnection() 호출
Statement
⇒ 인파라미터가 없는 정적 쿼리문 실행시 사용
PreparedStatement
⇒ 인파라미터가 있는 동적 쿼리문 실행시 사용됨.
⇒ 인파라미터는 쿼리문 작성시 매개변수로 전달된 값을 설정할 때 사용.
⇒ 인파라미터 : ? 로 표현되며, 쿼리문에서 일부 값을 나중에 결정할 수 있게 해줌.
etc) CallableStatement: 프로시저나 함수를 호출시 사용
ResultSet
⇒ SELECT 쿼리문의 결과를 저장할 때 사용
close()
변천사
1. JDBC 직접 사용
Java + JDBC + JSP/Servlet
특징
드라이버 로딩, Connection/Statement 생성 및 해제 모두 수동으로 작성
2. DAO 패턴 + MVC1/2
JSP + Servlet + JDBC + DAO
특징
로직 분리 (Controller, Model, View), DAO 재사용, 유지보수성 증가
3. 커넥션 풀 + JNDI
Servlet + JDBC + DataSource(JNDI)
특징
DriverManager 대신 DataSource를 통해 커넥션 획득
→ 애플리케이션 시작 시 N개의 커넥션을 생성해두었다가 요청시 Pool에서 꺼내어 사용&반납
→ 매번 연결/해제하지 않고 반납된 커넥션을 재사용하는 방식으로 성능 향상 도모
(커넥션은 비용이 비쌈 : 네트워크 연결 + 인증 + 세션 생성)
4. Spring Framework의 등장
Spring + JDBC Template + MVC 구조
DispatcherServlet → Controller → Service → DAO(JdbcTemplate)
↳ DB
특징
DI(의존성 주입), AOP 기반 구조
JDBC 코드 추상화 → JdbcTemplate
트랜잭션 관리 → @Transactional
MVC 구조 완전 도입 (Controller, Service, DAO)
5. ORM의 도입 – JPA / Hibernate
Spring + JPA (Hibernate) + Spring MVC
JDBC → 객체 중심의 ORM으로 전환
엔티티(Entity) 클래스로 DB 테이블 매핑
JPQL, Criteria API 사용
특징
- DB 독립성 강화
- 코드와 DB 구조 싱크로 유지
- 개발 효율 향상
6. 스프링 부트의 등장
Spring Boot + JPA + Spring Web + AutoConfig
특징
@SpringBootApplication 하나로 설정 자동화
내장 톰캣 제공 → 배포 편의성
그래서, 왜 이제 와서 JDBC를 알아야 할까?
⇒ JDBC는 자바에서 DB와 통신하는 기본 프로토콜
⇒ Spring, Hibernate, MyBatis 등 모든 DB 관련 프레임워크는 JDBC 위에서 동작함
⇒ Spring Framework 내부적으로 JDBC를 감싸고 추상화한 기능들이 포함되어 대신 처리해줌
⇒ 예전에는 이와 같이 수동으로 DB와 연결해주는 클래스를 정의하여야 했음
⇒ 반복되는 코드, 트랜잭션 관리의 어려움, Connection 풀 관리 등의 문제점이 존재
⇒ 과거에는 발전을 거듭하여 프레임워크가 이러한 부분을 담당해 주므로, 개발자가 서비스로직에만 집중할 수 있도록 환경을 제공한다는 장점이 있다.
JDBC 코드 (참고)
// JDBCConnect.java
// JDBC 연결과 해제를 담당
package common;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
public class JDBCConnect {
public Connection con;
public Statement stmt;
public PreparedStatement psmt;
public ResultSet rs;
// 1. 기본 생성자
public JDBCConnect() {
try {
// JDBC 드라이버 로드
Class.forName("oracle.jdbc.OracleDriver");
// DB에 연결
String url = "jdbc:oracle:thin:@localhost:1521:xe";
String id = "musthave";
String pwd = "1234";
con = DriverManager.getConnection(url, id, pwd);
System.out.println("DB 연결 성공(기본 생성자)");
} catch (Exception e) {
e.printStackTrace();
}
}
// 2. 두 번째 생성자
// => 단점: DB 접속이 필요할 때마다 동일 코드를 JSP에서 반복 기술해야함.
public JDBCConnect(String driver, String url, String id, String pwd) {
try {
// JDBC 드라이버 로드
Class.forName(driver);
// DB 연결
con = DriverManager.getConnection(url, id, pwd);
System.out.println("DB 연결 성공(인수 생성자 1)");
} catch (Exception e) {
e.printStackTrace();
}
}
// 3. 세 번째 생성자
// => 컨텍스트 초기화 매개변수를 생성자에서 직접 가져올 수 있게 정의
public JDBCConnect(ServletContext application) {
try {
// JDBC 드라이버 로드
String driver = application.getInitParameter("Oracleriver");
Class.forName(driver);
// DB에 연결
String url = application.getInitParameter("OracleURL");
String id = application.getInitParameter("OracleId");
String pwd = application.getInitParameter("OraclePwd");
con = DriverManager.getConnection(url, id, pwd);
System.out.println("DB 연결 성공(인수 생성자 2)");
} catch (Exception e) {
e.printStackTrace();
}
}
// 연결 해제(자원 반납)
public void close() {
try {
if (rs != null)
rs.close();
if (stmt != null)
stmt.close();
if (psmt != null)
psmt.close();
if (con != null)
con.close();
System.out.println("JDBC 자원 해제");
} catch (Exception e) {
e.printStackTrace();
}
}
}
'백엔드 > Spring Framework' 카테고리의 다른 글
| Spring :: 날짜/시간 자동 포맷팅 (1) | 2026.02.11 |
|---|---|
| Spring :: 페이징 처리 (요약) (0) | 2026.02.11 |
| Spring :: EntityManager (3) | 2025.08.05 |
| Spring :: 주요 모듈 (2) | 2025.08.04 |
| Spring :: 프로젝트 관리 :: Maven, Gradle (2) | 2025.08.04 |