누군가가 CVS 서버에 등록한 변경사항이 있다면 그 내용을 자신의 이클립스 프로젝트에 반영해야 한다. 이를 "Update" 한다고 한다. 앞서 "addCookie.jsp" 내용을 변경하고 이를 서버에 등록하였다. 그러면 다른 사람은 변경된 "addCookie.jsp"를 "Update"하여 변경된 내용을 해야 할 것이다.

다음 그림을 보자. 앞에서 "addCookie.jsp"가 변경되어 서버에 등록했을 때 버전이 "1.1"에서 "1.2"로 변경되었으나 그림에서는 아직 프로젝트의 "addCookie.jsp"의 버전이 "1.1"로 변경이 반영되지 않았음을 알 수 있다. 그러면 이 파일의 버전을 CVS 서버로부터 "Update" 하여 "1.2"로 업그레이드하는 방법을 살펴보겠다.

사용자 삽입 이미지

"Update"를 위해서는 프로젝트 이름에서 마우스 오른쪽 클릭을 해 나타나는 메뉴에서 "Team", "Update" 항목을 차례로 선택한다.

사용자 삽입 이미지

그러면 서버에 접속하여 변경된 내용을 가져온다. 이 과정은 "CVS Update" 창을 통해 나타난다.

사용자 삽입 이미지

CVS Update


"Update"를 통해 변경된 내용이 적용되면 변경된 파일의 버전이 변경된다. 다음 그림에서와 같이 "addCookie.jsp"의 버전이 "Update" 후 "1.1"에서 "1.2"로 변경되었음을 알 수 있다.

사용자 삽입 이미지
AND

공동으로 진행되는 프로젝트는 누군가에 의해 변경이 발생하고 이러한 변경은 또 다른 사람이 반영해야 한다. 만약 내가 "JSPLecture" 프로젝트에서 "WebContent" 디렉터리의 "addCookie.jsp" 프로그램을 변경했다면 이를 다른 사람이 반영할 수 있도록 CVS 서버에 등록해야 한다. 이클립스에서는 CVS에 의해 동기화 된 프로젝트의 프로그램과 같은 어떤 파일이 변경됐다면 다음 그림에 표시된 박스에서와 같이 해당 파일이름과 그 파일을 포함하고 있는 상위 디렉터리의 이름들 그리고 프로젝트 이름 좌측에 ">" 표시가 붙는다. 그러므로 ">" 표시가 있다면 CVS 서버와 동기화 된 후 변경이 발생했음을 의미하므로 이 변경사항을 서버에 등록해야 한다.

사용자 삽입 이미지
 
변경된 내용을 서버에 등록하는 것을 "Commit" 이라고 하며 이는 프로젝트 이름에서 마우스 오른쪽 클릭을 한 후 뜨는 메뉴 창에서 "Team", "Commit..." 항목을 차례로 선택한다.

사용자 삽입 이미지
 
앞 그림에서 "Commit..." 항목을 선택하면 변경된 내용에 대한 간단한 설명을 위한 "Commit" 창이 뜬다 필요하다면 굵은 선으로 된 박스 창에 설명을 추가할 수 있다. 여기서는 아무 설명도 입력하지 않고 "Finish" 버튼을 클릭 CVS 서버에 변경된 내용을 등록한다.

사용자 삽입 이미지
 
여기서는 아무런 설명도 하지 않고 등록했기 때문에 확인을 위한 "Empty commit comment" 창이 뜬다. 변경에 대한 설명을 입력하지 않아도 이 창이 뜨지 않도록 하려면 "Remember decision" 항목을 선택하면 된다.

사용자 삽입 이미지

Empty commit comment

 
변경된 내용이 CVS 서버에 반영됐다면 ">" 표시가 없어지며 변경된 파일 "addCookie.jsp"의 버전이 변경된다.

사용자 삽입 이미지
 
AND


