ajax로 검색한 결과 :: 시소커뮤니티[SSISO Community]
 
SSISO 카페 SSISO Source SSISO 구직 SSISO 쇼핑몰 SSISO 맛집
추천검색어 : JUnit   Log4j   ajax   spring   struts   struts-config.xml   Synchronized   책정보   Ajax 마스터하기   우측부분

회원가입 I 비밀번호 찾기


SSISO Community검색
SSISO Community메뉴
[카페목록보기]
[블로그등록하기]  
[블로그리스트]  
SSISO Community카페
블로그 카테고리
정치 경제
문화 칼럼
비디오게임 스포츠
핫이슈 TV
포토 온라인게임
PC게임 에뮬게임
라이프 사람들
유머 만화애니
방송 1
1 1
1 1
1 1
1 1
1

ajax로 검색한 결과
등록일:2008-03-14 11:18:29
작성자:
제목:Eclipse와 CVS를 이용하여 팀 작업하기


출처 공부 지질이도 안하는 넘의 공간 | 귀차니즘
원문 http://blog.naver.com/mickey109/60004903796
 

Eclipse와 CVS를 이용하여 팀 작업하기

Summary :
지금까지 진행한 Eclipse강좌의 대부분은 Eclipse IDE에 플러그인을 설치하는 방법에 대하여 살펴보았다. 이번 강좌에서는 Eclipse에 설치되어 있는 CVS를 이용하여 팀작업과 소스관리를 어떻게 할 수 있는지에 대하여 살펴보도록 하겠다. CVS의 필요성에 대해서는 많은 개발자들이 알고 있지만 정작 Eclipse내에서 CVS의 사용방법을 잘 몰라 사용하지 못하는 개발자들이 많은 것 같다. 따라서 이번 강좌에서는 Eclipse IDE기반하에서 CVS를 이용하는 방법에 대하여 살펴보도록 하겠다.

  Requirements

CVS는 소스의 버전관리가 가능하도록 해주는 잘 알려진 오픈 소스중의 하나이다. CVS외에도 많은 버전관리 시스템이 존재하고 있다. 필자는 그냥 편하게 버전관리를 지원하는 툴이라고 말하는데 좀 더 유식한 사람들은 소스를 형상관리 한다는 말을 사용하곤 한다. 하지만 필자가 형상 관리에 대하여 전문적으로 공부하거나 가지고 있는 지식이 없기 때문에 필자가 처음부터 사용해오던 말인 버전 관리 시스템이라는 말로 강좌를 진행하려고 한다. 물론 버전 관리 이외에도 더 많은 기능들을 제공할 것이라고 생각한다. 하지만 아직까지 필자가 주로 사용하고 있는 부분이 버전관리의 기능이 주된 기능이고, 이 기능만으로도 버전관리 시스템이 왜 필요한지를 뼈저리게 느끼고 있다.

프로그래밍 초기에는 한 명의 개발자가 하나의 솔루션이나 애플리케이션을 개발하는 것이 다반사였다. 그러나 점차 시스템이 커지면서 하나의 프로젝트를 진행하기 위하여 여러명의 개발자가 공동 개발하게 되었다. 최근에는 거의 대부분의 프로젝트가 3-4명에서부터 수십명의 개발자들이 관여하고 있다. 이처럼 수 많은 개발자들이 하나의 프로젝트에 관여하다 보니 소스를 관리하고 통합하는데 너무나 많은 시간을 소요하게 되었다.

많 은 개발자들이 프로젝트를 진행하면서 다음과 같은 경험을 한적이 있을 것으로 생각한다. 분명 어제 발생했던 버그를 고생고생하면서 수정한 다음 서버에 반영하였다. 그런데 다음날 체크리스트에 똑같은 버그가 그대로 남아 있다. 확인해본 결과 다른 개발자가 자신이 수정하기 전 소스를 수정한 다음 덮어씌워 버린 경우가 종종 있을 것이다. 처음에는 "뭐 나도 가끔 그러는데..", "누구나 실수는 할 수 있지.." 하면서 넘어간다. 그러나 그 횟수가 증가하면서 점점 개발자간에 짜증이 늘어나게 되며, 만약 되던 잘 실행되던 소스가 문제가 생길경우 자신의 소스문제라고 생각하기보다는 누군가 내 소스를 건드리지 않았을까하는 의심부터 하게 된다. 또한, 개발했던 소스를 또 다시 개발하면서 발생하는 의욕 저하와 적지 않은 시간을 중복투자해야 한다.

