본문 바로가기

JSP, Servlet, MySQL/JSP - webmarket

JSP Servlet JDBC로 데이터베이스와 JSP 연동 : 상품조회, 등록, 수정, 삭제하기

728x90
반응형

01 JDBC의 개요

JDBC(Java DataBase Connectivity)는 자바 / JSP 프로그램 내에서 데이터베이스와 관련된 작업을 처리할 수 있도록 도와주는 자바 표준 인터페이스로, 관계형 데이터베이스 시스템에 접근하여 SQL 문을 실행하기 위한 자바 API 또는 자바 라이브러이이다. JDBC API 를 사용하면 DBMS 종류에 상관없이 데이터베이스 작업을 처리할 수 있다. 

 

JDBC API 는 java.sql.* 패키지에 의해 구현되며, 이 패키지는 여러 종류의 데이터베이스에 접근할 수 있다. java.sql.8 패키지는 단일 API 를 제공하는 클래스와 인터페이스의 집합니다. JDBC API를 사용하려면 JSP 페이지에 page 디렉티브 태그의 import 속성을 사용하여 패키지 java.sql.*을 설정해야 한다. 

 

JDBC 를 사용한 JSP 와 데이터베이스의 연동은 다음과 같은 단계로 프로그래밍 된다. 

1. java.sql.* 패키지 임포트, 2. JDBC 드라이버 로딩 , 3. 데이터베이스 접속을 위한 Connection 객체 생성, 4.쿼리문을 실행하기 위한 Statement/PreparedStatement/CallableStatement 객체 생성, 5. 쿼리 실행 , 6. 쿼리 실행의 결과 값(int, ResultSet)사용 , 7. 사용된 객체 (ResultSet, Statement/PreparedStatement/CallableStatement, Connection) 종료 

 

 

02 JDBC 드라이버 로딩 및 DBMS 접속

 

데이터베이스에 접근하는 첫 단계는 JDBC 드라이버를 로딩하는 것이고, JDBC 드라이버를 로딩하고 나면 데이터베이스를 연결한다. 그리고 데이터베이스는 관련 작업이 종료되면 데이터베이스 연결을 해제한다.

 

2.1 JDBC 드라이버 로딩하기

JDBC 드라이버 로딩 단계에서는 드라이버 인터페이스를 구현하는 작업으로 Class.forName() 메소드를 이용하여 JDBC 드라이버를 로딩한다. JDBC 드라이버가 로딩되면 자동으로 객체가 생성되고 DriverManager 클래스에 등록되며 형식은 다음과 같다. JDBC 드라이버 로딩은 프로그램 수행 시 한 번만 필요하다.

 

Class.forName(String className);

 

여기서 매개변수 className 은 JDBC 드라이버 이름이다. 

다은은 MySQL 드라이버를 로딩하는 예이다. 

[MySQL 드라이버 로딩 예]

<%
	try{
    	Class.forName("com.mysql.jdbc.Driver");
        }catch(SQLException ex){
        	//예외 발생 처리
        }
%>

 

 

NOTE_ JDBC 드라이버 로딩하는 또 다른 방법

웹 애플리케이션에서 많은 노력을 기울이지 않고 MySQL 에서 다른 DBMS로 전환하려면 다음과 같이 WEB-INF/web.xml/파일의 <init-param> 요소에 드라이버 이름을 설정한다. 이렇게하면 서블릿을 초기화할때 로딩된다. 

<init-param>
	<param-name>jdbcDriver</param-name>
    <param-value>com.mysql.jdbc.Driver</param-value>
</init-param>

 

드라이버를 로딩하고 나서 <init-param>요소에 설정한 드라이버 이름을 사용하면 데이터베이스에 연결된다. 

java.lang.Class.forName(config.getInitParameter("jdbcDriver"));

 

 

2.2 Connecetion 객체 생성하기

