서브클립스 #
서브클립스(Subclipse)란 이클립스의 서브버전 클라이언트 플러그인입니다. 서브클립스를 사용하게 되면, 프로젝트의 버전관리를 이클립스 안에서 손쉽게 할 수 있습니다. 원래 서브버전 클라이언트는 콘솔 프로그램이라서 명령어를 통해 사용해야 하는데, 이런 사용방법은 정확하긴 하지만 방법이 불편하기 때문에, 이를 보완하는 많은 소프트웨어들이 있습니다. 널리 쓰이는 툴로는 TortoiseSVN이라는 툴이 있는데, 이는 윈도우의 파일 탐색기에서 사용하는 툴이며, 이클립스 개발환경을 사용하는 프로젝트라면, 서브클립스를 사용하면 훨씬 더 효율적인 작업이 가능해질 것으로 보입니다.
서브클립스 설치하기 #
통상 이클립스의 플러그인 설치하는 방법은, 직접 압축을 풀어서 복사해넣는 수동설치와 이클립스의 소프트웨어 업데이트 기능을 활용하는 자동설치가 있습니다. 여기서는 자동으로 설치할 방법을 사용하도록 하겠습니다.
- 이클립스를 실행합니다.
- Help > Software Updates > Find and Install을 클릭합니다.
- Search for new features to install을 선택한 후 Next를 클릭합니다.
- Update sites to visit 창이 나타나면, New Remote Site를 클릭합니다.
- Edit Remote Site 창이 나타나면, Name 항목에 Subclipse 1.4.x를 입력하고, URL 항목에 http://subclipse.tigris.org/update_1.4.x을 입력합니다. (현재 공개된 서브클립스의 버전은 1.0.x와 1.2.x, 1.4.x로 분리되어있는 상태인데, 여기서는 1.4.x 로 설치하도록 하겠습니다.)
- 입력을 마쳤으면 OK를 누른 후, Sites to include in search 리스트에서 방금 추가한 Subclipse 1.4.x항목을 선택합니다. 지금은 서브클립스의 설치를 하는 과정이니, 다른 선택된 항목들은 모두 선택을 해제해주도록 합시다.
- Finish 버튼을 누른 후 잠시 기다립니다.
- 잠시후, Updates 창이 나타나며, Select the features to install 리스트에서 Subclipse 1.4.x > Subclipse > Subclipse 1.4.x을 선택한 후, Next를 클릭합니다.
- 라이센스 관련 메시지가 나오는데, I accept the terms in the license agreement을 선택해서 동의함을 확인 후 Next버튼을 클릭합니다.
- Installation 창이 나오면, Finish를 눌러 설치작업을 진행합니다.
- 이제 다운로드 작업이 진행된 후, Verification 창이 등장합니다. Install All을 클릭해서 설치를 시작합니다.
- 설치기 완료되면, Install/Update 창이 이클립스를 재시작할 것을 권합니다. Yes를 클릭해서 이클립스를 재시작 합니다.
서브클립스 사용하기 #
서브클립스의 사용은 크게 두가지로 구분하면 될 것 같습니다. 첫째는 저장소 탐색이며, 둘째는 프로젝트 관리입니다. 이는 조사단계에서의 개인적인 사견이 섞인 것이니, 실제 사용을 해본 후 부정확했다 싶은 부분은 수정이 필요할 거라 생각합니다. 우선 이 글은 서브버전 서버환경이 구축되어있음을 전제로 진행하도록 하겠습니다.
저장소 탐색 #
이 작업은 이클립스의 Perspective를 변경한 후에 이루어집니다. 서브클립스의 설치를 마쳤다면 다음을 진행해 봅시다.
- 이클립스를 실행합니다.
- 이클립스 오른쪽 상단의, Open Perspective버튼을 클릭합니다. (+ 모양 아이콘이 붙어있습니다.)
- Other를 클릭합니다.
- Open Perspective 창이 나타나면, SVN Repositary Exploring항목을 선택한 후 OK를 클릭합니다.
- 이제 왼쪽을 보면, SVN Repositary 탭과 SVN Annotate 탭이 생겼습니다. SVN Repositary 탭을 클릭합니다.
- 현재는 아무 내용도 없을 것입니다. 빈 공간에 우클릭 후에 New > Repositary Location을 클릭합니다.
- Add SVN Repositary 창이 나타나면, Url 항목에 자신의 저장소 주소를 적어줍니다. (입력한 저장소 안을 탐색할 것이기 때문에, 저장소의 서브 디렉터리도 괜찮지만 그냥 단순하게 저장소의 루트 주소를 적어줘도 됩니다.)
- Finish 버튼을 클릭합니다.
- 방금 추가한 저장소의 주소로 아이템이 하나 추가되었을 것입니다. 인터페이스는 윈도우 탐색기와 비슷하니 저장소 안의 구조를 탐색해봅시다. 저장소 안에서 체크아웃을 할 디렉터리를 찾아봅시다. 저는 그냥 저장소 루트를 체크아웃해 보겠습니다.
- 체크아웃할 디렉터리 위에서 우클릭 후에, Checkout을 클릭합니다.
- Checkout from SVN 창이 나타나면, Check out as a project in the workspace를 선택 후, 프로젝트 이름을 적어줍니다. 저는 HelloSVN 이라고 했습니다. (만약 저장소에 .project 파일이 없는 경우라면, Check out as a project configured using the New Project Wizard 항목으로 체크아웃할 프로젝트를 생성할 수 있습니다.)
- Next를 클릭합니다.
- Use default workspace location 항목에 체크한 후, Finish를 클릭합니다. (만약 다른 위치에 저장하시려면 Use default workspace location 항목을 체크해제 한 후에 직접 위치를 지정하시면 됩니다.)
- 만약 저장소의 루트를 체크아웃한다면, 경고 문구가 뜰 것입니다. Yes를 클릭해서 의사를 밝힙니다.
- 잠시 후 체크아웃 과정이 완료되면 Perspective를 자신이 자주 쓰던 것으로 바꾸어준 후, 방금 체크아웃한 HelloSVN 프로젝트를 확인합니다. 저의 경우에는 Aptana Perspective 였습니다.
프로젝트 관리 #
서브클립스로 체크아웃한 프로젝트는, 프로젝트에 서브클립스의 아이콘이 붙습니다. 이런 프로젝트에서는 우클릭 후에 Team항목 밑으로 가면 프로젝트 버전관리에 관련된 명령들이 나옵니다. 지금은 간단하게 커밋을 하는 방법을 살펴봅시다.
- 위의 저장소 탐색에서 체크아웃한 HelloSVN프로젝트 루트에서 우클릭을 합니다.
- Team > Commit을 누르면 커밋이 진행됩니다. 지금은 프로젝트 내에서 변경된 점이 없어 No file were changed or added since the last commit 이라는 메시지와 함께 커밋이 되지 않을 것입니다.
- hello.txt 파일을 프로젝트에 추가하고, 내용에 hello, world!를 입력해 봅시다.
- 이제 다시 1~2의 과정을 진행해보면, Commit to: ... 창이 등장합니다.
- Edit the commit comment 항목에 커밋시 기록할 메모를 기록하고, Checked resources will be committed to SVN version control 항목에서 커밋할 파일을 선택합니다. 저는 메모에 hello.txt 추가, 파일은 Select All을 클릭했습니다.
- OK를 클릭하면 커밋이 진행됩니다.
버전 사이의 차이 보기 #
버전 사이의 차이 보기는 크게 두가지로 분류할 수 있습니다. 작업공간과 특정버전의 비교, 특정버전과 특정버전 간의 비교의 두가지이며, 전자의 작업공간과 특정버전의 경우, 전체 비교를 지원합니다. 이 기능을 사용하면, 어떤 파일이 어떻게 변경되었는지의 모든 정보를 확인할 수 있습니다.
작업공간과 특정버전의 비교 #
작업공간과 특정버전의 변경내역을 비교하는 방법은 다음과 같습니다.
- 프로젝트 탭의 작업공간 프로젝트 위에서 우클릭 후, Compare With > Branch/Tag를 클릭합니다.
- Compare with Branch/Tag 창이 나타납니다. URL은 작업공간의 저장소 주소이며, 이는 특별히 바꿀 필요가 없습니다. Revision 항목은 Head Revision과 Revision으로 구분되며, Head Revision을 선택할 시에는 저장소의 가장 최신 리비전과 비교를 하게 되며, Revision을 선택할 시에는 입력한 특정 리비전과 비교를 하게 됩니다. Compare type은 비교 방법인데, Graphical을 선택하면 서브클립스가 제공하는 '화면으로 비교를 할 수 있으며, Unified diff to output file을 선택하면 diff 파일로 비교하게 됩니다.
- 'Revision을 클릭하고, Show Log를 통해서 저장소에 저장되어있는 버전정보를 확인한 후에 특정 리버전번호를 입력합니다. 그리고 Compare type항목은 Graphical을 선택합니다.
- OK를 클릭하면, compare 작업공간 <workspace> and versions 화면이 나타납니다. Structure Compare 항목의 특정 파일을 더블클릭하면, 그 파일의 변경내역을 화면에 보여줍니다.
특정버전과 특정버전의 비교 #
특정버전과 특정버전의 비교는, 파일단위로만 비교할 수 있습니다. 방법은 다음과 같습니다.
- 우선 비교를 수행할 파일을 작업공간 내에서 선택합니다.
- 파일 위에서 우클릭 후 Team > Show History를 클릭합니다.
- History 창에 나타난 리비전들 중에서, 원하는 두개의 리비전을 CTRL클릭을 이용해서 선택한 후에 우클릭 후 Compare를 클릭합니다.
- 이제 서브클립스가 해당 버전과 버전 사이의 변경내역을 화면에 보여줍니다.
충돌 해결하기 #
여러 사람이 작업을 나누어 진행하다보면, 서로 같은 소스를 수정하여 충돌이 발생할 수 있습니다. 만약 파일 내의 수정한 곳이 서로 영향이 없는 경우에는 서브버전 클라이언트가 자동으로 Merge 기능을 수행해줍니다. 하지만 자동으로 Merge 기능 수행에 실패했을 때에는 충돌이 발생하고, 충돌이 일어난 당사자들끼리 이 문제를 해결해야 합니다.
우선 충돌이 발생한 후, 자동으로 Merge 가 수행되는 과정을 다음과 같이 따라해봅시다.
- 새 저장소를 만들고, 저장소 안의 hello.txt 파일을 다음과 같이 작성합시다.
zero one two three four five six seven
- 이제 저장소에 커밋합니다.
- 이클립스를 실행하고, 서브클립스로 방금 생성한 저장소를 체크아웃 해옵니다. 이때, 충돌이 발생하려면 적어도 두사람 이상이 작업을 하는 상황을 재현해야 하므로, 두개의 다른 프로젝트에 각각 체크아웃 해줍니다. 저는 Hello1 과 Hello2 라는 프로젝트로 체크아웃 하고 진행하도록 하겠습니다.
- 우선 Hello1 프로젝트의 hello.txt 파일을 다음과 같이 수정합니다. zero를 ZERO로 변경한 것입니다.
ZERO one two three four five six seven
- 이제 Hello2 프로젝트의 hello.txt 파일을 다음과 같이 수정합니다. six를 SIX로 변경한 것입니다.
zero one two three four five SIX seven
- 먼저 Hello1 프로젝트를 커밋합니다.
- 이제 Hello2 프로젝트를 커밋합니다. 아마 hello.txt가 out-of-date 라며 커밋에 실패할 것입니다. Hello1 프로젝트를 커밋하면서 hello.txt가 리비전2로 갱신되었기 때문입니다.
- Hello2 프로젝트에서 우클릭 후, Team > Update를 클릭합니다.
- Console 창을 보면, hello.txt가 Merged 되었다는 메시지와 함께 업데이트 되었을 것입니다. 이제 Hello2 프로젝트의 hello.txt 파일을 열어보면 다음과 같이 변경된 것을 보실 수 있습니다.
ZERO one two three four five SIX seven
- 이와 같이, 서로 다른 부분에서 충돌이 발생한 경우, SVN 클라이언트가 알아서 Merge 기능을 수행해줍니다. 이제 Hello2 프로젝트를 커밋해서, Merged된 hello.txt를 저장소에 반영해주면 됩니다. Hello1 프로젝트에서는 업데이트를 실행해서 Merged된 hello.txt를 자신의 작업공간에 반영해주어야 합니다.
- 현재 저장소의 hello.txt 파일이 다음과 같습니다.
ZERO one two three four five SIX seven
- Hello1 프로젝트의 hello.txt 파일을 다음과 같이 수정해줍니다. seven을 !LuckySeven으로 변경한 것입니다.
ZERO one two three four five SIX LuckySeven
- Hello2 프로젝트의 hello.txt 파일을 다음과 같이 수정해줍니다. seven을 !SevenStar로 변경한 것입니다.
ZERO one two three four five SIX SevenStar
- 먼저 Hello1 프로젝트를 커밋합니다.
- 이제 Hello2 프로젝트를 커밋합니다. 아마 hello.txt가 out-of-date 라며 커밋에 실패할 것입니다.
- Hello2 프로젝트에서 우클릭 후, Team > Update를 클릭합니다.
- Console 창을 보면, hello.txt 파일을 업데이트 했다는 메시지와 함께, File Statistics에 Conflicts: 1 이라는 메시지가 보일 것입니다. 더불어 프로젝트 안에 hello.txt.mine, hello.txt.r3, hello.txt.r4 같은 파일들도 생겼을 것입니다.
- 이제 Hello2 프로젝트의 hello.txt 파일을 열어보면, 다음과 같이 파일이 변경되어 있을 것입니다.
ZERO one two three four five SIX <<<<<<< .mine SevenStar ======= LuckySeven >>>>>>> .r4
- .mine은 자신이 변경한 부분, .r4는 저장소의 내용입니다. 둘 사이는 ====== 으로 구분되어 있습니다. 충돌이 난 부분이 저렇게 표기되며, 마지막으로 커밋한 작업자와 상의 후에 해당 부분을 수정해야 합니다.
- 충돌이 난 부분을 다음과 같이 변경해봅시다.
ZERO one two three four five SIX LuckySevenStar
- Hello2 프로젝트의 hello.txt 파일에서 우클릭 후에, Team > Mark Resolved를 클릭합니다. 이번에는 수작업이기 때문에, 충돌이 해결되었다는 정보도 직접 작업해주어야 하기 때문입니다.
- 충돌이 해결되었다는 정보를 알리면, 위에 충돌이 발생했을 때 생겨난 hello.txt.mine, hello.txt.r3, hello.txt.r4 같은 파일들도 사라질 것입니다.
- 이제 Hello2 프로젝트를 커밋해서 충돌을 해결한 파일을 저장소에 반영해줍니다. Hello1 프로젝트에서는 업데이트를 실행해서 충돌이 해결된 hello.txt를 자신의 작업공간에 반영해주어야 합니다.
가지를 줄기에 병합하기 #
서브버전을 이용한 실용적인 버전 관리 p130 참고.
서브클립스 설정하기 #
버전 관리되는 파일/폴더에 보여줄 정보 설정하기 #
- 이클립스를 실행합니다.
- Window > Preferences를 클릭합니다.
- 왼쪽의 트리에서 Team > SVN > Label Decoration을 클릭합니다.
- 우측에 나타난 탭중에서 Text를 클릭합니다.
- 이제 원하는 대로 설정하면 됩니다. 여기서는 파일에서 리비전번호, 날짜, 수정자에 대한 정보를 제외시키도록 해보겠습니다. File Format 항목에서 {revision} {date} {author} 정보를 삭제합니다. {added_flag}{dirty_flag}{name}만 남겠죠.
- 이제 버전관리되는 파일들이 어떻게 보여지는지 확인해보세요.
svn+ssh 지원 설정 #
svn+ssh 프로토콜을 지원하기 위해서는 2가지 방법이 존재합니다. 이는 서브클립스 설정중 SVN Interface 설정에 따라 다르며, JavaHL(JNI)의 경우에는 plink 라는 프로그램이 필요하고, SVNKit(Pure Java)의 경우에는 자체적으로 모든 일을 처리합니다. 여기서는 쉽게 사용할 수 있는 SVNKit 설정을 설명하겠습니다.
- 이클립스를 실행합니다.
- Window > Prefereces를 클릭합니다.
- 왼쪽의 트리에서 Team > SVN을 클릭합니다.
- 우측에서 SVN Interface 항목의 옵션 중에서 SVNKit(Pure Java)를 선택합니다.
- Apply를 눌러 적용합니다.







