메뉴 닫기

JAVA JDBC 연결 방법과 Statement로 SQL 실행하는 전체 흐름 정리


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 사이를 연결해주는 통역사 같은 역할이에요.
정상적인 연결을 위해서는 반드시 필요한 단계입니다.

CODE BLOCK
// 예전 방식 (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)

CODE BLOCK
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 쿼리 실행 시 사용, 처리된 행 수 반환

CODE BLOCK
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보다 더 빠르게 처리할 수 있습니다.
이러한 특성 덕분에 대량의 데이터를 처리하거나 반복적인 작업이 필요한 상황에서 유리합니다.

CODE BLOCK
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는 어떤 차이가 있나요?
JDBC는 자바 전용 API이며, ODBC는 다양한 언어에서 사용 가능한 범용 인터페이스입니다. JDBC는 자바 환경에 최적화되어 있어 성능과 편의성이 높습니다.
Statement와 PreparedStatement 중 무엇을 선택해야 하나요?
동적 데이터나 사용자 입력이 포함된다면 보안과 성능을 위해 PreparedStatement를 선택하는 것이 좋습니다. 정적이고 간단한 쿼리에는 Statement도 사용할 수 있습니다.
JDBC 드라이버는 어디서 구하나요?
보통 사용하는 데이터베이스의 공식 홈페이지나 Maven 중앙 저장소에서 받을 수 있습니다. 예: MySQL은 mysql-connector-j, Oracle은 ojdbc입니다.
JDBC 연결이 안 될 때 가장 먼저 확인할 것은?
JDBC URL이 올바른지, 포트가 열려 있는지, DB 사용자 계정 정보가 맞는지 등을 먼저 확인해야 합니다. 로그 메시지도 중요한 단서가 됩니다.
ResultSet은 언제 닫아야 하나요?
ResultSet은 데이터를 모두 읽고 난 후 반드시 닫아야 합니다. 닫지 않으면 메모리 누수로 이어질 수 있으며, 데이터베이스 연결 수 제한도 초과할 수 있습니다.
try-with-resources는 꼭 써야 하나요?
필수는 아니지만, 자원 정리를 자동으로 해주는 장점이 있어 강력히 권장됩니다. 특히 예외가 발생하더라도 close()를 누락하지 않아 코드가 안정적입니다.
JDBC는 어떤 경우에 비효율적일 수 있나요?
대규모 트랜잭션, 복잡한 관계 매핑, ORM이 필요한 상황에서는 JDBC보다 JPA 같은 프레임워크가 더 효율적일 수 있습니다.
JDBC만으로도 실제 웹 서비스를 만들 수 있나요?
가능합니다. 단, 유지보수나 확장성 측면에서 불리할 수 있으므로 보통은 Spring 같은 프레임워크와 함께 사용합니다.



🧩 JDBC 연결부터 Statement 실행까지 흐름 정리

이 글에서는 Java 애플리케이션에서 데이터베이스와 연동하기 위한 기본 기술인 JDBC의 전체 흐름을 소개했습니다.
JDBC는 드라이버 로딩 → Connection 객체 생성 → Statement로 SQL 실행 → ResultSet 처리 → close() 정리 순으로 작동합니다.
각 단계에서 필요한 개념과 코드를 예시와 함께 설명드렸으며, Statement와 PreparedStatement의 차이점도 명확히 비교해보았죠.

JDBC는 초보 개발자가 백엔드 기초를 쌓기 가장 좋은 도구이자, 향후 JPA 같은 프레임워크 학습을 위한 든든한 기반이 됩니다.
코드 작성 시 보안과 성능까지 고려한다면 더욱 좋은 개발 습관을 만들 수 있어요.
처음에는 낯설 수 있지만, 천천히 흐름을 익히다 보면 분명 실무에도 도움이 될 것입니다.


🏷️ 관련 태그 : JDBC, 자바데이터베이스연동, Statement, PreparedStatement, DB연결, 자바백엔드기초, SQL실행, Connection객체, 드라이버로딩, ResultSet