- 자카르타 DBCP 는 커넥션 풀 중의 하나이다.

- 커넥션 풀은 데이터베이스와 연결된 커넥션 객체를 미리 생성하여 풀에 저장해 두었다가 필요할 때마다 풀에 접근하여 커넥션 객체를 사용하고, 사용이 끝나면 다시 반환하는 것을 말한다.

- 라이브러리 다운로드 http://commons.apache.org/
 사이트에서 다운로드

※ WAS 에 설정하는 방법은 안좋다. WAS가 바뀌면 다 바꿔야 된다. 그리고 WAS를 띄우지 않으면 테스트 자체가 불가능해진다. 하지만 was에 설정해야 되는 경우가 온다. 그래서 인터페이스로 만들어야 한다.

1. library 파일을 lib 폴더에 복사해 넣는다.
commons-dbcp-1.2.2.jar, commons-io-1.3.2.jar, commons-pool-1.3.jar

2. db.jocl(jocl 확장자 명을 가지는 파일 이름은 상관없음) 파일을 src 폴더 아래에 만든다.

<object class="org.apache.commons.dbcp.PoolableConnectionFactory"
        xmlns="http://apache.org/xml/xmlns/jakarta/commons/jocl">
    <object class="org.apache.commons.dbcp.DriverManagerConnectionFactory">
        <string value="jdbc:oracle:thin:@127.0.0.1:1521:XE" />
        <string value="user01" />
        <string value="user01" />
    </object>
   
    <object class="org.apache.commons.pool.impl.GenericObjectPool">
        <object class="org.apache.commons.pool.PoolableObjectFactory" null="true" />
        <int value="10" />
        <byte value="1" />
        <long value="10000" />
        <int value="10" />
        <int value="3" />
        <boolean value="true" />
        <boolean value="true" />
        <long value="600000" />
        <int value="5" />
        <long value="3600000" />
        <boolean value="true" />
    </object>
   
    <object class="org.apache.commons.pool.impl.GenericKeyedObjectPoolFactory"
            null="true" />
   
    <string null="true" />
   
    <boolean value="false" />
   
    <boolean value="true" />
</object>


3. Class 파일에서 설정을 잡아준다.


import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class BasicDAO {
 
 private static final String BASIC_DRIVER = "oracle.jdbc.driver.OracleDriver";
 
 private static final String DRIVER = "org.apache.commons.dbcp.PoolingDriver";
 
 private static final String URL = "jdbc:apache:commons:dbcp:/db"; //db는 설정 파일의 이름 나중에 설정을 바꾸고 싶으면 다른 걸 만들어서 넣는다.
 
 static{
  try {
   Class.forName(BASIC_DRIVER);
   Class.forName(DRIVER);
  } catch (ClassNotFoundException e) {
   e.printStackTrace();
  }
 }
 
 public Connection getConnection() throws SQLException{
 
  Connection con = null;
  
  con = DriverManager.getConnection(URL);
  
  return con;
  
 }
}

이렇게 설정을 끝내고 테스트를 통해 같은 객체를 만들어 내는지 확인한다.
server.xml 의 tomcatThreadPool 과 커넥션 풀의 속성(maxActive)는 서버의 스레드풀에 갯수와 일치 시킨다.

서버에서 더 많은 스레드의 갯수를 가지면 정작 커넥션 풀의 스레드 수가 적어서 서비스를 제대로 하지 못하는 경우가 발생한다.
http://tomcat.apache.org/에서 zip 파일로 받은 Tomcat 버전 적용 방법.

1. Window - preferences 선택 - Server - Runtime Environments - Add 클릭한다.




2. 자신의 컴퓨터에 설치한 버전을 선택하고 Next 클릭



3. Browse를 클릭해서 설치한 Tomcat의 폴더를 선택한다.





4. JRE 부분을 그림에 보이는 것 처럼 자신이 설치한 버전의 jdk를 선택한다. 그리고 Finish 클릭



5. 자신이 만들 프로젝트에서 오른쪽 마우스를 클릭하고 Build Path - Configure Build Path 를 클릭한다.



6. 아래와 같은 화면이 나오면 Add Library를 클릭한다.



7. Server Runtime 을 선택하고 Next
 


8. 그러면 맨 처음 설정한 Tomcat이 나타나 있다. 이것을 선택하고 Finish



9. 그러면 아래 그림과 같이 추가된 것을 확인 할 수 있다.



10. 이제 프로젝트를 서버에 올린다. 생성한 프로젝트에서 오른쪽 마우스를 클릭하고, Run As - Run on Server