학교에서 실습한 프로젝트를 CVS 서버에 등록한 후 집이나 학교에서 이어서 진행하려면 우선 CVS 서버에 등록된 프로젝트를 이클립스로 가져와야 한다. 이를 위해서는 프로젝트 익스플로러에서 마우스 오른쪽 버튼을 클릭한 다음 "New" -> "Project..." 항목을 차례로 선택하는 것으로부터 시작한다. 이것은 CVS 서버에서 관리되고 있는 프로젝트를 최초로 이클립스레 가져오는 단계를 설명한 것이다.

사용자 삽입 이미지

CVS에서 Project 가져오기

 
"New Project" 창이 뜨면 "CVS" 의 "Projects from CVS" 항목을 선택한 후 "Next>" 버튼을 클릭한다.

사용자 삽입 이미지

New Project


CVS 서버 접속에 필요한 계정정보를 입력받기 위한 "Enter Repository Location Information" 창이 뜨면 다음과 같은 내용의 정보를 입력한다. 이는 앞 CVS 서버에 프로젝트 등록하기에서 다룬 내용과 동일하다. "Host"에는 CVS 서버의 도메인 이름이나 IP 주소를 입력하고, "Repository path"에는 서버에서 CVS 저장소를 위한 디렉터리 이름을 입력한다. "Repository path"는 서버에 따라 다르므로 관리자에게 문의하여 입력해야 한다. 그리고 CVS 서버에 주어진 자신의 아이디와 비밀번호를 "User"와 "Password"에 각각 입력한 뒤 "Next>" 버튼을 클릭한다. "Save password" 좌측의 체크박스를 선택하면 암호를 기억하여 다음부터 암호를 묻지 않는다.

사용자 삽입 이미지
 
"Select Module"창은 CVS 서버에서 관리되고 있는 모듈들 중 하나를 선택 가져올 수 있도록 한다. 여기서 모듈이름은 이클립스에서 프로젝트 이름과 동일하다고 생각하면 된다. 이 창이 뜨면 "Use an existing module" 항목을 선택한다. 그러면 서버에서 관리되는 모듈 목록이 나열되는데, 우리는 "JSPLecture"를 가져올 것이므로 이것을 선택한 후 "Finish" 버튼을 클릭한다. 그러면 서버로 부터 프로젝트 "JSPLecture"를 가져온다. 그 과정은 "Checking out JSPLecture from CVS" 창에 진행 상태와 함께 표시된다.

사용자 삽입 이미지

Select Module

 
사용자 삽입 이미지

Checking out 창

 
프로젝트 가져오기가 완료되면 CVS 서버 이름과 함께 프로젝트 이름인 "JSPLecture"가 출력된다.

 
사용자 삽입 이미지
 
AND

대규모의 프로젝트는 다수의 개발자가 참여하여 진행된다. 그러나 이런 경우 서로 동일한 소스를 동시에 수정하거나 삭제함으로써 개발에 종종 문제가 발생하곤 한다. 이 경우 CVS를 사용하면 이러한 문제를 해결할 수 있다. CVS는 "Concurrent Versions System"의 약자로 소스의 버전을 만들어 관리함으로써 소스의 백업과 동시 작업이 가능하도록 해주는 시스템이다. 이 CVS 시스템은 혼자 프로젝트를 진행할 경우에도 장소에 구애받지 않고 프로젝트를 진행할 수 있도록 한다.  이클립스에서는 프로젝트 진행과 관리를 위해 CVS를 지원한다.

이클립스에서 CVS를 활용하려면 우선 CVS 서버에 계정을 가지고 있어야 한다. 여기서는 CVS 서버를 설정하는 방법은 다루지 않고 이미 서버에 계정이 있다는 전제로 글을 진행하겠다. 이클립스에서 CVS를 이용한 프로젝트의 관리는 CVS 서버에 프로젝트 등록하는 단계, 등록된 프로젝트를 CVS 서버로부터 이클립스로 가져오는 단계, 자신이 수정한 내용을 서버에 적용하기 위한 단계 마지막으로 누군가에 의해 수정된 소스를 자신의 이클립스 프로젝트에 반영하기 위한 단계로 설명할 수 있다.

