6월 21일 내용정리
수업은 듣는데,,,이것 나혼자 공부하는게 나을거 같기도,,,에휴..

1.톰캣과 JDBC
그림속 회색은 톰켓 컨테이너임
톰켓 안에서 DB관련 된 일을 처리함
(1)DriverManager.getConnection()
메소드로 DBMS와 연결요청
(2)연결이되면 DBMS에서 Connection 되고 con 변수에 Connection 담김
(3)Connection의 con.createStstement() 메소드를 이용하여 spl명령문을 담을 Ststement 그릇을 만들 준비를 함.
(4)Ststement stmt 로 Ststement 객체를 만들어 변수 stmt에 담음
(5)stmt의 쿼리 실행문인 stmt.executeQuery(sql);를 이용하여
DBMS로 쿼리문을 보내고,
(6)DBMS에서 에서 받아 응답을 주는데,
(7)응답을 받는 객체인 ResultSet 로 받아 rs 변수에 담아준다.
2.ResultSet
위에서 말했듯이 ResultSet은 DBMS에서 쿼리문을 처리하고 결과를 담는 객체로 객체는 테이블 형태로 결과를 보여주는데, 커서라는 개념이 있어
4가지의 메서드로 커서를 이동하여 원하는 결과 값을 ResultSet 객체에 담을수 있다.

<%@page import="java.sql.*"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%!
//전역변수 설정
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
String url = "jdbc:oracle:thin:@localhost:1521:xe";
String uid = "scott";
String pass = "tiger";
String sql = "select * from member";
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<table width="800" border="1">
<tr>
<td>이름</td>
<td>아이디</td>
<td>암호</td>
<td>이메일</td>
<td>전화번호</td>
<td>권한(1:관리자, 2:일반회원)</td>
</tr>
<%
try{
Class.forName("oracle.jdbc.driver.OracleDriver"); //드라이버 로딩
conn=DriverManager.getConnection(url,uid,pass); //드라이버 연결
stmt=conn.createStatement(); //명령문 전달
rs=stmt.executeQuery(sql); //쿼리문의 결과를 가져와야함
while(rs.next()){ //커서
out.println("<tr>");
out.println("<td>"+rs.getString("name")+"</td>");
out.println("<td>"+rs.getString("userid")+"</td>");
out.println("<td>"+rs.getString("pwd")+"</td>");
out.println("<td>"+rs.getString("email")+"</td>");
out.println("<td>"+rs.getString("phone")+"</td>");
out.println("<td>"+rs.getInt("admin")+"</td>");
out.println("</tr>");
}
}catch(Exception e){
e.printStackTrace();
}finally {
try{
if(rs != null)
rs.close();
if(stmt != null)
stmt.close();
if(conn != null)
conn.close();
}catch(Exception e){
e.printStackTrace();
}
}
%>
</table>
</body>
</html>
3.회원정보 insert하기
회원정보 insert할려면 prepareStatement 메서드를 사용하여 insert하면 된다.
insert,update,delete 모두 prepareStatement 메서드를 사용하여 실행한다.
<%@page import="java.sql.*"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%!
//전역변수 설정
Connection conn=null;
PreparedStatement pstmt=null;
ResultSet re=null;
String url = "jdbc:oracle:thin:@localhost:1521:xe";
String uid = "scott";
String pass = "tiger";
String sql="insert into member values(?,?,?,?,?,?)";
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
request.setCharacterEncoding("UTF-8");
String name=request.getParameter("name");
String id=request.getParameter("id");
String pw=request.getParameter("pw");
String email=request.getParameter("email");
String phone=request.getParameter("phone");
String admin=request.getParameter("admin");
try{
//1단계 jdbc드라이버 로드
Class.forName("oracle.jdbc.driver.OracleDriver");
//2단계 데이터베이스 연결 객체인 Connection 생성
conn=DriverManager.getConnection(url,uid,pass);
//3단계 prepareStatement 객체 생성
pstmt=conn.prepareStatement(sql);
//4단계 바인딩 변수를 채운다.
pstmt.setString(1,name);
pstmt.setString(2,id);
pstmt.setString(3,pw);
pstmt.setString(4,email);
pstmt.setString(5,phone);
pstmt.setInt(6,Integer.parseInt(admin));
//5단계 SQL문을 실행하여 결과를 처리 한다.
pstmt.executeUpdate();
}catch(Exception e){
e.printStackTrace();
}finally{
try{
if(pstmt!=null)
pstmt.close();
if(conn!=null)
conn.close();
}catch(Exception e){
e.printStackTrace();
}
}
%>
<h3>회원 가입 성공</h3>
<a href="0620_02.jsp">회원 전체목록 보기</a>
</body>
</html>
4.DataSource 이용해 데이터베이스 연동
애플리케이션에서 데이터베이스 연결 과정에서 시간이 너무 많이 걸린다는 단점이 발견, 이것을 해결하기 위해 ConnectionPool이 나옴
애플리케이션 실행시 미리 Connection 객체를 생성한 후, 미리데이터베이스 연결을 맺는다.
애플리케이션은 데이터베이스 연동 작업 발생시 미리연결한Connection객체를 이용하여 작업을 한다.
대략 아래그림과 같음