JDBC 드라이버에서 데이터베이스와 연결된 커넥션을 가져오기 위해 DriverManager 클래스의 getConnerction() 메소드를 사용하며 형식은 다음과 같다. DriverNamager 클래스로 Connerction 객체를 생성할 때 JDBC 드라이버를 검색하고, 검색된 드라이버를 이용하여 Connection 객체를 생성한 수 이를 반환한다. 

 

static Connection getConnection(String url)
static Connection getConnection(String url, String user, String password)
static Connection getConnection(String url, Properties info)

 

여기서 매개변수 url 은 데이터베이스 경로이다. url 의 표현 형식은 'jdbc:dbms 이름:주소:포트 번호[데이터베이스 식별자]'이다. 매개변수 user는 데이터베이스 사용자 이름이고 password 는 데이터베이스 비밀번호이다. 그리고 매개변수 info 는 사용자 및 비밀번호 등의 추가 정보를 포함한 Properties 객체이고, 이객체를 사용하려면 패키지 java.util.Properties를 임포트 해야 한다. 

다음은 데이터 베이스 경로만을 이용하여 Connection 객체를 생성하는 예이다 .

[Connection 객체 생셩 예 : getConnection(String url) 메소드 사용]

<%
	Connection conn = null;
    try{
    	Class.forName("com.mysql.jdbc.Driver");
        conn = DriverManager.getConnection(
        "jdbc:mysql;//localhost:3306/JSPBookDB?user=root&password=177100");
        }catch (SQLException ex){
        	//예외 발생 처리
        }
%>

 

다음은 데이터베이스 URL, 사용자 이름, 비밀번호를 이용하여 Connection 객체를 생성하는 예이다. 

[Connection 객체 생성 예 : getConnection(String url, String user, String password) 메소드 사용]

 

<%
Connection conn = null;
try{
	Class.forName("com.mysql.jdbc.Driver");
    conn = DriverManager.getConnection(
    	"jdbc:mysql://localhost:3306/JSPBookDB","root","177100");
}catch(SQLException ex){
	//예외 발생 처리
}
%>

 

다음은 데이터베이스 URL 과 Properties 객체를 이용하여 Connection 객체를 생성하는 예이다. 

[Connection 객체 생성 예 : getConnection(String url, Properties info) 메소드 사용]

 