이처럼 하나의 프로젝트에 여러명의 개발자가 관여하게 되면서 소스관리와 소스통합은 프로젝트의 성패에 중요한 한 요인이 되고 있다. 필자는 버전 관리 시스템을 적용한 프로젝트와 그렇지 않은 프로젝트를 모두 경험했는데, 적용한 프로젝트와 그렇지 않은 프로젝트 간에 상당한 차이점을 느낄 수 있었다. 아무리 작은 프로젝트이더라도 버전관리 시스템을 적용하지 않았을 경우 소스의 유실로 인해 발생하는 문제가 예상보다 컸다. 개발자간의 짜증 또한 증가할 수 밖에 없었으며, 그로 인해 발생하는 시간낭비와 개발자의 의욕저하는 이로 말할 수 없었다.

따라서 필자는 프로젝트에서 버전관리 시스템의 중요성을 느끼고 아직 이 시스템을 경험하지 못한 많은 개발자들이 이 시스템을 이용했으면 하는 바람으로 이 강좌를 준비했다. 버전 관리 시스템은 오픈 소스를 많이 알려져 있는 CVS를 선택했으며, 개발툴은 Eclipse를 이용하였다. CVS서버를 설치하고 Eclipse IDE와 연동하는 방법에 대해서는 이전 강좌를 참고하기 바란다.

이 강좌에서는 Eclipse 기반하에서 CVS 서버를 이용하여 어떻게 효율적으로 팀작업을 진행할 수 있는지에 대하여 살펴보도록 하겠다. CVS를 사용할 경우 발생하는 생소한 용어들과 다른 개발자들과의 소스 충돌이 발생할 경우 어떻게 해결할 수 있는지에 대하여 살펴보도록 하겠다.

  CVS 테스트 환경 구축하기


CVS는 팀작업이 가능하도록 하기 위하여 버전관리 시스템이다. 따라서 CVS작업을 테스트하기 위해서는 한명의 개발자만으로는 테스트하기 힘들다. 만약 이 강좌를 팀 내에서 테스트한다면 하나의 CVS서버에 다른 계정을 가지는 여러명의 개발자들이 접속하여 테스트를 진행할 수 있다. 또한 그처럼 테스트 해야 소스의 충돌과 같은 문제가 발생할 경우 어떻게 해결할 수 있는지에 대해서도 테스트가 가능하다. 그러나 자신 혼자 테스트할 수 밖에 없는 환경이라도 너무 걱정하지 마라. 그 또한 테스트가 가능하다.

지금 구축하는 환경은 CVS서버를 설치하고 테스트할 개발자가 자신 혼자일 경우라고 가정하고 환경을 세팅하도록 하겠다. 만약 팀 내에서 테스트한다면 지금 강좌에서 하나의 컴에 설치하는 환경을 각각의 개발자들이 하나의 역할을 맡아서 진행하면 된다.

CVS서버는 CVSNT서버가 설치되어 있다는 가정하에서 진행하도록 하겠다. CVSNT 서버의 콘솔 화면을 띄운다음 Repositories패스를 다음 그림과 같이 설정한다. 즉 현재 Repository로 설정되어 있는 디렉토리를 D:\Repository\CICRepository\Project로 사용하고자 한다면 Valid Repository Roots에 절대 경로를 추가해준다. 만약 Repository Prefix기능을 이용할 경우 Eclipse의 모든 기능을 이용할 수 없게 된다. 그러나 Jbuilder와 같은 IDE에서는 Repository Prefix기능을 이용해도 큰 문제가 발생하지 않는 것을 확인할 수 있었다. CVS의 Repository Path정보를 위와 같이 설정하고 CVSNT 서버를 시작한다.

CVSNT 서버 Repositories 화면  : CVSNT 서버 Repositories 화면에서 Valid Repository Roots 값을 D:\Repository\CICRepository\Project로 설정하는 화면


다음은 OS에 두명의 사용자를 추가한다. 이 강좌에서는 cvsuser1과 cvsuser2를 추가하여 진행하도록 하겠다.

Eclipse의 CVS Repositories로 이동하여 cvsuser1과 cvsuser2의 사용자 계정으로 각각 CVS 서버로 Repository 연결을 한다.

새로운 CVS Repositories 연결화면  : cvsuser1 계정으로 CVSNT서버에 새로운 Repository를 연결하는 화면

새로운 CVS Repositories 연결화면  : cvsuser2 계정으로 CVSNT서버에 새로운 Repository를 연결하는 화면



cvsuser1과 cvsuser2로 CVS Repository연결이 정상적으로 진행되었다면 다음과 같은 화면을 볼 수 있다.

CVS Repositories 화면  : cvsuser1과 cvsuser2의 사용자로 CVS Repository에 연결되었을 때의 화면


이처럼 cvsuser1과 cvsuser2 계정으로 CVS Repository 연결을 진행한 다음 각각의 계정을 위한 프로젝트를 생성한다. 이 강좌에서는 cvsuser1project와 cvsuser2project라는 이름으로 두개의 java 프로젝트를 생성하겠다.

