Java

JDBC 구성 요소(아키텍처)

ryeonng 2024. 6. 14. 16:00
JDBC 아키텍처는 Java 애플리케이션과 데이터베이스 사이의 상호작용을 담당하는 여러 구성 요소로 이루어져 있다.
각 구성 요소는 특정 역할을 수행하며, 이들이 어떻게 작동하는지 이해하는 것이 중요하다.

 

JDBC 구성 요소

  • DriverManager
  • Driver
  • Connection
  • Statement
  • ResultSet
  • SQLException

 

1. DriverManager

  • DriverManagerJDBC 드라이버들을 관리하는 클래스이다. 데이터베이스 연결을 설정하기 위해 사용된다.
  • 애플리케이션이 데이터베이스에 연결 요청을 하면, DriverManager는 적절한 JDBC 드라이버를 찾아 연결을 설정한다.

DriverManager는 여행사와 같다. 여행사는 여러 항공사와 협력하여 고객에게 적합한 항공편을 찾아주는 역할을 한다.

JDBC 드라이버 : JDBC 드라이버는 특정 데이터베이스에 연결하고 SQL 쿼리를 실행할 수 있도록 하는 자바 클래스이다. 각 데이터베이스 벤더(예 : MySQL, Oracle, PostgreSQL 등)는 자사 데이터베이스와 상호작용할 수 있는 JDBC 드라이버(자바 클래스)를 제공한다.

1. Type 1 : JDBC-ODBC Bridge Driver
2. Type 2 : Native-API Driver
3. Type 3 : Network Protocol Driver
4. Type 4 : Thin Driver (가장 많이 사용 됨)

연결 설정도 관리 한다.
DriverManager는 애플리케이션이 데이터베이스 URL, 사용자 이름, 비밀번호 등을 제공하면, 이를 이용해 적절한 드라이버를 통해 데이터베이스와 연결을 설정한다.

 

예시 코드

Connection connection = 
	DriverManager.getConnection("jdbc:mysql://localhost:3306/mydatabase", "root", "password");

 

 

2. Driver

  • Driver는 JDBC 드라이버 인터페이스를 구현한 클래스이다. 데이터베이스와의 연결을 실제로 처리한다.
  • 데이터베이스에 연결하고 SQL 쿼리를 실행하는 데 필요한 방법을 제공한다.

Driver는 운전기사와 같다. 여행사가 예약한 항공편을 실제로 운행한다.

 

예시 코드

// 1. MySQL JDBC 드라이버 로드
Driver myDriver = new com.mysql.cj.jdbc.Driver();
DriverManager.registerDriver(myDriver);

-----------------------------------------------------

// 2. Oracle JDBC 드라이버 로드
Driver myDriver = new oracle.jdbc.OracleDriver();
DriverManager.registerDriver(myDriver);

 

 

3. Connection

  • Connection 객체는 데이터베이스와의 연결을 나타낸다.
  • SQL 쿼리를 실행하고, 트랜잭션을 관리하며, 연결을 닫는 등의 작업을 수행한다.

Connection 은 데이터베이스와의 전화선과 같다. 전화선을 통해 양방향 통신이 이루어진다.

 

예시 코드

Connection connection =
	DriverManager.getConnection("jdbc:mysql://localhost:3306/mydatabase", "root", "password");

 

 

4. Statement

  • 설명 : Statement 객체는 SQL 쿼리를 데이터베이스에 보내기 위해 사용된다.
  • 역할 : SQL 쿼리를 실행하고, 결과를 받아온다.

Statement는 데이터베이스에 보내는 편지와 같다. 편지를 보내면 답장을 받게 된다.

 

예시 코드

Statement statement = connection.createStatement();
ResultSet resultSet = statement.executeQuery("SELECT * FROM users");

 

 

5. ResultSet

  • 설명 : ResultSet 객체는 SQL 쿼리의 결과를 포함한다.
  • 역할 : 데이터베이스에서 반환된 데이터를 탐색하고 읽는 데 사용된다.

ResultSet은 편지의 답장과 같다. 답장에는 요청한 정보가 포함되어 있다.

 

예시 코드

while (resultSet.next()) {
    System.out.println("User ID: " + resultSet.getInt("id"));
    System.out.println("User Name: " + resultSet.getString("name"));
}

 

 

6. SQLException

  • 설명 : SQLException 은 JDBC 작업 중 발생하는 모든 예외를 처리한다.
  • 역할 : 데이터베이스 작업 중 오류가 발생하면 예외를 던져 문제를 알려준다.

