BE/JSP

JDBC

aodtns 2022. 2. 9. 17:44

JDBC

데이터베이스의 종류가 매우 다양해서 개발에 어려움이 많지만, JDBC자바 애플리케이션에서 표준화된 방법으로 다양한 데이터베이스에 접속할 수 있도록 해주기 때문에 개발자는 JDBC 클래스 API만 알면 모든 데이터베이스에서 동작할 수 있는 애플리케이션을 개발할 수 있다. 이때 드라이버 관리자를 통해 드라이버만 교체해 주면 각기 다른 데이터베이스에 접속할 수 있다.

 

 

JDBC API

JDBC 프로그래밍은 자바에서 데이터베이스 연동 프로그램을 개발하는 것을 말한다. 기본적인 단계는 아래와 같다.

 

 

1단계 : JDBC 드라이버 로드

데이터베이스에 접속하려면 해당 데이터베이스의 JDBC 드라이버를 로드해야 한다. JDBC 드라이버를 로드하는 방법은 크게 두 가지가 있는데, jdbc.drivers 라는 시스템 환경 변수에 등록된 내용으로 하는 방법과 Class.forName() 메서드를 이용해서 직접 해당 클래스를 로드하는 방법이다. 대부분 후자를 사용한다.

 

1. jdbc.drivers 환경변수 이용하기

System.setProperty("jdbc.drivers", "com.mysql.jdbc.Driver");

 

2. Class.forName() 이용하기

Class.forName("com.mysql.jdbc.Driver");

 

 

2단계 : 데이터베이스 연결

실제 데이터베이스와 연결하려면 Connection 클래스의 인스턴스가 필요하며, DriverManager.getConnection() 메서드를 이용해서 레퍼런스를 가져올 수 있다.

 

JDBC URL

JDBC URL 구조는 다음과 같다. 각 데이터베이스 별로 JDBC URL이 다르므로, 사용하는 데이터베이스 매뉴얼을 참고해서 작성해야 한다.

jdbc:<하위 프로토콜>:<데이터 원본 식별자>

MySQL의 경우 아래와 같다.

jdbc:mysql:// IP주소:PORT(옵션)/스키마

IP 주소 : MySQL 데이터베이스가 설치된 컴퓨터의 IP 주소, 또는 도메인 이름

포트 : 기본 설정 값인 3306 포트를 사용하는 경우에 생략 가능

스키마 : 데이터베이스에서 생성한 스키마(데이터베이스) 이름

 

-> 데이터베이스에 연결하려면 모든 정보를 정확하게 알고 있어야 하며, 이 중에서 한 가지라도 잘못되어 있다면 제대로 연결되지 않는다.

 

Connection 클래스 인스턴스 레퍼런스 얻기

DriverManager의 getConnection 메서드를 이용하면 된다.

Connection conn = DriverManager.getConnection(JDBC_URL, "아이디", "비밀번호");

JDBC_URL : 해당 데이터베이스에 맞게 미리 정의되어 있는 문자열

아이디와 비밀번호 : 시스템에 로그인하는 계정이 아니라 데이터베이스 자체에서 관리하는 계정

 

3단계 : Statement 생성

Statement는 데이터베이스 연결로부터 SQL 문을 수행할 수 있도록 해주는 클래스이다.

 

executeQuery()

SELECT 문을 수행할 때 사용한다. 반환 값은 ResultSet 클래스의 인스턴스로, 해당 SELECT 문의 결과에 해당하는 데이터에 접근할 수 있는 방법을 제공한다.

 

executeUpdate()

UPDATE, DELETE와 같은 문을 수행할 때 사용한다. 반환 값은 int 값으로, 처리된 데이터의 수를 반환한다.

 

Statement stmt = conn.createStatement();
stmt.executeUpdate("insert into test values(' "+request.getParameter("username")+" ','" + request.getParameter("email")+" ')");

위의 코드처럼 사용자 입력 값을 포함해야 하는 경우 SQL 문을 변수와 결합해서 만들어야 하기 때문에 소스가 복잡해진다. 그러므로 이처럼 복잡한 SQL 문을 사용할 때는 Statement의 더욱 향상된 기능을 제공하는 PreparedStatement를 이용한다.

 

PreparedStatement

PreparedStatement pstmt = conn.prepareStatement("insert into test values(?,?)");
pstmt.setString(1, request.getParameter("username"));
pstmt.setString(2, request.getParameter("email"));
pstmt.executeUpdate();

Statement의 close

stmt.close();

pstmt.close();

 

 

4단계 : SQL문 전송

데이터를 입력, 수정, 삭제하기 위해 SQL 문을 만드는데, PreparedStatement를 이용해서 변수와 적절히 조합하면 된다.

 

5단계 : 결과 받기

데이터의 결과를 받으려면 executeQuery()를 사용한다. 입력, 수정, 삭제와 달리 데이터를 갖고 오는 경우에는 가져온 결과 데이터를 처리하기 위한 ResultSet 객체가 필요하다.

ResultSet rs = pstmt.executeQuery();

ResultSet은 실제 처리 결과의 데이터가 모두 있는 구조가 아니라, 데이터의 인덱스 정보만 있는 구조이다. 따라서 ResultSet만 가져오고 연결을 끊으면 안 되고, 필요한 데이터를 모두 가져온 이후에 ResultSet을 close()하고, 그다음 connection을 close() 해야 한다.

 

ResultSet은 next() 메서드를 이용해서 다음 로우로 이동할 수 있다.

ResultSet rs = pstmt.executeQuery();
while(rs.next()){
     name = rs.getString("name");
     age = rs.getInt("email");
}
rs.close();

 

6단계 : 연결 해제

Connection 인스턴스는 사용한 뒤 반납하지 않으면 계속해서 연결을 유지하므로, 어느 시점에서는 데이터베이스 연결이 부족한 상황이 발생할 수 있다. 따라서 사용자가 많은 시스템일수록 커넥션 관리가 중요하다. 이를 위해 커넥션 풀(Connection Pool)을 이용하기도 한다.