Navigator화면  : cvsuser1과 cvsuser2 계정 각각을 위해 cvsuser1project와 cvsuser2project프로젝트를 생성한 화면


cvsuser1project프로젝트를 cvsuser1계정으로 연결한 CVS Repository와 연결시킨다. 연결시키는 과정은 먼저 cvsuser1project프로젝트에서 오른쪽 클릭 >> Team >> Share Project를 선택한 다음 앞에서 생성한 CVS Repository중 cvsuser1계정으로 연결한 Repository를 선택한다.

프로젝트를 CVS 서버와 연결하는 화면  : cvsuser1project프로젝트를 cvsuser1 계정으로 생성한 CVS Repository와 연결시키는 화면


CVS와의 연결시 사용할 이름을 지정한다. 이 강좌에서는 CVSTEST라는 이름을 사용하겠다.

CVS 모듈 이름 설정화면  : cvsuser1project프로젝트를 CVS와 연결시 모듈이름을 CVSTEST로 지정하는 화면


cvsuser1project프로젝트를 CVS와 연결하는 과정이 완료되면 같은 방법으로 cvsuser2project프로젝트를 cvsuser2 계정으로 생성한 CVS Repository와 연결한다.

프로젝트를 CVS 서버와 연결하는 화면  : cvsuser2project프로젝트를 cvsuser2 계정으로 생성한 CVS Repository와 연결시키는 화면


CVS와의 연결시 사용할 이름을 지정한다. 이 강좌에서는 CVSTEST라는 이름을 사용하겠다.

CVS 모듈 이름 설정화면  : cvsuser2project프로젝트를 CVS와 연결시 모듈이름을 CVSTEST로 지정하는 화면


이상으로 Eclipse 기반하에서 CVS 서버를 사용하기 위한 환경구축을 모두 마쳤다. 다음 절에서는 cvsusr1과 cvsuser2 계정으로 새로운 소스를 생성하여 CVS에 추가하고 CVS에 추가한 소스를 로컬 프로젝트로 가져오는 방법에 대하여 살펴보도록 하겠다.

  CVS에 새로운 소스 추가하기


CVS와의 테스트에서 처음으로 진행할 부분은 로컬에서 생성한 소스를 CVS 서버에 추가하는 과정이다. 먼저 cvsuser1project프로젝트의 src폴더 에 HelloWorld1.java와 HelloWorld2.java를 생성한다.

package net.javajigi;

/**
* @author Administrator
*/
public class HelloWorld1 {

}

HelloWorld1.java  : HelloWorld1.java

package net.javajigi;

/**
* @author Administrator
*/
public class HelloWorld2 {

}

HelloWorld2.java  : HelloWorld2.java


이와 같이 로컬에 처음으로 생성된 소스파일은 로컬에만 존재하게 된다. 이처럼 로컬에 존재하는 파일을 CVS서버에 추가하기 위해서는 CVS의 Add기능을 이용하면 된다. 이를 실행하기 위해서는 src폴더에서 오른쪽 클릭 >> team >> add to version control을 이용하여 추가할 수 있다.

CVS의 Add to version control 메뉴  : cvsuser1project프로젝트에 생성한 소스를 CVS에 추가하고 있는 화면


add to version control 기능을 이용하여 CVS에 소스를 추가했다고 해서 CVS에 새로운 버전의 소스가 생성되는 것은 아니다. CVS 서버에 최종적으로 새로운 버전을 생성하기 위해서는 CVS의 commit기능을 이용해야 한다. CVS의 commit은 commit하고자 하는 소스를 선택한 다음 오른쪽 클릭 >> team >> commit 명령어를 실행하여 진행할 수 있다.

CVS의 commit 메뉴  : cvsuser1project프로젝트에 생성한 소스를 CVS에 Commit하고 있는 화면

CVS의 commit시 부연 설명 추가화면  : cvsuser1project프로젝트에 생성한 소스를 CVS에 Commit할 때 부연 설명을 추가할 수 있는 화면


CVS에 소스가 정상적으로 추가되었는지를 확인하고 싶다면 HelloWorld.java파일 오른쪽 클릭 >> team >> Show in Resource History 명령을 실행하여 확인할 수 있다. 다음 화면과 같이 Revision 1.1을 가지는 소스가 Repository History에 추가되어 있는 것을 확인할 수 있다.

CVS의 Show in Resource History을 실행한 화면  : cvsuser1project프로젝트에 생성한 HelloWorld.java소스가 CVS에 정상적으로 추가되었는지를 확인하기 위한 소스.