SQLException은 전화 연결 중 문제가 발생하면 알람이 울리는 것과 같다.

 

예시 코드

try {
    Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydatabase", "root", "password");
    Statement statement = connection.createStatement();
    ResultSet resultSet = statement.executeQuery("SELECT * FROM users");
} catch (SQLException e) {
    e.printStackTrace();
}

 

package ch01;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class MySQLJdbcExample {

	public static void main(String[] args) {

		// jdbc connect 준비물
		//
		String url = "jdbc:mysql://localhost:3306/mydb2?serverTimezone=Asia/Seoul";
		String user = "root"; // 상용서비스에서 절대 루트 계정 사용 금지 !
		String password = "asd123";
		
		// 필요 데이터 타입
		// JDBC API 레벨(자바 개발자들이 개념화 시켜놓은 클래스들)
		Connection connection = null; // 연결
		Statement statement = null; // 문자를 기반으로 쿼리를 실행시키는 객체
		ResultSet resultSet = null;
		
		// 1. MySQL 구현체를 사용하겠다는 설정을 해야 한다.
		// JDBC 드라이버 로드 (MySQL 드라이버)
		try {
			// 1. 메모리에 사용하는 드라이버 클래스(JDBC API를 구현한 클래스)를 띄운다.
			Class.forName("com.mysql.cj.jdbc.Driver");

			// 2. 데이터 베이스에 연결 설정
			connection = DriverManager.getConnection(url, user, password);
			
			// 3. SQL 실행
			statement = connection.createStatement();
			// 2가지 쿼리를 실행시키는 메서드를 기억하자.
			resultSet = statement.executeQuery("SELECT * FROM employee"); // select 실행 시 사용
			// statement.executeUpdate(password); --> Insert, Update, Delete 사용
			
			// 구문 분석 -- 파싱
			
			// 4. 결과 처리
			while(resultSet.next()) { // next() : 데이터가 있다면, true 반환
				
				System.out.println("USER ID : " + resultSet.getInt("id"));
				System.out.println("USER NAME : " + resultSet.getString("name"));
				System.out.println("department : " + resultSet.getString("department"));
				System.out.println("-------------------------------------");
				
			}
			
		} catch (ClassNotFoundException e) {
		
			e.printStackTrace();
		} catch (SQLException e) {

			e.printStackTrace();
		}
		
		
	} // end of main

} // end of class

 

JDBC 드라이버 유형

  • Type 1 : JDBC-ODBC Bridge Driver
  • Type 2 : Native-API Driver
  • Type 3 : Network Protocol Driver
  • Type 4 : Thin Driver
드라이버 유형 설명 장점 단점 사용 예
Type 1: JDBC-ODBC Bridge Driver
JDBC 호출을 ODBC 호출로 변환하여 데이터베이스와 상호작용하는 드라이버입니다.
다양한 ODBC 호환 데이터베이스에 접근 가능
성능 저하, 네이티브 코드 의존, 네트워크 환경 사용 불가
현재 거의 사용되지 않음
Type 2: Native-API Driver
네이티브 라이브러리를 사용하여 데이터베이스와 상호작용합니다.
Type 1 드라이버보다 성능 우수
네이티브 코드 의존, 플랫폼 독립적이지 않음, 각 데이터베이스별 별도 드라이버 필요
일부 기업 환경에서 사용되지만 현재는 잘 사용되지 않음
Type 3: Network Protocol Driver
JDBC 호출을 미들웨어 서버로 전달하고, 미들웨어 서버는 이를 데이터베이스 특정 프로토콜로 변환하여 상호작용합니다.
클라이언트에서 네이티브 코드 필요 없음, 플랫폼 독립적, 네트워크 환경에 적합
미들웨어 서버 설치 및 관리 필요
대규모 엔터프라이즈 환경에서 유용
Type 4: Thin Driver
네이티브 라이브러리나 미들웨어 서버 없이 직접 네트워크를 통해 데이터베이스와 상호작용하는 순수 Java로 작성된 드라이버입니다.
플랫폼 독립적, 설치 간단, 성능 우수
특정 데이터베이스에 종속
현재 대부분의 Java 애플리케이션에서 사용 (MySQL, Oracle 등)

 

'Java' 카테고리의 다른 글

JDBC 트랜잭션 관리와 배치 처리  (0) 2024.06.27
JDBC 기본 사용법  (0) 2024.06.14
JDBC  (0) 2024.06.14
1:1 양방향 통신  (0) 2024.06.12
1:1 단방향 통신 (클라이언트측)  (0) 2024.06.12