[DB][MySQL][개념] ✨ JDBC를 활용한 Java 애플리케이션 개발 가이드 ✨

김상욱·2024년 9월 22일
0
post-thumbnail

✨ JDBC (Java Database Connectivity)란? ✨

JDBC는 Java에서 데이터베이스와 연결하고 SQL 쿼리를 실행할 수 있는 표준 API예요! 🖥️ 데이터베이스 관리 시스템과 Java 애플리케이션이 독립적으로 상호작용할 수 있게 도와준답니다.

📌 주요 특징

  1. 📝 ANSI SQL(1999) 지원
    대부분의 SQL 문을 사용해 데이터베이스 조작이 가능해요!

  2. 📞 함수 호출 인터페이스
    SQL 문을 실행하기 위해 프로그래밍 언어와 데이터베이스 간의 함수 호출을 통한 인터페이스를 제공해요.

  3. 🔗 DBMS 독립성
    하나의 코드를 다양한 DBMS에서 사용할 수 있어요. 데이터베이스가 변경되더라도 드라이버와 URL만 수정하면 동일한 코드로 작업할 수 있답니다!

  4. 🌐 Java의 플랫폼 독립성
    다양한 환경에서 동일한 API로 애플리케이션을 개발할 수 있어요.

  5. 🛠️ 데이터베이스 연결 설정
    데이터베이스와의 연결을 설정해 데이터를 접근하고 조작할 수 있어요.

  6. 🚀 SQL 전송 및 결과 처리
    SQL 문장을 DBMS에 전송하고 결과를 받아 처리할 수 있어요.

  7. 🧩 드라이버를 통한 구현

    • Database 제공 인터페이스: 각 DBMS 업체가 제공하는 드라이버를 통해 Java 애플리케이션이 DBMS와 통신해요.
    • 프로그래머 제공 인터페이스: 프로그래머는 JDBC API로 SQL 문을 작성하고 결과를 받는 작업을 합니다.

🏗️ JDBC의 구조

JDBC는 크게 두 가지 인터페이스로 나뉩니다:

  1. 🛠️ Driver Interface
    각 DBMS 업체가 제공하는 드라이버로, JDBC API의 데이터베이스 연결 및 SQL 실행 메커니즘을 구현합니다.

  2. 👨‍💻 Programmer Interface
    Java 프로그래머가 사용하는 API로, SQL 패키지가 제공하는 라이브러리예요. DB 연결, 쿼리 실행, 결과 처리 등의 작업을 수행할 수 있습니다.


⚙️ JDBC의 작동 과정

  1. 📥 JDBC 드라이버 로드
    DBMS에 맞는 드라이버를 로드하여 Java 애플리케이션이 DBMS와 통신할 수 있게 합니다.

  2. 🔗 데이터베이스 연결 생성
    드라이버를 통해 데이터베이스에 연결하고, Connection 객체로 DBMS와 상호작용할 준비를 합니다.

  3. 📝 SQL 문 실행
    PreparedStatement나 Statement 객체로 SQL 문을 DBMS로 전송해 실행합니다.

  4. 📊 결과 처리
    SQL 실행 결과는 ResultSet 객체로 받아, 데이터를 애플리케이션 로직에 맞게 활용합니다.

  5. 🔒 연결 종료
    작업이 끝나면 데이터베이스와의 연결을 종료해 자원을 해제합니다.


🕸️ 1. JAVA (Web) Application 🕸️

Java 웹 애플리케이션은 사용자가 웹 브라우저를 통해 접근하는 서버 측 애플리케이션이에요. 🌐 로그인, 상품 조회, 주문 처리 등과 같은 기능에서 데이터베이스와 상호작용이 필요할 때, JDBC API를 사용해 데이터베이스와 연결하고 SQL 명령을 전송합니다. 💬


📚 2. JDBC API (Java Database Connectivity API) 📚

JDBC API는 Java 프로그램이 데이터베이스와 상호작용할 수 있도록 다양한 클래스와 메서드를 제공하는 표준 인터페이스입니다. ✨ 주요 기능은 다음과 같아요:

  • 🔗 데이터베이스 연결 설정: 데이터베이스와 연결을 설정해줍니다.
  • 📝 SQL 문 실행: SQL 명령어(SELECT, INSERT 등)를 전달하고 실행합니다.
  • 📊 결과 처리: SQL 문의 결과를 받아와 사용할 수 있습니다.
  • ⚠️ 에러 처리: 데이터베이스 작업 중 발생할 수 있는 예외를 처리합니다.