이상으로 cvsuser1project프로젝트에서 생성한 소스를 CVS에 추가하는 과정을 마쳤다. cvsuser2project프로젝트도 cvsuser1project프로젝트와 마찬가지로 과정으로 HelloWorld3.java, HelloWorld4.java를 추가한 다음 CVS에 추가한다. 이렇게 추가된 소스는 다음 절에서 각각의 프로젝트로 가져올 수 있다.

  CVS에 추가되어 있는 소스 가져오기


다음은 각각의 개발자들에 의하여 추가된 소스를 자신의 로컬로 가져오는 방법이다. 자신의 로컬에서 새로 생성된 소스를 추가하는 것 또한 중요하지만 남이 개발해 놓은 소스를 가져오는 것 또한 중요하다. 앞 절에서 추가한 소스들을 다시한번 살펴보면 cvsuser1project프로젝트에서 HelloWorld1.java와 HelloWorld2.java를 추가하였고, cvsuser2project프로젝트에서 HelloWorld3.java와 HelloWorld4.java 소스를 추가하였다.

cvsuser1은 HelloWorld1.java와 HelloWorld2.java 두개의 소스에 자신이 구현하고자하는 소스들을 구현하느라 몇시간의 시간이 흘러 버렸다. cvsuser1은 CVS에 새로운 소스가 있는지 확인한다음, 만약 새로운 소스가 추가되었다면 새로 추가된 소스를 자신의 프로젝트로 가져오고 싶다.

이와 같이 다른 개발자가 추가한 소스를 자신의 로컬로 가져오기 위해서는 먼저 CVS와 자신의 로컬 프로젝트를 동기화할 필요가 있다. 이와 같이 프로젝트와 CVS를 동기화하는 방법은 동기화하고자하는 디렉토리에서 오른쪽 클릭 >> team >> Synchronize with Repository 명령을 실행한다.

CVS의 Synchronize with Repository 메뉴  : cvsuser1project프로젝트의 소스 폴더를 CVS와 동기화하는 화면


Synchronize with Repository 명령을 실행하여 CVS와 동기화를 진행하면 현재 프로젝트에 있는 소스와 CVS 서버 사이의 소스에서 동기화되어 있지 않은 소스들의 정보를 다음 화면과 같이 Synchorinze 화면에 제공하게 된다.

CVS와 동기화를 진행한 후 Synchronize화면  : cvsuser1project프로젝트의 소스 폴더를 CVS와 동기화한 후 동기화 정보를 제공하는 Synchronize 화면


cvsuser1project프로젝트의 소스폴더에서 동기화를 하면 cvsuser2project프로젝트에서 추가한 HelloWorld3.java와 HelloWorld4.java 소스가 Synchronize의 Incoming Mode에서 나타나는 것을 확인할 수 있다. 이것의 의미는 동기화한 결과 CVS에는 HelloWorld3.java와 HelloWorld4.java 소스가 추가되었기 때문에 자신의 로컬 디렉토리에 추가하라는 의미이다.
따라서 HelloWorld3.java와 HelloWorld4.java 소스를 선택한 다음 오른쪽 클릭 >> Update From Repository 명령을 이용하여 CVS에 추가되어 있는 두개의 소스를 로컬로 가져올 수 있다. 이와 같이 CVS서버에 있는 소스를 로컬로 가져오는 것을 Checkout이라고 한다.

Synchronize화면에서 Update From Repository 명령  : CVS와 동기화한 후 동기화 정보를 제공하는 Synchronize 화면에서 추가된 소스를 로컬로 Checkout하는 화면

CVS에서 Checkout한 다음 cvsuser1project프로젝트  : CVS의 소스를 Checkout한 다음 HelloWorld3.java와 HelloWorld4.java파일을 cvsuser1project프로젝트에 추가되어 있는 것을 확인할 수 있는 화면.


이상으로 cvsuser2project프로젝트에서 추가한 소스를 cvsuser1project프로젝트에서 Checkout하는 과정에 대하여 살펴보았다. cvsuser2project 프로젝트에서도 이상의 과정과 같은 방법으로 cvsuser1project 프로젝트에서 추가한 HelloWorld1.java와 HelloWorld2.java파일을 Checkout해보기 바란다.

다음 절에서는 기존에 존재하는 소스를 수정한 다음 CVS에 반영하는 방법에 대하여 살펴보도록 하겠다.

  CVS에 수정된 소스 반영하기


cvsuser1과 cvsuser2 계정을 가진 개발자는 자신이 생성한 소스파일을 이용하여 프로그램을 개발하였다. 개발을 진행하던 중 하나의 모듈이 완성되어 CVS 서버에 반영하고자 한다. 이처럼 로컬에서 진행하던 작업중 한 파트가 완료하게 되면 대부분의 개발자들은 CVS서버에 완료된 부분을 추가하게 된다. 이처럼 수정된 소스를 CVS서버에 반영하는 방법에 대하여 살펴보도록 하겠다.

