내가 개발해볼게!!

[스프링 DB 1편 데이터 접근 핵심 원리] 1. JDBC의 이해 본문

Backend/Spring

[스프링 DB 1편 데이터 접근 핵심 원리] 1. JDBC의 이해

보송송희 2023. 9. 20. 23:34

https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-db-1/dashboard

 

스프링 DB 1편 - 데이터 접근 핵심 원리 - 인프런 | 강의

백엔드 개발에 필요한 DB 데이터 접근 기술을 기초부터 이해하고, 완성할 수 있습니다. 스프링 DB 접근 기술의 원리와 구조를 이해하고, 더 깊이있는 백엔드 개발자로 성장할 수 있습니다., 백엔

www.inflearn.com

해당 강의를 듣고 배운 지식을 정리하는 글입니다!

 

Java DataBase Connectivity

: 자바에서 DB에 접속할 수 있도록 하는 자바 API

데이터베이스마다 커넥션을 연결하는 방법, SQL을 전달하는 방법, 결과를 응답받는 방법이 다르다. = DB를 다른 종류의 DB로 변경하려면 애플리케이션 서버에 개발된 DB 사용 코드도 변경해야 한다 = 각 DB마다 사용법을 따로 익혀야 한다

→ JDBC가 표준 인터페이스를 제공한다

  • java.sql.Connection : 연결
  • java.sql.Statement : SQL을 담은 내용
  • java.sql.ResultSet : SQL 응답

JDBC 드라이버 : JDBC 인터페이스를 각 DB 벤더(회사)에서 자신의 DB에 맞게 구현해 제공하는 라이브러리

JDBC의 등장으로 두 가지 문제가 해결되었다

  • DB를 다른 종류의 DB로 변경하려면 애플리케이션 서버에 개발된 DB 사용 코드도 변경해야 한다
  • → 애플리케이션 로직이 JDBC 표준 인터페이스에만 의존하기 때문에 DB를 변경하고 싶으면 JDBC 드라이버만 변경하면 된다
  • 각 DB마다 사용법을 따로 익혀야 한다
  • → JDBC 표준 인터페이스의 사용법만 익히면 모든 데이터베이스에 동일하게 적용할 수 있다 (SQL문은 해당 DB에 맞도록 변경해야한다)

 


JDBC와 최신 데이터 접근 기술

JDBC는 오래되고 복잡한 기술이기 때문에 JDBC를 편리하게 사용하는 다른 기술을 주로 사용한다

  • SQL Mapper
    • JdbcTemplate, MyBatis
    • 장점: JDBC를 편리하게 사용하도록 SQL 응답 결과를 객체로 편리하게 반환해주고, JDBC의 반복 코드를 제거해준다
    • 단점: 개발자가 SQL을 직접 작성해야 한다
  • ORM 기술
    • JPA, JPA 구현체(하이버네이트, 이클립스링크)
    • 객체를 관계형 데이터베이스 테이블과 매핑해주는 기술. SQL을 동적으로 만들어 실행해준다
    • 장점: SQL 자체를 작성하지 않아도 돼서 개발 생산성이 높아진다
    • 단점: 실무에서 사용하려면 깊이 있게 학습해야 한다

데이터베이스와 연결

JDBC의 DriverManager.getConnection()을 사용하면 라이브러리에 있는 DB 드라이버를 찾아 해당 DB와 connection을 맺고 반환받을 수 있다.

16:35:42.388 [Test worker] INFO spring.practice.connection.DBConnectionUtil - get connection 
 = com.mysql.cj.jdbc.ConnectionImpl@6b5f8707, class = class com.mysql.cj.jdbc.ConnectionImpl

com.mysql.cj.jdbc.ConnectionImpl : MySQL DB 드라이버가 제공하는 MySQL 전용 커넥션. java.sql.Connection 인터페이스를 구현하고 있다

JDBC에서는 java.sql.Connection 표준 커넥션 인터페이스를 정의하고 있고, 각 DB마다 JDBC 커넥션 인터페이스를 구현한 구현체를 제공한다

 

DriverManager 커넥션 요청 흐름

DriverManager는 라이브러리에 등록된 DB 드라이버들을 관리하고, 커넥션을 획득하는 기능을 제공한다.

  1. 애플리케이션 로직에서 커넥션이 필요하면 DriverManager.getConnection()을 호출한다
  2. DriverManager는 자동으로 인식한 라이브러리 내에 등록된 드라이버에게 URL, 이름, 비밀번호 등의 정보를 전달해 커넥션을 획득할 수 있는지 확인한다.
  3. URL의 앞부분에 데이터베이스의 종류가 명시되어 있다(jdbc:h2, jdbc:mysql) 각 드라이버는 해당 정보를 확인하여 본인이 처리할 수 있는 요청인지 판단한다.
  4. 이렇게 찾은 커넥션 구현체를 클라이언트에 반환한다.

JDBC를 통한 데이터베이스의 조작은 다음과 같은 흐름으로 진행된다

커넥션 획득 - SQL문 준비 및 실행 - 리소스 정리

  1. 커넥션 획득 : Connection con = DriverManager.getConnection()
  2. SQL문 준비 및 실행
    1. String sql = “insert into book(book_id, price) values (?, ?)”; 데이터베이스에 전달할 SQL을 문자열 타입으로 정의했다
    2. PreparedStatement pstmt = con.prepareStatement(sql); DB에 전달할 SQL과 파라미터로 전달할 데이터들을 준비한다. 이때 PreparedStatement는 Statement의 자식 타입인데, PreparedStatement를 통한 파라미터 바인딩 방식을 사용해 SQL Injection 공격을 예방할 수 있다.
    3. pstmt.setString(1, “1234”); SQL의 1번째 ?에 값을 지정한다
    4. pstmt.execute(); 준비된 SQL을 커넥션을 통해 실제 DB에 전달한다.
  3. 리소스 정리
    • 쿼리를 실행하고 나면 항상 사용한 리소스를 정리해야 하기 때문에 finally 구문에 작성한다. 만약 커넥션이 계속 끊어지지 않고 유지되는 문제, 리소스 누수가 발생하면 커넥션 부족으로 장애가 발생할 수 있다.
    • 사용한 리소스는 항상 역순으로 정리해줘야 한다( ResultSet → PreparedStatement → Connection )