공부방

JDBC 본문

스프링 DB-JDBC/JDBC

JDBC

코딩 화이팅 2025. 3. 25. 15:30

JDBC(Java Database Connectivity) ?

  • 자바 프로그램과 데이터베이스(DB)를 연결해주는 다리 역할
  • 자바로 프로그램을 만들고 데이터는 DB에 저장하지만 자바와 DB는 서로 다른 언어를 사용한다.
  • 그래서 중간에서 말을 번역해주는 역할

JDBC의 동작 흐름

  • JDBC는 Java 애플리케이션 내에서 JDBC API를 사용하여 데이터베이스에 접근하는 단순한 구조이다.
  • JDBC API를 사용하기 위해서는 JDBC 드라이버를 먼저 로딩한 후 데이터베이스와 연결하게 된다.

JDBC의 기본 동작 순서 (단계별)

1단계 : JDBC 드라이버 불러오기

Class.forName("com.mysql.cj.jdbc.Driver");
  • MySQL 드라이버라는 번역기를 가져오는 코드
  • MySQL 드라이버 클래스를 메모리에 로딩
  • 자바는 이걸 통해 MySQL과 연결하기 위해 이걸 써야한다는 걸 알게 됨
  • 이 드라이버가 내부에서 DriverManager에 자신을 자동 등록

2단계 : DB랑 연결하기

Connection conn = DriverManager.getConnection(
  "jdbc:mysql://localhost:3306/testdb",
  "root",
  "비밀번호"
);
  • Connection은 자바와 DB를 연결해주는 통로
  • 연결되면 이제 말(쿼리)을 주고받을 수 있다.
  • DriverManager는 등록된 드라이버들 중에서 이 주소를 이해할 수 있는 애가 있냐고 요청
  • 그럼 등록된 MySQL 드라이버가 할 수 있다고 응답
  • 그럼 그 드라이버가 실제로 MySQL 서버에 연결

3단계 : 쿼리 준비하기

String sql = "INSERT INTO users (name, email) VALUES (?, ?)";
PreparedStatement stmt = conn.prepareStatement(sql);
  • 쿼리는 DB에게 명령하는 문장
  • PreparedStatement는 안전하게 데이터를 넣는 도구
    미리 틀을 만들어놓고 나중에 값만 안전하게 채워서 보내니까 보안도 좋고 성능도 좋다.
  • ?는 나중에 값을 넣을 자리를 표시하는 것

4단계 : 값 넣고 실행하기

stmt.setString(1, "철수");
stmt.setString(2, "chulsoo@example.com");

stmt.executeUpdate(); // 실행!
  • 이제 ? 자리에 값을 넣고
  • 실행하면 DB가 저장 처리
  • executeUpdate()INSERT / UPDATE / DELETE 같은 변경 작업을 실행
  • executeQuery()SELECT처럼 조회 작업을 할 때 사용
  • 여기서 JDBC는 내부적으로 DB 서버에 SQL 쿼리를 문자열로 보낸다.
    그리고 결과를 DB에서 받아옴

5단계 : 결과 받아오기(ResultSet)

ResultSet rs = stmt.executeQuery("SELECT * FROM users");

while (rs.next()) {
    System.out.println(rs.getString("name"));
}
  • ResultSet은 결과 테이블처럼 생긴 데이터 덩어리
  • rs.next()는 그 테이블에서 한 줄씩 이동하면서 데이터를 읽는 것

6단계 : 연결 종료

rs.close();
stmt.close();
conn.close();
  • 메모리 낭비를 방지하기 위해 연결 끊어주기

커넥션 풀(Connection Pool)

  • JDBC API를 사용하여 데이터베이스와 연결하기 위해 Connection 객체를 생성하는 작업은 비용이 많이 드는 작업 중 하나이다.
  • 커넥션 객체를 생성하는 과정
    1. 애플리케이션에서 DB 드라이버를 통해 커넥션을 조회
    2. DB 드라이버는 DB와 TCP/IP 커넥션을 연결한다. (3 way handshake와 같은 네트워크 연결 동작 발생)
    3. DB 드라이버는 TCP/IP 커넥션이 연결되면 아이디와 패스워드, 기타 부가 정보를 DB에 전달한다.
    4. DB는 아이디, 패스워드를 통해 내부 인증을 거친 후 내부에 DB를 생성한다.
    5. DB는 커넥션 생성이 완료되었다는 응답을 보낸다.
    6. DB 드라이버는 커넥션 객체를 생성해서 클라이언트에 반환한다.
  • 이처럼 커넥션을 새로 만드는 것은 비용이 많이 들며, 비효율적이다.
  • 이러한 문제를 해결하기 위해 애플리케이션 로딩 시점에 Connection 객체를 미리 생성하고, 애플리케이션에서 데이터베이스에 연결이 필요할 경우 미리 준비된 Connection 객체를 사용하여 애플리케이션의 성능을 향상하는 커넥션 풀이 등장하게 된다.
  • Connection 객체를 미리 생성하여 보관하고 애플리케이션이 필요할 때 꺼내서 사용할 수 있도록 관리해 주는 것이 Connection Pool이다.

커넥션 풀 동작 구조

  • 애플리케이션을 시작하는 시점에 커넥션 풀은 필요한 만큼 커넥션을 미리 생성하여 보관한다.
  • 서비스의 특징과 스펙에 따라 생성되는 Connection 객체의 개수는 다르지만 일반적으로 기본값으로 10개를 생성한다.
  • 커넥션 풀에 들어있는 Connection 객체는 TCP/IP로 DB와 연결되어 있는 상태이기 때문에 즉시 SQL을 DB에 전달할 수 있다.
  • 즉, DB 드라이버를 통해 새로운 커넥션을 획득하는 것이 아닌 이미 생성되어 있는 커넥션을 참조하여 사용하게 된다.
  • 커넥션 풀에 있는 커넥션을 요청하면 커넥션 풀은 자신이 가지고 있는 커넥션 객체 중 하나를 반환한다.
  • 따라서 DB 드라이버를 통해 조회, 연결, 인증, SQL을 실행하는 시간 등 커넥션 객체를 생성하기 위한 과정을 생략 가능하게 된다.

'스프링 DB-JDBC > JDBC' 카테고리의 다른 글

JDBC  (0) 2023.06.13