먼저 cvsuser1 계정을 가진 개발자는 HelloWorld1.java와 HelloWorld2.java 소스를 다음과 같이 수정하였다.

package net.javajigi;

/**
* @author Administrator
*/
public class HelloWorld1 {

public String helloWorld1(String name){
return name + " Hello World";
}
}

HelloWorld1.java  : helloWorld1() 메써드를 추가한 HelloWorld1.java 소스파일

package net.javajigi;

/**
* @author Administrator
*/
public class HelloWorld2 {

public String helloWorld2(String name){
return name + " Hello World";
}
}

HelloWorld2.java  : helloWorld2() 메써드를 추가한 HelloWorld2.java 소스파일


예제의 단순화를 위하여 각각의 클래스에 helloWorld1(), helloWorld2() 메써드를 하나씩 추가하였다. 이처럼 자신이 작업하고자하는 소스의 개발이 완료되었다고 가정하자. 다음은 CVS서버에 지금까지 개발한 소스를 반영하고자 한다. 이를 위한 첫번째 단계는 로컬 프로젝트와 CVS서버를 동기화하는 것이다.

앞 절에서 했던 방법과 같이 src폴더에서 오른쪽 클릭 >> team >> Synchronize with Repository 명령을 이용하여 동기화를 진행한다. 이 명령을 실행하면 Synchronize 화면에 Outgoing Mode가 표시되면서 HelloWorld1.java, HelloWorld2.java 소스가 리스트에 보이기 된다. 이는 cvsuser1project 프로젝트와 CVS 서버의 동기화 결과 위 두개의 파일이 불일치하고 있으며, 로컬의 소스가 수정되었다는 것을 보여주고 있는 것이다.

동기화 결과 Synchronize화면  : CVS와 동기화한 후 동기화 정보를 제공하는 Synchronize 화면에서 수정된 소스를 보여주고 있는 화면


이처럼 Synchronize 화면의 Outgoing Mode에 리스트되는 파일들은 로컬에서 변경되었기 때문에 CVS서버에 수정된 내용을 반영해주어야 한다는 것을 의미한다. HelloWorld1.java, HelloWorld2.java 소스를 CVS서버에 반영하기 위한 방법은 먼저 이 두개의 파일을 선택한 다음 오른쪽 클릭(해당 소스의 상위 디렉토리인 javajigi 디렉토리에서 오른쪽 클릭도 가능) >> commit 명령을 실행한다.

Synchronize화면에서 commit 명령  : CVS와 동기화한 후 동기화 정보를 제공하는 Synchronize 화면에서 commit 명령을 실행하는 화면


commit 명령을 실행하면 CVS에 새로운 버전의 소스가 생성된다. 처음 소스가 생성되었을 때 1.1버전이라면 위와 같이 소스를 수정한 다음 commit 명령을 실행 후 1.2 버전을 가지는 소스가 생성된다.

Show in Resource History 명령을 실행했을 때의 화면  : HelloWorld1.java파일에 대하여 Resource History를 확인했을 때 1.2 버전까지 생성되었음을 확인할 수 있는 화면


cvsuser2project 프로젝트의 HelloWorld3.java와 HelloWorld4.java 소스에도 위와 같이 새로운 메써드를 추가한 다음 commit해 보기 바란다. 각각의 프로젝트에서 commit을 진행한 다음 동기화를 통하여 수정된 소스들을 다시 Check out해보기 바란다.

지금은 CVS를 어떻게 사용하는지 익히는 과정이기 때문에 가능한 여러번 각각의 기능을 계속해서 사용해보는 것이 중요하다. 따라서 기회가 생길 때마다 동기화를 하고 각각의 소스를 동기화해보기 바란다.

다음 절에서는 여러명의 개발자가 같은 소스를 수정했을 경우 발생하는 소스 충돌을 어떻게 해결하는지에 대하여 살펴보도록 하겠다.

  소스 충돌이 발생할 경우 해결하는 방법


버전 관리 시스템을 사용하다 보면 종종 발생하는 문제가 같은 소스를 두명 이상의 개발자가 동시에 수정했을 때의 충돌 문제이다. 사실 버전 관리 시스템을 사용할 때 가장 큰 이슈가 되는 부분이고 개발자들간에 약속 및 규칙이 있어야 하는 부분이다. 따라서 프로젝트를 시작할 때 CVS 소스 충돌시 어떻게 해결할지에 대한 규칙을 정해야 한다.

프로젝트를 진행하다보면 같은 소스를 2명 이상의 개발자가 동시에 개발하는 경우가 종종 발생하게 된다. 이럴 경우 각각의 개발자가 수정한 소스가 충돌을 일으킬 수 있다.