Connection을 미리 생성해두었다가, Connection객체을 가져와서사용하고 다시 반납을 하게 되면 매번 새로운 Connection객체를 생성하지 않아도 되어 성능을 높일 수 있다.
DBCP(Database Connection Pool)는 DBCP매니저가 어느 정도 연결을 확보해 놓고 있다가 클라이언트의 요청이 들어오면 연결해주고, 클라이언트의 작업이 다 끝나면 연결을 다시 DBCP매니저에게 반환하도록 만들었다.
5.ConnectionPool의 동작 원리

(1)톰캣 컨테이너를 실행후 응용프로그램을 실행됨

(2)톰캣 컨테이너 실행시 ConnectionPool객체를 생성함

(3)데이터연동이 필요한 경우 응용프로그램에서 메서드를 호출하여 ConnectionPool객체와 연결하고,
ConnectionPool객체는 DBMS와 연결되고, 최종 DB와 연결됨.
(4)클라이언트 작업이 끝나면 차례대로 종료되면서 최종적으로 DBCP매니저에게 Connection객체를 반환함
톰캣 컨테이너는 자체적으로 ConnectionPool 기능을 제공 합니다. 톰캣 실행 시 톰캣은 설정 파일에 설정된 데이터베이스 정보를 이용해 미리 데이터베이스와 연결하여 ConnectionPool 객체를 생성한 후 애플리케이션이 데이터베이스와 연동할 일이 생기면 ConnectionPool객체의 메서드를 호출해 빠르게 연동하여 작업을 한다.
6.JNDI(Java Naming and Directory Interface)
JNDI의 정의를 보면 디렉터리 서비스에서 제공하는 데이터 및 객체를 발견하고 참고(lookup)하기 위한 자바 API라고 되어있다. 쉽게 말하면 외부에 있는 객체를 가져오기 위한 기술이다.
필요한 자원을 키/값 쌍으로 저장한 후 필요할때 키를 이용해 값을 얻는 방법
7.JNDI 활용 예
-웹브라우져에서 name/value 쌍으로 전송한 후에 서블릿에서 getParameter(name)로 값을 가져올때
-해시맵이나 해시테이블에 키/값으로 저장한 후 키를 이용해 값을 가져올때
-웹 브라우저에서 도메인 네임으로 DNS서버에 요청할 경우 도메인 네임에 대한 IP주소를 가져올때
8.ConnectionPool과 JNDI 관계
-톰캣컨테이너가 ConnectionPool 객체를 생성하면 이 객체에 대한 JNDI 이름을 미리 설정해 놓는다.
-웹 애플리케이션에서 데이터베이스와 연동 작업을 할때 JNDI 이름으로 접근하여 작업을 수행함.
9.ConnectionPool로 연결한 데이터속성