<%
	Connection conn = null;
    try{
    	Class.forName("com.mysql.jdbc.Driver");
        Properties props = new Properties();
        props.put("user","root");
        props.put("password","177100");
        conn=DriverManager.getConnection(
        	"jdbc:mysql://localhost"3306/JSPBookDB", props);
   	}catch(SQLException ex){
    	//예외 발생 처리
    }
%>

 

2.3 데이터베이스 연결 닫기

데이터베이스 연결이 더이상 필요하지 않으면 데이터베이스와 JDBC 리소스가 자동으로 닫힐때까지 대기하는 것이 아니라 close() 메소드로 생성한 Connection 객체를 해제한다. 일반적으로 데이터베이스 리소스를 사용하지 않기 위해 사용을 끝내자마자 리소스를 해제하는 것이 좋다. 

void close() throws SQLException

 

다음은 데이터베이스의 연결을 종료하는 예이다. 

<%
	Connection conn = null;
    try{
    	//JDBC 드라이버 로딩
        //Connection 객체 생성
    }catch(SQLException e){
    	//예외 발생 처리
    }finally{
    	if(conn != null)conn.close();
    }
%>

 

 

예제 - JDBC API 로 데이터베이스 접속하기 

 

1. 프로젝트 생성하기 : 

2. 데이터베이스 커넥션 설정하기 

커넥션 이름은 MySQL_Conn 이고 다음과 같이 데이터베이스 이름을 JSPBookDB 로 설정한다. 

3. JSP 페이지 작성하기 

 

JSPBook/WebContent/ch16/connection.jsp

<%@ page contentType="text/html; charset=utf-8"%>
<%@ page import="java.sql.*" %>
<html>
<head>
<title>Database SQL</title>
</head>
<body>
	<%
		//Connection 객체를 null 로 초기화하도록 작성한다. 
		Connection conn = null;
		try{//데이터베이스 이름을 포함한 URL , 사용자 계정, 비밀번호를 작성한다. 
			String url = "jdbc:mysql://localhost:3306/JSPBookDB";
			String user = "root";
			String password = "177100";
			
			Class.forName("com.mysql.jdbc.Driver");//데ㅐ이터베이스와 연동하기 위해 JDBC를 로딩하도록 Class.forName()메소드를 작성한다. 
			conn = DriverManager.getConnection(url, user, password);//DriverManager 객체로부터 Connection 객체를 얻어오도록 getConnection() 메소드를 작성한다. 
			out.println("데이터베이스 연결이 성공했습니다. ");
		}catch (SQLException ex){//예외가 발생하면 예외 상황을 처리하도록 catch 구문을 작성한다. 
			out.println("데이터베이스 연결이 실패했습니다 . <br>");
			out.println("SQLException :" + ex.getMessage());
		}finally{//생성된 Connection 객체를  해제하도록 close()메소드를 작성한다. 
			if(conn != null)
				conn.close();
		}
	
	%>
	
</body>
</html>

실행결과는 보는데 500오류

 

org.apache.jasper.JasperException: 행 [17]에서 [/ch16/connection.jsp]을(를) 처리하는 중 예외 발생

14: 			String user = "root";
15: 			String password = "177100";
16: 			
17: 			Class.forName("com.mysql.jdbc.Driver");
18: 			conn = DriverManager.getConnection(url, user, password);
19: 			out.println("데이터베이스 연결이 성공했습니다. ");
20: 		}catch (SQLException ex){


Stacktrace:
	org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:610)
	org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:489)
	org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:379)
	org.apache.jasper.servlet.JspServlet.service(JspServlet.java:327)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:623)
	org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)
    
    근본 원인 (root cause)

javax.servlet.ServletException: java.lang.ClassNotFoundException: com.mysql.jdbc.Driver
	org.apache.jasper.runtime.PageContextImpl.handlePageException(PageContextImpl.java:655)
	org.apache.jsp.ch16.connection_jsp._jspService(connection_jsp.java:162)
	org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:623)
	org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:466)
	org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:379)
	org.apache.jasper.servlet.JspServlet.service(JspServlet.java:327)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:623)
	org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)
근본 원인 (root cause)

java.lang.ClassNotFoundException: com.mysql.jdbc.Driver
	org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1412)
	org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1220)
	org.apache.jasper.servlet.JasperLoader.loadClass(JasperLoader.java:122)
	org.apache.jasper.servlet.JasperLoader.loadClass(JasperLoader.java:58)
	java.base/java.lang.Class.forName0(Native Method)
	java.base/java.lang.Class.forName(Class.java:375)
	org.apache.jsp.ch16.connection_jsp._jspService(connection_jsp.java:135)
	org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:623)
	org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:466)
	org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:379)
	org.apache.jasper.servlet.JspServlet.service(JspServlet.java:327)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:623)
	org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)
비고 근본 원인(root cause)의 풀 스택 트레이스를, 서버 로그들에서 확인할 수 있습니다.

 

javax.servlet.ServletException: java.lang.ClassNotFoundException: cohttp://m.mysql.jdbc.Driver

 

원인을 찾아보니 아마 Class.forName()메소드를 찾지못해서 사용하지 못하는것 같아서 해결방법을 찾아봤다. 

 

 

일단 java Build Path 에 jar 파일을 추가해주었다... 실패

 

그다음 직접 프로젝트 폴더에 추가했다.

 

Dynamic Project - src - main - webapp - WEB-INF - lib  폴더에 connection 파일 직접넣기

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

그리고.. 다행이 성공.. SQLD 끝나고 데이터베이스 오랜만에 하는데 왜이ㅓㅀ게 저는지 모르겠다.. 

728x90
반응형