이 강좌에서는 cvsuser1과 cvsuser2가 HelloWorld1.java를 동시에 개발한다는 가정하에서 진행하도록 하겠다. 먼저 각각의 개발자가 개발한 소스는 다음과 같다.

package net.javajigi;

/**
* @author Administrator
*/
public class HelloWorld1 {
private String name = null;

public String helloWorld1(String name){
this.name = name;

return name + " Hello World";
}

/**
* @return
*/
public String getName() {
return name;
}

/**
* @param string
*/
public void setName(String string) {
name = string;
}
}

cvsuser1 개발자가 수정한 HelloWorld1.java  : cvsuser1 개발자가 수정한 HelloWorld1.java 소스파일. name property를 추가하고 setter와 getter를 생성.


위 소스와 같이 수정한 다음 CVS서버에 commit한다.

cvsuser2 개발자는 자신이 원하는 방향으로 HelloWorld1.java 소스를 수정한 다음 CVS서버와 동기화를 진행한다. cvsuser2 개발자가 수정한 소스는 다음과 같다.

package net.javajigi;

/**
* @author Administrator
*/
public class HelloWorld1 {
private String address = null;

public HelloWorld1(String address){
this.address = address;
}

public String helloWorld1(String name){
return name + " Hello World";
}
/**
* @return
*/
public String getAddress() {
return address;
}

/**
* @param string
*/
public void setAddress(String string) {
address = string;
}
}


cvsuser2 개발자가 수정한 HelloWorld1.java  : cvsuser2 개발자가 수정한 HelloWorld1.java 소스파일. address property를 추가하고 setter와 getter를 생성. 생성자를 통해 address정보를 받는다.


cvsuser2는 위와 같이 소스를 수정하였다. cvsuser1 개발한 소스와 완전히 다른 방향으로 소스를 수정하였다. cvsuser1은 자신이 개발한 소스를 이미 commit하여 cvs 서버에 반영되어 있다. 이처럼 두명의 개발자가 하나의 소스에 대하여 동시에 작업을 진행할 경우 소스의 충돌이 발생하게 된다.

위와 같이 소스를 수정한 다음 cvsuser2project 프로젝트의 HelloWorld1.java를 CVS 서버와 동기화를 한다. 동기화를 하게 되면 아래 화면과 같은 붉은 색의 양쪽 화살표가 생기면서 CVS서버의 소스와 로컬 소스에서 충돌이 발생했음을 표시해 준다.

동기화 결과 Synchronize화면  : CVS와 동기화한 후 동기화 정보를 제공하는 Synchronize 화면에서 충돌이 난 소스를 보여주고 있는 화면


이와 같이 충돌이 발생하면 CVS 서버의 소스와 로컬 소스를 비교할 필요가 있다. Eclipse에서는 이와 같이 충돌이 발생했을 경우를 위해 Java Source Compare Editor를 제공하고 있다. Synchronize화면에서 HelloWorld1.java를 선택한 후 Double Click 하면 Synchronize 화면 하단에 CVS서버와 로컬 파일 중 서로 불일치하는 부분을 표시해 준다.

Java Source Compare Editor 화면  : Synchronize 화면에서 HelloWorld1.java파일을 Double Click할 경우 CVS서버와 로컬 파일에서 불일치하는 부분을 표시해주고 있는 화면


이처럼 소스의 충돌이 발생했을 때 cvsuser2 개발자가 임의적으로 자신의 소스를 commit하게 되면 cvsuser1이 개발한 소스는 없어지게 된다. 이 경우에는 먼저 cvsuser1 개발자에게 소스의 충돌이 발생했음을 공지한 다음 cvsuser1 개발자와 협조하여 소스를 유지해야 할 부분과 삭제해도 무방한 부분을 찾아야 한다. 그와 같이 CVS 서버의 소스와 로컬 소스의 통합 작업이 완료된 다음 commit작업을 진행해야 한다.

이 강좌의 HelloWorld1.java파일의 충돌 문제는 cvsuser1과 협의한 결과 cvsuser1이 개발한 모든 소스가 반영되어야 한다고 협조가 이루어 졌다. 이처럼 CVS 서버에 있는 소스를 모두 유지하고 싶을 경우 Java Source Compare Editor를 이용하여 쉽게 통합할 수 있다. Java Source Compare Editor를 보면 소스의 충돌이 발생하는 부분의 소스에 대하여 CVS 서버에서 로컬로 복사할 수 있도록 기능을 제공하고 있다.

Java Source Compare Editor에서 통합한 후의 결과 화면  : Java Source Compare Editor에서 CVS 서버의 HelloWorld1.java소스를 로컬 소스와 통합 한 후의 결과 화면


이처럼 소스의 통합이 완료된 다음 commit을 진행할 수 있다. 충돌이 난 소스에 대한 commit 작업은 Synchronize화면에서 HelloWorld1.java 소스파일 오른쪽 클릭 >> override and commit 명령을 이용하여 실행할 수 있다.