11. 설치한 버전을 선택하고 Next



12. 그러면 아래 그림과 같이 자신이 생성한 프로젝트가 오른쪽에 나타나 있는 것을 확인 할 수 있다.
Finish 클릭


13. 이클립스 화면에서 Project Explorer 에 Servers가 추가 되고, 아래쪽에 Servers 탭이 나타난 것을 확인 할 수 있다. 이제 서버를 실행시키고 아이피와 프로젝트 이름과 원하는 페이지 이름을 입력하고 실행하면 원하는 페이지를 볼 수 있을 것이다.

include 지시어는 JSP 파일 또는 HTML 파일을 해당 JSP  페이지에 삽입 할 수 있는 기능을 제공하는 지시어이다. 공통된 부분을 다른 폴더에 모아서 만들어 놓고 include 지시어로 포함시켜서 매번 같은 내용을 편리하게 입력할 수 있도록 도와 준다.

그리고 include 지시어는 하나의 파일에 중첩되어 사용가능하기 때문에 여러 파일들을 include 할 수 있다.

<%@ include file="header.jsp"%>

include 액션은 임시로 제어권을 include 되는 페이지로 넘겼다가 그 페이지의 처리가 끝나면 다시 원래의 페이지로 제어권을 반환한다. include 지시어 처럼 여러 페이지를 한 페이지 않에 담는 기능을 갖고 있지만 둘의 차이점은

<jsp:forward page="이동할 페이지"/> <jsp:param name="파라미터 이름1" value="파라미터 값1"/>
<jsp:forward page="포함될 페이지" flush="false"/> 파라미터 동일.

include 지시어는 include 되는 파일들을 포함시켜서 컴파일을 시키는 방법이고, include 액션은 따로 컴파일 되어 제어권 자체가 include액션으로 지정된 페이지로 넘어갔다가 다시 원래 페이지로 돌아온다는 점이다.

include 지시어는 주로 정적인 페이지를 포함시킬 때 주로 사용하고, include 액션은 JSP 페이지처럼 동적인 페이지를 포함시킬 때 사용한다.

1. viewCookies.jsp

쿠키에 들어있는 값들을 보여준다. 여기에 같은 조회번호가 있다면 더이상 카운트를 올려 주지 않으면 된다.


<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR" session="true"%>

<%
 Cookie[] cookies = request.getCookies();

 if(cookies == null || cookies.length == 0){
  
  out.println("쿠키없음");
  return; //return 실행의 제어권을 반환해준다.
  
 }

 for(Cookie ck:cookies){
  
  out.println(ck.getName() + ":" + ck.getValue());
  out.println("<hr>");
  
 }
%>


2. viewBbs.jsp

이 부분에서 bbsno 페이지 번호를 받고, 쿠키를 받아와서 쿠키의 name에 VIEWCOOKIE가 있는지 검색하고 없으면 VIEWCOOKIE 를 만들어 주고 있으면 bbsno를 추가한다. '|' 는 번호를 구분하기 위해 같이 입력한다.


<%@ page contentType="text/html; charset=EUC-KR"
    session="true"%>

<%
 String bbsno = request.getParameter("bbsno");

 Cookie[] cookies = request.getCookies();
 Cookie viewCookie = null;
 
 if(cookies != null && cookies.length > 0){
  
  for(int i = 0; i< cookies.length; i++){
   if(cookies[i].getName().equals("VIEWCOOKIE")){ //Cookie의 name이 VIEWCOOKIE와 일치하는 쿠키를 viewCookie에 넣어준다.
    viewCookie = cookies[i];
   }
  }  
 }
 
 //만일 viewCookie없다면
 if(viewCookie == null){
  System.out.println("VIEWCOOKIE 없음");
  Cookie newCookie = new Cookie("VIEWCOOKIE","|"+bbsno+"|"); //("VIEWCOOKIE"는 name, "|"+bbsno+"|" 는 value 다. 
  response.addCookie(newCookie);
 }else{
  System.out.println("VIEWCOOKIE 있음");
  String value = viewCookie.getValue();
  
  if(value.indexOf("|"+bbsno+"|") <  0){ // 입력한 번화와 일치하는 번호가 없으면 추가한다.
   value = value+"|"+bbsno+"|";
   viewCookie.setValue(value);
   response.addCookie(viewCookie);
  }
 }
 
%>

- 실행 화면

주소창에 처음으로