만약 학교에서 이클립스 실습시간에 배운 내용이나 부여된 과제물을 집이나 회사 또는 제3의 장소에서 계속적으로 진행하려고 한다면 어떻게 CVS를 적용시킬 수 있을까. 가장 먼저 이클립스 프로젝트를 CVS 서버에 등록해야 한다. 이는 이클립스 프로젝트 익스플로러의 메뉴 중 "Team" 항목의 서브메뉴인 "Shared Project" 항목을 통해 이루어진다. 이클립스 프로젝트의 등록은 최초 한번만 하면 된다. CVS 서버에 등록된 이클립스 프로젝트를 집이나 회사와 같은 다른 컴퓨터에서 불러오려면 역시 이클립스 "File" 메뉴에서 "New" -> "Project" 항목을 차례로 선택한 다음 "CVS"의 서브항목인 "Projects from CVS"를 통해 가져올 수 있다. 이렇게 CVS 서버와 동기화 된 이클립스 프로젝트는 "Update", "Commit"에 의해 버전을 관리할 수 있다. "Update"는 누군가에 의해 최근 변경된 프로젝트의 내용을 내가 작업하는 프로젝트에 반영하는 과정이고, "Commit"은 내가 작업하고 변경한 내용을 다른 사람들이 반영할 수 있도록 서버에 등록하는 과정이다.

사용자 삽입 이미지

CVS 처리 과정

 
그러면 이클립스 프로젝트를 CVS 서버에 등록하는 방법에 대해 살펴보자. 등록하려는 프로젝트는 "JSPLecture"이다. 우선 이 프로젝트를 등록하려면 프로젝트 익스플로러의 프로젝트 이름 "JPSLecture" 위에서 마우스 오른쪽 클릭을 한 후 "Team", "Shared Project..." 항목을 차례로 선택한다.

사용자 삽입 이미지

Shared Project


CVS 서버 접속에 필요한 계정정보를 입력받기 위한 "Enter Repository Location Information" 창이 뜨면 다음과 같은 내용의 정보를 입력한다. "Host"에는 CVS 서버의 도메인 이름이나 IP 주소를 입력하고, "Repository path"에는 서버에서 CVS 저장소를 위한 디렉터리 이름을 입력한다. "Repository path"는 서버에 따라 다르므로 관리자에게 문의하여 입력해야 한다. 그리고 CVS 서버에 주어진 자신의 아이디와 비밀번호를 "User"와 "Password"에 각각 입력한 뒤 "Next>" 버튼을 클릭한다. "Save password" 좌측의 체크박스를 선택하면 암호를 기억하여 다음부터 암호를 묻지 않는다.

 

사용자 삽입 이미지


"Enter Module Name" 창이 뜨면 "Use project name as module name"을 선택한다. 이는 서버에서 관리되는 프로젝트 이름이 이클립스 프로젝트 이름과 동일하게 관리되도록 한다. 그러나 만약 서버에 동일한 이름이 존재한다면 "Use specified module name" 항목을 선택한 후 서버에서 다른 이름으로 관리되도록 할 수 도 있다. 모듈이름을 결정했으면 "Next>" 버튼을 클릭한다.

사용자 삽입 이미지

Enter Module Name


"Shared Project Resource" 창과 "Commit" 창에서는 특별히 입력하거나 변경할 내용이 없으므로 "Next>" 버튼과 "Finish" 버튼을 차례로 클릭하여 프로젝트 등록을 진행한다.

 

사용자 삽입 이미지

 

사용자 삽입 이미지


프로젝트가 CVS 서버에 등록되는 "Committing resources" 창을 통해 진행 과정이 표시된다.

사용자 삽입 이미지

Committing resources


진행이 완료되면 이클립스 프로젝트 이름 옆에 CVS 서버 이름이 출력되어 해당 프로젝트가 CVS 서버와 동기화 되고 있음을 알린다.

 

사용자 삽입 이미지


AND

우리는 앞서 MySQL의 기본 사항에 대해 배울 때 "명령 프롬프트"를 통해 "mysql" 클라이언트 프로그램을 실행함으로써 데이터베이스 서버에 접속하고 몇몇 데이터 조작을 위한 명령을 실행하였다. 이 과정은 크게 네 가지 단계로 나누어 생각할 수 있다.

