JDBC(Java Database Connectivity)는 자바 애플리케이션이 데이터베이스와 상호작용할 수 있도록 해주는 API이다.
→ SQL 쿼리 실행, 데이터 삽입 및 수정, 데이터베이스와의 연결 관리 등
이번 포스트에서는 JDBC를 사용하여 데이터베이스에 연결하는 4단계 과정을 알아보겠다. (MySQL 활용)
try {
Class.forName("com.mysql.cj.jdbc.Driver"); // MySQL JDBC 드라이버 로드
System.out.println("MySQL 드라이버 성공적 로드 !");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
Class.forName() 메서드를 사용하여 JDBC 드라이버를 메모리에 로드한다.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는 데이터베이스가 현재 컴퓨터에서 실행 중임을 의미한다.user와 password는 데이터베이스에 접근하기 위한 인증 정보이다.Statement 또는 PreparedStatement 객체가 필요하다. 일반적으로 SELECT 쿼리는 Statement, INSERT/UPDATE/DELETE 쿼리는 PreparedStatement를 사용하는 것이 좋다.executeQuery() 메서드는 SELECT 쿼리 실행한다.executeUpdate() 메서드는 INSERT, UPDATE, DELETE 쿼리를 실행한다.| 메서드 | 주로 사용하는 SQL 문 | 리턴 타입 | 설명 |
|---|---|---|---|
executeQuery() | SELECT | ResultSet | 결과로 반환된 데이터 테이블을 읽을 수 있음 |
executeUpdate() | INSERT, UPDATE, DELETE, DDL | int (영향받은 행 수) | 데이터베이스에서 변경된 행 수를 반환, 구조 변경도 처리 가능 |
| 구분 | 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() 메서드를 호출하면 현재 커서가 다음 행으로 이동한다. 처음 호출 시, 커서는 결과 집합의 첫 번째 행 앞에 위치한다.next() 메서드는 다음 행이 존재하면 true를 반환하고, 더 이상 행이 없으면 false를 반환한다. 이를 통해 결과 집합의 끝에 도달했는지 확인할 수 있다.next() 메서드는 일반적으로 while 문 내에서 사용되어 모든 행을 순회한다.next() 메서드 호출 시 SQLException이 발생할 수 있으므로, 적절한 예외 처리가 필요하다.next()를 호출한 후에는 ResultSet의 현재 행에 있는 데이터를 가져오기 위해 getXXX() 메서드를 사용할 수 있다.getXXX(columnName) :특정 열의 데이터를 가져올 수 있다. 여기서 columnName은 데이터베이스의 테이블에서 정의된 열의 이름 !getXXX(1) : 열의 인덱스를 통해 데이터를 가져올 수 있다. 인덱스는 1부터 시작 ! → 첫 번째 열은 1, 두 번째 열은 2public 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 쿼리를 실행하고, 마지막으로 자원을 해제하는 과정을 통해 데이터베이스와의 상호작용을 효과적으로 수행할 수 있다.