http://127.0.0.1:8081/web01_10/viewBbs.jsp?bbsno=100 bbsno를 100으로 주고 들어가면 "VIEWCOOKIE 없음" 이라고 나온다.



그리고

http://127.0.0.1:8081/web01_10/viewCookies.jsp 들어가보면 100 이 추가 된 모습을 볼 수 있다.

다시

http://127.0.0.1:8081/web01_10/viewBbs.jsp?bbsno=100 창에서 새로고침을 누르면 위에 사진 처럼
"VIEWCOOKIE 있음" 이라는 메시지가 뜨는 것을 확인 할 수 있다.



http://127.0.0.1:8081/web01_10/viewBbs.jsp?bbsno=101 번 추가 했을 경우 


http://127.0.0.1:8081/web01_10/viewBbs.jsp?bbsno=102 번 추가 했을 경우


이렇게 새로운 bbsno 를 입력할 때 마다 쿠키에 저장되고 다시 새로 고침을 해도 같은 번호는 들어가지 않는다. 이 방법을 이용해서 게시물 조회수 관리라든지 쇼핑몰에서 한번 클릭한 상품을 옆에 보여주는 기능도 구현 할 수 있다.

Session을 좀더 효과적을 사용하기 위해서 세션을 사용하여 로그인을 할 때, 데이타베이스에서 로그인한 사용자와 관련된 정보를 가져와서 세션에 저장 시켜 놓는 것이다. 그러면 사용자 정보가 필요할 때, 다시 데이타베이스를 접속하지 않아도 된다.

로그인을 통한 Session을 사용하는 방법과 사용자 정보를 가지고 와서 어떻게 유용하게 사용하는지 본다.

1. UserVO class를 만든다.


package org.web.member;

public class UserVO {

 private String id;
 private String pw;
 private String name;
 private String email;
 public String getId() {
  return id;
 }
 public void setId(String id) {
  this.id = id;
 }
 public String getPw() {
  return pw;
 }
 public void setPw(String pw) {
  this.pw = pw;
 }
 public String getName() {
  return name;
 }
 public void setName(String name) {
  this.name = name;
 }
 public String getEmail() {
  return email;
 }
 public void setEmail(String email) {
  this.email = email;
 }

 public String toString(){
  return id + ":" + pw + ":" + name + ":" + email;
 }
}

2. login.jsp 작성 - 아이디와 패스워드를 입력하고 loginAction.jsp로 전송한다.


<%@ page contentType="text/html; charset=EUC-KR"
    session="true"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
<title>Insert title here</title>
</head>
<body>
<FORM METHOD=POST ACTION="loginAction.jsp">
 <TABLE>
 <TR>
  <TD>아이디</TD>
  <TD><INPUT TYPE="text" NAME="id"></TD>
  
 </TR>
 <TR>
  <TD>패스워드</TD>
  <TD><INPUT TYPE="password" NAME="pw"></TD>
  
 </TR>
 <TR>
  <TD>로그인</TD>
  <TD><INPUT TYPE="submit" value="전송"></TD>
 
 </TR>
 </TABLE>
</FORM>
</body>
</html>

3. loginAction.jsp - 원래는 여기서 데이타베이스에서 로그인한 사용자의 정보를 가지고 와서 VO 객체에 저장시켜준다.


<%@ page contentType="text/html; charset=EUC-KR" session="true"%>
<%@ page import = "org.web.member.*" %>   
   
<%
 String id = request.getParameter("id");
 String pw = request.getParameter("pw");
 
 //데이타베이스를 통해서 데이타를 가지고 온다. 여기서는 그냥 임의로 입력한다.
 UserVO vo = new UserVO();
 vo.setId(id);
 vo.setPw(pw);
 vo.setName(id + "님");
 vo.setEmail("think@korea.kr");
 
 session.setAttribute("LOGIN", vo); //LOGIN이라는 이름으로 vo 객체를 담아 준다.
%>

<%= id %><br/>
<%= pw%>

4. insertBbs.jsp - 세션에서 정보를 받아와서 입력할 창에 넣어준다. 이러면 사용자가 다시 자기 이름과 이메일 주소를 입력하지 않아도 된다.


<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
   
<%@ page import = "org.web.member.*" %>   
 
<%
 //Object obj = session.getAttribute("LOGIN");
 UserVO vo = (UserVO)session.getAttribute("LOGIN"); //session에 있는 정보를 받아온다.
 
 if(vo == null){
  System.out.println("로그인 안한 사용자");
 }else{
  System.out.println("로그인한 사용자");
 }
