JDBC :: 내부 구조 파헤치기

2025. 8. 4. 17:42백엔드/Spring Framework

JDBC(Java Database Connectivity) 프로그래밍이란?

Java에서 데이터베이스에 연결하고 SQL을 실행해 데이터를 읽고 쓰는 기능을 구현하는 것

  1. JDBC 드라이버 로드
  2. 데이터베이스 연결
  3. 쿼리문 작성
  4. 쿼리문(Statement 계열) 객체 생성
  5. 쿼리 실행
  6. 실행 결과 처리
  7. 연결 해제

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