JAVA JDBC 연결 방법과 Statement로 SQL 실행하는 전체 흐름 정리
📌 초보 개발자도 이해할 수 있는 JDBC 연동의 전 과정 안내서
자바로 프로그램을 만들다 보면 데이터베이스와 연동하는 기능이 필수로 요구되곤 합니다.
특히 백엔드 개발을 시작하는 분들이라면 JDBC의 기본 개념과 구조를 정확히 이해하는 것이 중요하죠.
이 글에서는 JDBC 연결 흐름과 Statement를 이용한 SQL 실행까지 실제 코드 작성에 바로 적용할 수 있도록 차근차근 설명드릴게요.
처음 접하시는 분들도 부담 없이 따라올 수 있도록 용어 설명부터 실습 팁까지 알차게 담았습니다.
그럼 지금부터 하나씩 알아보겠습니다.
JDBC(Java Database Connectivity)는 자바에서 데이터베이스와 연동하기 위한 표준 API입니다.
DB 드라이버 로딩, Connection 객체 생성, Statement를 이용한 SQL 실행까지 일련의 과정은 자바 기반 백엔드 시스템을 구축할 때 반드시 숙지해야 하는 핵심 기술 중 하나예요.
이 글에서는 JDBC의 구조와 흐름을 코드와 함께 설명하고, 실습 중 자주 발생하는 오류나 헷갈릴 수 있는 포인트도 함께 짚어볼 예정입니다.
초보자부터 실무자까지 꼭 알아야 할 JDBC 연결 흐름을 한눈에 정리해드립니다.
📋 목차
🔗 JDBC란 무엇인가요?
JDBC(Java Database Connectivity)는 자바에서 데이터베이스와 통신하기 위한 표준 인터페이스입니다.
간단히 말해 자바 프로그램이 데이터베이스에 접근하고, 쿼리를 전송하고, 결과를 받아올 수 있도록 도와주는 역할을 해요.
JDBC 덕분에 Oracle, MySQL, PostgreSQL 등 다양한 DBMS와 통일된 방식으로 연동할 수 있습니다.
JDBC는 크게 다음과 같은 순서로 동작합니다.
먼저 DB 드라이버를 로딩한 뒤, 데이터베이스와 연결(Connection 객체 생성)을 맺고, SQL을 실행할 Statement 객체를 통해 쿼리를 전달합니다.
그 결과를 ResultSet으로 받아오고, 마지막으로 리소스를 정리(close)하는 구조입니다.
- 🔍드라이버 로딩 – 사용할 DB에 맞는 JDBC 드라이버 클래스를 메모리에 적재
- 🔗Connection 객체 생성 – DB와 연결 설정
- 📤Statement 또는 PreparedStatement를 통해 SQL 실행
- 📥ResultSet을 통해 결과 처리
- 🧹모든 객체는 close()로 종료
JDBC는 단순한 기술 같지만, 실제로는 데이터베이스 드라이버 벤더마다 구현이 달라지기 때문에 표준 API의 개념을 잘 이해하는 것이 중요합니다.
또한 JDBC를 직접 다루면서 데이터베이스 연동의 기초를 쌓아두면, 이후 Spring Framework의 JdbcTemplate, JPA 같은 고급 기술로 넘어갈 때도 이해가 훨씬 수월해집니다.
🛠️ JDBC 드라이버 로딩 방법
JDBC에서 가장 먼저 수행해야 할 작업은 드라이버 로딩입니다.
이는 자바 프로그램이 특정 데이터베이스에 접근할 수 있도록 도와주는 중계자의 역할을 하죠.
예전에는 명시적으로 드라이버 클래스를 메모리에 로딩해야 했지만, JDBC 4.0 이후부터는 자동 로딩 기능이 도입되어 더 간편해졌습니다.
💬 드라이버 로딩은 자바와 DB 사이를 연결해주는 통역사 같은 역할이에요.
정상적인 연결을 위해서는 반드시 필요한 단계입니다.
// 예전 방식 (JDBC 3.x 이하)
Class.forName("com.mysql.cj.jdbc.Driver");
// 최신 방식 (JDBC 4.0 이상)
Connection conn = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/testdb", "root", "password");
최신 JDBC 버전을 사용하고 있다면 드라이버 클래스를 명시적으로 로딩하지 않아도 되지만, 여전히 Class.forName()을 사용하는 경우도 많습니다.
특히 여러 드라이버를 번갈아 사용하는 복잡한 환경에서는 명확한 로딩이 오류를 줄여줄 수 있습니다.
각 데이터베이스마다 드라이버 클래스 이름이 다르므로 사용 중인 DB에 맞는 드라이버가 필요해요.
예를 들어, MySQL은 com.mysql.cj.jdbc.Driver, Oracle은 oracle.jdbc.driver.OracleDriver 등이 대표적입니다.
💎 핵심 포인트:
JDBC 4.0 이상에서는 드라이버 jar 파일만 classpath에 포함되면 자동으로 로딩되므로 Class.forName() 생략이 가능합니다.
⚙️ Connection 객체 생성 흐름
드라이버가 로딩되었다면 이제 Connection 객체를 생성해 데이터베이스와 연결을 맺어야 합니다.
이 객체는 자바 프로그램과 DBMS 간의 연결 통로로 작동하며, SQL을 실행하거나 트랜잭션을 관리하는 기반이 됩니다.
연결을 생성하기 위해선 DriverManager.getConnection() 메서드를 사용하며, 다음 세 가지 정보가 필요합니다.
- 🌐JDBC URL (예: jdbc:mysql://localhost:3306/testdb)
- 👤DB 사용자 계정 (예: root)
- 🔒DB 비밀번호 (예: password)
String url = "jdbc:mysql://localhost:3306/testdb";
String user = "root";
String password = "password";
Connection conn = DriverManager.getConnection(url, user, password);
연결이 성공하면 conn 객체를 통해 DB 작업을 수행할 수 있습니다.
만약 연결에 실패하면 예외가 발생하므로 반드시 try-catch 문을 활용해 예외 처리를 해야 해요.
⚠️ 주의: 데이터베이스 주소(URL)가 잘못되었거나 사용자 정보가 틀리면 연결이 되지 않으며, SQLException이 발생합니다.
성공적으로 연결된 후에는 꼭 Connection 객체를 close() 해주는 습관을 들이세요.
DB 연결을 종료하지 않으면 리소스 누수로 인해 장애로 이어질 수 있어요.
🔌 Statement로 SQL 실행하기
DB와의 연결이 완료되면 이제 SQL 문장을 실행할 수 있습니다.
이때 사용하는 객체가 바로 Statement입니다.
Statement는 정적인 SQL 쿼리를 실행할 때 적합하며, 주로 SELECT, INSERT, UPDATE, DELETE 등의 쿼리를 실행할 수 있어요.
Statement 객체는 Connection 객체에서 생성하며, SQL 실행 결과에 따라 다른 메서드를 사용합니다.
- 📥
executeQuery()– SELECT 쿼리 실행 시 사용, 결과는 ResultSet 반환 - 📤
executeUpdate()– INSERT, UPDATE, DELETE 쿼리 실행 시 사용, 처리된 행 수 반환
Statement stmt = conn.createStatement();
// SELECT 예제
ResultSet rs = stmt.executeQuery("SELECT * FROM users");
// INSERT 예제
int rowCount = stmt.executeUpdate("INSERT INTO users(name, email) VALUES('홍길동', 'hong@example.com')");
SQL 실행 후 ResultSet을 통해 결과 데이터를 받아올 수 있으며, while 루프를 통해 결과를 반복 처리할 수 있어요.
💎 핵심 포인트:
Statement는 SQL을 문자열 그대로 전달하기 때문에 SQL 인젝션에 취약할 수 있습니다.
동적 데이터가 포함된 쿼리는 PreparedStatement를 사용하는 것이 안전합니다.
마지막으로 Statement와 ResultSet, Connection 객체는 반드시 close()를 호출하여 자원을 반환해줘야 합니다.
try-with-resources 문법을 사용하면 자동으로 리소스를 닫을 수 있어 실수를 방지할 수 있어요.
💡 PreparedStatement와의 차이점
Statement 객체와 함께 자주 언급되는 것이 PreparedStatement입니다.
두 객체 모두 SQL 실행을 위해 사용되지만, 중요한 차이점이 존재해요.
특히 보안성과 성능 면에서 PreparedStatement는 Statement보다 더 강력한 기능을 제공합니다.
🔐 보안: SQL 인젝션 방지
Statement는 SQL 구문 전체를 문자열로 처리하기 때문에 사용자가 입력한 값이 악의적인 SQL 코드로 동작할 위험이 있습니다.
반면, PreparedStatement는 파라미터 바인딩을 통해 쿼리를 실행하므로 SQL 인젝션을 효과적으로 방지할 수 있어요.
⚡ 성능: 반복 실행에 유리
PreparedStatement는 SQL이 미리 컴파일되어 저장되기 때문에, 동일한 쿼리를 반복 실행할 경우 Statement보다 더 빠르게 처리할 수 있습니다.
이러한 특성 덕분에 대량의 데이터를 처리하거나 반복적인 작업이 필요한 상황에서 유리합니다.
String sql = "INSERT INTO users(name, email) VALUES(?, ?)";
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.setString(1, "홍길동");
pstmt.setString(2, "hong@example.com");
int rowCount = pstmt.executeUpdate();
💎 핵심 포인트:
동적 파라미터를 포함한 SQL 실행에는 PreparedStatement가 보안과 성능 모두에서 유리합니다.
실무에서는 Statement보다 PreparedStatement를 더 많이 사용합니다.
물론 간단한 테스트나 정적인 쿼리에는 Statement도 충분히 사용될 수 있어요.
하지만 실무나 사용자 입력 기반의 시스템에서는 PreparedStatement를 기본 선택지로 삼는 것이 좋습니다.
❓ 자주 묻는 질문 (FAQ)
JDBC와 ODBC는 어떤 차이가 있나요?
Statement와 PreparedStatement 중 무엇을 선택해야 하나요?
JDBC 드라이버는 어디서 구하나요?
JDBC 연결이 안 될 때 가장 먼저 확인할 것은?
ResultSet은 언제 닫아야 하나요?
try-with-resources는 꼭 써야 하나요?
JDBC는 어떤 경우에 비효율적일 수 있나요?
JDBC만으로도 실제 웹 서비스를 만들 수 있나요?
🧩 JDBC 연결부터 Statement 실행까지 흐름 정리
이 글에서는 Java 애플리케이션에서 데이터베이스와 연동하기 위한 기본 기술인 JDBC의 전체 흐름을 소개했습니다.
JDBC는 드라이버 로딩 → Connection 객체 생성 → Statement로 SQL 실행 → ResultSet 처리 → close() 정리 순으로 작동합니다.
각 단계에서 필요한 개념과 코드를 예시와 함께 설명드렸으며, Statement와 PreparedStatement의 차이점도 명확히 비교해보았죠.
JDBC는 초보 개발자가 백엔드 기초를 쌓기 가장 좋은 도구이자, 향후 JPA 같은 프레임워크 학습을 위한 든든한 기반이 됩니다.
코드 작성 시 보안과 성능까지 고려한다면 더욱 좋은 개발 습관을 만들 수 있어요.
처음에는 낯설 수 있지만, 천천히 흐름을 익히다 보면 분명 실무에도 도움이 될 것입니다.
🏷️ 관련 태그 : JDBC, 자바데이터베이스연동, Statement, PreparedStatement, DB연결, 자바백엔드기초, SQL실행, Connection객체, 드라이버로딩, ResultSet