[JSP] 11.4 JSP에서 JDBC 프로그래밍하기

2022. 4. 28. 16:45JAVA/Servlet&JSP

JDBC란 무엇인가?

JDBC는 Java DataBase Connectivity의 약자로서 자바에서 데이터베이스와 관련된 작업을 처리할 수 있도록 도와주는 API입니다. 자바는 DBMS(Oracle, MySQL 등)의 종류에 상관없이 하나의 JDBC API를 사용해서 데이터베이스 작업을 처리할 수 있습니다.

 

1. JDBC의 구조

JDBC 프로그래밍의 구조

  • 각각의 DBMS는 자신에게 알맞은 JDBC 드라이버를 제공하고 있으며, JDBC API는 JDBC 드라이버를 거쳐 데이터베이스와 통신을 수행합니다.
  • JDBC API를 사용하면 DBMS에 알맞은 JDBC 드라이버만 있으면 어떤 데이터베이스라도 사용할 수 있게 됩니다.

2. JDBC 드라이버 준비하기

2.1 ojdbc.jar 파일 다운로드

저 같은 경우 ojdbc8.jar을 다운로드하였습니다.

https://jar-download.com/?search_box=ojdbc8+jar 

 

Download ojdbc8 jar JAR files with all dependencies

com.oracle.database.jdbc ojdbc8 21.5.0.0 compile group: 'com.oracle.database.jdbc', name: 'ojdbc8', version: '21.5.0.0' //Thanks for using https://jar-download.com libraryDependencies += "com.oracle.database.jdbc" % "ojdbc8" % "21.5.0.0" //Thanks for using

jar-download.com

다운로드 받은 압축파일을 해제한 후 ojdbc8-19.3.0.0.jar 파일을 복사합니다.

 

2.2 웹 프로젝트(jdbc_test 프로젝트) 생성후 webapp/WEB-INF/lib 디렉토리에 붙여넣습니다.

2.3 프로젝트 오른쪽 버튼 클릭 -> Build Path -> Configure Build Path... 버튼 클릭

 

2.4 Libraries 탭 -> Classpath 클릭 -> Add JARs... 클릭

2.5 프로젝트의 WEB-INF/lib 디렉터리에 있는 jar파일을 클릭하고 OK 버튼을 클릭

수행 결과 Classpath에 ojdbc8.jar 파일이 추가된 것을 확인할 수 있습니다.

 

3. JDBC 연동 예제

3.1 오라클 데이터베이스의 테이블과 샘플데이터를 준비합니다.

MEMBER 테이블 생성

create table member(
    MEMBERID VARCHAR2(10),
    PASSWORD VARCHAR2(10),
    NAME     VARCHAR2(20),
    EMAIL    VARCHAR2(80)
);

MEMBER 테이블의 샘플 데이터 입력

insert into MEMBER(MEMBERID, PASSWORD, NAME, EMAIL) VALUES('user1', 'user1', '김용환', 'user1@gmail.com');
insert into MEMBER(MEMBERID, PASSWORD, NAME, EMAIL) VALUES('user2', 'user2', '홍길동', 'user2@gmail.com');
insert into MEMBER(MEMBERID, PASSWORD, NAME, EMAIL) VALUES('user3', 'user3', '강감찬', 'user3@gmail.com');

 

샘플데이터 확인

select * from MEMBER;

 

3.2 회원들의 정보를 출력하는 jsp 파일 작성

viewMemberList.jsp

<%@page import="java.sql.SQLException"%>
<%@page import="java.sql.DriverManager"%>
<%@page import="java.sql.ResultSet"%>
<%@page import="java.sql.Statement"%>
<%@page import="java.sql.Connection"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    
<%
	// 1. JDBC 드라이버 로딩
	Class.forName("oracle.jdbc.driver.OracleDriver");
	
	Connection conn = null;
	Statement stmt = null;
	ResultSet rs = null;
	
	try{
		
	String url = "jdbc:oracle:thin:@localhost:1521/ORCLPDB";
	String user = "JSP2";
	String pwd = "JSP2";
	
	String query = "select * from MEMBER order by MEMBERID";
	
	// 2. 데이터베이스 연결 생성
	conn = DriverManager.getConnection(url, user, pwd);
	
	// 3. Statement 생성
	stmt = conn.createStatement();
	
	// 4. 쿼리 실행
	rs = stmt.executeQuery(query);
	
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>회원 목록</title>
</head>
<body>
	MEMBER 테이블의 내용
	<table width="100%" border="1">
		<tr>
			<td>이름</td>
			<td>아이디</td>
			<td>이메일</td>
		</tr>
		<% 
			while(rs.next()){
				
		%>
			<tr>
				<td><%= rs.getString("NAME") %></td>
				<td><%= rs.getString("MEMBERID") %></td>
				<td><%= rs.getString("EMAIL") %></td>	
			</tr>
		<%
			}
		}catch(SQLException e){
			out.println(e);
		}finally{
			// 6. 사용한 Statement 종료
			if(rs != null)
			{
				rs.close();
			}
			if(stmt != null)
			{
				stmt.close();
			}
			if(conn != null)
			{
				conn.close();
			}
		}
		%>
	</table>
