[JDBC (7) ] JDBC의 핵심 인터페이스/클래스 + JDBC 개발 절차

Yeonbi_Kim·2024년 7월 21일
post-thumbnail

JDBC 개발 절차 및 핵심 클래스

이 내용은 JDBC(Java Database Connectivity)를 사용하여 자바 애플리케이션에서 데이터베이스와 상호작용하는 방법을 설명한다. 아래는 개념, 사용방법, 왜 사용하는지, 유의점 , 실제 개발 과정, 논리적 과정을 포함한다.

JDBC 개념

1. JDBC 드라이버 로드

  • 개념 : 자바 애플리케이션에서 데이터베이스와 연결하기 위해 필요한 JDBC 드라이버를 로드한다.
  • 왜 사용하는가? : JDBC드라이버는 자바 애플리케이션 데이터베이스 사이의 통신을 가능하게 한다.
  • 사용방법 :
java

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

위의 명령어는 일반적으로 데이터베이스와의 연결을 설정하는 부분에 위치한다.
이 코드는 주로 자바 프로젝트의 메인 클래스나 데이터베이스 연결을 담당하는 유틸리티 클래스에 작성한다.
<예제 프로젝트 구조>
jdbc_example/

├── src/
│ ├── main/
│ │ ├── java/
│ │ │ └── com/
│ │ │ └── example/
│ │ │ ├── Main.java
│ │ │ └── DatabaseUtil.java
│ │ └── resources/
│ │
└── build.gradle
-Main.java-
메인 클래스에서 데이터베이스 유틸리티 클래스를 사용하여 데이터베이스 연결을 테스트한다.

Java

package com.example;

public class Main {
  public static void main(String[] args) {
      DatabaseUtil databaseUtil = new DatabaseUtil();
      databaseUtil.connect();
      databaseUtil.executeQuery("SELECT * FROM users");
  }
}
  • DatabaseUtil.java -
    데이터베이스 연결을 설정하고 관리하는 유틸리티 클래스이다.
java

package com.example;

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

public class DatabaseUtil {

    private static final String URL = "jdbc:mysql://localhost:3306/jdbc_ex";
    private static final String USER = "jdbc_ex1";
    private static final String PASSWORD = "jdbc_ex1";

    private Connection conn = null;

    // 데이터베이스 연결 설정
    public void connect() {
        try {
            // JDBC 드라이버 로드
            Class.forName("com.mysql.cj.jdbc.Driver");

            // 데이터베이스 연결 설정
            conn = DriverManager.getConnection(URL, USER, PASSWORD);
            System.out.println("Database connected successfully!");

        } catch (ClassNotFoundException e) {
            System.err.println("JDBC Driver not found: " + e.getMessage());
        } catch (SQLException e) {
            System.err.println("Database connection error: " + e.getMessage());
        }
    }

    // SQL 쿼리 실행
    public void executeQuery(String query) {
        Statement stmt = null;
        ResultSet rs = null;
        try {
            if (conn != null) {
                // Statement 객체 생성
                stmt = conn.createStatement();

                // SQL 문 실행
                rs = stmt.executeQuery(query);

                // 결과 처리
                while (rs.next()) {
                    System.out.println("ID: " + rs.getString("ID") + ", Name: " + rs.getString("NAME"));
                }
            }
        } catch (SQLException e) {
            System.err.println("SQL execution error: " + e.getMessage());
        } finally {
            // 리소스 해제
            try {
                if (rs != null) rs.close();
                if (stmt != null) stmt.close();
            } catch (SQLException e) {
                System.err.println("Error closing resources: " + e.getMessage());
            }
        }
    }

    // 데이터베이스 연결 해제
    public void disconnect() {
        if (conn != null) {
            try {
                conn.close();
                System.out.println("Database connection closed.");
            } catch (SQLException e) {
                System.err.println("Error closing connection: " + e.getMessage());
            }
        }
    }
}
            
    
   //설명: 
   /* - Class.forName("com.mysql.cj.jdbc.Driver"); : 
         -위치 : DatabaseUtil 클래스의 connect 메서드 내.
         -기능 : JDBC 드라이버를 메모리에 로드하여 데이터베이스와의 연결을 가능하게 함.
      
      - DriverManager.getConnection(URL, USER, PASSWORD);:
         -위치 : DatabaseUtil 클래스의 connect 메서드 내.
         -기능 : 데이터베이스와 실제 연결을 설정함. 
      
      - Connection conn = DriverManager.getConnection(url, user, password);:
	•	위치: DatabaseUtil 클래스의 connect 메서드 내.
	•	기능: 데이터베이스와 실제 연결을 설정합니다.
	•	유의점: URL, 사용자명, 비밀번호가 정확히 입력되어야 하며, 연결 실패 시 예외 처리가 필요합니다.
	
      - Statement stmt = conn.createStatement();:
	•	위치: DatabaseUtil 클래스의 executeQuery 메서드 내.
	•	기능: SQL 쿼리를 실행하기 위한 Statement 객체를 생성합니다.
	•	유의점: Statement 객체를 사용하여 SQL 쿼리를 실행하고, 실행 후 반드시 close() 메서드를 호출하여 리소스를 해제해야 합니다.  
         
         */

