오늘 Java에서 데이터베이스를 연결하고 SQL을 실행하는 과정을 실습했다. 단순히 SQL을 실행하는 것이 아니라, JDBC의 기본적인 흐름과 각 메서드의 역할을 명확히 이해하는 것이 중요하다는 점을 배울 수 있었다.
이 글에서는 INSERT, UPDATE, DELETE 같은 데이터 변경 작업과 SELECT 조회 작업의 흐름을 정리하고, 실제 코드 예제를 통해 보다 쉽게 개념을 이해할 수 있도록 한다. 🦖
데이터 변경 작업(INSERT, UPDATE, DELETE) 은 executeUpdate()
를 사용하며, 결과로 영향을 받은 행(row) 개수를 반환한다.
Connection 획득 → DriverManager.getConnection()
또는 DataSource
를 사용하여 DB 연결
PreparedStatement 획득 → connection.prepareStatement(SQL문)
실행
?에 값 바인딩 → preparedStatement.setXXX(인덱스, 값);
사용
SQL 전송 및 실행 → executeUpdate()
실행하여 DB 반영
자원 해제 → PreparedStatement
와 Connection
닫기 (try-with-resources 사용 권장)
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
public class InsertExample {
public static void main(String[] args) {
// 데이터베이스 연결 정보 설정
String url = "jdbc:mysql://localhost:3306/mydb";
String user = "root";
String password = "password";
// 실행할 SQL 쿼리문 작성 (?는 나중에 값 바인딩)
String sql = "INSERT INTO users (name, email) VALUES (?, ?)";
try (
// 데이터베이스 연결 생성
Connection conn = DriverManager.getConnection(url, user, password);
// SQL 실행을 위한 PreparedStatement 객체 생성
PreparedStatement pstmt = conn.prepareStatement(sql)
) {
// 첫 번째 ? 자리에 값 바인딩 (이름 설정)
pstmt.setString(1, "고승민");
// 두 번째 ? 자리에 값 바인딩 (이메일 설정)
pstmt.setString(2, "KSM@naver.com");
// SQL 실행 및 변경된 행 개수 반환
int affectedRows = pstmt.executeUpdate();
System.out.println("추가된 행 개수: " + affectedRows);
} catch (Exception e) {
e.printStackTrace();
}
}
}
executeUpdate()
는 변경된 행 개수를 반환하므로 이를 활용하여 성공 여부를 확인할 수 있다.
SELECT 작업은 executeQuery()
를 사용하며, 결과를 ResultSet
객체로 반환받는다.
이후 while(rs.next())
를 사용하여 데이터를 하나씩 가져와야 한다.
Connection 획득 → DB 연결
PreparedStatement 획득 → connection.prepareStatement(SQL문)
실행
?에 값 바인딩 → preparedStatement.setXXX(인덱스, 값);
사용
SQL 전송 및 실행 → executeQuery()
실행하여
ResultSet
반환
ResultSet 처리 → while (rs.next())
를 이용하여 데이터 반복 조회
자원 해제 → ResultSet
, PreparedStatement
, Connection
닫기
조회 결과 반환 → 필요하면 리스트에 담아 반환
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
public class SelectExample {
public static void main(String[] args) {
// 데이터베이스 연결 정보 설정
String url = "jdbc:mysql://localhost:3306/mydb";
String user = "root";
String password = "password";
// 실행할 SQL 쿼리문 작성
String sql = "SELECT id, name, email FROM users WHERE name = ?";
try (
Connection conn = DriverManager.getConnection(url, user, password);
PreparedStatement pstmt = conn.prepareStatement(sql)
) {
// 검색할 이름 설정
pstmt.setString(1, "고승민");
// SQL 실행 및 결과(ResultSet) 반환
ResultSet rs = pstmt.executeQuery();
// 결과를 저장할 리스트 생성
List<String> users = new ArrayList<>();
// 조회된 데이터를 한 줄씩 읽기
while (rs.next()) {
int id = rs.getInt("id");
String name = rs.getString("name");
String email = rs.getString("email");
users.add(id + ", " + name + ", " + email);
}
System.out.println("조회된 유저 목록: " + users);
} catch (Exception e) {
e.printStackTrace();
}
}
}
executeQuery()
는 ResultSet
을 반환하며, while(rs.next())
를 사용하여 데이터를 하나씩 처리한다.
✔ 데이터 변경 작업(INSERT, UPDATE, DELETE) 는 executeUpdate()
를 사용하며, 변경된 행 개수를 반환한다.
✔ 조회 작업(SELECT) 는 executeQuery()
를 사용하며, ResultSet
을 반환하여 반복문을 통해 데이터를 처리해야 한다.
✔ SQL 실행 후에는 반드시 자원을 닫아야 하며, try-with-resources
문법을 사용하면 자동으로 자원 해제가 가능하다.
✔ SQL Injection 방지를 위해 PreparedStatement
를 활용하여 ? 바인딩을 하는 것이 필수적이다.
✔ 데이터를 리스트로 변환하여 관리하면 가독성이 좋아지고, 유지보수하기 편하다.