먼저 데이터베이스 서버로의 연결 단계이다. 이 단계는 "명령 프롬프트"에서 다음 명령을 실행하고 암호를 입력함으로써 이루어진다.

mysql  -u  jsp  -p

이 명령은  데이터베이스 사용자 "jsp"가 클라이언트 프로그램을 이용 서버에 연결 데이터 조작을 할 수 있도록 한다. 이 때 서버와의 연결을 위해 주어지는 정보는 세 가지다. 첫 째 사용자아이디, 둘 째 비밀번호, 그리고 데이터베이스 서버가 실행되고 있는 컴퓨터 정보다. 위 명령에서 컴퓨터 정보는 주어지지 않았지만 실제로는 "-h" 옵션 뒤에 도메인네임 또는 IP 주소와 같은 컴퓨터 이름을 줄 수 있으며 이 옵션이 생략되면 "-h localhost"가 주어진 것과 동일하다. 따라서 위 명령은

mysql  -u  jsp  -p  -h localhost

와 같다.

둘 째 데이터베이스 서버로의 연결이 완료되면 다음 명령을 이용 사용하고자 하는 데이터베이스를 선택해야 한다.

use  jsp ;


이 명령은 MySQL 서버가 관리하고 있는 데이터베이스 중 "jsp" 를 사용하겠다는 의미이다. 만약 데이터베이스를 선택하지 않고 쿼리를 실행할 때 많은 경우 데이터베이스가 선택되지 않았다는 오류 메세지를 출력한다.

데이터베이스를 선택한 후에는

SELECT, INSERT, DELETE, UPDATE, CREATE, DROP, ALTER
 

등과 같은 한 각종 SQL 명령을 실행 데이터를 조작한다.

마지막으로 원하는 데이터조작이 완료됐으면 데이터베이스 클라이언트와 서버 사이의 연결은 끊는다. 이 처럼 연결, 데이터베이스 선택, 쿼리실행, 연결종료 네 단계 과정이 하나의 주기로 이루어진다. JSP 프로그램에서도 이와 같이 네 단계의 과정을 통해 데이터베이스와의 연동이 이루어진다. 그러면 간단한 회원가입 폼과 프로그램을 통해 JSP와 데이터베이스를 연동하는 방법을 살펴보자.

아래 "MemberJoin.html"은 가입을 위해 회원정보를 입력하는 HTML 폼이다.

<!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 action="MemberJoin.jsp" method="post">
<table>
    <tr>
        <td>회원아이디</td>
        <td><input type="text" size="10" maxlength="16" name="userid"></td>
    </tr>
    <tr>
        <td>비밀번호</td>
        <td>
            <input type="password" size="10" maxlength="16" name="userpwd1">
            <input type="password" size="10" maxlength="16" name="userpwd2">
        </td>
    </tr>
    <tr>
        <td>이름</td>
        <td><input type="text" size="10" maxlength="20" name="username"></td>
    </tr>
    <tr>
        <td>주민등록번호</td>
        <td>
            <input type="text" size="6" maxlength="6" name="jumin1"> -
            <input type="password" size="7" maxlength="7" name="jumin2">
        </td>
    </tr>
    <tr>
        <td>&nbsp;</td>
        <td>
            <input type="submit" value="등록">
            <input type="reset" value="초기화">
        </td>
    </tr>
</table>
</form>
</body>
</html>

사용자 삽입 이미지

MemberView.html 실행결과


이 폼에서 회원 정보를 입력받는 창의 이름을 기억하자. 이 폼에 입력된 정보는 "등록" 버튼을 클릭하면 아래 "MemberJoin.jsp" 프로그램으로 전달한다. 그러면 "MemberJoin.jsp"는 데이서베이스 서버와 연결, 데이터베이스 선택의 단계를 거쳐 입력된 정보를 데이터베이스 테이블에 저장하기 위한 쿼리를 실행한 다음 데이터베이스 서버와의 연결을 종료하면 된다. 그러면 각 단계별로 JSP에서 어떻게 처리하는지 살펴보자.

