JDBC를 이용하여 데이터베이스 연결하기 : 4단계 구성

홍나연·2024년 10월 13일

Backend

목록 보기
5/8
post-thumbnail

JDBC란

JDBC(Java Database Connectivity)는 자바 애플리케이션이 데이터베이스와 상호작용할 수 있도록 해주는 API이다.
→ SQL 쿼리 실행, 데이터 삽입 및 수정, 데이터베이스와의 연결 관리 등

이번 포스트에서는 JDBC를 사용하여 데이터베이스에 연결하는 4단계 과정을 알아보겠다. (MySQL 활용)

1. JDBC 드라이버 로드하기

  • JDBC 드라이버는 Java 프로그램과 DB 간의 연결을 가능하게 하는 소프트웨어이다.
  • DB마다 사용하는 드라이버가 다르기 때문에, 사용하려는 데이터베이스에 맞는 드라이버를 다운로드하고 프로젝트에 포함해야 한다.

예시

try {
    Class.forName("com.mysql.cj.jdbc.Driver"); // MySQL JDBC 드라이버 로드
    System.out.println("MySQL 드라이버 성공적 로드 !");
} catch (ClassNotFoundException e) {
    e.printStackTrace();
}

코드 설명

  • Class.forName() 메서드를 사용하여 JDBC 드라이버를 메모리에 로드한다.
  • 여기서 "com.mysql.cj.jdbc.Driver"는 MySQL 데이터베이스를 위한 드라이버 클래스 이름 !
    드라이버가 성공적으로 로드되면, 데이터베이스에 연결할 준비가 된다.
    - DB 별 Driver Class 존재
    - PostgreSQL : org.postgresql.Driver
    - Oracle : orcle.jdbc.driver.OracleDriver
    - …

2. 데이터베이스 연결하기

  • 드라이버를 로드한 후에는 데이터베이스에 연결할 수 있다. 이 과정에서는 데이터베이스 URL, 사용자 이름, 비밀번호가 필요하다.
    • 데이터베이스 URL : JDBC를 통해 특정 데이터베이스에 연결하기 위해 필요한 주소이다.
    • 사용자 이름 : 데이터베이스 관리자가 생성한 사용자 계정으로, 해당 계정은 데이터베이스에 대한 특정 권한을 가질 수 있다.
    • 비밀번호 : 사용자가 데이터베이스에 연결하기 위해 입력해야 하는 암호로, 비밀번호를 통해 사용자가 특정 권한을 가진 계정임을 인증한다.
  • DriverManager를 통해 접근이 가능하다.

예시

Connection connection = null; // 데이터베이스 연결 객체
String url = "jdbc:mysql://localhost:3306/mydatabase"; // 데이터베이스 URL
String user = "your_username"; // 데이터베이스 사용자 이름
String password = "your_password"; // 데이터베이스 비밀번호

try {
    connection = DriverManager.getConnection(url, user, password); // 데이터베이스에 연결
    System.out.println("데이터베이스에 연결 성공 !!");
} catch (SQLException e) {
    e.printStackTrace();
}

코드 설명

  • DriverManager.getConnection() 메서드를 사용하여 데이터베이스에 연결한다.
  • url은 연결할 데이터베이스의 위치를, localhost는 데이터베이스가 현재 컴퓨터에서 실행 중임을 의미한다.
  • userpassword는 데이터베이스에 접근하기 위한 인증 정보이다.

3. SQL문 실행하기

  • 데이터베이스에 연결된 후, SQL 쿼리를 실행하여 데이터를 조회하거나 수정할 수 있다.
  • SQL문을 수행하기 위해서는 Statement 또는 PreparedStatement 객체가 필요하다. 일반적으로 SELECT 쿼리는 Statement, INSERT/UPDATE/DELETE 쿼리는 PreparedStatement를 사용하는 것이 좋다.
    • executeQuery() 메서드는 SELECT 쿼리 실행한다.
    • executeUpdate() 메서드는 INSERT, UPDATE, DELETE 쿼리를 실행한다.
메서드주로 사용하는 SQL 문리턴 타입설명
executeQuery()SELECTResultSet결과로 반환된 데이터 테이블을 읽을 수 있음
executeUpdate()INSERT, UPDATE, DELETE, DDLint (영향받은 행 수)데이터베이스에서 변경된 행 수를 반환, 구조 변경도 처리 가능

구분Statement (stmt)PreparedStatement (pstmt)
SQL 실행 방식동적으로 SQL 생성미리 컴파일된 SQL 사용
파라미터 처리 방식SQL 쿼리 내에서 문자열로 직접 처리?로 동적 파라미터 바인딩
보안SQL 인젝션에 취약SQL 인젝션 방지
성능반복 실행 시 성능이 떨어짐반복 실행 시 성능 우수
사용 용도간단한 쿼리나 단순한 상황에서 사용복잡한 쿼리나 사용자 입력이 있는 경우 사용

