자바와 DB - JDBC, 커넥션풀

목차

JDBC란

🌟 자바에서 DB에 독립적이게 DB 작업(접속/CRUD)을 할 수 있는 자바 인터페이스이다.

DBMS(Oracle, MySQL 등)의 종류에 상관없이 하나의 JDBC API를 이용해서 데이터베이스 작업을 처리할 수 있다. → DB별 JDBC 드라이버를 통해

JDBC가 생긴 이유?

이전에는 데이터베이스의 종류마다 각각의 SQL문을 사용하였다. DB의 종류에 따라 SQL문(데이터베이스 방언)의 작성 방법이 달라서 구현이 불편했다. 따라서 DBMS 종류에 독립적이게 동일한 CRUD를 구현할 수 있도록 JDBC를 만들었다. (마치 JVM 처럼)

JDBC 동작 과정

간단하게는 아래의 과정을 거친다.

DB와 연결 → DB에 SQL 전송 → (DB에서 처리) → DB에서 결과 전송 → 연결 종료

  1. DB 서버 접속을 위해 JDBC 드라이버를 로드한다.

  2. DB Connection 객체를 생성한다**(매 연결 시 Connection 객체를 생성해야함)**.

  3. 쿼리를 수행하기 위한 PreparedStatement 객체를 생성한다.

  4. executeQuery를 수행하고 ResultSet로 반환받는다.

  5. 그 결과로 ResultSet 객체를 받아서 데이터를 처리한다.

  6. ResultSet를 종료한다.

  7. 실행한 쿼리문 Statement를 종료한다.

  8. JDBC Connection 종료한다.

Statement와 Prestatement

  • Statement이란

    • 정적 쿼리문으로, 쿼리에 값이 미리 입력되어야 한다.

    • executeQuery()/executeUpdate()를 실행하는 시점에 컴파일되어 실행한다.

      String query = "INSERT INTO persons(id, name) VALUES(" + personEntity.getId() + ", '"+ personEntity.getName() + "')";
      
      Statement statement = connection.createStatement();
      statement.executeUpdate(query);
  • Prestatement이란

    • 동적 쿼리문으로, 쿼리에 값이 런타임에 결정되어도 된다.

    • SQL쿼리의 틀을 미리 컴파일 해놓고, placeholder(?)값이 나중에 지정되면 그떄 실행한다.

    • 동일한 SQL문을 특정 파라미터만 바꿔서 여러 번 실행시켜야할 때 효율적이다.

      String query = "INSERT INTO persons(id, name) VALUES( ?, ?)";
      
      PreparedStatement preparedStatement = connection.prepareStatement(query);
      preparedStatement.setInt(1, personEntity.getId());
      preparedStatement.setString(2, personEntity.getName());
      preparedStatement.executeUpdate();

Statement보다 Prestatement을 사용하는 이유?

  1. 보안을 위해 (SQL injection 방지용)

  2. 특수 기호를 쉽게 처리할 수 있다.

    Statement는 ‘는 두번 써주어야하는 등 특수 기호 처리가 복잡하였다. Prestatement는 알아서 파싱해주므로 쉽게 처리할 수 있다.

  3. Prestatement는 캐시를 사용한다.

    반복 수행하는 쿼리일 경우 효율적이다. Prestatement는 처음 컴파일 후 캐시에 보관한다. 값을 지정하여 실행 시 재사용한다. DB에 부하가 적고 성능이 좋다.

DB connection pool

DB connection pool이란 데이터베이스에 접근하기 위한 Connection들을 모아두는 공간을 의미한다.

🌟 DB connection pool을 사용하면,

웹서버가 DB서버에 접근할 때 DB connection pool의 미리 생성되어 있는 DB Connection 객체를 가져다 쓰고 반환한다.

DB connection pool 사용하는 이유?

매 연결마다 Connection 객체를 생성하고 소멸시키는 비용/시간을 줄일 수 있다. 또한, DB에 접근하는 Connection의 수를 제한하여, 메모리와 DB에 걸리는 부하를 조정할 수 있다.

참고) 웹 서버에서 DB서버에 최초로 연결되어 Connection 객체를 생성할 때가 가장 오래 걸린다.

Reference

위로가기⬆

Last updated