%>   
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
<title>Insert title here</title>
</head>
<body>
<FORM METHOD=POST ACTION="insertBbsAction.jsp">
 <TABLE border="1">
 <TR>
  <TD>제목</TD>
  <TD><INPUT TYPE="text" NAME="title"></TD>
 </TR>
 <TR>
  <TD>내용</TD>
  <TD><INPUT TYPE="text" NAME="content"></TD>
 </TR>
 <TR>
  <TD>작성자</TD>
  <TD><INPUT TYPE="text" NAME="writer" value="<%=vo.getName()%>"></TD>
 </TR>
 <TR>
  <TD>작성자 e-mail</TD>
  <TD><INPUT TYPE="text" NAME="email" value="<%=vo.getEmail()%>"></TD>
 </TR>
 <TR>
  <TD>전송</TD>
  <TD><INPUT TYPE="submit" value="전송"></TD>
 </TR>
 </TABLE>
</FORM>
</body>
</html>
- 결과 화면 보기

1. login.jsp


2. loginAction.jsp


3. insertBbs.jsp



Cookie : 클라이언트 측에서 관리되는 정보로 쿠키는 하드디스크에 저장되어 있기 때문에 브라우저를 종료해도 사라지지 않는다. 그래서 보안의 문제를 가지고 있다. 따라서 보안에 관련된 정보는 세션으로 처리하고, 보안과 관련 없는 정보는 쿠키로 처리한다.

사용자를 식별하기 위한 쿠키 (자동으로 생성되는)를 보통 세션 쿠키라고 한다.

자동으로 발행되는 쿠키가 세션 쿠키이다. - 이건 was 마다 다르다.

수동으로 발행하는 쿠키를 수동쿠키 또는 사용자 정의 쿠키라고 부른다.

Session : 세션은 서버 측의 컨테이너에서 관리되는 정보로, 컨테이너에 접속해서 종료되기까지 유지된다. 서버측에서 관리되기 때문에 보안에 안전하다고 볼 수 있다. 세션은 세션의 유지 시간을 설정 할 수 있다.

HTTP를 사용한 웹 서버 통신은 기본적으로 Request/Response를 이용하여 한번 전송하고, 한번 응답하는 서비스를 종료한다. 그래서 사용자의 정보를 유지하기 위해 Session Tracking을 사용한다. (
추가!!!!)

Cookie와 Session을 사용하는데 있어서 반드시 알아야 하는 것은 동시에 많은 사용자가 페이지에 접속하게 된다면 session이 발생하여 메모리를 차지하게 된다는 것이다. 그래서 서버가 죽는 경우가 발생 할 수 있다.
일예로 아마존에서 이벤트를 했는데 동시에 접속자가 몰려서 session이 많이 발생하여 메모리를 잡아먹게 되어 서버가 다운 되는 경우가 발생했다고 한다.;;;

그래서 개발자가 개발시에 주의해야 할 점은 jsp페이지에서

<%@ page language="java" contentType="text/html; charset=EUC-KR" pageEncoding="EUC-KR" session="true"%>

page 지시어에 보면 session="true" 항목이 있다. 기본값은 true이고 HttpSession의 사용여부를 결정한다.

이 부분을 false로 놓고 개발을 해야 한다. 그리고 로그인 같은 세션이 필요한 곳에서는 세션을 살려 놓고 작업을 한다.

이클립스에서 이부분을 설정하는 부분을 보면

Windows - Preferences - Web - JSP Files - Editor - Templates 로 이동해 보면 아래와 같은 그림을 볼 수 있다.


여기서 New JSP File(html)을 클릭하고 Edit를 누르면 아래와 같은 그림이 나온다.

<%@ page language="java" contentType="text/html; charset=${encoding}"
    pageEncoding="${encoding}"%>


이 부분을 아래 그림과 같이 변경한다.


이 부분에서 page 지시어 부분을 그림에서와 같이 변경하고 JSP 페이지를 만들면 기본적으로 변경한 내용으로 만들어 진다.

이렇게 설정을 하고 작업을 하며, 세션이 필요한 경우에는 session="true" 로 변경하고 작업을 하면 된다.

만약 false로 놓고 cookie나 session 작업을 한다면 cookie와 session은 실행되지 않는다.

반드시 구현해야할 계약서를 만드는 작업이 인터페이스다.

BbsDAO에서 반드시 해야 할 작업들을 작성해 놓는다.

Interface BbsDAO 를 작성한다.