예시

String query = "SELECT * FROM users"; // 실행할 SQL 쿼리
Statement statement = null; // SQL 문 실행 객체
ResultSet resultSet = null; // 쿼리 결과를 담을 객체

try {
    statement = connection.createStatement(); // SQL 문 실행 객체 생성
    resultSet = statement.executeQuery(query); // SQL 쿼리 실행

    // 결과 처리
    while (resultSet.next()) {
        String username = resultSet.getString("username"); // 결과에서 사용자 이름 가져오기
        System.out.println("사용자 이름: " + username);
    }
} catch (SQLException e) {
    e.printStackTrace();
} finally {
    // 자원 해제
    if (resultSet != null) {
        try {
            resultSet.close(); // 결과 집합 닫기
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
    if (statement != null) {
        try {
            statement.close(); // SQL 문 실행 객체 닫기
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

코드 설명

  • Statement 객체 : SQL 쿼리를 실행하기 위해 사용되는 객체이다. createStatement() 메서드를 호출하여 생성할 수 있다.
  • executeQuery() : SELECT 쿼리를 실행하고 결과를 ResultSet 객체에 저장한다. 이 객체를 통해 쿼리의 결과를 순회하고 처리할 수 있다.
  • ResultSet : 쿼리 결과를 담고 있는 객체이다. resultSet.next() 메서드를 사용하여 결과 집합의 각 행으로 이동하고, 필요한 데이터를 가져올 수 있다.
    • next()의 특징
      • 행 이동 : next() 메서드를 호출하면 현재 커서가 다음 행으로 이동한다. 처음 호출 시, 커서는 결과 집합의 첫 번째 행 앞에 위치한다.
      • boolean 반환 : next() 메서드는 다음 행이 존재하면 true를 반환하고, 더 이상 행이 없으면 false를 반환한다. 이를 통해 결과 집합의 끝에 도달했는지 확인할 수 있다.
      • 반복문에서 사용 : next() 메서드는 일반적으로 while 문 내에서 사용되어 모든 행을 순회한다.
      • 예외 처리 : next() 메서드 호출 시 SQLException이 발생할 수 있으므로, 적절한 예외 처리가 필요하다.
      • 데이터 접근 : next()를 호출한 후에는 ResultSet의 현재 행에 있는 데이터를 가져오기 위해 getXXX() 메서드를 사용할 수 있다.
        • 컬럼명으로 접근 getXXX(columnName) :특정 열의 데이터를 가져올 수 있다. 여기서 columnName은 데이터베이스의 테이블에서 정의된 열의 이름 !
        • 인덱스(순서)로 접근 getXXX(1) : 열의 인덱스를 통해 데이터를 가져올 수 있다. 인덱스는 1부터 시작 ! → 첫 번째 열은 1, 두 번째 열은 2

4. 데이터베이스 연결 끊기

  • 모든 작업이 완료되면 데이터베이스 연결을 종료하여 자원을 해제해야 한다.
    • 해제해야 하는 이유
      • 자원 관리 : 데이터베이스 연결은 시스템 자원(메모리, 네트워크 연결 등)을 사용한다. 연결을 종료하지 않으면 자원이 소모된 채로 남아있고, 시스템 성능 저하 문제로 이어질 수 있다.
      • 안정성 및 성능 : 열린 연결이 너무 많아지면 데이터베이스 서버의 성능이 저하되거나 응답 속도가 느려질 수 있다. (서버가 동시에 처리할 수 있는 연결 수에 제한이 있기 때문)

예시

public void close(AutoCloseable... closeables) {
		for (AutoCloseable c : closeables) {
		    if (c != null) {
		        try {
			          c.close();
            } catch (Exception e) {
		            e.printStackTrace();
            }
				}
		}
}

코드 설명

  • public void close(AutoCloseable... closeables) : 여러 개의 자원을 동시에 닫기 위한 메서드로, AutoCloseable 인터페이스를 구현한 객체(Connection, Statement, ResultSet)를 인자로 받을 수 있다.
  • 반복문을 통한 자원 처리 : for (AutoCloseable c : closeables) 구문을 통해 전달된 모든 자원에 대해 반복한다.
  • 자원 닫기 : c.close() 메서드를 호출하여 자원을 닫는다. AutoCloseable 인터페이스를 구현한 객체는 close() 메서드를 가지고 있어서 자원 해제가 가능하다.

요약

이 포스트에서는 JDBC를 사용하여 데이터베이스에 연결하는 4단계 과정을 다뤘다. 각각의 단계에서 JDBC 드라이버를 로드하고, 데이터베이스에 연결하며, SQL 쿼리를 실행하고, 마지막으로 자원을 해제하는 과정을 통해 데이터베이스와의 상호작용을 효과적으로 수행할 수 있다.

0개의 댓글