<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<%@ page import = "java.sql.*" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<%

request.setCharacterEncoding("euc-kr");

String userId   = request.getParameter("userid");
String userPwd1 = request.getParameter("userpwd1");
String userPwd2 = request.getParameter("userpwd2");
String userName = request.getParameter("username");
String jumin1   = request.getParameter("jumin1");
String jumin2   = request.getParameter("jumin2");

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

Connection conn = null;
Statement  stmt = null;

String url = "jdbc:mysql://localhost:3306/jsp?user=jsp&password=your_password";
String sql = "INSERT INTO members VALUES ('"
             + userId +"', md5('"+ userPwd1 +"'),'"+ userName +"','"+ jumin1 +"',md5('"+ jumin2 +"'))";
System.out.print(sql);
conn = DriverManager.getConnection(url);
stmt = conn.createStatement();
stmt.execute(sql);
stmt.close();
conn.close();
%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
<title>Insert title here</title>
</head>
<body>
<table>
    <tr>
        <td>회원아이디</td>
        <td><%= userId %></td>
    </tr>
    <tr>
        <td>비밀번호</td>
        <td><%= userPwd1 %></td>
    </tr>
    <tr>
        <td>이름</td>
        <td><%= userName %></td>
    </tr>
    <tr>
        <td>주민등록번호</td>
        <td><%= jumin1 %>-<%= jumin2 %></td>
    </tr>
</table>
</body>
</html>

먼저 데이터베이스와의 연동을 위해 JDBC 드라이버를 로딩해야 한다. 드라이버의 로딩은 "Class.forName" 메소드를 이용한다. 프로그램에서 보면

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

부분이 드라이버를 로딩하는 부분이다. 이 메소드를 실행하기 위해 필요한 파라메터는 값은 드라이버를 다운로드 할 때 매뉴얼에 함께 제공되며, MySQL 드라이버의 경우 "com.mysql.jdbc.Driver" 이다. 드라이버가 성공적으로 로딩되어야 JSP와 데이터베이스와 연동 프로그램을 작성할 수 있다.

드라이버가 로딩 됐으면 "DriverManager.getConnection" 메소드를 이용 JSP와 데이터베이스 서버와의 연결을 실행한다. 이 메소드를 실행하기 위해 필요한 파라메터 역시 드라이버 배포시 매뉴얼에 함께 제공되며 드라이버 별로 고유한 패턴을 가지는데 MySQL의 경우 다음과 같은 형식을 가진다.

"jdbc:mysql://hostname:3306/databasename?user=userid&password=userpassword"


이를 커넥션스트링이라 하는데 프로그램에서 사용된 커넥션스트링

"jdbc:mysql://localhost:3306/jsp?user=jsp&password=your_password"


를 살펴보면 "localhost"에 접속하라는 의미이며, 사용자 아이디는 "jsp", 비밀번호는 "your_password" 그리고 사용하려는 데이터베이스는 "jsp" 임을 알 수 있다. "DriverManager.getConnection" 메소드에 의해 연결된 결과는 Connection 클래스 객체를 생성한 후 저장한다.

conn = DriverManager.getConnection(url);


데이터베이스 선택과 함께 서버와의 연결이 이루어지면 쿼리실행 단계에 들어간다. 이 프로그램은 회원가입을 위한 프로그램이므로 만약 입력된 회원정보가 입력 창에

hong
1234
12345
Hong Gil Dong
123456
7654321

순으로 입력 됐다면 다음과 같은 SQL을 만들어 실행하여 회원정보를 테이블에 저장해야 한다.

INSERT INTO members VALUES
('hong', md5('1234'), 'Hong Gil Dong', '123456', md5('7654321'))

위 SQL 에서 md5('1234')와 md5('7654321')은 '1234', '7654321'을 암호화 알고리즘인 MD5 알고리즘을 사용하여 암호화 하라는 의미이다. 그러므로 members 테이블에 비밀번호와 주민등록번호 뒷 자리는 암호화되어 '1234', '7654321'이 아닌 전혀 다른 값으로 저장된다. 프로그램에서 회원 정보는 "request.getParameter" 메소드를 이용 전달받으며,

