공부방
JDBC 본문
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 객체를 생성하는 작업은 비용이 많이 드는 작업 중 하나이다.
- 커넥션 객체를 생성하는 과정
- 애플리케이션에서 DB 드라이버를 통해 커넥션을 조회
- DB 드라이버는 DB와 TCP/IP 커넥션을 연결한다. (3 way handshake와 같은 네트워크 연결 동작 발생)
- DB 드라이버는 TCP/IP 커넥션이 연결되면 아이디와 패스워드, 기타 부가 정보를 DB에 전달한다.
- DB는 아이디, 패스워드를 통해 내부 인증을 거친 후 내부에 DB를 생성한다.
- DB는 커넥션 생성이 완료되었다는 응답을 보낸다.
- 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 |
---|