< 파일 작성 및 실행 방법 >
1.프로젝트 생성 : 프로젝트 구조를 생성하고, 소스 코드를 각가의 파일에 작성.
2.의존성 추가 : build.gradle 파일에 MySQL JDBC드라이버 의존성을 추가함.
3.프로젝트 빌드 및 실행 : - gradle 명령어를 사용하여 프로젝트를 빌드하고 실행.
- ./gradle build 명령어를 사용하여 프로젝트를 빌드.
- ./gradlew run 명령어를 사용하여 프로젝트를 실행.

groovy

dependencies {
     implemetation 'mysql:mysql-connector-java:8.0.28'
}

2. 데이터베이스 연결

  • 개념 : 데이터베이스와 연결을 설정함.
  • 사용방법 :
java

Connection conn = DriverManager.getConnection(url, user, password);
  • 왜 사용하는가 : 데이터베이스와의 연결을 통해 SQL명령어를 전송하고 결과를 받을 수 있다.
  • 유의점 : 데이터베이스 URL,사용자명,비밀번호 등을 정확히 입력하여야 하며, 예외 처리가 필요하다.

3.Statement 생성

  • 개념 : SQL명령어를 실행하기 위한 객체 생성
  • 사용 방법 :
java

Statement stmt = conn.createStatement();
  • 왜 사용하는가 : SQL 쿼리를 실행하기 위해 사용됨.
  • 유의점 : SQL 인젝션 공격을 방지하기 위해 PrepareStatement를 사용하는 것이 좋다.

4.SQL문 전송

  • 개념 : 생성된 Statement 객체를 사용하여 SQL명령어를 데이터베이스에 전송.
  • 사용방법 :
java

ResultSet rs = stmt.executeQuery("SELECT * FROM users");
  • 왜 사용하는가? 데이터베이스에서 데이터를 조회하거나 조작하기 위해 사용.
  • 유의점 : SQL 문법을 정확히 지켜야 하며, 퀄 결과를 처리하는 방법을 알아야 함.

5.결과받기

  • 개념 : SQL쿼리의 실행 결과를 받는다.
  • 사용방법 :
java

while (rs.next()) {
   String id = rs.getString("ID");
   //데이터 처리
}
  • 왜 사용하는가? 데이터베이스에서 조회한데이터를 애플리케이션에서 사용할 수 있게한다.
  • 유의점 : ResultSet 객체를 통해 데이터를 반복 처리할 때 예외 처리를 적절히 해야 함.

연결 해제

  • 개념 : 데이터베이스와의 연결을 종료한다.
  • 사용방법 :
java

conn.close();
  • 왜 사용하는가? 사용한 리소스를 반환하여 메모리 누수를 방지함.
  • 유의점 : 항상 연결을 종료해야 하며, 예외 발생 시에도 연결을 종료할 수 있도록 finally블록에서 처리함.

실제 개발자가 거치는 과정

  1. JDBC 드라이버 추가
  • Maven 또는 Gradle을 사용하여 프로젝트에 JDBC 드라이버 의존성을 추가.
  1. 데이터베이스 연결 설정
  • 데이터베이스 URL, 사용자명, 비밀번호 등을 설정하여 연결을 생성.
  1. SQL 쿼리 작성 및 실행
  • Statement 또는 PreparedStatement 객체를 생성하여 SQL 쿼리를 실행.
  1. 결과 처리
  • ResultSet 객체를 사용하여 쿼리 결과를 처리.
  1. 연결 해제
  • 모든 작업이 완료되면 연결을 닫아 리소스를 반환한다.

논리적 과정

  1. 드라이버 로드 - 애플리케이션이 데이터베이스와 통신할 수 있도록 드라이버를 메모리에 로드.
  2. 연결 설정 - 데이터베이스 서버에 연결을 설정.
  3. SQL문 실행 준비 -SQL문을 실행하기 위한 statement 객체를 생성.
  4. SQL문 전송 - 데이터베이스에 SQL문을 전송하여 쿼리를 실행.
  5. 결과 처리 - 쿼리 실행 결과를 ResultSet 객체를 통해 처리.
  6. 연결 종료 - 사용한 리소스를 반환하기 위해 연결을 종료.

0개의 댓글