package org.sdq.bbs;

public interface BbsDAO {

 public void create(BbsVO vo) throws Exception; //데이타를 집어넣을 작업을 구현하게 한다.
 
}


이제 인터페이스를 구현할 BbsDAOImpl Class를 만든다.

그리고 이전에 오라클과 연결하기 위한 작업을 수행하던 클래스를 상속 받아서 사용한다.


package org.sdq.bbs;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class BasicDAO {

 private static final String DRIVER = "oracle.jdbc.driver.OracleDriver";
 private static final String URL="jdbc:oracle:thin:@127.0.0.1:1521:XE";
 private static final String USER = "USER01";
 private static final String PW = "USER01";
 
 static{ //실행될 때 메모리 상에 올린다. 한번만
  try {
   Class.forName(DRIVER); //import 하는 거와 동일하다. 왜 이렇게 하냐 면 다른 DB를 사용 때 체크한다.
  } catch (ClassNotFoundException e) {
   e.printStackTrace();
  }
 }
 
 public Connection getConnection() throws SQLException{
  
  Connection con = null;
  
  //서브잡일때 잡고, 메인잡일때 던져(일부분일 때는 잡아야되고, 전체일 때는 던진다
  
  con = DriverManager.getConnection(URL, USER, PW);
  
  return con;
 }
}

그리하여 완성된 BbsDAOImpl Class!


package org.sdq.bbs;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;

public class BbsDAOImpl extends BasicDAO implements BbsDAO {

 @Override
 public void create(BbsVO vo) throws Exception {
 
    Connection con = null;
    PreparedStatement pstmt = null;
   
    StringBuffer buffer = new StringBuffer();
    //buffer.append(" INSERT into TBL_BBS (bbsno, title, content, writer)\n");
    //buffer.append(" values(SEQ_BBS.NEXTVAL, 'AAAAAAAAA', 'BBBBBBBB', 'YNK')\n");
    buffer.append("  INSERT into TBL_BBS (bbsno, title, content, writer) \n");
    buffer.append("  values(SEQ_BBS.NEXTVAL, ?, ?, ?)  \n");
  
    try{
    
     con =
getConnection();
     pstmt = con.prepareStatement(buffer.toString());
     pstmt.setString(1, vo.getTitle());
     pstmt.setString(2, vo.getContent());
     pstmt.setString(3, vo.getWriter());
    
     int result = pstmt.executeUpdate();
     System.out.println(result);
    
     //작업
     pstmt.close();
     pstmt = null;
     con.close();
     con = null;
    }catch(Exception e){
     e.printStackTrace();
    }finally{
     if(pstmt != null){try{ pstmt.close(); }catch(Exception e){} }
     if(con != null){try{con.close();}catch(Exception e){}}
    } 
 }
}

- 쿼리문을 만들어 줄 Class

package org.bnk.util;

import java.io.FileInputStream;
import java.io.InputStream;
import java.util.Scanner;

public class QueryUtil {
 
 public void makeQuery()throws Exception{
   
    InputStream in = new FileInputStream("query.txt");
    Scanner scanner = new Scanner(in);
   
    while(true){
    
     try{
      String str = scanner.nextLine();
      System.out.println("buffer.append(\" "+ str+"\\n\");");
     
     }catch(Exception e){
      break;
     }  
    }
    in.close();
   }
  
   public static void main(String[] args)throws Exception {
    new QueryUtil().makeQuery();
   }
}

- query.txt 파일을 프로젝트 밑에 만들고 거기 안에다가 쿼리 문을 넣는다.

그리고 실행하면 PreparedStatement 에서 사용할 쿼리가 만들어 진다.

INSERT into TBL_BBS (bbsno, title, content, writer)
values(SEQ_BBS.NEXTVAL, 'AAAAAAAAA', 'BBBBBBBB', 'CCCCCC');


위 문장이 텍스트 파일에 있었다면

실행을 하고 만들어지는 문장은

buffer.append(" INSERT into TBL_BBS (bbsno, title, content, writer)\n");
buffer.append(" values(SEQ_BBS.NEXTVAL, 'AAAAAAAAA', 'BBBBBBBB', 'YNK')\n");


이렇게 많들어 진다.

이걸 PreparedStatement 에서 사용할 문자로 바꾸면 이렇게 된다.

buffer.append("  INSERT into TBL_BBS (bbsno, title, content, writer) \n");
buffer.append("  values(SEQ_BBS.NEXTVAL, ?, ?, ?)  \n");