"INSERT INTO members VALUES ('"
+ userId +"', md5('"+ userPwd1 +"'),'"+ userName +"','"+ jumin1 +"',md5('"+ jumin2 +"'))"

부분이 회원정보를 테이블에 저장하기위한 "INSERT" 문을 만드는 부분이다. JSP 프로그램에서 데이터 조작을 위한 SQL 문을 만든 후에는 Connection 객체의 메소드 "createStatement"를 이용 Statement 객체를 생성한 후 이 객체의 "execute" 메소드를 이용 쿼리를 실행한다.

stmt = conn.createStatement();
stmt.execute(sql);

쿼리 실행 후 모든 데이터 조작이 마무리되면 Statment 객체와 Connection 객체의 "close" 메소드를 이용 할당된 자원을 돌려주고 연결을 끊는다.

stmt.close();
conn.close();

 
사용자 삽입 이미지

MemberJoin.jsp 실행결과


다음 프로그램 "MemberView.jsp"는 "members" 테이블에 저장된 레코드를 출력하는 JSP 프로그램이다. 테이블 검색을 위해서 사용하는 SQL은 "SELECT" 문이다. "SELECT" 문은 "INSERT", "DELETE","UPDATE" 문과는 달리 처리해야 하는 부분이 더 필요하다. "SELECT" 문을 실핼할 때도 서버연결, 데이터베이스 선택, 쿼리실행, 연결끊기의 네 단계가 필요하다. 그러나 "SELECT" 문의 경우 검색된 결과를 사용자에게 출력해야 하기 때문에 쿼리실행 후 검색된 레코드를 반복문을 통해 추출하고 출력하는 부분이 추가된다.

<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<%@ page import = "java.sql.*" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<%
Class.forName("com.mysql.jdbc.Driver");

Connection conn = null;
Statement  stmt = null;
ResultSet  rs = null;

String url = "jdbc:mysql://localhost:3306/jsp?user=jsp&password=your_password";
String sql = "SELECT userid, username, jumin1 FROM members";
conn = DriverManager.getConnection(url);
stmt = conn.createStatement();

rs = stmt.executeQuery(sql);
%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
<title>Insert title here</title>
</head>
<body>
<%
while (rs.next()) {
%>
아이디 : <%= rs.getString("userid") %><br />
이름 : <%= rs.getString("username") %><br />
주민등록 : <%= rs.getString("jumin1") %><br />
<%
}
%>
</body>
</html>
<%
stmt.close();
conn.close();
%>

위 프로그램을 살펴보면 ResultSet 객체 rs를 선언하고 있다. 이 객체는 쿼리실행 단계에서 그 결과를 저장한다. 이 때 "SELECT" 문의 실행을 위해 stmt.execute가 아닌 stmt.executeQuery 메소드를 사용하고 있음에 주목하자. 저장된 결과는 ResultSet 형으로 검색된 모든 레코드를 가지고 있다. 여기서 각각의 레코드로 접근을 하기 위해서는 "next" 메소드를 이용한다. "next" 메소드가 호출되면 현 레코드에서 다음 레코드로 커서를 이동한다. 커서란 레코드를 가리키는 포인터를 의미한다. 만약 마지막 레코드인 경우 false를 돌려준다. 그러므로 반복문을 이용하면 모든 레코드를 읽을 수 있다.

현재 레코드에서 각 필드값을 얻기 위해서는 "rs.getString" 메소드를 사용한다. 파라메터로는 해당 테이블의 필드명을 준다. 다음은 "MemberView.jsp"를 실행한 결과이다.

사용자 삽입 이미지

MemberView.jsp 실행결과


'프로그래밍 > JSP' 카테고리의 다른 글

JDBC 드라이버와 한글 깨짐 해결  (0) 2009.06.09
NetBeans에서 JSP 개발하기  (0) 2009.06.07
웹프로그램의 개발 목적  (0) 2009.03.24
JSP에서 폼 데이터 처리  (0) 2009.03.23
쿼리스트링(Query String)  (2) 2009.03.18
AND