소스 통합 후 commit하는 화면  : Java Source Compare Editor에서 HelloWorld1.java 소스의 통합을 완료한 다음 CVS서버에 commit을 실행하는 화면


위 화면을 보면 override and commit외에 override and update 명령이 있는 것을 볼 수 있다. 이 명령을 실행하면 로컬에 통합된 소스가 CVS서버에 반영되는 것이 아니라 CVS 서버에 있는 소스가 Checkout 되면서 로컬 소스가 Update 되는 기능이다. 따라서 소스 충돌이 발생할 경우 개발자들이 원하는 작업을 다양한 방법으로 진행할 수 있다.
따라서 소스의 충돌이 발생했을 경우에는 마지막으로 commit개발자가 누구인지를 파악한 다음 해당 개발자와 업무 협조를 하는 것이 가장 좋은 방법이다. 이와 같은 규칙을 지키지 않을 경우 다른 개발자가 개발한 소스를 overwrite할 수 있는 가능성은 존재할 수 밖에 없다. 그러나 CVS의 장점은 버전관리가 된다는 것이다. 따라서 소스의 버전이 증가하면서 누구에 의해 소스가 overwrite되었는지를 찾는 것은 정말 쉬운 일이다. 따라서 남의 소스를 수정해 놓고 오리발을 내밀기는 힘들 것이다. 그러므로 소스의 충돌이 발생했을 때는 항상 해당 개발자와 협조하는 습관을 들이는 것이 좋은 개발 습관이다.

위에서 생성한 다른 소스파일을 이용하여 충돌이 발생하는 다양한 경우를 만들어보고, 해결해보는 연습을 진행해보기 바란다. 소스의 충돌에 대해서는 다양한 경우가 발생할 수 있기 때문에 충분한 연습을 해보는 것이 좋으며, Eclipse에서 제공하는 다양한 기능들을 이용하여 쉽게 해결할 수 있는 방법을 찾는 것이 중요하다.

필 자 또한 아직 Eclipse에서 제공하는 모든 기능을 활용하지 못하고 있다. 필자 또한 계속해서 새로운 방법들을 찾을 것이며, 이 글을 읽는 개발자들 또한 찾을 수 있을 것이다. 새로운 충돌 해결 방법을 찾을 경우 이 사이트를 통하여 공유해준다면 정말 감사하겠다.

  Eclipse 기반하에서 CVS 사용시 필자의 의견


이 절에서는 필자가 Eclipse 기반하에서 CVS를 사용하면서 느낀 부분에 대하여 간단하게 언급할 부분들을 모아보았다. 유용할 수도 있지만 필요없는 부분도 많을 것으로 생각되니 이해해주기 바란다.

1. CVS를 이용하여 프로젝트를 진행할 경우 지금까지 살펴본 기능만으로 충분히 프로젝트를 진행할 수 있다. 그러나 Eclipse는 더 많은 기능을 제공하고 있으며, 필자도 아직 사용해보지 못했기 때문에 다른 부분들이 얼마나 유용한지에 대해서는 언급할 수 없다. 그러나 Eclipse의 더 많은 기능들을 활용해서 프로젝트를 진행해보았으면 하는 바람이다. 좀 더 효율적인 소스관리가 될 것으로 생각한다. Eclipse는 매뉴얼이 정말 잘되어 있기 때문에 매뉴얼을 책 읽듯이 한번 읽으면서 따라해 보면 CVS의 더 고급스러운 기능들을 이용할 수 있을 것이다.

2. 많은 개발자들이 지금까지 CVS와 같은 버전관리 시스템을 사용하지 않다보니 종종 CVS와 동기화하는 작업을 잊어버리곤 한다. 동기화작업 시간이 길어지면 길어질수록 충돌이 나는 소스파일이 많아지게 되며, 통합하는데만 상당한 시간을 소요하게 된다. 그러므로 종종 CVS와의 동기화 작업을 진행하여 CVS서버에 반영된 소스를 Checkout하기 바란다. 많은 개발방법론에서는 하루에 한번 이상은 하라고 이야기하더군요. 그러나 프로젝트의 성격에 따라 다를 것이라 생각된다. 하지만 컴파일도 되지 않는 소스를 Commit하지는 말아야 한다. 자신이 개발하고 있는 파트가 어느 정도 완료된 다음 Commit하는 습관을 들여야 한다. 따라서 Commit을 하기 전에는 항상 CVS서버의 소스를 Checkout한 다음 소스상에서 컴파일 에러가 발생하지 않는지 확인한 다음 소스를 Commit하시기 바란다.

