26/07/16 IL(I Learned) - Step 1

JDBC 기초 이해와 데이터베이스 연결

Java 프로그램과 데이터베이스를 연결하는 JDBC(Java Database Connectivity)의 가장 기본적인 동작 과정을 학습하였다. Driver를 직접 로딩하고 Connection 객체를 생성하면서 JDBC가 어떻게 동작하는지 이해할 수 있었다.


1) DriverLoading

학습 내용상세 내용
JDBC(Java Database Connectivity)Java 프로그램이 데이터베이스와 통신하기 위한 표준 API이다. 데이터베이스 종류(MySQL, PostgreSQL 등)가 달라도 동일한 JDBC 인터페이스를 사용하여 프로그래밍할 수 있다.
JDBC Driver데이터베이스 회사에서 제공하는 라이브러리이다. Java에서 작성한 명령을 각 데이터베이스가 이해할 수 있는 형태로 변환하는 역할을 수행한다.
Driver LoadingDriver를 메모리에 등록하는 과정이다. Driver가 등록되어야 DriverManager가 적절한 Driver를 선택하여 데이터베이스와 연결할 수 있다.
Class.forName()문자열로 전달받은 클래스를 JVM 메모리에 로드하는 메서드이다. JDBC Driver 등록 과정에서 많이 사용되었다.
예외 처리Driver가 존재하지 않으면 ClassNotFoundException이 발생하므로 반드시 예외 처리를 수행해야 한다.
public class DriverExample {

    public static void main(String[] args) {

        try {

            Class.forName("com.mysql.cj.jdbc.Driver");

            System.out.println("Driver Loading Success");

        } catch (ClassNotFoundException e) {

            System.out.println("Driver Loading Failed");
        }

    }

}

데이터베이스에 연결하기 전에 가장 먼저 JDBC Driver를 JVM에 등록하는 과정을 수행하였다.

Class.forName() 메서드는 문자열 형태로 전달받은 클래스를 메모리에 로드하는 기능을 수행한다.

Class.forName("com.mysql.cj.jdbc.Driver");

가 실행되면 MySQL Driver 클래스가 JVM에 로드되고 DriverManager 내부에 자동으로 등록된다.

이후 프로그램에서

DriverManager.getConnection(...)

을 호출하면 DriverManager는 현재 등록되어 있는 Driver들 중 연결 가능한 Driver를 찾아 데이터베이스 연결을 수행한다.

최근 JDBC에서는 Driver가 자동 등록되기 때문에 직접 호출하지 않아도 되는 경우가 많지만, 내부 동작 원리를 이해하기 위해서는 Driver Loading 과정이 매우 중요하다는 것을 알게 되었다.

또한 Driver 클래스가 존재하지 않으면 프로그램은 Driver를 찾을 수 없으므로 ClassNotFoundException이 발생하며, 이를 처리하기 위해 try-catch 문을 사용하였다.

내용설명
Spring BootDriver를 자동 등록해 주므로 직접 작성하지 않는 경우가 많다.
순수 JDBCDriver Loading을 직접 수행하는 경우가 존재한다.
DriverManager등록된 Driver를 이용하여 데이터베이스 연결을 생성한다.
라이브러리 관리Driver Jar 파일이 프로젝트에 포함되어 있어야 한다.

2) GetConnection

학습 내용상세 내용
Connection데이터베이스와 실제 연결된 객체이다. SQL을 실행하기 위해 가장 먼저 생성해야 하는 객체이다.
DriverManager등록된 Driver 중 적절한 Driver를 선택하여 Connection 객체를 생성한다.
DBUtil데이터베이스 연결 코드를 하나의 클래스로 분리하여 재사용성을 높였다.
환경 변수URL, USER, PASSWORD를 코드에 직접 작성하지 않고 환경 변수로 관리하였다.
SQLException데이터베이스 연결 과정에서 발생하는 예외이다.
public class ConnectionExample {

    public static void main(String[] args) {

        try {

            Connection databaseConnection = DBUtil.getConnection();

            System.out.println(databaseConnection.getMetaData().getURL());

        } catch (SQLException e) {

            e.printStackTrace();

        }

    }

}

Driver를 등록한 이후 실제 데이터베이스와 연결을 수행하였다.

Connection databaseConnection = DBUtil.getConnection();

을 호출하면 내부적으로 DriverManager가 실행된다.

DBUtil에서는

  • URL
  • USER
  • PASSWORD

를 환경 변수에서 읽어와 Connection 객체를 생성한다.

이처럼 DB 연결 정보를 별도의 Utility 클래스로 분리하면 여러 클래스에서 동일한 Connection 생성 코드를 반복해서 작성하지 않아도 된다.

또한 민감한 정보(DB 계정과 비밀번호)를 소스 코드에 직접 작성하지 않아 보안 측면에서도 장점이 있다.

Connection 객체가 생성되면 데이터베이스와의 통신이 가능한 상태가 되며, 이후 Statement나 PreparedStatement를 생성하여 SQL을 실행할 수 있다.

JDBC 연결 과정

실습을 통해 JDBC의 연결 과정은 다음과 같은 순서로 이루어진다는 것을 이해하였다.

Java Program
      │
      ▼
Class.forName()
      │
      ▼
DriverManager
      │
      ▼
Connection 생성
      │
      ▼
Statement / PreparedStatement 생성
      │
      ▼
SQL 실행
      │
      ▼
ResultSet 반환

단순히 Connection만 생성하는 것이 아니라, JDBC는 위와 같은 흐름으로 데이터베이스와 통신한다는 점을 이해하는 것이 중요하다고 느꼈다.

내용설명
DBUtil프로젝트 전체에서 하나의 DB 연결 클래스를 공유한다.
환경 변수DB 계정과 비밀번호를 코드에 작성하지 않는다.
Connection Pool실무에서는 매번 Connection을 생성하지 않고 HikariCP와 같은 Connection Pool을 사용한다.
Spring BootDataSource를 통해 Connection을 자동 관리한다.
profile
예 마 함 가보입시더

0개의 댓글