내가 개발해볼게!!
[스프링 DB 1편 데이터 접근 핵심 원리] 1. JDBC의 이해 본문
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 드라이버들을 관리하고, 커넥션을 획득하는 기능을 제공한다.
- 애플리케이션 로직에서 커넥션이 필요하면 DriverManager.getConnection()을 호출한다
- DriverManager는 자동으로 인식한 라이브러리 내에 등록된 드라이버에게 URL, 이름, 비밀번호 등의 정보를 전달해 커넥션을 획득할 수 있는지 확인한다.
- URL의 앞부분에 데이터베이스의 종류가 명시되어 있다(jdbc:h2, jdbc:mysql) 각 드라이버는 해당 정보를 확인하여 본인이 처리할 수 있는 요청인지 판단한다.
- 이렇게 찾은 커넥션 구현체를 클라이언트에 반환한다.
JDBC를 통한 데이터베이스의 조작은 다음과 같은 흐름으로 진행된다
커넥션 획득 - SQL문 준비 및 실행 - 리소스 정리
- 커넥션 획득 : Connection con = DriverManager.getConnection()
- SQL문 준비 및 실행
- String sql = “insert into book(book_id, price) values (?, ?)”; 데이터베이스에 전달할 SQL을 문자열 타입으로 정의했다
- PreparedStatement pstmt = con.prepareStatement(sql); DB에 전달할 SQL과 파라미터로 전달할 데이터들을 준비한다. 이때 PreparedStatement는 Statement의 자식 타입인데, PreparedStatement를 통한 파라미터 바인딩 방식을 사용해 SQL Injection 공격을 예방할 수 있다.
- pstmt.setString(1, “1234”); SQL의 1번째 ?에 값을 지정한다
- pstmt.execute(); 준비된 SQL을 커넥션을 통해 실제 DB에 전달한다.
- 리소스 정리
- 쿼리를 실행하고 나면 항상 사용한 리소스를 정리해야 하기 때문에 finally 구문에 작성한다. 만약 커넥션이 계속 끊어지지 않고 유지되는 문제, 리소스 누수가 발생하면 커넥션 부족으로 장애가 발생할 수 있다.
- 사용한 리소스는 항상 역순으로 정리해줘야 한다( ResultSet → PreparedStatement → Connection )