</body>
</html>

위 코드를 통한 JDBC 프로그램의 일반적인 실행 순서는 다음과 같습니다.

  1. JDBC 드라이버 로딩
  2. 데이터베이스 연결을 구함
  3. 쿼리 실행을 위한 Statement 객체 생성
  4. 쿼리 실행
  5. 쿼리 실행 결과 사용
  6. Statement 종료
  7. 데이터베이스 연결 종료

3.3 viewMemberList.jsp을 실행하여 결과 확인

4. DBMS와의 통신을 위한 JDBC 드라이버

JDBC 드라이버는 DBMS와의 통신을 담당하는 자바 클래스로서 DBMS마다 별도의 JDBC 드라이버가 필요합니다. 일반적으로 JDBC 드라이버는 ojdbc.jar 파일 형태로 제공됩니다.

 

JDBC 드라이버를 로딩하는 방법

Class.forName("JDBC 드라이버 클래스의 완전한 이름");

Oracle
Class.forName("oracle.jdbc.driver.OracleDriver");

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

Class.forName() 메서드 자체는 지정한 클래스 정보를 담고 있는 Class 인스턴스를 구해 주는 기능만을 제공합니다.

 

5. 데이터베이스 식별을 위한 JDBC URL

JDBC URL 형식

jdbc:[DBMS]:[데이터베이스 식별자]

MySQL
jdbc:mysql://HOST[:PORT]/DBNAME[?param=value&param1=value2&...]

Oracle
jdbc:oracle:thin:@HOST:PORT:SID[/PDB NAME]

 

JDBC URL 예제

MySQL
- jdbc:mysql://localhost:3306/chap11
- jdbc:mysql://localhost:3306/chap11?useUnicode=true&characterEncoding=euc-kr

Oracle
- jdbc:oracle:thin:@localhost:1521:ORCL
- jdbc:oracle:thin:@localhost:1521/ORCLPDB

 

6. 데이터베이스 연결

데이터베이스 프로그래밍을 하기 위해서는 먼저 데이터베이스와 연결된 Connection 객체를 구해야 합니다.

 

java.sql.Connection 클래스가 데이터베이스 Connection 객체를 나타냅니다. java.sql.DriverManager 클래스가 제공하는 getConnection() 메서드를 사용해서 Connection 객체를 구할 수 있습니다.

 

Connection 객체 구하기

Connection conn = DriverManager.getConnection(url, user, pwd);

 

Connection 객체 해제

conn.close();

 

7. Statement와 PreparedStatement를 사용한 쿼리 실행

Connection 객체를 생성한 후에는 Statement 객체를 생성한 후에 쿼리를 실행할 수 있습니다.

Statement stmt = conn.createStatement();

stmt.executeQuery(String query) : SELECT 쿼리를 실행
stmt.executeUpdate(String query) : INSERT, UPDATE, DELETE 쿼리를 실행

// 쿼리에 인자를 주고 싶은 경우 Statement 객체 대신 PreparedStatement 객체를 사용함
PreparedStatement stmt = conn.preparedStatment(query);

stmt.setString(1, name);
stmt.setString(2, memberid);
...

 

PreparedStatement 객체를 이용한 UPDATE 쿼리 실행

String url = "jdbc:oracle:thin:@localhost:1521/ORCLPDB";
		String user = "JSP2";
		String pwd = "JSP2";
		
		memberid = request.getParameter("memberid");
		name = request.getParameter("name");
		
		String query = "update member set name = ? where memberid = ?";
		
		// 2. 데이터베이스 연결 생성
		conn = DriverManager.getConnection(url, user, pwd);
		
		// 3. prepareStatement 생성
		stmt = conn.prepareStatement(query);
		
		// 4. 파라미터 섲렁
		stmt.setString(1, name);
		stmt.setString(2, memberid);
		
		// 5. 쿼리 실행
		updateCnt = stmt.executeUpdate();

 

8. ResultSet에서 값 읽어오기

Statement 객체의 executeQuery() 메서드는 SELECT 쿼리를 실행한후 SELECT 쿼리 결과를 java.sql.ResultSet 객체에 담아서 리턴합니다. ResultSet 클래스가 제공하는 메서드를 사용해서 결과값을 읽어올 수 있습니다.

ResultSet 객체는 SELECT 쿼리의 결과를 위와 같이 행으로 저장하며 커서를 통해서 각 행의 데이터에 접근할 수 있습니다. ResultSet.next() 메서드를 호출하여 다음 행으로 이동합니다.

 

ResultSet 객체의 사용 예제

ResultSet rs = stmt.executeQuery("SELECT * FROM MEMBER");

while(rs.next())
{
    String memberid = rs.getString("MEMBERID");
    String name     = rs.getString("NAME");
    String email    = rs.getString("EMAIL");
    
    ...
}

 

References

source code : https://github.com/yonghwankim-dev/JSP2.0
JSP 2.0 프로그래밍 기초부터 중급까지