JABHACK
2025. 1. 25. 11:54
2025. 1. 25. 11:54
1. 데이터베이스 드라이버의 역할 및 종류
항목 |
설명 |
예시/종류 |
드라이버 역할 |
애플리케이션과 데이터베이스 간의 통신을 중개. 애플리케이션 요청을 데이터베이스가 이해할 수 있는 언어로 변환. |
우체부나 통역사의 역할과 유사. |
드라이버 종류 |
데이터베이스별로 다른 드라이버가 필요. |
- Oracle: oracle.jdbc.OracleDriver- MySQL: com.mysql.jdbc.Driver- H2: org.h2.Driver |
2. 데이터베이스 드라이버 동작 방식
단계 |
설명 |
비유 |
연결 초기화 |
드라이버가 데이터베이스와 연결. 네트워크 정보, 인증 자격 증명을 사용. |
항공기✈️가 관제탑에 이륙 요청. |
SQL 전송 및 실행 |
애플리케이션의 SQL 명령을 데이터베이스가 이해할 수 있도록 변환하여 처리. |
외국어를 현지 언어로 번역하는 통역사 역할. |
결과 처리 |
데이터베이스가 반환한 결과를 애플리케이션이 이해할 수 있도록 변환하여 전달. |
관제탑이 비행기 착륙을 안전하게 안내. |
연결 종료 |
데이터베이스 연결을 해제하여 자원을 정리하고 시스템 초기화. |
항공기✈️가 공항 게이트에 도킹. |
[1]. Spring Boot 의 JDBC 라이브러리
- Spring Boot와 JDBC: Spring Boot는 데이터베이스 연결을 쉽게 구성할 수 있도록 다양한 JDBC 드라이버를 지원합니다. 이를 통해 개발자는 복잡한 설정 없이 데이터베이스와의 연결을 쉽게 구성할 수 있습니다.
- **spring-boot-starter-jdbc**는 Spring Boot 프로젝트에서 JDBC를 통해 데이터베이스와 상호작용하기 위해 사용되는 스타터 패키지입니다.
- 이 스타터 패키지는 데이터베이스 작업을 수행하는 데 필요한 주요 의존성과 자동 구성 기능을 제공합니다. 데이터베이스와의 연결을 쉽고 빠르게 구성할 수 있도록 도와주는 브릿지 역할을 합니다.
- 주요 포함 내용
- JDBC API 지원: JDBC API를 통해 SQL 데이터베이스에 접근하고 작업을 수행할 수 있습니다.
- DataSource 구성: 데이터 소스 연결을 위한 기본적인 설정을 자동으로 구성합니다. 이는 데이터베이스 연결을 관리하는 데 필수적인 요소입니다.
- JdbcTemplate: **JdbcTemplate**은 Spring의 핵심 클래스 중 하나로, JDBC 작업의 많은 번거로움을 줄여 줍니다. SQL 쿼리 실행, 결과 세트 처리, 예외 처리 등을 단순화합니다.
- 주요 장점 내용
- 간소화된 데이터베이스 연결: DataSource 설정과 JdbcTemplate 사용을 통해 복잡한 JDBC 코드를 간소화할 수 있습니다.
- 자동 구성: Spring Boot의 자동 구성 기능은 개발자가 데이터베이스 연결에 필요한 대부분의 구성을 자동으로 처리할 수 있도록 합니다.
- 효율적인 예외 처리: Spring의 **DataAccessException**을 통해 JDBC에서 발생하는 예외를 Spring의 일관된 예외 체계로 변환합니다.
[2]. JDBC
- JDBC 드라이버란?: JDBC(Java Database Connectivity)는 자바 애플리케이션에서 데이터베이스에 접근할 수 있도록 하는 API입니다. JDBC 드라이버는 이 API를 구현하여, 자바 애플리케이션과 특정 데이터베이스 간의 연결을 가능하게 합니다.
- JDBC 드라이버 타입: JDBC 드라이버는 네 가지 유형(Type 1, 2, 3, 4)이 있으며, 각각의 특징과 사용 환경에 따라 선택할 수 있습니다. Type 4 드라이버(순수 자바 드라이버)가 가장 일반적으로 사용됩니다.
- 문장 그대로 Java 앱과 DB 를 연결시켜주기 위해 만들어진 기술입니다.
- 그렇기 때문에 JPA 도 이 기술을 사용하여 구현되어 있습니다. ✅
- JDBC Driver 는 여러타입의 DB 와 연결할 수 있는 기능을 제공합니다.
- JDBC 실습
- DriverManager 를 통해서 Connection(연결) 을 생성하여 쿼리를 요청할 수 있는 상태를 만들어주고
- Statement(상태) 를 생성하여 쿼리를 요청하고
- ResultSet(결과셋) 을 생성해 쿼리 결과를 받아옵니다.
[3]. JDBC Template (QueryMapper)
- JDBC 로 직접 SQL을 작성했을때의 문제
- SQL 쿼리 요청시 중복 코드 발생
- DB별 예외에 대한 구분 없이 Checked Exception (SQL Exception) 처리
- Connection, Statement 등.. 자원 관리를 따로 해줘야함
- 자원 해제 안해주면 메모리 꽉차서 서버가 죽음
- 이 문제 해결을 위해 처음으로 Persistence Framework 등장!
- Persistence Framework 는 2가지가 있다.
- SQL Mapper : JDBC Template, MyBatis 👈 요게 먼저나옴
- ORM : JPA, Hibernate
- SQL Mapper (QueryMapper)
- SQL ↔ Object
- SQL 문과 객체(Object)의 필드를 매핑하여 데이터를 객채화
JDBC Template (RowMapper)
- SQL Mapper 첫번째 주자로 JDBCTemplate 에 RowMapper 탄생
- 쿼리 수행 결과와 객채 필드 매핑
- RowMapper 로 응답필드 매핑코드 재사용
- Connection, Statement, ResultSet 반복적 처리 대신 해줌
- 😵💫 But, 결과값을 객체 인스턴스에 매핑하는데 여전히 많은 코드가 필요함
3. JDBC 주요 객체 및 역할
객체 |
역할 |
사용 예시 |
Connection |
데이터베이스와의 연결을 생성 및 관리. |
Connection conn = DriverManager.getConnection(url, username, password); |
Statement |
SQL 명령어를 데이터베이스에 전달하는 역할. |
Statement stmt = conn.createStatement(); |
PreparedStatement |
Statement의 확장. 파라미터화된 SQL 쿼리를 효율적으로 실행하며 SQL Injection 방지. |
PreparedStatement pstmt = conn.prepareStatement("INSERT INTO users VALUES (?, ?)"); |
ResultSet |
쿼리 실행 결과를 저장하고 처리. |
ResultSet rs = stmt.executeQuery("SELECT * FROM users"); |
4. JDBC Template 주요 특징
항목 |
설명 |
중복 코드 제거 |
Connection, Statement, ResultSet과 같은 반복적인 코드 제거. |
자원 관리 자동화 |
자원의 자동 반환을 통해 메모리 누수를 방지. |
예외 처리 간소화 |
JDBC의 Checked Exception(SQL Exception)을 Spring의 일관된 예외 체계로 변환. |
RowMapper 제공 |
SQL 결과를 객체와 매핑하는 기능을 제공하여 결과 매핑 코드를 단순화. |
5. JDBC Template vs. SQL Mapper vs. ORM
|
JDBC Template |
SQL Mapper (MyBatis 등) |
ORM (JPA/Hibernate) |
주요 특징 |
SQL 문을 직접 작성하지만 반복적인 작업을 단순화. |
SQL 문과 객체 필드를 매핑하여 데이터 객체화. |
데이터베이스 테이블과 객체 간의 매핑을 자동화. |
장점 |
반복 작업 제거, 코드 간결화. |
SQL 활용이 유연하며 성능 최적화 가능. |
객체 중심의 설계, 개발 생산성 향상. |
단점 |
SQL 코드가 여전히 필요. |
XML 설정 파일 및 복잡한 매핑 관리가 필요. |
초기 학습 곡선이 가파르며 성능 최적화가 어려움. |
6. PreparedStatement vs Statement
|
Statement |
PreparedStatement |
SQL Injection 방지 |
지원하지 않음. |
변수 바인딩으로 Injection 방지. |
성능 |
매번 구문 분석(parse) 수행. |
SQL 구문 분석 결과를 캐싱하여 성능 향상. |
사용 방식 |
SQL 전체를 코드에 작성. |
SQL에 파라미터를 설정하여 실행. |
예시 코드 |
stmt.executeQuery("SELECT * FROM users WHERE id = " + id); |
pstmt.setInt(1, id); pstmt.executeQuery(); |