Tomcat 6.0 설치

http://tomcat.apache.org/download-60.cgi 

사이트에서 Core : zip 버전을 다운로드하고 원하는 위치에 압축을 푼다.

1. 환경변수 설정에서 JAVA_HOME 셋팅 되어 있는지 확인한다. 거의 모든 WAS가 JAVA_HOME 경로를 참조하기 때문이다.

2. 오라클이 설치된 경우에는 8080포트는 사용할 수 없다.
- XE버전일 때는 톰캣의 포트를 수정하는 편이 편한다.

3.  아파치-톰캣 conf경로 안에 있는 server.xml 파일을 수정한다. 

C:\apache-tomcat-6.0.20\conf - server.xml

67번째 줄에 있는.

//8080을 -> 다른 포트 번호로 수정한다.

<Connector port="8081" protocol="HTTP/1.1"
 
               connectionTimeout="20000"
               redirectPort="8443" />

4. 콘솔 창으로 접속 한 다음에 C:\apache-tomcat-6.0.20\bin 폴더에서 startup 실행을 한다.



만약 다음과 같이 오류가 발생한다면.

CATALINA_HOME environment variable... 메시지가 떴다면 환경변수를 수정해야 된다.

현재 톰캣의 경로 : C:\apache-tomcat-6.0.20 환경 변수에 셋팅한다.

CATALINA_HOME 추가

환경변수 추가 방법은 http://thinkingblog.tistory.com/42 글을 참조 한다.


환경변수 수정하고 나면 명령프롬프트를 새로 시작하고 다시 

콘솔 창으로 C:\apache-tomcat-6.0.20\bin 폴더에서 접근한 다음에 startup 실행을 한다.

새로운 창이 뜨면서 실행이 성공한다.



http://127.0.0.1:8081 으로 접속해서 창이 뜨는지 확인한다.



창이 제대로 뜬다면 설정 성공!

종료는 shutdown 을 콘솔 창에서 입력한다.

■ JUnit 이란 독립된 테스트를 할 수 있도록 도와주는 framework이다.

테스트시 권장 사항으로 test 로 시작하는 메서드 이름을 작성한다. 

register() 라는 메서드를 테스트 하려면 testRegister()로 만드는 것이 좋다.

그리고 eclipse의 JUnit 플러그인은 test로 시작된 메서드들을 찾아서 리플렉션을 통해서 테스트를 수행하게 한다.

■ 실습해보기.

1. Java Project를 하나 만든다.

2. Project 이름에서 오른쪽 마우스를 클릭하고 Properties를 클릭한다.

3. Java Build Path를 클릭한다.

4. Libraries 탭을 클릭하고 Add Library를 클릭한다.



5. JUnit 을 선택하고 Next를 클릭.



6. 버전을 선택하고 Finish



7. JUnit3이 추가 된 모습을 확인 할 수 있다.




8. Project 에서 오른쪽 마우스 클릭하고, New에서 JUnit Test Case를 클릭한다.

 

만약 저 위치에 없다면 Other를 클릭하고 Java 폴더 - JUnit 폴더에서 선택하면 된다.



9. Name에 클래스 이름을 입력하고 Finish.



10. 클래스를 작성 한다.

- TestVO.java

- Test.java


11. Test 클래스 이름을 더블클릭하고 오른쪽 마우스를 클릭한 다음에 Run As -> JUnit Test를 실행한다.



테스트가 성공한 모습을 볼 수 있다.



12. 오류가 있는 경우 에러가 발생한다.

오류가 있는 코드를 삽입한 결과.


오류가 있는 메소드에서 에러가 발생한 모습을 볼 수 있다.

JUnit을 사용하면 이렇게 에러가 발생한 곳을 찾을 수 있고, 단계별로 검사를 진행하면서 하면 나중에 큰 문제 없이 프로젝트를 완성할 수 있다.



JDBC 드라이버는 데이타베이스에 맞는 드라이버를 사용해야된다. 

버전이 다를 경우 오류가 발생 할 수 있는데, 무슨 오류인지 몰라서 잡기가 힘들다.

데이타베이스는 그에 맞는 드라이버를 제공한다. 

Oracle Database 10g Express Edition 의 경우

C:\oraclexe\app\oracle\product\10.2.0\server\jdbc\lib 

경로 아래에 두개의 Jar File 이 있다.



ojdbc14_g 파일은 디버깅용으로 속도가 좀 떨어진다.

여기에 있는 Jar File을 가져다가 사용하자.


+ Recent posts