3. CVS에 소스를 Commit하거나 Update를 진행할 때 CVS서버와의 동기화없이 해당 작업을 바로 진행하는 개발자들이 있다. 이는 정말 중요한 CVS서버나 자신의 로컬 소스를 날려버릴 수 있다. 따라서 해당 작업을 진행하기 전에 CVS서버와 동기화를 진행한 다음 Synchronize화면에서 Commit과 Update작업을 진행하는 습관을 들여야 한다. 동기화 없이 작업을 진행하다가 후회하는 개발자들을 종종 본다.

4. CVS를 이용할 경우 CVS에서 다운 받은 소스를 바로 애플리케이션 서버에 디플로이하는 경우를 종종 본다. 이처럼 CVS소스를 바로 디플로이할 경우 CVS와 관련된 정보등 수 많은 필요없는 파일들이 같이 디플로이되게 된다. 따라서 CVS에서 소스를 Checkout한 다음 필요한 소스들만 웹 애플리케이션 구조로 만든 다음에 디플로이하는 것이 소스 관리차원에서 좋다. 이를 가능하게 하고 싶으면 ANT와 같은 툴을 이용하는 것이 좋은 방법이라고 생각한다. CVS이용할 때는 가능하면 ANT를 이용하여 Checkout과 컴파일, 디플로이 등을 작업을 배치로 실행하도록 하는 것이 개발 속도의 향상에 많은 도움이 된다는 것을 느낄 수 있었다.

5. 아직 국내에는 CVS를 이용하여 프로젝트를 진행하는 곳이 생각보다 많지 않다. 따라서 프로젝트 초기에 모든 개발자들에게 충분한 교육이 선행되어야 한다. 그렇지 않을 경우 개발자들이 CVS를 잘 사용하지 않게되며, 사용한다고 해도 잘못된 사용으로 인해 소스를 날려버리는 문제는 똑같이 발생하게 된다. 따라서 프로젝트 초기에 CVS 관리자를 따로 두어 교육 및 소스관리를 담당하도록 하는 것이 좋다. 많은 개발 방법론에서는 소스관리를 전담으로 하는 사람을 두라고 하지만 국내의 개발 여건상 이는 말도 안되는 소스로 밖에 들리지 않을거 같으며, 개발자들이 이 역할을 겸직할 수 밖에 없을거 같다. PL, TL이 능력이 된다면 이 사람들이 그 역할을 해준다면 더할나위 없이 좋을 것으로 생각된다.

이상으로 필자가 CVS를 프로젝트에 적용하면서 느꼈던 부분이다. 더 많은 부분들이 있겠지만 필자가 정리하는 습관이 없다보니 모두 기억하지 못하겠다. CVS를 사용했던, 사용하고 있는 개발자들이 있다면 한마디씩 추가해주시면 CVS를 사용하게 될 많은 개발자들에게 도움이 될거라 생각한다. 이 강좌에서 다룬 내용은 CVS의 극히 일부분만을 설명하고 있다. CVS를 제대로 사용하기 위해서는 개발자들의 더 많은 노력이 필요할 것이다. Eclipse의 매뉴얼을 참고하여 더 많은 기능을 프로젝트에 적용해보기 바란다.

저도 Eclipse에서 제공하는 더 많은 CVS기능을 사용해본 다음에 이 강좌의 후속편을 만들어 보도록 노력하겠다. 이 강좌와 관련된 질문은 이 사이트의 Q&A란을 이용해 주시기 바란다. 가끔 메일과 메신저를 이용해 질문을 하는 개발자들이 있는데 이에 대해서는 답변을 하지 않음을 유념하기 바란다.

이 강좌를 통해 CVS의 기초를 다지고 더 나은 Process를 알게된다면 이 사이트의 다양한 게시판을 통하여 다른 개발자들과 공유할 수 있었으면 한다. 모든 개발자들이 그럴만한 충분한 능력을 가지고 있으며, 열정 또한 있을 것이라 믿는다.

저자에 대하여 : 

박재성  2001 년부터 자바지기 사이트를 운영하면서 Java와 XML에 대한 활용방안에 대하여 고민하고 있다. 또한 Eclipse와 Eclipse플러그인을 이용하여 개발속도를 향상시킬 수 있는 방법을 찾고 있다. 현재 프리랜서로 활동 중이다. 주된 관심 분야는 모델2 FrameWork과 JDO를 이용한 MVC 모델구현과 효율적인 개발 Process를 통하여 좀 더 빠르게 프로그램을 개발하는 방법에 대하여 고민하고 있다. 더불어 수 많은 오픈소스 프레임워크을 이용한 개발 방법론에도 많은 관심을 가지고 있다. 현재 공부하고 있는 부분은 AspectJ를 이용한 AOP 개발 방법론에 대하여 공부하고 있다.

참고 자료  :