JDBC (Java Database Connectivity)
자바에서 데이터베이스에 접속할 수 있도록 하는 자바 API로, Java로 데이터베이스에 연결 및 쿼리를 실행하기 위한 표준 인터페이스를 제공한다.
| 인터페이스/개념 | 설명 |
|---|---|
java.sql.Connection | 데이터베이스와의 연결(세션)을 나타내는 인터페이스 |
java.sql.Statement | SQL 쿼리를 실행하고 결과를 받아오는 역할을 하는 인터페이스 |
java.sql.PreparedStatement | 미리 컴파일된 SQL 쿼리를 실행하는 인터페이스로, Statement를 상속 |
java.sql.ResultSet | SQL 쿼리의 실행 결과를 나타내는 인터페이스 |
| JDBC 드라이버 | 특정 데이터베이스 벤더에서 제공하는 JDBC 표준 인터페이스의 구현체 |
JDBC Flow
섹션 제목: “JDBC Flow”| 단계 | 설명 | 사용 클래스/메서드 |
|---|---|---|
| 1. Get Connection | 데이터베이스에 연결하기 위한 연결 정보를 사용하여 DriverManager 클래스를 통해 데이터베이스 연결 | java.sql.Connection 인터페이스를 반환하는 DriverManager.getConnection() 메서드를 사용하여 Connection 객체 생성 |
| 2. Create Statement | Connection 객체로부터 SQL 쿼리를 실행하기 위한 Statement 객체를 생성 | java.sql.Statement 인터페이스를 반환하는 Connection.createStatement() 메서드를 사용하여 Statement 객체 생성 |
| 3. Configure Statement | 생성된 Statement 객체에 실행하려는 SQL 쿼리를 설정 (보통 PreparedStatement 사용) | java.sql.PreparedStatement 인터페이스를 사용하여 PreparedStatement 객체 생성 및 매개변수 설정 |
| 4. Execute Statement | 구성된 SQL 쿼리를 실행 | - executeQuery(): SELECT 문을 실행하고 결과를 ResultSet 객체로 반환- executeUpdate(): INSERT, UPDATE, DELETE 등의 데이터 조작 쿼리를 실행하고 영향을 받은 행의 수를 반환 |
| 5. Handle Warning | SQL 쿼리 실행 중에 발생한 경고나 예외 처리 | - try-catch 블록을 사용하여 예외 처리 |
| 6. Return Result | 쿼리를 실행한 결과 데이터 반환 | - ResultSet 객체를 사용하여 결과를 검색 및 처리 |
| 7. Close Statement | 작업이 완료되면 사용한 Statement 객체를 Statement.close() 메서드를 사용하여 명시적으로 닫아 자원 해제 | java.sql.Statement 인터페이스의 close() 메서드 |
| 8. Close Connection | 모든 데이터베이스 작업 완료 후 Connection 객체를 Connection.close() 메서드를 사용하여 명시적으로 닫아 데이터베이스 연결 자원을 해제 후 연결을 종료 | java.sql.Connection 인터페이스의 close() 메서드 |
굉장히 많은 과정을 필요로 하지만 JdbcTemplate를 사용하면 이러한 과정을 대신 처리해주어 편리하게 사용할 수 있다.
Statement / PreparedStatement
섹션 제목: “Statement / PreparedStatement”JDBC는 SQL을 실행하기 위한 인터페이스로 Statement와 PreparedStatement를 제공한다.
- Statement: SQL 쿼리를 실행 시점에 생성하고 실행하는 방식
- PreparedStatement: SQL 쿼리의 템플릿을 미리 정의하고, 실행 시점에 파라미터만 전달하여 실행하는 방식
- 성능: 데이터베이스는 전달받은 SQL 템플릿을 미리 파싱하고 컴파일하여 실행 계획을 캐싱
- 이후 동일한 쿼리가 파라미터만 바뀌어 요청되면 캐시된 실행 계획을 재사용하여 성능상 이점을 가짐
- 보안: 파라미터 바인딩 메커니즘을 통해 SQL Injection 공격을 원천적으로 방지
- 가독성 및 유지보수: SQL 쿼리와 파라미터가 분리되어 코드가 더 깔끔하고 유지보수가 용이
- 성능: 데이터베이스는 전달받은 SQL 템플릿을 미리 파싱하고 컴파일하여 실행 계획을 캐싱
JDBC 사용의 문제점
섹션 제목: “JDBC 사용의 문제점”JDBC API를 직접 사용하면 데이터베이스에 접근할 수 있지만, 실용적인 관점에서 몇 가지 문제점을 가진다.
- 반복적인 코드: 데이터베이스 연결,
Statement생성,ResultSet처리, 그리고 연결 및 리소스 종료 등의 반복적인 코드 작성 필요 - 리소스 관리의 번거로움:
Connection,Statement,ResultSet등의 리소스의 명시적 관리 필요 - 예외 처리: JDBC는 대부분의 예외를
SQLException이라는 checked exception으로 던지며, 벤더별로 다른 에러 코드를 가지므로 일관된 예외 처리가 어려움
JDBC의 사용
섹션 제목: “JDBC의 사용”최근에는 직접 사용하는 것보다는 SQL Mapper나 ORM을 결합하여 사용하고 있다.
flowchart LR subgraph direct["JDBC 직접 사용"] direction LR A1[애플리케이션 로직] --> B1[JDBC] end
subgraph mapper["SQL Mapper"] direction LR A2[애플리케이션 로직] --> SM["SQL Mapper<br/>(JdbcTemplate, MyBatis)"] --> B2[JDBC] end
subgraph orm["ORM"] direction LR A3[애플리케이션 로직] --> JPA[JPA] --> IMPL[JPA 구현체] --> B3[JDBC] endSQL Mapper와 ORM 비교
섹션 제목: “SQL Mapper와 ORM 비교”| 기술 유형 | 장점 | 단점 | 대표 기술 |
|---|---|---|---|
| SQL Mapper | - SQL 응답 결과를 객체로 편리하게 변환 - JDBC의 반복 코드를 제거 | - 개발자가 SQL을 직접 작성 | 스프링 JdbcTemplate, MyBatis |
| ORM | - 객체와 RDB의 패러다임 불일치 해결 - 생산성 - 유지보수 | - 학습비용 - 잘못 사용하면 성능 이슈 | JPA(자바 진영 ORM 표준 인터페이스), 하이버네이트, 이클립스링크 |