JDBC API는 Java 애플리케이션이 DBMS의 구체적인 구현 방식에 구애받지 않고 데이터베이스와 상호작용할 수 있게 해주는 중간 계층이에요. 🛡️


🖥️ 3. JDBC Driver 🖥️

JDBC Driver는 특정 DBMS와 통신할 수 있도록 JDBC API의 요청을 해석하는 드라이버입니다. 각 DBMS(예: MySQL, Oracle 등)는 자신만의 JDBC 드라이버를 제공하며, 이를 통해 Java 애플리케이션과 데이터베이스 간의 통신을 담당합니다. 📡

  • 🎯 역할: JDBC API의 요청을 받아 DBMS가 이해할 수 있는 형식으로 변환해요.
  • 📂 종류:
    • Type 1: JDBC-ODBC Bridge Driver
    • Type 2: Native-API Driver
    • Type 3: Network Protocol Driver
    • Type 4: Thin Driver (순수 Java로 구현되어 플랫폼 독립성이 뛰어남)

대부분의 최신 애플리케이션에서는 Type 4 드라이버를 많이 사용합니다. 🚀


🗃️ 4. Database 🗃️

Database는 데이터를 저장하고 관리하는 시스템으로, SQL 쿼리를 통해 데이터를 삽입, 수정, 삭제, 조회할 수 있습니다. 🛠️ JDBC는 Java 애플리케이션과 데이터베이스를 연결하는 역할을 합니다.

  • 🔧 DBMS의 역할: SQL 명령을 처리하고 그 결과를 반환합니다. 여러 사용자와 애플리케이션이 데이터를 동시에 처리할 수 있도록 관리하며, 데이터의 무결성을 유지합니다.

🔄 전체 과정 설명 🔄

  1. 📥 JDBC 드라이버 로딩: Java 웹 애플리케이션이 시작되면 DBMS에 맞는 JDBC 드라이버를 로드해요. 이 드라이버는 요청을 DBMS가 이해할 수 있는 형식으로 변환해 줍니다.

  2. 🔗 데이터베이스 연결 설정: JDBC API를 사용해 데이터베이스와 연결을 설정합니다. 연결 정보를 포함한 URL, 사용자명, 비밀번호 등을 제공해요.

  3. 📝 SQL 문 전송: Java 애플리케이션이 SQL 문을 JDBC API를 통해 실행 요청하고, 이 요청은 JDBC 드라이버를 통해 DBMS로 전달됩니다.

  4. 📊 결과 처리 및 반환: DBMS는 SQL 명령을 처리하고, 그 결과를 Java 애플리케이션에 반환합니다. Java 애플리케이션은 이 결과를 화면에 표시하거나 다른 로직에 사용해요.

  5. 🔒 연결 종료: 작업이 완료되면 JDBC API를 통해 데이터베이스 연결을 종료하여 자원을 해제합니다.


📦 java.sql package 📦

Java에서 데이터베이스와 상호작용하기 위한 핵심 인터페이스들을 포함하고 있는 패키지예요. JDBC의 다양한 인터페이스를 통해 데이터베이스와 연결하고 SQL 명령을 처리할 수 있습니다.


🏎️ 1. Driver (Interface) 🏎️

Driver 인터페이스는 JDBC 드라이버를 나타내며, 데이터베이스 연결을 위한 다양한 기능을 제공합니다. 🌐 JDBC API가 호출한 SQL 문을 DBMS가 이해할 수 있는 형태로 변환하는 중요한 역할을 해요.

📌 주요 특징

  • 📝 드라이버 정보 보유: 드라이버의 이름, 버전, 지원 기능 등의 정보를 가지고 있습니다.
  • 🛠️ 모든 드라이버가 구현해야 하는 인터페이스: 모든 JDBC 드라이버는 이 인터페이스를 구현해야 합니다.
  • 🔍 연결 정보 메소드: 드라이버의 버전과 데이터베이스 제품 이름 등의 정보를 반환하는 메서드들이 있어요.

🎯 역할

  • Java 애플리케이션이 데이터베이스에 연결을 요청할 때, 이 인터페이스가 연결 요청을 처리하고 적절한 JDBC 드라이버를 통해 연결을 설정합니다. 📡

🔗 2. Connection (Interface) 🔗

