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를 통해 데이터베이스와 상호작용하기 위해 사용되는 스타터 패키지입니다.
    • 이 스타터 패키지는 데이터베이스 작업을 수행하는 데 필요한 주요 의존성과 자동 구성 기능을 제공합니다. 데이터베이스와의 연결을 쉽고 빠르게 구성할 수 있도록 도와주는 브릿지 역할을 합니다.
    • 주요 포함 내용
      1. JDBC API 지원: JDBC API를 통해 SQL 데이터베이스에 접근하고 작업을 수행할 수 있습니다.
      2. DataSource 구성: 데이터 소스 연결을 위한 기본적인 설정을 자동으로 구성합니다. 이는 데이터베이스 연결을 관리하는 데 필수적인 요소입니다.
      3. JdbcTemplate: **JdbcTemplate**은 Spring의 핵심 클래스 중 하나로, JDBC 작업의 많은 번거로움을 줄여 줍니다. SQL 쿼리 실행, 결과 세트 처리, 예외 처리 등을 단순화합니다.
    • 주요 장점 내용
      1. 간소화된 데이터베이스 연결: DataSource 설정과 JdbcTemplate 사용을 통해 복잡한 JDBC 코드를 간소화할 수 있습니다.
      2. 자동 구성: Spring Boot의 자동 구성 기능은 개발자가 데이터베이스 연결에 필요한 대부분의 구성을 자동으로 처리할 수 있도록 합니다.
      3. 효율적인 예외 처리: 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();

 

'DB > JPA ( Java Persistence API )' 카테고리의 다른 글

[JPA] 테이블 객체  (0) 2025.01.27
[JPA] 쿼리 파일 만들기 (QueryMapper)  (0) 2025.01.26
[JPA] JPA와 Transaction  (0) 2025.01.17
[JPA] 지연로딩, 즉시로딩  (0) 2025.01.15
[JPA] Proxy  (0) 2025.01.14

+ Recent posts