Connection 인터페이스는 데이터베이스에 대한 하나의 세션을 표현합니다. 🛡️ SQL 문을 실행하거나 데이터베이스 트랜잭션을 관리할 때 사용되며, 연결된 동안 데이터베이스와 지속적으로 상호작용할 수 있습니다.

📌 주요 특징

  • 🔌 데이터베이스 세션: 클라이언트와 서버 사이의 연결 상태를 나타냅니다.
  • 🚀 DriverManager의 getConnection() 사용: DriverManager.getConnection() 메소드로 Connection 객체를 생성해요.
  • 🔄 트랜잭션 관리:
    • AutoCommit 설정: 기본적으로 자동 커밋(setAutoCommit(true)) 상태예요.
    • 수동 커밋 설정: setAutoCommit(false)로 설정해 명시적으로 commit()rollback()을 관리할 수 있습니다.

🎯 역할

  • 데이터베이스 연결을 관리하고 SQL 명령 실행과 트랜잭션을 제어해 데이터의 일관성을 유지합니다.

📝 3. Statement (Interface) 📝

Statement 인터페이스는 SQL 문을 실행하고 그 결과를 가져오는 역할을 해요. Java 애플리케이션이 데이터베이스에 명령을 전달하고 결과를 처리할 수 있도록 도와주는 인터페이스입니다.

📌 주요 메소드

  • ⚡ execute(String sql): SQL 문을 실행하고 ResultSet인지 여부를 반환합니다.
  • 🔍 executeQuery(String sql): 주로 SELECT 문을 실행해 ResultSet 객체로 결과를 반환합니다.
  • ✍️ executeUpdate(String sql): INSERT, UPDATE, DELETE 같은 DML 문을 실행하고 영향을 받은 행의 개수를 반환합니다.

🎯 역할

  • SQL 명령을 DBMS로 전달하고, 명령의 실행 결과를 처리할 수 있도록 합니다. 간단한 SQL 명령을 실행할 때 사용되며, 매개변수가 있는 SQL 명령은 PreparedStatement를 사용하여 더 안전하게 처리할 수 있어요.

📑 4. PreparedStatement (Interface) 📑

PreparedStatement는 반복적으로 실행되는 SQL 문을 미리 컴파일하여 저장하고 성능을 개선하는 데 사용돼요. 🚀 특히 반복적인 데이터 삽입이나 업데이트 작업에서 큰 효과를 발휘합니다.

📌 주요 특징 및 역할

  • 🔄 반복적인 SQL 실행 최적화: 동일한 SQL 문을 반복해서 실행할 때 성능을 크게 향상시켜줍니다.

  • ⚙️ 미리 컴파일된 SQL: SQL 문이 미리 컴파일되어 저장되므로, 실행할 때마다 컴파일하지 않아도 되어 시간이 절약되고, SQL 인젝션 공격 방어도 강화됩니다. 🛡️

  • 📂 대용량 데이터 처리: 대용량의 문자 데이터나 바이너리 데이터를 처리할 때 유리해요. BLOB이나 CLOB 타입의 데이터도 손쉽게 다룰 수 있습니다.

  • 🧹 파라미터 초기화: clearParameters() 메서드를 사용하여 이전에 사용된 파라미터를 초기화하고 새로운 값을 설정할 수 있어요.

🔧 주요 메서드

  • 🔍 executeQuery(): SELECT 문을 처리하여 결과를 ResultSet으로 반환합니다.
  • ✍️ executeUpdate(): INSERT, UPDATE, DELETE와 같은 DML 문을 실행하며, 영향을 받은 행의 개수를 반환합니다.

PreparedStatement는 SQL 문에 파라미터를 안전하게 설정할 수 있어 코드의 안전성과 가독성을 높여줘요. 🛠️


📞 5. CallableStatement (Interface) 📞

CallableStatement는 데이터베이스에 저장된 프로시저(Stored Procedures)를 호출하는 데 사용됩니다. 🗂️

📌 주요 특징 및 역할

  • 📥 Stored Procedures 호출: 직접 SQL을 실행하지 않고, 데이터베이스에 저장된 프로시저를 호출하여 작업을 처리합니다.

  • ⚙️ 코드 독립성 및 성능 향상: 자바 코드와 SQL을 분리하여 유지보수성과 효율성을 높여줍니다.

  • 🔧 매개변수 설정: IN, OUT, INOUT 매개변수를 지원하여 프로시저의 입력과 출력을 관리할 수 있습니다.

📜 Stored Procedures란?

  • 데이터베이스에 미리 저장된 SQL 명령어들의 집합으로, 자주 사용되는 작업을 함수처럼 재사용할 수 있도록 해요. 이를 사용하면 성능이 향상되고 코드의 재사용성이 높아집니다.

📊 6. ResultSet (Interface) 📊

ResultSet은 SQL 쿼리의 결과 데이터를 처리하는 인터페이스로, SELECT 쿼리의 실행 결과를 탐색하고 데이터를 읽어오는 데 사용됩니다. 📜

📌 주요 특징 및 역할

  • 📝 결과 처리: 쿼리 실행 후 반환된 결과를 행(row)과 열(column)로 구성하여 제공하며, 커서(cursor)를 통해 행 단위로 탐색할 수 있어요.

  • 📍 커서의 위치: 커서는 첫 번째 레코드 이전에 위치하며, next() 메서드를 호출하여 다음 레코드로 이동합니다.

  • 📥 데이터 읽기: 다양한 getXXX() 메서드를 통해 특정 필드의 값을 읽어올 수 있어요. 예를 들어:

    • getString(): 문자열 값을 읽음
    • getInt(): 정수 값을 읽음
    • getDate(): 날짜 값을 읽음
    • 그 외에도 getFloat(), getDouble(), getBoolean() 등 다양한 메서드가 제공됩니다.

🔧 주요 메서드

  • ➡️ next(): 커서를 다음 행으로 이동시키며, 더 이상 행이 없으면 false를 반환합니다.

  • 🔍 getXXX(): 다양한 데이터 타입을 읽어올 수 있는 메서드들이 제공되며, 열의 인덱스나 이름을 통해 접근 가능합니다.

ResultSet을 사용하면 쿼리의 결과를 효율적으로 탐색하고 데이터를 자바 애플리케이션에서 활용할 수 있습니다. 📊


🛠️ JDBC 개발 순서 🛠️

Java 애플리케이션에서 데이터베이스와 상호작용하기 위해 JDBC(Java Database Connectivity)를 활용하는 기본 개발 순서를 안내해 드릴게요! 이 과정은 데이터베이스와 연결을 설정하고 SQL 명령어를 실행하며, 마지막으로 연결을 종료하는 단계로 구성됩니다.


1️⃣ JDBC Driver Loading (JDBC 드라이버 로딩)

JDBC 드라이버는 Java 애플리케이션과 데이터베이스 간의 통신을 가능하게 하는 중요한 소프트웨어입니다. 🚀 드라이버를 로딩하는 단계는 데이터베이스와의 연결을 준비하는 첫 번째 단계예요.

📌 주요 과정

  • 📥 드라이버 클래스를 적재: 드라이버 로딩은 Class.forName() 메서드를 사용하여 드라이버 클래스 이름을 지정함으로써 이루어집니다.

    Class.forName("com.mysql.cj.jdbc.Driver"); // MySQL 드라이버 로딩 예시
  • 🗂️ 드라이버 클래스:

    • MySQL: com.mysql.cj.jdbc.Driver
    • Oracle: oracle.jdbc.driver.OracleDriver
    • MSSQL: com.microsoft.sqlserver.jdbc.SQLServerDriver

이 과정에서 애플리케이션이 데이터베이스와 통신할 수 있도록 드라이버가 JVM에 등록됩니다. 🌐


2️⃣ DBMS와 연결 (Connection 생성)

JDBC 드라이버가 로딩된 후에는 데이터베이스와 연결을 설정합니다. 이 단계는 Java 프로그램이 SQL 명령을 데이터베이스로 전송하고 결과를 받을 수 있는 상태를 만듭니다. 🔗

📌 주요 과정

  • 🔑 DriverManager를 통한 연결 요청: DriverManager.getConnection() 메서드를 사용하여 데이터베이스와 연결합니다. 이 메서드는 URL, 사용자 ID, 비밀번호를 인자로 받아요.

    Connection con = DriverManager.getConnection(URL, dbid, dbpassword);
  • 📝 JDBC URL 형식: 각 DBMS마다 고유의 URL 형식으로 데이터베이스를 식별합니다.

    • MySQL: jdbc:mysql://HOST:PORT/DBNAME[?param1=value1&param2=value2&...]
    • Oracle: jdbc:oracle:thin:@Host:PORT:SID
    • MSSQL: jdbc:sqlserver://HOST:PORT;databaseName=DB

이 단계에서 데이터베이스와의 연결이 설정되어 SQL 문을 전송할 준비가 됩니다. 📡


3️⃣ SQL 실행 준비 (Statement, PreparedStatement 생성)

데이터베이스와의 연결이 완료되면 SQL 명령을 실행할 준비를 해야 합니다. 이 단계에서는 Statement 또는 PreparedStatement 객체를 생성하여 SQL 문을 실행할 준비를 합니다. 📑

📌 주요 과정

  • 📝 SQL 문 작성: 실행할 SQL 문을 문자열로 작성합니다.

    String sql = "SELECT * FROM users WHERE id = ?";
  • 🛠️ Statement 생성:

    • Statement: 일반적인 SQL 문을 실행하는 데 사용됩니다.

      Statement stmt = con.createStatement();
  • 🛡️ PreparedStatement 생성:

    • PreparedStatement: SQL 문을 미리 컴파일하여 성능을 높이고, 파라미터화된 SQL 문을 안전하게 실행할 수 있게 해줍니다.

      PreparedStatement pstmt = con.prepareStatement(sql);

PreparedStatement는 성능과 보안 측면에서 이점이 있어 반복 실행되는 SQL 문에 유리합니다. 🔒


🚀 4. SQL 실행 🚀

SQL 문이 준비되면 Statement 또는 PreparedStatement 객체를 사용하여 SQL 문을 데이터베이스에 전송하고 실행합니다. 📝

📌 주요 과정

  • 🛠️ Statement 사용:

    • 🔧 DML (INSERT, UPDATE, DELETE):

      • executeUpdate() 메서드를 사용해 DML 문을 실행하고, 영향을 받은 행의 수를 반환합니다.
      int cnt = stmt.executeUpdate(sql); // DML 문 실행
    • 🔍 SELECT:

      • executeQuery() 메서드를 사용하여 SELECT 문을 실행하고, 결과를 ResultSet 객체로 반환받습니다.
      ResultSet rs = stmt.executeQuery(sql); // SELECT 문 실행
  • 🛡️ PreparedStatement 사용:

    • 🎯 파라미터 설정: PreparedStatement의 SQL 문 내 ?에 값을 설정합니다.

      pstmt.setInt(1, 100); // 첫 번째 ?에 100 설정
    • 🔧 DML:

      • executeUpdate() 메서드를 사용하여 DML 문을 실행합니다.
      int cnt = pstmt.executeUpdate();
    • 🔍 SELECT:

      • executeQuery() 메서드를 사용하여 SELECT 문을 실행하고, 결과를 ResultSet으로 반환합니다.
      ResultSet rs = pstmt.executeQuery();
  • 📊 ResultSet:

    • SQL SELECT 문의 실행 결과는 ResultSet 객체로 관리되며, 쿼리의 결과를 행 단위로 탐색할 수 있습니다.
    while (rs.next()) {
        String str = rs.getString("column_name");
        int cnt = rs.getInt("column_name");
    }

🛑 5. DBMS 연결 끊기 🛑

모든 작업이 완료되면 데이터베이스와의 연결을 끊어야 해요. 연결을 종료하지 않으면 시스템 리소스를 불필요하게 점유하여 성능 저하를 초래할 수 있습니다. ⚠️

📌 주요 과정

  • 🔒 연결 종료: close() 메서드를 호출하여 ResultSet, Statement(PreparedStatement), Connection 객체를 연결한 순서의 역순으로 종료합니다.

    rs.close();
    pstmt.close();
    con.close();
  • 🛠️ 자원 관리: 데이터베이스 연결은 많은 시스템 자원을 소모하므로, 최적화된 상태를 유지하기 위해 반드시 연결을 종료해야 합니다.

  • 🧹 Try with Resources:

    • Java 7 이상에서는 try-with-resources 구문을 사용하여 자동으로 자원을 해제할 수 있어요. AutoCloseable 인터페이스를 구현한 객체는 이 구문에 포함될 수 있으며, try 블록이 종료되면 자동으로 close() 메서드를 호출합니다.
    try (Connection con = DriverManager.getConnection(URL, dbid, dbpassword);
         PreparedStatement pstmt = con.prepareStatement(sql)) {
         // SQL 실행 로직
    } catch (SQLException e) {
         e.printStackTrace();
    }

0개의 댓글