• Ubuntu Precise Pangolin 12.04에서 Test 완료. (2012-05-21)
    (Redmine 1.3.3, Redmine Mylyn Connector Plugin 2.7.6, Eclipse 3.7.2(Indigo), Mylyn 3.6.5, Mylyn Connector-Redmine 0.3.7)
  • Ubuntu Oneiric Ocelot 11.10에서 Test 완료. (2012-03-21)
    (Redmine 1.3.0 & 1.3.2 & 1.3.3, Redmine Mylyn Connector Plugin 2.7.6, Eclipse 3.7.2(Indigo), Mylyn 3.6.5, Mylyn Connector-Redmine 0.3.7)

이번 Post에서는 Ubuntu에서 Redmine Server 구성하기에 이어서 Redmine과 Eclipse의 Mylyn을 연동하여 Task를 관리하는 방법을 알아보도록 하겠습니다.

1. Mylyn?

Mylyn은 Eclipse에서 Task를 관리하기 위한 Plugin입니다. 여기서 말하는 Task(또는 Issue)는 Bug나 New Feature에 대한 요청과 같은 Project 작업의 단위를 말합니다.

Mylyn을 사용하면 개발자가 원하는 Task만을 검색하여 확인하거나 상태를 변경할 수 있으며, 새로운 Task를 작성하거나 삭제하는 등의 Task 관리가 Eclipse 상에서 가능하게 됩니다.

Mylyn를 이용한 Task 관리는 Task(또는 Issue) 관리 System과의 연동을 통해 이루어집니다. Task 관리 System과 연동을 위해서 Connector를 설치해야 하는데, 기본적으로 Mylyn은 Bugzilla, Trac과 같은 잘 알려진 Task 관리 System을 지원합니다.

Mylyn의 더 자세한 내용을 알기 원한다면 devloperWorks의 다음 글들을 참고하기 바랍니다.

2. 설치

Redmine과 Mylyn을 연동하여 사용하기 위해서는 Redmine이 설치된 Server와 Mylyn을 사용하는 Eclipse에 각각 필요한 Plugin을 설치해야 합니다.

이번 항목에서는 설치방법을 설명합니다.

2.1. Redmine Plugin 설치

Redmine Server에서는 먼저 Mylyn과 연동을 위한 Plugin을 설치해야 합니다. Terminal에서 다음과 같이 입력합니다.

1
2
3
4
$ sudo apt-get install git ruby-git
$ cd /usr/share/redmine
$ sudo ruby script/plugin install --force git://redmin-mylyncon.git.sourceforge.net/gitroot/redmin-mylyncon/redmine-mylyn-connector
$ sudo service apache2 restart
Redmine - Plugins

Redmine - Plugins

Redmine에 admin 계정으로 접속한 다음, 관리 -> 플러그인을 Click하면 위와 같이 Mylyn Connector plugin이 설치된 것을 확인할 수 있습니다.

Redmine - Settings

Redmine - Settings

Mylyn과 연동을 위해 REST Interface를 사용하기 때문에 관리 -> 설정 -> 인증에서 REST 웹서비스 활성화에 Check하고 저장을 누르면 Server 설정이 끝나게 됩니다.

2.2. Eclipse Plugin 설치

Eclipse에서는 당연히 Mylyn Plugin이 설치되어 있어야 합니다. Eclipse의 All-in-one Pack(C/C++ Developers, Java Developers etc.)을 사용한다면 Mylyn이 Default로 포함되어 있습니다.

만약 Mylyn이 설치되어 있지 않다면 다음과 같은 방법으로 설치할 수 있습니다.

2.2.1. Mylyn 설치
Eclipse - Install New Software

Eclipse - Install New Software

Eclipse에서 Help -> Install New Software를 Click합니다.

Eclipse - Available Software (Mylyn)

Eclipse - Available Software (Mylyn)

Work With에 Indigo(Eclipse의 Version에 따라 다를 수 있음)를 선택한 다음, 검색창에 mylyn을 입력하면 Mylyn과 연관된 Plugin들이 표시될 것입니다. (List를 가져오는데 시간이 좀 걸릴 수 있습니다.) 이중에서 다음과 같은 Plugin을 Check한 다음, Next를 눌러 설치하면 됩니다.

  • Mylyn Context Connector: Eclipse IDE
  • Mylyn Context Connector: Java Development, C/C++ Development (Optional)
  • Mylyn Context Connector: Team Support
  • Mylyn Task List
  • Mylyn Task-Forced Interface
2.2.2. Redmine-Mylyn Connector 설치

Mylyn Plugin을 설치했다면 이제 Redmine과 Mylyn을 연동하기 위한 Connector를 설치해야 합니다. 설치하는 방법은 다음과 같습니다.

Eclipse - Preferences

Eclipse - Preferences

먼저 Software Site를 추가하기 위해서 Window -> Preferences를 Click합니다.

Eclipse - Available Software Sites

Eclipse - Available Software Sites

Install/Update -> Available Software Sites에서 Add Button을 누릅니다.

Eclipse - Add Site

Eclipse - Add Site

Add Dialog에서 다음과 같이 입력하고 OK를 누릅니다.

  • Name: Redmine-Mylyn Connector
  • Location: http://redmin-mylyncon.sourceforge.net/update-site/N/
Eclipse - Available Software (Mylyn Redmine Connector)

Eclipse - Available Software (Mylyn Redmine Connector)

그 다음 Help -> Install New Software를 Click한 후, Work with에 Redmine-Mylyn Connector를 선택합니다. 그리고 List에 표시되는 Mylyn Integration을 Check하고 Next를 눌러 설치하면 Eclipse 설정이 완료됩니다.

Eclipse - Security Warning

Eclipse - Security Warning

만약 설치 도중에 위와 같은 Security Warning이 표시된다면, OK를 눌러 계속 진행하면 됩니다.

3. Redmine과 Mylyn 연동

이제 Server와 Eclipse 모두 준비가 되었으니 연동을 해 봅시다. 아래의 항목들을 순서대로 진행하면 됩니다.

3.1. Task Repository 추가하기

Redmine과 Mylyn을 연동하기 위해서는 먼저 Task Repositories View에 Redmine Server를 추가해야 합니다.

Eclipse - Show View

Eclipse - Show View

Eclipse에서 Window -> Show View -> Other를 Click합니다.

Eclipse - Show View (Other)

Eclipse - Show View (Other)

Mylyn의 Task Repositories를 Click하고 OK를 누릅니다.

Eclipse - Task Repositories

Eclipse - Task Repositories

Task Repositories View가 표시되면 오른쪽의 Add Task Repository Button을 Click합니다.

Eclipse - Add Task Repository

Eclipse - Add Task Repository

Dialog에서 Redmine을 선택한 다음 Next를 누릅니다.

Eclipse - Redmine Repository Settings

Eclipse - Redmine Repository Settings

Redmine Repository Settings Dialog가 표시되면 다음과 같은 항목을 입력합니다.

  • Server: Redmine Server에 접근하기 위한 URL을 입력합니다. URL 앞에 Protocol(http)까지 제대로 입력해야 합니다.
  • Label: Task Repositories View에 표시될 이름을 입력합니다.
  • API-Key: Redmine ID와 Password입력을 사용하여 인증하는 것 대신 API Key를 통해서 인증하는 것이 더 안전합니다. 오른쪽의 Enable을 Check한 다음, API Key를 입력합니다. API-Key를 얻는 방법은 바로 다음에 설명합니다.
  • Task Editor Settings: Textile을 Check하면 Redmine의 Wiki 문법을 Comment나 Description에 사용할 수 있습니다.

입력 후에는 아래의 Vailidate Settings를 Click하여 설정을 Check합니다. 제대로 인증되었다면 Finish를 누르면 됩니다.

Redmine

Redmine

인증을 위한 API-Key를 얻으려면 먼저 Mylyn으로 접근하기 위한 계정으로 Redmine에 Login한 다음, 오른쪽 위의 내 계정을 Click합니다.

Redmine - My Account

Redmine - My Account

오른쪽의 API 접근키의 보기를 누른다음, 표시된 Key를 복사하여 Redmine Repository Settings Dialog의 API-Key에 입력하면 됩니다.

Eclipse - Add New Query

Eclipse - Add New Query

Redmine Repository가 추가되면 위와 같이 Query를 추가할 지 물어보는데, 다음 항목에서 설명할 것이므로 여기서는 No를 누릅니다.

Eclipse - Update Repository Configuration

Eclipse - Update Repository Configuration

추가가 완료되면 Redmine의 정보를 Load하기 위해서 Redmine Repository에서 Mouse 오른쪽 Popup을 띄운 후, Update Repository Configuration을 Click합니다.

만약 Redmine의 설정이 변경되었거나 Redmine-Mylyn Connector가 Update되었다면, Update Repository Configuration과 Synchronize All Tasks를 Click하여 설정이 변경된 내용을 적용하고 동기화 시켜야 합니다.

3.2. Query 추가하기

Task Repository가 추가되면 이제 Eclipse에서 Redmine의 Task를 관리할 준비가 된 것입니다. 이제 Query를 추가하여 개발자가 원하는 Task만을 검색하여 관리해 봅시다.

Redmine - Issues

Redmine - Issues

Redmine의 Hello Project에 위와 같은 Task가 있는 경우를 예로 들어 보겠습니다.

Eclipse - Show View

Eclipse - Show View

Task를 확인하기 위한 Task List View를 표시하기 위해서, 먼저 Eclipse에서 Window -> Show View -> Other를 Click합니다.

Eclipse - Show View (Other)

Eclipse - Show View (Other)

Mylyn -> Task List를 Click하고 OK를 누릅니다.

Eclipse - Task List

Eclipse - Task List

Task List View가 표시되면 Query를 추가하기 위해서 Task List View의 New Task Button 옆 역삼각형을 Click한 다음, New Query를 Click합니다.

Eclipse - New Query

Eclipse - New Query

Select a repository에서 Redmine을 선택한 다음 Next를 누릅니다.

Eclipse - Select a predefined query

Eclipse - Select a predefined query

Combobox에서 Create a new query를 선택한 다음 Next를 누릅니다.

Eclipse - Create a new query

Eclipse - Create a new query

새로 생성할 Query를 설정하는 화면에서 원하는 Task를 검색하기 위한 Query를 만들 수 있습니다.

Query Title에는 Task List View에 표시될 Query의 이름을 입력하면 됩니다. 그 외에 나머지는 Redmine의 Task를 생성할 때 입력하는 항목과 동일하니 따로 설명하지는 않겠습니다. 위의 그림은 Hello Project의 신규로 설정된, 그리고 자신에게 배속된 Task를 검색하는 Query를 설정한 것입니다.

만약 Redmine의 내용이 Query 설정에 제대로 표시되지 않는다면 아래의 Update Attributes from Repository를 눌러 Redmine의 설정을 가져오면 됩니다.

Eclipse - Created Query

Eclipse - Created Query

Query 생성 Dialog에서 Finish를 눌러 생성이 완료되었다면 위의 그림과 같이 Query로 검색된 Task의 List가 Task List View에 표시됩니다. 그리고 Task를 Double-Click하면 Task의 내용을 확인하거나 변경할 수 있습니다.

3.3. Task 추가하기

Eclipse - New Task

Eclipse - New Task

Eclipse에서 Task를 Redmine에 새로 추가하기 위해서는 Task List View의 Add Task를 Click합니다.

Eclipse - Select a repository

Eclipse - Select a repository

Task Repository 중 Redmine을 선택한 다음 Finish를 누릅니다.

Eclipse - Task

Eclipse - Task

새로운 Task 편집 Tab에서 Task의 각 항목을 입력하고 Submit Button을 누르면 Redmine에 Task가 추가됩니다.

3.3.1. Task 추가시 Error가 발생할 경우
Eclipse - Problem Occurred

Eclipse - Problem Occurred

Task를 작성한 다음 Submit을 눌렀을 때, 위와 같이 자세한 내용이 없는 Server Error가 발생할 수 있습니다.

Redmine Server에서 Redmine의 Log File인 /var/log/redmine/defaults/production.log를 확인하면 다음과 같은 Error가 발생한 것을 확인할 수 있습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
 NoMethodError (private method `gsub' called for :autologin:Symbol):
   /usr/lib/ruby/vendor_ruby/rack/backports/uri/common.rb:24:in `encode_www_form_component'
   /usr/lib/ruby/vendor_ruby/rack/utils.rb:23:in `escape'
   /usr/lib/ruby/vendor_ruby/rack/utils.rb:201:in `set_cookie_header!'
   /usr/lib/ruby/vendor_ruby/rack/utils.rb:238:in `delete_cookie_header!'
   /usr/lib/ruby/vendor_ruby/rack/response.rb:63:in `delete_cookie'
   /usr/lib/ruby/vendor_ruby/action_controller/cookies.rb:94:in `delete'
   app/controllers/application_controller.rb:32:in `handle_unverified_request'
   /usr/lib/ruby/vendor_ruby/action_controller/request_forgery_protection.rb:79:in `verify_authenticity_token'
   /usr/lib/ruby/vendor_ruby/active_support/callbacks.rb:178:in `send'
   /usr/lib/ruby/vendor_ruby/active_support/callbacks.rb:178:in `evaluate_method'
   /usr/lib/ruby/vendor_ruby/active_support/callbacks.rb:166:in `call'
   /usr/lib/ruby/vendor_ruby/action_controller/filters.rb:225:in `call'

이에 대한 해결책이 Redmine의 Issue에 서 논의되었는데 이것은 Rack 1.3.1에서 발생하는 문제로 보입니다. Redmine 1.3.0의 Code를 확인해 보니 Issue에서 언급된 내용은 Fix되어 있지만, 다른 Code에서 동일한 문제를 발생시키는 것을 확인할 수 있었습니다.

이 문제를 해결하려면 Rack 1.4.0을 설치해야 합니다. 하지만 PPA로 Redmine을 설치한 경우에는 Rack 1.3.1이 System에 Package로 설치되기 때문에, Issue를 참고하여 문제를 해결하기 위한 Patch를 만들어 봤습니다.

Redmine Server에서 아래의 Patch를 Download한 후, 다음과 같이 입력하여 Patch를 적용합니다.

이 Patch는 Redmine 1.3.0에서 Test되었습니다. 이 외의 Version에 적용할 경우 문제가 발생할 수 있습니다.

최근 PPA를 통해서 배포된 Redmine 1.3.2를 설치하면 Rack 1.4.1이 같이 설치됩니다. 때문에 위와 같은 문제가 발생하지 않습니다. (2012-04-04)

1
2
3
4
$ sudo mv cookie_symbol_to_s-1.3.0.txt /usr/share/redmine/cookie_symbol_to_s.patch
$ cd /usr/share/redmine
$ sudo patch -p0 < cookie_symbol_to_s.patch
$ sudo service apache2 restart

Patch를 적용한 다음, 다시 Eclipse에서 Task를 Submit하면 Task가 제대로 Redmine에 적용된 것을 확인할 수 있습니다.

  • Ubuntu 12.04 Precise Pangolin에서 Test 완료 (2012-05-21)
  • Ubuntu 11.10 Oneiric Ocelot에서 Test 완료 (2011-12-05)

Subversion은 CVS를 대체하기 위해 만들어진 형상관리 Tool(Version Control System)로 지금은 Apache Foundation에서 Project를 관리하고 있습니다.

간단하게 말하면, Subversion은 다수의 Programmer가 하나의 Project를 개발할 때 서로가 개발하는 부분에 대한 충돌이 없도록 Source를 관리하고 공유할 수 있게 도와주는 Software입니다.

물론 개인이 혼자 개발한다 하더라도, 현재 Source를 이전 Version으로 변경하고 싶을 때나 Backup을 위해서도 유용하게 사용됩니다.

이번 Post에서는 Ubuntu Natty Narwhal 11.04에서 Subversion Server를 구성하는 방법과 간단한 사용방법을 알아보도록 하겠습니다.

1. Subversion 설치

Ubuntu에서 Subversion을 설치하는 방법은 간단합니다. 아래와 같이 Terminal에서 입력합니다.

1
$ sudo apt-get install subversion

Subversion Server를 구성하기 위해서는 Subversion을 사용할 계정을 위한 Group을 생성하고, Group의 Default 계정을 설정해야 합니다. 다음과 같이 Terminal에서 입력합니다.

1
2
$ sudo groupadd subversion
$ sudo usermod -a -G subversion www-data

www-data는 기본적으로 System에 생성되어 있는 Login을 할 수 없는 User로 원래 Apache HTTP Server와 같은 Web Service를 위해 사용되는 계정입니다. 이 계정을 Default로 사용해서 Subversion 저장소를 생성하게 됩니다.

이제 Subversion 저장소(각 Project의 저장소가 저장될 최상위 Directory)를 아래와 같이 입력하여 생성합니다.

1
2
3
$ sudo mkdir /home/svn
$ sudo chown www-data:subversion /home/svn
$ sudo chmod g+rws /home/svn

Subversion 저장소의 위치는 취향에 따라 다른 곳에 설정해도 됩니다. 보통 /srv/svn, /usr/local/svn 등을 사용하는데 /home/svn을 대부분 많이 사용하는 것 같습니다.

이제 저장소의 위치도 지정했다면 Subversion을 사용해 봅시다. Subversion 저장소에 접근하는 Protocol에 따라 설정방법이 조금씩 차이가 있는데, 여기에서는 여러 Protocol 중 Subversion 고유 Protocol인 svn://와 SSH Tunneling을 이용하는 svn+ssh://일 경우에 대해서 알아보겠습니다.

2. svn:// Protocol을 사용할 경우

svn:// Protocol은 Subversion의 고유 Protocol로 이것을 사용하면 각 Project의 저장소에 Login하기 위해서 System의 계정이 아닌 따로 설정한 ID와 Password를 사용할 수 있습니다. 저장소에 접근하기 위해서 System 계정을 만들어 주지 않아도 되기 때문에 보안상 유리할 수 있습니다.

그리고 각 Project 저장소마다 따로 ID와 Password를 설정할 수 있기 때문에 각기 다른 사용자가 Subversion Server에 접근한다면 해당 사용자에게 원하는 Project 저장소에만 접근하도록 설정할 수 있습니다.

다만 svn:// Protocol을 사용하기 위해서는 Subversion의 Service Daemon인 svnserve가 항상 실행되어 있어야만 합니다.

2.1 Init Script 생성

앞서 언급한 대로 Subversion의 Service Daemon을 실행하기 위해서 Init Script를 만들어야 합니다. Init Script를 만들게 되면 나중에 Service를 실행하기 편리하며 System 시작 시에 자동으로 실행되도록 만들 수 있습니다.

Init Script를 따로 제공하지는 않으나 다른 Ubuntu User가 만들어 놓은 Script를 활용해서 설정해 봅시다. 아래와 같이 Terminal에서 입력합니다.

1
2
3
$ sudo wget http://odyniec.net/articles/ubuntu-subversion-server/svnserve -O /etc/init.d/svnserve
$ sudo chmod 755 /etc/init.d/svnserve
$ sudo vi /etc/init.d/svnserve

Download한 Script는 Subversion 저장소가 다르게 되어 있으니 현재 설정에 맞춰 봅시다. 아래와 같이 되어 있는 것을,

1
DAEMON_ARGS="-d -r /usr/local/svn/repos"

다음과 같이 바꾼 후 저장하면 됩니다.

1
DAEMON_ARGS="-d -r /home/svn"

이제 Subversion Server를 실행해 봅시다. 아래와 같이 입력합니다.

1
$ sudo service svnserve start

작성한 Subversion Init Script를 시작 시에 자동으로 실행하려면 다음과 같이 입력합니다.

1
$ sudo update-rc.d svnserve defaults

2.2 방화벽 설정

System에 UFW 방화벽이 동작하고 있다면 방화벽 설정을 해 주어야 외부에서 Server로 접속할 수가 있습니다. 방화벽을 사용하지 않는다면 이 부분은 넘겨도 됩니다.

Gufw를 사용하여 UFW 방화벽을 설정해 봅시다. 설치되어 있지 않다면 다음과 같이 입력합니다.

1
$ sudo apt-get install gufw
Gufw in Dash

Gufw in Dash

Dash에서 시스템을 선택하고 방화벽 설정을 Click합니다.

Gufw

Gufw

Gufw가 실행되면 새로운 Rule을 추가하기 위해서 추가 Button을 누릅니다.

Gufw - Add Rule (Subversion)

Gufw - Add Rule (Subversion)

간단하게 Tab에서 Allow, In, Both를 선택하고 Subversion의 Service Port인 3690을 입력한 후, 추가를 누르면 외부에서 Server로 svn://을 사용해서 접근할 수 있게 됩니다.

2.3 Project 저장소 생성

이제 Project Source를 Import (저장소에 Source Code를 등록)하기 위해서 Project 저장소를 생성해 봅시다.

예를 들어, hello라는 Project에 대한 저장소를 만들기 원한다면 아래와 같이 Terminal에서 입력합니다.

1
2
3
$ sudo svnadmin create /home/svn/hello
$ sudo chown www-data:subversion /home/svn/hello -R
$ sudo chmod g+rws /home/svn/hello -R

위의 명령을 통해서 hello Project에 대한 저장소를 생성하고 적당한 권한을 부여했습니다. 그 다음, 저장소에 접근할 수 있는 ID와 Password를 설정하기 위해서 저장소의 설정을 변경해야 합니다. 아래와 같이 입력하여 수정합시다.

1
$ sudo vi /home/svn/hello/conf/svnserve.conf

svnserve.conf의 중간쯤에 아래와 같이 되어 있는 부분을,

1
# password-db = passwd

#을 제거하여 다음과 같이 변경하고 저장합니다.

1
password-db = passwd

마지막으로 ID와 Password를 설정할 차례입니다. 아래와 같이 입력하여 설정합시다. (ID가 foo이고 Password가 bar인 경우의 예)

1
2
3
4
$ sudo vi /home/svn/hello/conf/passwd

[users]
foo = bar

2.4 Import

Project 저장소를 생성했으니 Source Code를 Import해 봅시다.

예를 들기 위해서 hello라는 Project를 만들어 봅시다. Subversion Project 저장소에 Import하기 위한 Directory 구조인 branches, tags, trunk를 생성하고 trunk에 hello.c를 간단하게 작성합시다. 아래와 같이 입력합니다.

1
2
3
4
5
$ mkdir hello
$ cd hello
hello$ mkdir branches tags trunk
hello$ cd trunk
trunk$ vi hello.c
1
2
3
4
5
6
7
#include <stdio.h>

int main(void)
{
    printf("Hello, World!\n");
    return 0;
}

Source가 완성되었으니 Import를 해봅시다. import를 하기 위해서는 다음과 같이 입력해야 합니다.

1
$ svn import <Import할 Directory> svn://<passwd에 설정한 ID>@<Server Name 또는 Address>/<생성한 Project 저장소 이름>

hello Project를 이전에 생성한 hello Project 저장소로 Import하는 경우를 예로 들면 다음과 같습니다.

1
2
trunk$ cd ../..
$ svn import hello svn://foo@localhost/hello

위와 같이 입력하면 vi가 표시되면서 Import에 대한 Log Message를 입력할 수 있습니다. Log Message를 적고 저장한 후 vi를 종료하면 ID에 대한 암호를 묻고, 제대로 입력했다면 저장소에 Source Code가 Import 됩니다.

2.5 Checkout

제대로 Project 저장소에 Import가 되었는지 확인하기 위해서 Checkout(저장소에 존재하는 최신의 Source를 Download)을 받아봅시다.

Checkout을 위한 명령어 구문은 다음과 같습니다.

1
$ svn co svn://<passwd에 설정한 ID>@<Server Name 또는 Address>/<생성한 Project 저장소 이름>

위에서 예를 든 hello Project를 Checkout 받는 경우라면 다음과 같이 입력해야 합니다.

1
$ svn co svn://foo@localhost/hello

제대로 Checkout 받았다면 hello Directory가 생기면서 그 안에 branches, tags, trunk Directory와 trunk/hello.c가 존재할 것입니다.

3. svn+ssh:// Protocol을 사용할 경우

svn+ssh:// Protocol은 Subversion Service Daemon을 실행하지 않고도 SSH protocol을 사용하여 Tunneling을 통해 Subversion Project 저장소에 접근할 수 있습니다.

보통의 경우 SSH Server를 구성하여 System을 관리하는 경우가 많기 때문에 특별한 설정없이 간단하게 Subversion Server를 구성할 수 있습니다. 또한 SSH의 Tunneling을 사용하기 때문에 암호화되어 Data가 전송되므로 안전합니다.

다만 각 Project 저장소마다 ID와 Password를 따로 만들어 줄 수 있는 svn:// Protocol과는 달리 System에 생성된 계정으로 접근하기 때문에 계정만 있다면 모든 Project 저장소에 접근할 수 있는 단점이 존재합니다. (굳이 구분하려 한다면 Project 저장소 Directory에 권한 설정으로 가능할 것 같네요.)

3.1 OpenSSH Server 설치

svn+ssh:// Protocol을 사용하기 위해서 OpenSSH Server를 설치합시다. 설치방법은 간단합니다. 다음과 같이 Terminal에서 입력합니다.

1
$ sudo apt-get install openssh-server

설치된 SSH Server가 System 시작 시에 자동으로 실행되게 하려면 다음과 같이 입력합니다.

1
$ sudo update-rc.d ssh defaults

3.2 방화벽 설정

UFW 방화벽이 활성화 되어 있다면 SSH Server를 위해서 방화벽 설정을 해 주어야 합니다. 방화벽을 사용하지 않을 경우에는 이 부분을 건너뛰어도 좋습니다.

Gufw를 사용하여 UFW 방화벽을 설정해 봅시다. 설치되어 있지 않다면 다음과 같이 입력합니다.

1
$ sudo apt-get install gufw
Gufw in Dash

Gufw in Dash

Dash에서 시스템을 선택하고 방화벽 설정을 누릅니다.

Gufw

Gufw

Gufw를 실행되면, Unlock을 눌러 Superuser 권한을 얻은 후, 추가 Button을 누릅니다.

Gufw - Add Rule (SSH)

Gufw - Add Rule (SSH)

편리하게 Tab에서 Allow, In, Service, SSH를 선택하고 추가 Button을 누르면 외부에서도 Server의 SSH Service에 접근할 수 있게 됩니다.

3.3 Project 저장소 생성

이제 Project 저장소를 생성해 봅시다. 위에서 만든 hello Project를 위한 저장소를 만들기 위해서는 다음과 같이 입력하면 됩니다.

1
2
3
$ sudo svnadmin create /home/svn/hello
$ sudo chown www-data:subversion /home/svn/hello -R
$ sudo chmod g+rws /home/svn/hello -R

Project 저장소를 만든 다음에 접근할 수 있는 계정을 생성해야 합니다. 예를 들어 foo라는 계정을 Subversion Project 저장소에 접근할 수 있도록 하려면 다음과 같이 입력합니다.

1
2
$ sudo useradd -g subversion foo
$ sudo passwd foo

또는 기존에 System에 존재하는 계정을 Subversion Project 저장소에 접근하게 하려면 아래와 같이 입력하면 됩니다.

1
$ sudo usermod -a -G subversion <subversion을 사용할 계정>

3.4 Import

svn+ssh:// Protocol을 사용하기 위한 준비가 끝났습니다. 이제 Project Source를 Import해 봅시다. import 시에 명령 구문은 아래와 같습니다.

1
$ svn import <Import할 Directory> svn+ssh://<Server에 Login 가능한 ID>@<Server Name 또는 Address>/<Subversion 저장소 Directory>/<생성한 Project 저장소 이름>

svn:// Protocol을 사용할 때와 다른 점은 Server Name과 Project 저장소 이름 사이에 Subversion 저장소의 System 경로를 적어야 한다는 것입니다.

예를 들어 위에 설정한 것 처럼 Subversion 저장소가 /home/svn이고, 생성한 Project 저장소 이름이 hello인 경우 다음과 같이 Terminal에서 입력해야 합니다.

1
$ svn import hello svn+ssh://foo@localhost/home/svn/hello

위의 명령을 입력하면 처음으로 SSH Server에 접속할 경우 계속 접속할 것인지 여부를 묻는데 yes라고 입력한 후 접속할 계정의 비밀번호를 입력합니다. 이후 나머지 과정은 svn:// Protocol을 사용하여 Import할 때와 동일합니다.

3.5 Checkout

이번에는 Import한 Project Source를 Checkout 해 봅시다. 명령구문은 다음과 같습니다.

1
$ svn co svn+ssh://<Server에 Login 가능한 ID>@<Server Name 또는 Address>/<Subversion 저장소 Directory>/<생성한 Project 저장소 이름>

Import의 경우와 마찬가지로 여기서도 Server Name과 Project 저장소 이름 사이에 Subversion 저장소 Directory 경로가 포함되어야 합니다. 위에서 예로 Import한 hello Project를 Checkout하려면 아래와 같이 입력합니다.

1
$ svn co svn+ssh://foo@localhost/home/svn/hello

4. 마치면서…

이상으로 Ubuntu Natty Narwhal 11.04에서 Subversion Server를 구성하는 방법을 알아봤습니다. 마지막으로 Subversion에 대한 자세한 정보를 얻기 원한다면 다음 Link를 방문해 보기 바랍니다.


  • Ubuntu Precise Pangolin 12.04 Test 완료. (2012-05-22)
    (apache2-mpm-prefork 2.2.22, OpenJDK 6 1.6.0_24, OpenKM 5.1.9)
  • Ubuntu Oneiric Ocelot 11.10 Test 완료. (2012-04-24)
    (apache2-mpm-prefork 2.2.20, Oracle Java 1.6.0_26, OpenKM 5.1.9)

1. OpenKM?

OpenKM은 Electronic Document Management System(EDMS)를 구축하기 위한 Solution으로 Community Version은 Open-source License(GPLv2)로 배포되며, 그 외에 Cloud Service나 Professional Support는 유료로 이용할 수 있습니다.

여기서 말하는 EDMS는 회사나 업무에서 사용하는 종이문서 대신 전자문서(Office files, images, etc.)를 사용하도록 함으로서 비용을 절감하고, 쉽게 문서를 관리할 수 있도록 돕는 System을 의미합니다.

OpenKM은 Java로 개발되어 있으며, JBoss, Lucene, jBPM등의 Open-source Package와 이 외의 Third-party Tool을 통하여 기능이 확장됩니다.

OpenKM이 지원하는 기능은 다음과 같습니다.

  • 문서 관리
  • 문서 Version 관리 (SCM과 유사한 저장소와 Revision 개념)
  • Image 관리
  • WebDAV로 문서 저장소에 접근 가능
  • Workflow 지원 (jBPM)
  • Lucene 검색 (문서 내부 검색 지원)
  • Multi-platform, Multi-database 지원
  • Web 2.0 UI, Mobile Web UI
  • 다국어 지원
  • 유의어 사전(Thesaurus) 지원

OpenKM에 대해서 더 자세히 알기 원한다면, OpenKM의 Demo Site에 접속해서 직접 사용해 보기 바랍니다.

2. 설치

OpenKM은 WAS인 JBoss를 사용하며 그 외에 여러 Library를 포함하고 있기 때문에 WAS와 Library를 포함한 통합 Package 형태로 Source를 배포합니다.

이번 항목에서는 OpenKM을 설치하는 방법과 Apache와 연동하여 사용하는 방법을 알아봅니다.

2.1. JDK 설치

OpenKM은 Java로 구현되어 있기 때문에 JDK가 필요합니다. JDK가 System에 설치되어 있지 않다면, 이전 Post의 5.3. Oracle Java 6 설치를 참고하기 바랍니다.

2.2. OpenKM 설치

이미 언급했지만 JBoss와 여러 Library가 포함된 형태로 배포되기 때문에 OpenKM을 설치할 Server에 Tomcat과 같은 다른 WAS가 설치되어 있다면 설치에 유의해야 합니다.

가급적이면 WAS가 설치된 Server에서는 설치하지 않는 것이 좋습니다. (그래도 설치해야 할 경우 OpenKM의 Wiki Page를 참고하기 바랍니다.)

OpenKM을 Download하기 위해서 아래의 Link에 접속합니다. OpenKM-5.1.x_JBoss-4.2.3.GA.zip 중에서 최신 Version을 Download하면 됩니다.

File을 Download한 다음, 다음과 같이 Terminal에서 입력하여 설치합니다.

1
$ sudo unzip OpenKM*.zip -d /opt

설치된 OpenKM을 위한 Start-up Script를 만들기 위해서 Terminal에서 다음과 같이 입력합니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
$ sudo vi /etc/init.d/jbossokm

#! /bin/sh
# /etc/init.d/jbossokm: Start and stop JBoss Application Service

ECHO=/bin/echo
TEST=/usr/bin/test
JBOSS_START_SCRIPT=/opt/jboss-4.2.3.GA/bin/run.sh
JBOSS_STOP_SCRIPT=/opt/jboss-4.2.3.GA/bin/shutdown.sh

$TEST -x $JBOSS_START_SCRIPT || exit 0
$TEST -x $JBOSS_STOP_SCRIPT || exit 0

start() (
   $ECHO -n "Starting JBoss"
   su -c "$JBOSS_START_SCRIPT -b 0.0.0.0 > /dev/null 2> /dev/null &"
   $ECHO "."
   )

stop () (
   $ECHO -n "Stopping JBoss"
   su -c "$JBOSS_STOP_SCRIPT -S > /dev/null &"
   $ECHO "."
   )

case "$1" in
      start )
            start
            ;;
      stop )
            stop
            ;;
      restart )
            stop
            sleep 30
            start
            ;;
      * )
            $ECHO "Usage: jbossokm {start|stop|restart}"
            exit 1
esac

exit 0

$ sudo chmod 755 /etc/init.d/jbossokm

이제 OpenKM을 실행해 봅시다. 다음과 같이 입력합니다.

1
$ sudo service jbossokm start

System Booting 시에 자동으로 실행하도록 설정하려면 다음과 같이 입력합니다.

1
$ sudo update-rc.d jbossokm defaults
OpenKM - First Run

OpenKM - First Run

이제 OpenKM이 제대로 실행되었는지 확인해 봅시다. http://localhost:8080/OpenKM/에 Browser로 접속하여 위와 같은 화면이 나온다면 정상적으로 실행된 것입니다.

위의 그림에 아래쪽을 보면 Warning이 표시되어 있습니다. 설치한 후 처음 실행했기 때문에 발생하는 Message로 이 문제를 해결하기 위해 Terminal에서 다음과 같이 입력합니다.

1
2
3
4
5
6
7
$ sudo service jbossokm stop
$ sudo vi /opt/jboss*/OpenKM.cfg

# hibernate.hbm2ddl의 값을 create에서 none으로 변경
hibernate.hbm2ddl=none

$ sudo service jbossokm start
OpenKM - Login

OpenKM - Login

변경 후, OpenKM에 다시 접속하면 위와 같이 Warning Message가 사라지는 것을 확인할 수 있습니다.

2.3. Apache와 연결

외부에서 Internet을 통해 OpenKM이 설치된 Server에 접근을 허용할 경우, OpenKM의 JBoss에 직접 접근하게 된다면 보안상 위험할 수 있습니다. JBoss의 보안 Issue 때문에 http port를 통해서 OpenKM에 접근하는 것이 조금 더 안전합니다.

다음은 Apache의 AJP13 Protocol을 이용하여 Apache와 OpenKM의 JBoss가 통신하도록 설정하는 방법을 설명합니다.

먼저 Apache가 설치되어 있지 않다면 설치해야 합니다. 다음과 같이 Terminal에서 입력합니다.

1
$ sudo apt-get install apache2

그 다음, 필요한 Apache Module을 활성화합니다.

1
2
3
$ sudo a2enmod proxy_ajp
$ sudo a2enmod proxy_http
$ sudo a2enmod headers

Apache의 mod_proxy 설정을 위해서 다음과 같이 입력합니다.

1
$ sudo vi /etc/apache2/mods-available/proxy.conf

<IfModule>과 </IfModule> 사이에 아래와 같은 내용을 입력하고 저장합니다.

1
2
3
4
5
6
7
8
9
  ProxyRequests Off
 
  <Proxy *>
    AddDefaultCharset off
    Order deny,allow
    Allow from all
  </Proxy>
 
  ProxyVia On

그리고 Apache의 Virtual Host 설정을 변경하기 위해서 다음과 같이 입력합니다.

1
$ sudo vi /etc/apache2/sites-enabled/000-default

<VirtualHost>와 </VirtualHost> 사이에 다음과 같이 입력하고 저장합니다.

1
2
3
4
<Location /OpenKM>
         ProxyPass ajp://127.0.0.1:8009/OpenKM
         ProxyPassReverse http://localhost/OpenKM
</Location>

설정을 적용하기 위해 Apache를 다시 시작합니다.

1
$ sudo service apache2 restart

만약 UFW 방화벽이 System에 활성화 되어 있다면 외부에서 접속이 가능하도록 다음과 같이 입력하여 설정합니다.

1
$ sudo ufw allow http
OpenKM - via Apache

OpenKM - via Apache

마지막으로 Test를 위해 Browser에서 http://localhost/OpenKM으로 접속합니다. 제대로 설정이 되었다면 위와 같이 정상적으로 Login Page가 표시될 것입니다.

3. 설정

이번 항목에서는 OpenKM을 설치한 후 기본적으로 설정해야 할 것들을 설명합니다.

3.1. OpenKM 설정

OpenKM - Login (Admin)

OpenKM - Login (Admin)

OpenKM을 설정하기 위해서는 OpenKM에 접속하여 Administrator 권한으로 Login해야 합니다. 설치 후, 기본적으로 제공되는 Admin ID는 okmAdmin, Password는 admin입니다.

OpenKM - Main (Admin)

OpenKM - Main (Admin)

Login하면 위와 같은 Main 화면이 표시될 것입니다. okmAdmin 계정으로 Login하면 왼쪽 아래의 빨간색 사각형 안에 okmAdmin 계정으로 접속했다는 Message가 표시됩니다.

OpenKM의 설정을 변경하기 위해서 오른쪽 위의 Administration Tab을 Click합니다.

OpenKM - Administration

OpenKM - Administration

Administration Tab은 okmAdmin 계정이나 관리자 권한을 가진 계정으로 Login했을 때만 표시가 됩니다.

먼저, 기본적으로 설정된 okmAdmin 계정의 비밀번호를 변경하기 위해서 상단 가운데의 User List Icon을 Click합니다.

OpenKM - User List

OpenKM - User List

User List에서 okmAdmin의 정보를 변경하기 위해 위의 그림에 표시한 것과 같이 연필 모양의 Icon을 Click합니다.

OpenKM - Edit User

OpenKM - Edit User

Edit User에서 Password에 새로 변경할 비밀번호를 입력하고 Confirm password에 한번 더 입력한 다음, Send를 눌러 저장합니다.

OpenKM - Configuration

OpenKM - Configuration

이번에는 Upload할 File의 크기를 변경해 봅시다. 상단 왼쪽의 Configuration Icon을 클릭한 다음, File 크기에 대한 Option인 max.file.size를 변경하기 위해 연필 Icon을 Click합니다.

OpenKM - Edit Configuration

OpenKM - Edit Configuration

Edit Configuration에서 Value에 원하는 값(MB 단위)를 넣고 Send를 누르면 Upload할 File의 크기가 변경됩니다.

이 밖에도 대부분의 OpenKM과 관련된 설정은 Administration의 Configuration에서 변경하면 됩니다. 하지만 Performance나 Unicode와 관련된 설정들이 이미 기본적으로 되어 있기 때문에 위에 언급한 정도만 수정하면 될 것 같습니다.

또한, OpenKM을 더 유용하게 만들어 주는 Third-party Tool에 대한 설정도 Configuration에서 설정합니다. 하지만 내용이 많은 관계로 다음 Post에서 좀 더 자세하게 설명하도록 하겠습니다.

3.2. 새 User 추가

okmAdmin 계정으로 사용하는 것 보다는 일반 User로 사용하는 것이 더 안전할 것입니다. 새로운 계정은 okmAdmin 계정과 같은 관리자 권한을 가진 계정에서만 만들 수 있습니다.

계정을 만드는 방법은 다음과 같습니다.

OpenKM - User List

OpenKM - User List

Administration Tab의 User List에서 위의 그림과 같이 + Button을 Click합니다.

OpenKM - Create User

OpenKM - Create User

Create User에서 ID, Password, Name, Mail을 입력하고, Active를 Check합니다. 그리고 Roles에서 UserRole을 선택하면 일반 계정이, AdminRole을 선택하면 관리자 계정이 됩니다.

모두 입력한 다음 Send를 눌러 저장합니다.

OpenKM - User List (Added)

OpenKM - User List (Added)

추가 되면 위와 같이 새로운 계정이 List에 등록된 것을 확인할 수 있습니다.

OpenKM - Main (User)

OpenKM - Main (User)

File -> Exit를 Click하여 Log out한 다음, 새로 생성한 일반 계정으로 Login하면 위와 같은 Main화면이 표시됩니다. 관리자 계정이 아니기 때문에 Administration Tab이 표시되지 않는 것을 확인할 수 있습니다.

4. 사용법

이번 항목에서는 OpenKM을 사용하여 문서를 관리하는 기본적인 방법에 대해서 간단하게 설명합니다.

4.1. 문서 추가

OpenKM에서 말하는 문서는 사실 모든 File을 의미합니다. 다만 지원하는 Office Format(doc, xls, ppt, odt, etc.)이나 PDF, Image(png, gif, jpg, etc.)에 대해서는 Preview와 같은 기능들을 지원하여 사용자가 Web Browser에서 해당 문서를 열람하거나 문서의 내용을 검색할 수 있기 때문에 좀 더 장점을 가지고 있습니다.

OpenKM - Add Document

OpenKM - Add Document

OpenKM에 Login하면 위와 같은 Main 화면이 표시될 것입니다. 먼저 문서를 Taxonomy에 올려봅시다.

Taxonomy는 우리가 흔히 사용하는 Folder Tree 구조를 의미합니다. 때문에 여기에 문서를 올리면 Folder 별로 문서를 나누어 관리할 수 있습니다.

문서를 추가하기 위해서 File -> Add document를 Click합니다.

OpenKM - Add New Documents

OpenKM - Add New Documents

Add new documents에서 파일 선택 Button을 눌러 Upload할 문서를 선택합니다. 그리고 Upload Button을 눌러서 문서를 Upload합니다.

OpenKM - Add New Documents (Uploaded)

OpenKM - Add New Documents (Uploaded)

Upload가 성공하면 위와 같은 화면이 표시됩니다. Add another file을 눌러서 문서를 더 추가하거나 Close를 눌러 문서 추가를 종료할 수 있습니다.

OpenKM - Main (Uploaded)

OpenKM - Main (Uploaded)

추가된 문서는 Taxonomy의 Folder 안에 추가됩니다. 왼쪽의 okm:root는 Root Directory를 의미합니다. File -> Create Folder를 눌러 새로운 Folder를 추가한 다음, Folder를 선택한 상태에서 문서를 추가할 경우에는 문서가 해당 Folder안에 존재하게 됩니다.

추가된 문서를 선택하면, 아래에 정보들이 표시됩니다. Properties Tab에서는 Keyword, Category를 설정할 수 있고, Notes Tab에서는 문서에 대한 설명이나 Memo를 적을 수 있습니다.

그리고 Security Tab에서는 문서의 권한을 보거나 설정할 수 있으며, History Tab에서는 문서의 변경사항을 보거나 변경 전으로 복구할 수 있습니다. 마지막으로 Preview Tab에서는 문서의 내용을 Flash를 통해 열람할 수 있습니다.

4.1.1. 여러 문서를 한 번에 추가하는 방법

위의 방법으로 여러 개의 문서를 추가하려면 각각의 File을 개별적으로 Upload하기 때문에 불편합니다. 한 번에 여러 개의 문서를 추가하기를 원한다면 먼저 추가할 문서를 ZIP Format으로 압축합니다. 미리 Folder를 만들어서 압축하면 추가 시에 Taxonomy에 Folder도 같이 추가됩니다.

OpenKM - Add New Documents (ZIP)

OpenKM - Add New Documents (ZIP)

문서를 압축한 ZIP File을 Upload하기 위해 File -> Add Document를 Click하면 위와 같은 화면이 나옵니다.

여기서 압축한 ZIP File을 선택한 다음, Import Documents from ZIP을 Check하고 Upload를 누릅니다. (압축된 File에 문서가 많다면 시간이 좀 걸릴 수 있습니다.)

OpenKM - Main (ZIP Uploaded)

OpenKM - Main (ZIP Uploaded)

Upload가 완료되면 위의 그림과 같이 ZIP File 내부의 Folder가 추가되면서 그 안에 들어있던 문서들도 그대로 Upload되는 것을 확인할 수 있습니다.

이 방법 외에도 WebDAV Protocol을 사용하면 DropBox나 다른 Cloud Service와 같이 Explorer나 Nautilus를 이용하여 OpenKM의 문서 저장소에 접근하여 간편하게 문서를 Upload하거나 지울 수 있습니다. 이것에 대해서는 다음 Post에서 WebDAV 설정과 함께 설명하도록 하겠습니다.

4.2. Check Out/Check In

OpenKM에서는 SCM인 Subversion과 유사한 저장소의 개념을 가지고 있기 때문에 문서를 Version 별로 관리할 수 있습니다. 이번 항목에서는 Check Out과 Check In을 통해 문서를 갱신하는 방법을 알아보겠습니다.

OpenKM - Check Out

OpenKM - Check Out

Check Out이라는 기능은 OpenKM에 등록된 문서를 변경하겠다는 것을 OpenKM에 알리고 Download하는 기능입니다.

먼저 변경할 문서를 선택한 다음, Edit -> Check out을 Click합니다.

OpenKM - Check In

OpenKM - Check In

Check Out이 되면 해당 문서는 Browser를 통해 Download됩니다. 그리고 그 문서는 Check Out 상태로 Check In을 기다리게 됩니다. Check In은 Check Out의 반대로 Check Out한 문서를 다시 OpenKM에 Upload하여 갱신하는 것을 의미합니다.

Check Out한 문서는 반드시 Check In이 되어야 합니다. 만약 Check Out을 중단하려면 Check Out한 문서를 선택하고 Edit -> Cancel check out을 Click하면 Check Out이 중단됩니다.

Download한 문서를 변경했다면 이제 Check In을 통해 Upload하여 OpenKM에 등록된 문서를 갱신해 봅시다. Check In할 문서를 선택하고 Edit -> Check in을 Click합니다.

OpenKM - Update Documents

OpenKM - Update Documents

Update Documents 창에서 변경한 문서를 선택하고 변경된 내용에 대해서 간단한 Comment를 입력한 다음, Upload를 누르면 Check In이 완료됩니다.

OpenKM - Main (Updated)

OpenKM - Main (Updated)

Check In이 완료되면 Check In한 문서는 위의 그림처럼 Version이 올라가게 됩니다.

OpenKM - Document History

OpenKM - Document History

그리고 해당 문서를 선택하고 아래쪽의 History Tab을 Click하면 Check Out/Check In을 통해서 갱신된 내역이 표시됩니다. 갱신되기 이전의 문서로 돌리기를 원하다면 여기서 Restore를 눌러 복구하면 됩니다.

4.3. Keyword

Keyword는 문서를 분류하기 위한 다른 방법입니다. 문서를 대표하는 단어로 문서를 분류하기 위한 기능인데 이것은 Blog에서 사용하는 Tag와 동일합니다.

OpenKM - Keywords

OpenKM - Keywords

Keyword를 추가하기 위한 문서를 선택한 다음, 아래의 Properties Tab에서 추가할 Keyword를 입력합니다. 여러 개의 Keyword를 동시에 추가하기를 원한다면 위의 그림과 같이 Space Bar로 구분하여 입력하면 됩니다.

OpenKM - Keywords (Added)

OpenKM - Keywords (Added)

Keyword가 추가되면 위의 그림과 같은 모습이 됩니다. 추가된 Keyword 옆의 -를 누르면 해당 Keyword를 제거할 수 있습니다.

그리고 Keywords cloud에서는 Blog의 Tag Cloud와 같이 Keyword에 포함된 문서의 개수에 따라 Keyword의 크기를 다르게 해서 보여줍니다.

OpenKM - Dashboard (Keyword Map)

OpenKM - Dashboard (Keyword Map)

문서에 Keyword를 추가해 놓으면 Keyword를 통해서 문서를 검색할 수 있습니다.

오른쪽 상단의 Dashboard Tab에서 Keyword map을 선택하면 위와 같은 화면이 표시됩니다. 여기서는 주로 사용된 Keyword를 확인하거나 Keyword가 적용된 문서를 검색할 수 있습니다.

OpenKM - Dashboard (Keyword Map, Selected)

OpenKM - Dashboard (Keyword Map, Selected)

위의 그림은 Opensource라는 Keyword를 선택한 모습입니다. 여러 개의 Keyword를 선택하면 해당 Keyword를 포함하는 문서를 List로 표시합니다.

4.4. Category

Category는 위에서 설명한 Taxonomy, Keyword외에 문서를 분류하는 또 다른 방법입니다.

Taxonomy가 기존의 문서를 Folder 구조로 관리한다면 Category는 Taxonomy에 등록된 문서들을 Taxonomy의 Folder 구조와는 상관없는 또 다른 Folder(Category) 구조로 문서를 분류할 수 있도록 도와주는 것입니다.

때문에 Category에서는 문서를 추가할 수가 없습니다. 단지 Folder를 생성하여 그것을 Category로 사용할 수 있게 만들어 줄 뿐입니다. 아래에서는 Category를 사용하는 방법을 설명합니다.

OpenKM - Categories

OpenKM - Categories

왼쪽의 Categories를 Click하면 위의 그림과 같이 Category가 Folder 구조로 표시됩니다. okm:categories는 Category들의 Root입니다.

OpenKM - Create Folder

OpenKM - Create Folder

Category를 새로 추가하기 위해서 File -> Create folder를 눌러서 새로운 Folder를 만들고 이름을 입력합니다.

OpenKM - Categories (Added)

OpenKM - Categories (Added)

이렇게 Categories에 만들어진 Folder는 그대로 하나의 Category가 됩니다.

OpenKM - Set Categories

OpenKM - Set Categories

이제 만들어진 Category에 문서를 추가해 봅시다. Taxonomy로 다시 넘어와서 Category에 추가하고 싶은 문서를 선택한 다음, 아래의 Properties Tab에 Categories Icon을 Click합니다.

OpenKM - Add Category

OpenKM - Add Category

Add Category 창이 표시되면 여기서 방금 전 생성한 Category를 선택하고 Add를 누릅니다. 여러 개의 Category에 추가하고 싶다면 다른 Category를 선택하고 Add를 누르면 됩니다.

Category 추가가 끝났다면 Close를 누릅니다.

OpenKM - Category Added

OpenKM - Category Added

Category가 추가된 모습입니다. Properties Tab의 Categories에 추가한 Category가 표시되는 것을 확인할 수 있습니다.

OpenKM - Categories (Added)

OpenKM - Categories (Added)

이제 Categories로 돌아와서 추가한 Category를 선택해 봅시다. 그러면 해당 Category에 속하는 Taxonomy의 문서가 표시될 것입니다.

4.5. Search

OpenKM의 Search 기능은 상당히 유용합니다. 문서 이름이나 Keyword 뿐만 아니라, 문서 내부의 Text도 검색할 수 있습니다. (다국어 지원)

OpenKM - Search

OpenKM - Search

오른쪽 상단의 Search Tab을 Click하면 문서 검색화면이 표시됩니다. 위의 검색항목에서 Context에는 검색할 문서 저장소를 선택합니다. 일반적으로 Taxonomy로 설정하면 됩니다.

Content에서 검색할 단어를 입력하고 Enter나 Search Button을 누르면 검색할 단어가 문서 내부에 포함되어 있는 지를 검색하여 해당 문서를 List로 표시합니다.

그리고 Name에서는 문서 이름으로, Keywords에서는 문서의 Keyword로 검색합니다.

마지막으로 검색을 초기화하려면 Clean을 누르면 됩니다.

OpenKM - Search Results

OpenKM - Search Results

위의 그림은 Taxonomy에 등록된 문서들 중에서 소프트웨어라는 단어가 내용에 들어간 문서를 검색한 결과입니다.

이 외에도 지면상 소개하지 않은 여러가지 기능들이 있습니다. OpenKM의 자세한 사용법은 OpenKM Wiki의 User Guide를 참고하기 바랍니다.

5. 마치면서…

이상으로 간단하게 OpenKM을 설치하는 방법과 사용법을 알아봤습니다. 개인적으로 문서들을 많이 취급하게 되는 터라 관리하기에 편한 Solution을 찾다보니 이렇게까지 삽질을 하게 되었네요. Enterprise 급의 문서 관리에 적용하는데는 부족하겠지만 작은 기업이나 개인적으로 사용하기에는 부족함이 없는 것 같습니다.

다음 Post에서는 OpenKM을 좀 더 편리하고 유용하게 사용하는 방법과 Migration, Backup에 대해서 알아보도록 하겠습니다. :)

Part1에 이어서 이번 Post에서는 OpenKM의 기능을 확장시켜주는 Third-party Tool과 Backup 등에 대해서 알아보도록 하겠습니다.

6. Third-party Tool 설정

대부분의 Open-source Solution이 그렇듯이 OpenKM도 여러 Open-source Tool과 함께 사용하면 기능이 더 확장되고 유용해집니다. 이번 항목에서는 Third-party Tool을 설치하고 OpenKM에서 사용할 수 있도록 설정하는 방법을 설명합니다.

6.1. PDF Preview

OpenKM의 Web Interface에서 PDF 문서를 미리보기할 수 있습니다. (미리보기를 위해서는 Browser에 Flash Plugin이 설치되어 있어야 합니다.)

먼저 PDF를 SWF로 변환하기 위해서 SWFTools를 설치해야 합니다. Ubuntu의 Repository에서 기본적으로 제공하지 않기 때문에 PPA에서 Build한 DEB Package로 설치해 봅시다.

Pacakge를 Download하기 위해서 Terminal에서 다음과 같이 입력합니다.

  • 32bit:
    1
    $ wget "https://launchpad.net/~ella-animation/+archive/dev/+files/swftools_0.9.1-0maverick2_i386.deb"
  • 64bit:
    1
    $ wget "https://launchpad.net/~ella-animation/+archive/dev/+files/swftools_0.9.1-0maverick2_amd64.deb"

Download한 Package를 설치하기 위해 다음과 같이 입력합니다.

1
2
$ apt-get install libjpeg62
$ sudo dpkg -i swftools*.deb
OpenKM - Configuration

OpenKM - Configuration

그 다음, OpenKM에 okmAdmin으로 접속한 후 Administration Tab에서 Configuration을 Click합니다.

여러가지 설정변수 중 system.swftools.pdf2swf를 찾아서 값을 편집하기 위해 연필 Icon을 Click합니다.

OpenKM - system.swftools.pdf2swf

OpenKM - system.swftools.pdf2swf

Value에 다음과 같은 값을 입력하고 Send를 눌러 저장합니다.

1
/usr/bin/pdf2swf -T 9 -f ${fileIn} -o ${fileOut}

마지막으로 OpenKM을 다시 시작하기 위해서 Terminal에서 다음과 같이 입력합니다.

1
$ sudo service jbossokm restart
OpenKM - PDF Preview

OpenKM - PDF Preview

다시 시작된 OpenKM에 접속해서 PDF문서를 Click한 다음, 아래의 Preview Tab을 Click하면 위의 그림과 같이 PDF문서의 내용을 확인할 수 있습니다.

6.2. Image Preview

OpenKM에 Image(gif, png, jpg, etc.)를 Upload할 경우, Image 또한 Preview를 통해서 미리보기가 가능합니다.

Image Preview를 위해서는 Image Format 변환을 위해 ImageMagick을 설치해야 합니다. 설치를 위해서 Terminal에서 다음과 같이 입력합니다.

1
$ sudo apt-get install imagemagick
OpenKM - Configuration

OpenKM - Configuration

OpenKM에서 okmAdmin으로 접속한 다음, Administration의 Configuration에서 system.imagemagick.convert 환경변수를 변경하기 위해 연필 Icon을 Click합니다.

OpenKM - system.imagemagick.convert

OpenKM - system.imagemagick.convert

Value에 다음과 같은 값을 입력하고 Send를 누릅니다.

1
/usr/bin/convert

변경된 설정을 OpenKM에 적용하기 위해 다음과 같이 입력하여 OpenKM을 다시 시작합니다.

1
$ sudo service jbossokm restart
OpenKM - Image Preview

OpenKM - Image Preview

다시 시작된 OpenKM에 접속하여 Image File을 Upload한 다음, Preview를 누르면 위의 그림과 같이 Image가 표시되는 것을 확인할 수 있습니다.

6.3. Tesseract OCR

OCR은 Image에서 Text를 추출하는 Program입니다. OpenKM에서는 Open-source OCR Program을 이용하여 검색 시에 Image(tif, png, jpg, gif) 내에 포함되어 있는 Text까지 검색하여 결과를 표시합니다.

OpenKM은 Open-source OCR 중 Tesseract와 Cuneiform을 지원하지만 여기서는 인식률이 좀 더 나은 Tesseract를 사용하는 방법에 대해서 설명합니다.

Tesseract는 Ubuntu repository에 포함되어 있습니다. 하지만 최신의 Tesseract를 사용하려면 PPA를 이용해야 합니다. 다음과 같이 입력하여 Tesseract를 설치합니다.

1
2
$ sudo add-apt-repository ppa:gezakovacs/tesseract
$ sudo apt-get update && sudo apt-get install tesseract-ocr tesseract-ocr-eng

Tesseract는 기본적으로 영문 Text를 추출할 수 있습니다. 만약, Image 내의 한글을 추출하기 원한다면 다음과 같이 입력하여 한국어 Language Data를 설치합니다.

1
2
3
$ cd /usr/share/tesseract-ocr/tessdata
$ sudo wget "http://tesseract-ocr.googlecode.com/files/kor.traineddata.gz"
$ sudo gunzip kor.traineddata.gz
OpenKM - Configuration

OpenKM - Configuration

OpenKM에서 okmAdmin으로 접속한 다음, Administration의 Configuration에서 system.ocr을 찾아서 옆의 연필 Icon을 Click합니다.

OpenKM - system.ocr

OpenKM - system.ocr

Value에 다음 중 하나를 선택하여 입력하고 Send를 누릅니다. 여기서 유의할 점은 한국어로 설정한 경우 영문이 포함된 Image에서는 제대로 영문을 추출할 수 없다는 것입니다. 영어로 설정한 경우에는 당연히 한글을 추출할 수 없겠죠. :(

  • 영어:
    1
    /usr/bin/tesseract ${fileIn} ${fileOut}
  • 한국어:
    1
    /usr/bin/tesseract ${fileIn} ${fileOut} -l kor

설정을 저장한 후, 다음과 같이 입력하여 OpenKM을 종료합니다.

1
$ sudo service jbossokm stop

OpenKM에서 검색을 위한 Data를 만들 때, OCR을 사용하도록 설정하기 위해 다음과 같이 입력하여 설정파일을 편집기로 엽니다.

1
$ sudo vi /opt/jboss*/repository.xml

내용 중에서 textFilterClasses를 검색한 다음, value를 다음과 같이 변경하고 저장합니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<param name="textFilterClasses" value="
org.apache.jackrabbit.extractor.PlainTextExtractor,
org.apache.jackrabbit.extractor.MsWordTextExtractor,
org.apache.jackrabbit.extractor.MsExcelTextExtractor,
org.apache.jackrabbit.extractor.MsPowerPointTextExtractor,
org.apache.jackrabbit.extractor.OpenOfficeTextExtractor,
org.apache.jackrabbit.extractor.RTFTextExtractor,
org.apache.jackrabbit.extractor.HTMLTextExtractor,
org.apache.jackrabbit.extractor.XMLTextExtractor,
org.apache.jackrabbit.extractor.PngTextExtractor,
org.apache.jackrabbit.extractor.MsOutlookTextExtractor,
com.openkm.extractor.PdfTextExtractor,
com.openkm.extractor.AudioTextExtractor,
com.openkm.extractor.ExifTextExtractor,
com.openkm.extractor.Tesseract3TextExtractor,
com.openkm.extractor.SourceCodeTextExtractor,
com.openkm.extractor.MsOffice2007TextExtractor"/>

그리고 다음과 같이 입력하여 또 다른 설정 파일을 편집기로 엽니다.

1
$ sudo vi /opt/jboss*/repository/workspaces/default/workspace.xml

여기서도 마찬가지로 textFilterClasses를 검색하여 value를 다음과 같이 변경하고 저장합니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<param name="textFilterClasses" value="
org.apache.jackrabbit.extractor.PlainTextExtractor,
org.apache.jackrabbit.extractor.MsWordTextExtractor,
org.apache.jackrabbit.extractor.MsExcelTextExtractor,
org.apache.jackrabbit.extractor.MsPowerPointTextExtractor,
org.apache.jackrabbit.extractor.OpenOfficeTextExtractor,
org.apache.jackrabbit.extractor.RTFTextExtractor,
org.apache.jackrabbit.extractor.HTMLTextExtractor,
org.apache.jackrabbit.extractor.XMLTextExtractor,
org.apache.jackrabbit.extractor.PngTextExtractor,
org.apache.jackrabbit.extractor.MsOutlookTextExtractor,
com.openkm.extractor.PdfTextExtractor,
com.openkm.extractor.AudioTextExtractor,
com.openkm.extractor.ExifTextExtractor,
com.openkm.extractor.Tesseract3TextExtractor,
com.openkm.extractor.SourceCodeTextExtractor,
com.openkm.extractor.MsOffice2007TextExtractor"/>

마지막으로 설정을 적용하기 위해서 OpenKM을 시작합니다.

1
$ sudo service jbossokm start
OpenKM - OCR Test

OpenKM - OCR Test

Test하는 방법은 간단합니다. 위의 그림에서와 같이 Text가 들어가 있는 Image를 OpenKM에 Upalod합니다. Image를 Upload할 때, Tesseract가 내부적으로 실행되면서 추출한 내용을 검색 Data에 저장합니다.

OpenKM - Search Result

OpenKM - Search Result

Search Tab에서 Content에 Image 안의 단어 중 하나를 넣어서 검색했을 때, 아래의 검색결과에 해당 Image가 표시된다면 제대로 설정이 된 것입니다.

6.4. OpenOffice.org Integration

Ubuntu Precise Pangolin 12.04에서는 LibreOffice 3.5.3.2를 이용하여 미리보기를 표시할 수 없습니다. OpenKM에 포함되어있는 JODConverter와 LibreOffice간에 통신에 제대로 이루어지지 않는 것 같네요. 아직까지는 해결할 수 있는 방법이 없는 것 같습니다. (soffice.bin이 headless로 실행되다가 갑자기 종료됨)

server.log는 다음과 같습니다.

1
2
3
4
5
6
7
8
2012-05-22 16:37:00,938 INFO  [org.artofsolving.jodconverter.office.OfficeProcess] starting process with acceptString 'socket,host=127.0.0.1,port=2002,tcpNoDelay=1' and profileDir '/tmp/.jodconverter_socket_host-127.0.0.1_port-2002'
2012-05-22 16:37:01,078 INFO  [org.artofsolving.jodconverter.office.OfficeProcess] started process
2012-05-22 16:37:31,261 WARN  [com.openkm.servlet.RepositoryStartupServlet] failed to start and connect
org.artofsolving.jodconverter.office.OfficeException: failed to start and connect
        at org.artofsolving.jodconverter.office.ManagedOfficeProcess.startAndWait(ManagedOfficeProcess.java:61)
        at org.artofsolving.jodconverter.office.PooledOfficeManager.start(PooledOfficeManager.java:102)
        at org.artofsolving.jodconverter.office.ProcessPoolOfficeManager.start(ProcessPoolOfficeManager.java:59)
        at com.openkm.util.DocConverter.start(DocConverter.java:164)

OpenKM에서는 Office Format(docx, doc, xlsx, xls, pptx, ppt, odt, etc.)의 File을 미리보기 할 수 있습니다. (미리보기를 위해서는 먼저 6.1의 SWFTools를 설치해야 합니다.)

미리보기를 위해서 OpenKM은 OpenOffice.org를 사용합니다. 때문에 MS Office 관련 Format을 미리보기 할 경우, OpenOffice.org에서 해당 문서를 연 모습과 같이 표시되기 때문에 Layout이나 Font가 기존의 문서와 조금 다를 수 있습니다.

기본적으로 Ubuntu에서는 OpenOffice.org의 Fork인 Libre Office가 설치되어 있는데 다음과 같이 입력하여 OpenOffice.org를 설치합니다.

1
$ sudo apt-get install openoffice.org

OpenOffice.org Package를 설치한다고 해도, 실제적으로 새로 OpenOffice.org가 설치되는 것은 아닙니다. Libre Office가 OpenOffice.org의 역할을 대신할 수 있도록 필요한 몇 가지 Package만 설치하게 됩니다.

OpenKM - Configuration

OpenKM - Configuration

OpenKM에서 okmAdmin으로 접속한 다음, Administration의 Configuration에서 system.openoffice.path를 찾아 옆의 연필 Icon을 Click합니다.

OpenKM - system.openoffice.path

OpenKM - system.openoffice.path

Value에 다음과 같이 입력하고 Send를 눌러 저장합니다.

1
/usr/lib/libreoffice

저장한 설정을 OpenKM에 적용하기 위해서 다음과 같이 입력합니다.

1
$ sudo service jbossokm restart
OpenKM - PPT Preview

OpenKM - PPT Preview

설정이 적용된 OpenKM에서 Office Format의 문서를 Upload한 다음, Preview를 Click하면 위의 그림과 같이 해당 문서의 내용을 확인할 수 있습니다.

6.5. Anitivirus

Antivirus Program을 OpenKM에서 사용하도록 설정하면, Upload하는 문서가 Virus에 감염되어 있을 경우, 해당 문서를 Repository에 등록하지 않고 사용자에게 해당 문서가 문제가 있다는 것을 알려줍니다.

OpenKM은 Antivirus Program으로 Open-source인 ClamAV를 지원합니다. 설치를 위해서 다음과 같이 Terminal에서 입력합니다.

1
2
$ sudo apt-get install clamav      
$ sudo freshclam
OpenKM - Configuration

OpenKM - Configuration

OpenKM에서 okmAdmin으로 접속한 후, Administration의 Configuration에서 system.antivir을 찾아 옆의 연필 Icon을 Click합니다.

OpenKM - system.antivir

OpenKM - system.antivir

Value에 다음과 같이 입력하고 Send를 눌러 저장합니다.

1
/usr/bin/clamscan

설정을 적용하기 위해서 다음과 같이 입력하여 OpenKM을 다시 시작합니다.

1
$ sudo service jbossokm restart
OpenKM - Virus Detected

OpenKM - Virus Detected

위의 그림은 실제 사용하다가 문서 내의 Virus를 감지한 모습입니다. ZIP으로 문서를 묶어서 Upload한 경우에도 Virus를 검색하여 문제가 있는 File을 걸러내어주니 제법 유용합니다.

7. WebDAV 설정

WebDAV는 HTTP를 통해서 Server 내의 문서를 편집하거나 관리하는 방법을 표준으로 정한 Protocol입니다.

OpenKM에서는 WebDAV를 지원하여 WebDAV Client를 통해서 마치 File System에 있는 것처럼 Repoisitory의 문서를 편하게 열람하고 관리할 수 있습니다.

이번 항목에서는 OpenKM에서 WebDAV를 사용할 수 있도록 설정하는 방법과 Linux, Windows에서 WebDAV Client를 사용하여 접속하는 방법을 설명합니다.

7.1. OpenKM 설정

먼저 OpenKM에서 WebDAV를 지원하도록 설정하는 방법에 대해서 알아봅시다.

OpenKM - Configuration

OpenKM - Configuration

OpenKM Web Interface에서 okmAdmin으로 접속한 다음, Administration의 Configuration에서 system.webdav.server, system.webdav.fix 설정변수를 편집(연필 Icon Click)합니다.

OpenKM - system.webdav.server

OpenKM - system.webdav.server

system.webdav.server 환경변수의 Value를 Check한 다음, Send를 누르면 OpenKM이 WebDAV Protocol을 지원하게 됩니다.

OpenKM - system.webdav.fix

OpenKM - system.webdav.fix

system.webdav.fix 환경변수를 설정하면, Taxonomy의 Root인 okm:root의 ‘:’을 Windows에서는 Folder명으로 사용할 수 없기 때문에 대신 okm_root로 변경해 줍니다.

Windows에서 접속하여 사용할 것이라면 Value에 Check하고 Send를 눌러 저장합니다.

7.2. Linux에서 WebDAV를 통하여 OpenKM에 접근하는 방법

Linux에서 davfs2를 설치하면 WebDAV를 통하여 OpenKM의 Repository에 접근해서 File System처럼 문서를 열람하고 관리할 수 있습니다.

Ubuntu의 경우, 설치를 위해서 Terminal에서 다음과 같이 입력합니다.

1
2
$ sudo apt-get install davfs2
$ sudo dpkg-reconfigure davfs2
davfs2 Configuration

davfs2 Configuration

설치 시, davfs2를 이용하여 Root 계정이 아닌 일반 계정에서도 Mount하여 사용할 수 있도록 설정할 지 여부를 묻는 창이 위의 그림과 같이 나온다면 예를 선택하고 Enter를 누릅니다.

설치가 완료된 다음, davfs2를 사용할 User를 설정하고 Mount Point를 설정하기 위해 아래와 같이 입력합니다. (User가 foo인 경우)

1
2
$ sudo usermod -a -G davfs2 foo
$ sudo mkdir /home/foo/.media/okmdav -p

그리고 Mount Point에 대한 정보를 저장하기 위해서 /etc/fstab을 아래와 같이 편집하여 저장합니다. (OpenKM의 접속 URL이 http://www.example.com/OpenKM일 경우)

1
2
3
4
$ sudo vi /etc/fstab

# OpenKM WebDAV
http://www.example.com/OpenKM/webdav /home/foo/.media/okmdav davfs rw,user,noauto 0 0

이제 Mount가 제대로 이루어지는지 Test해 봅시다. 아래와 같이 입력합니다.

1
2
3
4
5
6
7
8
9
10
$ mount ~/.media/okmdav
Please enter the username to authenticate with server
http://www.example.com/OpenKM/webdav or hit enter for none.
  Username:
Please enter the password to authenticate user ioriy2k with server
http://www.example.com/OpenKM/webdav or hit enter for none.
  Password:  

$ ls ~/.media/okmdav
lost+found  okm_mail  okm_personal  okm_root  okm_templates

Username과 Password에는 OpenKM에 접속할 ID와 Password를 입력하면 됩니다.

Mount된 Directory에는 위와 같이 여러 Folder가 존재하는데 Taxonomy에 등록된 문서는 모두 okm_root 안에 위치합니다.

제대로 Mount가 되었다면, Mount 시의 번거로움을 줄이기 위해 OpenKM에 접속할 ID와 Password 정보를 저장해 봅시다. 다음과 같이 입력합니다. (OpenKM의 URL이 http://www.example.com/OpenKM, ID가 foo, Password가 bar인 경우의 예)

1
2
3
4
$ vi ~/.davfs2/secrets

# OpenKM
http://www.example.com/OpenKM/webdav    foo    "bar"

Mount Point에 편리하게 접근하고 싶다면, 다음과 같이 입력하여 Symbolic Link를 만들면 됩니다.

1
$ ln -sf ~/.media/okmdav/okm_root ~/문서/OpenKM
7.2.1. Login 시에 Mount하는 방법

OpenKM을 WebDAV를 통하여 Mount할 경우 Network 연결을 이용한 Mount의 특성 상 System 시작 시에 자동으로 Mount하지 않습니다.

하지만 편리하게 사용하기 위해서 Desktop 환경에 Login 시에 자동으로 Mount할 수 있도록 설정할 수 있습니다. 먼저 다음과 같이 입력하여 Mount를 위한 Script를 만듭니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
$ mkdir ~/.local/bin -p
$ vi ~/.local/bin/mount.okm

#!/bin/bash
 
grep okmdav /proc/mounts > /dev/null
 
if [ $? == 0 ]; then
    umount ~/.media/okmdav/
fi

mount ~/.media/okmdav/

$ chmod 755 ~/.local/bin/mount.okm

작성한 Script를 시작 Program에 등록하기 위해 아래와 같이 입력합니다.

1
$ gnome-session-properties
Startup Applications

Startup Applications

시작 프로그램 기본 설정에서 추가 Button을 누르면 위의 그림과 같이 입력 창이 표시됩니다. 다음과 같이 입력하고 확인을 눌러 저장한 후, Logout, Login하면 OpenKM이 자동으로 Mount됩니다. (User가 foo인 경우)

  • 이름: OpenKM WebDAV
  • 명령: /home/foo/.local/bin/mount.okm

7.3. Windows에서 WebDAV를 통하여 OpenKM에 접근하는 방법

Windows에서도 WebDAV를 통하여 OpenKM에 접근할 수 있습니다. Linux에서와 마찬가지로 File System 처럼 Mount하기 때문에 탐색기에서 문서를 편리하게 관리할 수 있습니다.

WIndows에서 기본적으로 제공하는 WebDAV Protocol 연결은 문제가 있기 때문에 상용 WebDAV Client인 WebDrive를 사용하여 연결해 봅시다. WebDrive는 여기서 Trial을 받아 설치할 수 있습니다.

Start Menu - WebDrive

Start Menu - WebDrive

WebDrive를 설치했다면 WebDrive -> WebDrive를 Click하여 실행합니다.

WebDrive - Program Settings

WebDrive - Program Settings

먼저 설정을 변경하기 위해 File -> Program Settings를 Click합니다.

WebDrive - General Settings

WebDrive - General Settings

MS Office 문서를 편집할 때의 Performance를 높이기 위해서 General Settings의 Disable DFS (improves performance of MS Office)를 Check하고 OK를 누릅니다.

WebDrive - New Site

WebDrive - New Site

이제 OpenKM Site를 등록하기 위해서 New Site Button을 Click합니다.

WebDrive - Site Wizard

WebDrive - Site Wizard

Site Wizard에서 Connect by Server Type (SFTP, WebDAV, FTP, etc.)를 선택하고 다음을 누릅니다.

Site Wizard - Server Type

Site Wizard - Server Type

Server type을 WebDAV로 선택하고 다음을 누릅니다. 만약 OpenKM Server가 HTTPS를 지원한다면 Connect Securely를 Check합니다.

Site Wizard - Server URL

Site Wizard - Server URL

Enter the URL for the Server에 OpenKM의 WebDAV 접속 URL을 입력하고 다음을 누릅니다. 예를 들어 OpenKM의 접속 URL이 “http://www.example.com/OpenKM”이라면 WebDAV 접속 URL은 “http://www.example.com/OpenKM/webdav/okm_root”가 됩니다.

Site Wizard - Account Information

Site Wizard - Account Information

Username과 Password에 OpenKM에 접속하기 위한 ID와 Password를 입력합니다. 그리고 제대로 연결이 되는지 확인하기 위해서 Test Connection을 누릅니다.

Site Wizard - Test Connection

Site Wizard - Test Connection

Test Connection으로 확인하여 제대로 연결되었다면 위와 같은 Message를 표시할 것입니다. Close를 눌러 Test를 종료합니다.

Site Wizard - Site Name

Site Wizard - Site Name

그 다음 WebDAV 접속에 대한 이름을 입력하고 Drive를 설정한 후, 다음을 누릅니다.

Site Wizard - Finish

Site Wizard - Finish

마지막으로 Windows Login이나 시작 시에 자동으로 Mount되도록 설정하려면 Connect at login/startup을 Check합니다. 그리고 마침을 누릅니다.

WebDrive - Properties

WebDrive - Properties

Site 등록이 완료되었으면, OpenKM을 위한 설정을 위해서 Properties를 Click합니다.

WebDrive - Properties (File)

WebDrive - Properties (File)

Site Properties의 File에서 다음과 같은 항목의 설정을 변경하고 OK를 누릅니다.

  • Encode filenames in UTF-8, Cache temporary MS Office files를 Check
  • Enable Quota Processing의 Check를 해제
WebDrive - Connect

WebDrive - Connect

설정이 모두 완료되었으니 이제 Mount해 봅시다. Connect Button을 Click합니다.

Explorer - Connected

Explorer - Connected

제대로 Mount 되었다면 위의 그림과 같이 탐색기로 OpenKM의 Repository를 접근할 수 있게 됩니다.

8. Backup & Migration

이번 항목에서는 마지막으로 OpenKM을 Backup하는 방법과 새로운 Version이 나왔을 때 Migration하는 방법을 간단하게 설명합니다.

8.1. Backup/Restore

OpenKM은 Solution으로 되어 있기 때문에 필요한 것만 골라서 Backup하기가 용이하지 않습니다.

okmAdmin으로 접속할 경우, Administration에서 Export/Import를 지원하지만 문서에 대한 Metadata 정보를 제대로 가져오지 못하기 때문에 문서만 Backup하는 경우 외에는 거의 의미가 없습니다.

가장 간단하고 편리하게 전체를 Backup하는 방법은 압축하여 보관하는 방법입니다. 예를 들어 Backup 명령을 실행해 본다면 다음과 같습니다. (/backup/openkm에 Backup하는 경우)

1
2
$ cd /opt
$ sudo tar cvzf /backup/openkm/openkm-`date +%Y-%m-%d`.tar.gz jboss*

Backup한 OpenKM 압축을 Restore하기 위해서는 다음과 같이 명령을 입력하면 될 것입니다.

1
$ sudo tar xvzf /backup/openkm/openkm-2012-05-01.tar.gz -C /opt

물론 Restore 후, Startup Script와 Apache 연결은 Part1을 참고하여 다시 설정해야 합니다.

8.2. Migration

Backup과 마찬가지로 Migration도 쉬운 편은 아닙니다. 현재 사용하고 있는 OpenKM의 Version에서 다음 Version으로 차례대로 Migration을 해 나가야 합니다.

예를 들어 사용하고 있는 OpenKM의 Version이 5.1.8이라면, 5.1.10까지 Migration하기 위해서 5.1.9로 먼저 Migration한 다음, 5.1.10으로 Migration해야 합니다.

Migration을 위한 일반적인 방법은 아래와 같습니다.

Migration은 각 Version마다 각각 조금씩 추가된 과정이 더 있을 수 있습니다. 자세한 Migration 방법은 OpenKM의 Wiki를 참고하기 바랍니다.

  1. Backup을 만듭니다. (Backup/Restore 항목 참조)
  2. Service를 정지합니다.
    1
    $ sudo service jbossokm stop
  3. Migration할 새 Version의 OpenKM을 Download합니다.
  4. Download한 OpenKM 압축에서 server/default/deploy/OpenKM.war를 압축해제합니다.
    1
    $ unzip OpenKM*.zip jboss*/server/default/deploy/OpenKM.war
  5. 압축 해제한 OpenKM.war를 설치된 OpenKM에 덮어씁니다.
    1
    $ sudo mv jboss*/server/default/deploy/OpenKM.war /opt/jboss*/server/default/deploy/
  6. Update를 위해 설치된 OpenKM의 OpenKM.cfg를 다음과 같이 수정합니다.
    1
    2
    3
    $ sudo vi /opt/jboss*/OpenKm.cfg

    hibernate.hbm2ddl=update
  7. Service를 시작합니다.
    1
    $ sudo service jbossokm start
  8. 마지막으로 OpenKM.cfg를 한 번 더 수정합니다.
    1
    2
    3
    $ sudo vi /opt/jboss*/OpenKm.cfg

    hibernate.hbm2ddl=none

9. 마치면서…

이상으로 OpenKM에 대해서 알아봤습니다. Open-source Solution이 가지는 특성 상 지원이 조금 미흡하고, Update나 Backup이 좀 불편하긴 하지만, 유용하게 사용할 수 있는 Solution이라고 생각됩니다.

많은 문서들을 관리하기 버거워하는 분이 있다면 이번에 소개한 OpenKM은 좋은 해답이 되어 줄 것입니다. :)

이제 Project를 Checkout 받았으니 Eclipse를 통해서 Project source를 관리할 수 있습니다. Subclipse의 기본적인 개념은 Subversion의 그것과 동일합니다. Subversion을 잘 모른다면 KLDP의 Wiki page를 참고하면 도움이 될 것입니다. 간단하게 Subclipse의 주요 기능에 대해서 알아봅시다.

1. Team Synchronizing Perspective

Team Synchronizing Perspective는 Eclipse IDE를 변경시켜 Subclipse에서 제공하는 CVS, SVN 등의 소스관리 툴과 연동을 위한 동작을 처리하기 위한 작업환경입니다.

fb4-subclipse19

Perspective 를 변경하기 위해서는 Package Explorer에서 해당 Project위에서 Mouse 오른쪽 button으로 Popup을 띄운 후, Team->Synchronize with Repository를 클릭합니다.

fb4-subclipse20

처음으로 Team Synchronizing Perspective를 실행한 경우 아래와 같은 Message가 표시됩니다. Yes를 클릭합니다.

fb4-subclipse21

Team Synchronizing Perspective를 IDE에 설정한 화면입니다. 왼쪽에 Source관리를 위한 Synchronize View와 Task Repositories View가 표시됩니다. Synchronize View에서는 SVN의 각 동작을 처리할 수 있고, Task Repositories에서는 Local 저장소를등록하고 관리할 수 있습니다.

2. Update

Project를 저장소로 부터 Update 받기 위해서는, Package Explorer에서 Update 받을 Project의 Folder위에서 Popup을 띄운 후, Team->Update to HEAD 또는 Update to version을 클릭하면 됩니다.

여기서 Update to HEAD는 저장소에서 현재 최신의 Source를 Update하며, Update to version은 저장소에서 해당 Revision의 Source를 가지고 현재 Source를 Update합니다.

3. Commit

Project를 개발하다가 저장소에 변경된 내용을 저장하기 위해서는 Commit을 해야 합니다. Commit하기 전에는 먼저 저장소에 변경된 내용이 없는 지 확인하기 위해서 먼저 Update를 수행하는 것 좋습니다. 변경된 Source file은 Package Explorer에서 해당 Source의 Icon이 변경되어 있는 것으로 확인할 수 있습니다.

Commit을 하기 위해서는 Package Explorer에서 Commit할 Source가 존재하는 Project의 Folder위에서 Popup을 띄운 후, Team->Commit을 클릭합니다.

fb4-subclipse22

클릭하면 위와 같은 Commit Dialog가 화면에 표시됩니다. 위에 Textarea에는 변경사항을 텍스트로 적을 수 있고 아래의 Tree에는 변경된 Source의 목록이 표시됩니다. 여기서 Check된 항목만 Commit되기 때문에 Commit시에 필요한 파일만 Commit할 수도 있습니다. OK를 누르게 되면 Commit이 완료됩니다.

4. History

저장소의 History를 확인할 수 있습니다. 누가 어떤 Source의 무슨 내용을 변경했는지에 대한 정보를 확인할 수 있습니다. 누가 저장소에 Source를 잘못 올려놓아서 Update를 했는데 Compile이 되지 않거나 문제가 생긴다면 추적하는데 사용할 수 있습니다.ㅋㅋ

Package Explorer에서 Project Folder위에서 Popup을 띄운 후, Team->Show History를 클릭하면 아래와 같이 History View가 아래에 표시됩니다.

fb4-subclipse23

5. Revert

현재 변경된 Source의 수정된 내용을 무시하고 저장소에 저장된 이전 Source로 돌리고 싶을 때 사용합니다. Package Explorer에서 변경된 Source위에서 Popup을 띄우고 Team->Revert를 클릭하면 아래와 같이 Revert Dialog가 뜹니다.

fb4-subclipse24

되돌릴 Source에 체크한 후 OK를 누르면 저장소의 최신버전으로 선택한 Source를 변경합니다.

6. Branch/Tag 생성하기

쉽게 이야기 하면 Branch는 현재 Project에서 다른 가지로 나와서 새로운 기능을 시도하는 등의 변종 Project를 의미하고, Tag는 현재 Project를 Release하는 시점의 Source를 보관하고 Version tag를 붙인 Source를 의미합니다. Branch와 Tag를 생성하기 위해서는, Branch와 Tag를 할 Folder의 상위 Folder를 선택한 후, Mouse 오른쪽 Popup에서 Team->Branch/Tag를 클릭합니다.

fb4-subclipse25

Branch/Tag Dialog에서 Copy to URL에는 해당 Branch 또는 Tag가 저장될 저장소의 주소를 입력하고 Next를 클릭합니다.

fb4-subclipse26

저장소의 어떤 Revision을 Branch 또는 Tag로 등록할지에 대해서 선택합니다. 위의 그림에서는 최신 Revision에 대하여 Branch/Tag를 등록하는 설정입니다. Next를 클릭합니다.

fb4-subclipse27

마 지막으로 Comment를 작성하고 Finish를 클릭하면 저장소의 해당 위치에 Branch/Tag가 등록됩니다. 등록이 최종 완료되면 위와 같은 그림처럼 Package Explorer에서 해당 위치에 등록 된 것을 확인할 수 있습니다.

fb4-subclipse28

7. 마치면서

이상으로 Eclipse 3.5 Galileo에 설치된 Subclipse 1.6의 각 기능들을 간단하게 살펴보았습니다. Subclipse로 Eclipse에서 작업하는 모든 Project의 Source를 효율적으로 관리하시길 바랍니다.

– God Bless..

지난 Post에 이어서 Ubuntu에서 Valgrind로 Memory Leak을 검사하는 방법의 활용편으로 Valgrind의 GUI Front-end로 Memory Leak을 검사하는 방법과 Callgrind를 사용하는 간단한 방법, 그리고 Eclipse 내에서 Valgrind를 사용하는 방법을 알아보도록 하겠습니다.

5. 유용한 Front-end

Valgrind를 사용해서 Terminal에서 Memory Leak을 검사하는 방법을 알아봤지만, 아무래도 좀 더 보기 편리하고 사용하기 쉬운 쪽이 생산성이 좋을 것입니다. 그래서 이번에는 Valgrind를 위한 유용한 Front-end를 소개하려 합니다.

5.1. Alleyoop Memory Checker

Alleyoop은 GTK+ 기반으로 만들어진 GUI Front-end입니다. 이 Program은 Valgrind의 Memcheck Tool의 결과를 좀 더 보기 쉽게 표현해 주고 해당 Code를 쉽게 확인할 수 있습니다.

먼저 설치를 위해서 Terminal에서 다음과 같이 입력합니다.

1
$ sudo apt-get install alleyoop

위에서 작성한 Test Program을 가지고 Alleyoop을 사용해서 Memory Leak을 검사해 봅시다. Terminal에서 다음과 같이 입력합니다. (아래의 예는 Source의 Directory가 ~/test, 실행 File이 ./test일 경우)

1
$ alleyoop -R ~/test/ ./test

-R Option을 사용하면 해당 Directory 내에서 Memory Leak이 발생한 Source Code를 찾게 됩니다. 만약 Memory Leak을 검사할 Program이 Argument(명령행 인자)를 가지고 있다면, 위의 명령에서 검사할 Program 뒤에 그대로 이어서 적으면 됩니다.

Alleyoop - Preferences

Alleyoop - Preferences

실행한 다음, 설정 -> 기본 설정에서 Memory Leak을 검사하기 위한 설정을 해야 합니다. 위의 그림과 같이 Memcheck Tab에서 Leak Check를 full로, Leak Resolution을 high로 설정하고 OK를 누릅니다.

Alleyoop - Run

Alleyoop - Run

그 다음 상단 Toolbar의 Run을 누르면 Program이 실행됩니다. Test Program이 종료된 후에는 위의 그림과 같이 Valgrind의 Memcheck Tool을 통해 얻은 정보가 아래의 Treeview에 표시됩니다.

Memory Leak이 발생한 경우에는 위의 그림과 같이 해당 Source의 일부분과 발생한 Line을 표시해 주기 때문에 쉽게 문제가 발생한 부분을 확인할 수 있습니다.

Gedit

Gedit

그리고 Memory Leak을 나타내는 Code를 Double-Click하면 문제가 발생한 부분을 쉽게 편집할 수 있도록 Gedit가 실행되면서 해당 Source에서 Memory Leak이 발생한 Line에 Cursor를 위치시켜 줍니다.

이외에도 Alleyoop을 사용하면 NCURSES(Console 화면 출력을 쉽게 다루기 위한 Library)를 사용한 Console Program도 쉽게 Memory Leak을 검사할 수 있습니다.

NCURSES를 사용한 Program의 경우, Alleyoop에서 Run을 누르면 Alleyoop을 실행한 Terminal에서 Program이 실행되며 Program이 종료되면 결과가 Alleyoop에 표시되게 됩니다.

5.2. KCachegrind

KCachegrind는 정확하게 말하면 Memory Leak을 검사하기 위한 Front-end는 아닙니다. 하지만, Program의 Performance 향상을 위해 사용되는 상당히 좋은 Tool로 Valgrind에 대해서 설명하는 이 Post에서 잠깐 다뤄보려 합니다.

KCachegrind는 Valgrind의 도구 중 하나인 Callgrind가 생성한 Profile Data를 시각화하여 보여주는 Tool입니다.

이 Program을 사용하면 AQTime 방식과 유사하게 Callgrind로 분석한 ASCII Data를 보기 편리하게 GUI를 통해 시각화하여 보여줌으로서 사용자에게 편의를 제공합니다. 또한 이 것을 통해서 각 Function 별 Cost(비용)와 호출 관계등을 알 수 있습니다.

먼저, 설치를 위해서 Terminal에서 다음과 같이 입력합니다.

1
$ sudo apt-get install kcachegrind

설치가 완료되었다면 이제 KCachegrind를 사용하기 위한 Profile Data를 얻어봅시다.

다음과 같이 Terminal에서 입력하여 Test할 Application의 Data를 얻습니다. (아래는 이전에 작성한 test Program의 예)

1
$ valgrind --tool=callgrind ./test

Callgrind도 마찬가지로 Runtime에 수행이 되기 때문에 Program 실행 시에 수행되지 않은 Function에 대한 Data를 얻지 못하는 것을 유의해야 합니다.

실행이 완료되면 Callgrind를 통해서 얻은 Data는 Console에 표시되는 것이 아니라 File(일반적인 경우 callgrind.out.*)로 저장됩니다.

Unity - KCachegrind

Unity - KCachegrind

이제 Data도 얻었으니 분석을 위해서 KCachegrind를 실행해 봅시다. Unity Dash에서 개발자 도구를 선택한 다음, KCachegrind를 Click합니다.

KCachegrind

KCachegrind

KCachegrind를 실행한 화면입니다. 일부 한글로 번역이 되어있으나 완전치는 않습니다.

분석한 Data를 Load하기 위해서 위의 그림과 같이 Toolbar의 열기를 누릅니다.

Select Callgrind Profile Data

Select Callgrind Profile Data

Dialog에서 Callgrind Data가 생성된 Directory로 이동한 다음 Data File을 선택하고 열기를 누릅니다.

만약 Data의 이름을 다른 것으로 변경했다면 아래의 Filter에서 Callgrind Profile Data 대신 All Files를 선택하여 모든 File이 List에 표시되도록 변경한 후 선택하면 됩니다.

KCachegrind - Callee Map and Call Graph

KCachegrind - Callee Map and Call Graph

Data를 제대로 Load했다면 위의 그림과 같이 표시될 것입니다.

분석을 위해서 간단하게 설명하면, 왼쪽 위의 최고비용 호출 스택은 Program 수행 시에 Cost가 가장 많이 발생한 Function의 순서대로 List에 표시합니다.
(Ir은 CPU에서 계산을 위해 Memory에서 Instruction을 가져오는 것을 나타내는 Instruction Fetch의 Cost(%)를, 호출은 호출 횟수를 나타냅니다.)

그리고 왼쪽 아래의 균일한 프로파일은 Runtime에 수행된 거의 모든 Function(Cost가 너무 낮은 것은 제외됨)의 Cost(%)와 호출 횟수를 표시합니다.
(포함은 각 Function 내에서 호출된 다른 Function의 Cost(%)까지를 포함한 값입니다. 그리고 Self는 호출된 다른 Function을 제외한 Function 자체의 Cost(%)를 나타내며, 호출됨은 해당 Function이 호출된 횟수를 나타냅니다.)

이 외에도, 오른쪽 상단과 하단에서는 균일한 프로파일에서 선택한 Function에 대하여 다음과 같은 정보를 제공합니다.

  • Callers: 해당 Function을 호출한 호출자를 List로 표시합니다.
  • All Callers: 호출자 뿐만 아니라 호출자를 호출한 호출자까지 포함한 List입니다.(Recursive)
  • Callee Map: Function 내부에서 호출한 다른 Function의 Cost값을 가지고 Visual한 Map을 표시합니다.
  • Source Code: Function의 Source가 존재할 경우, 해당 Function의 Code를 표시하며 각 Line 별로 Cost를 표시합니다. Source가 다른 곳에 위치할 경우, 설정 -> KCachegrind 설정 -> Annotations Tab에서 Source Directory를 추가할 수 있습니다.
  • Callee: Function 내부에서 호출한 다른 Function의 List입니다.
  • Call Graph: 해당 Function과 호출자와 호출한 다른 Function간의 호출 관계도를 표시합니다.
  • All Callees: Function 내부에서 호출한 다른 Function에서 또 다른 Function을 호출한 것까지 List로 표시합니다. (Recursive)
  • Caller Map: 호출자의 Cost값을 가지고 Visual한 Map으로 표시합니다.

KCachegrind로 얻은 위와 같은 정보를 통해서 Cost가 많이 발생하거나 호출 빈도가 높은 Function에 대해서 최적화를 수행하거나 설계 구조를 변경함으로서 Application의 Performance 향상을 꾀할 수 있을 것입니다.

KCachegrind의 자세한 기능및 분석 방법을 알고 싶다면 KCachegrind의 Documentation을 참고하기 바랍니다.

6. Eclipse CDT와 함께 사용하기

Eclipse CDT를 사용하여 개발하는 C/C++ Project에서도 IDE와 통합하여 쉽게 Valgrind로 Memory Leak을 검사할 수 있습니다.

Eclipse Classic 3.7.1 Indigo의 Linux version(또는 Eclipse IDE for C/C++ Linux Developers 1.4.1)을 통해 사용법을 간단하게 설명해 보도록 하겠습니다.

만약 Eclipse가 System에 설치되어 있지 않다면, Ubuntu에서 Eclipse CDT를 사용하여 Autotools Project 만들기 (Part 1)을 참고하여 설치하기 바랍니다.

Install Valgrind Tools Integration

Install Valgrind Tools Integration

Eclipse Classic에서 CDT를 설치한 경우라면 Valgrind를 사용하기 위한 Plugin을 설치해야 합니다. (Eclipse IDE for C/C++ Linux Devlopers를 설치했다면 이 과정은 무시해도 좋습니다.)

먼저 Help -> Install New Software를 Click하면 위와 같은 설치 Dialog가 표시됩니다.

위의 그림에서와 같이 Work with에서 Indigo를 선택하면 아래에 설치 가능한 Plugin의 List가 표시됩니다.

List에서 Linux Tools -> Valgrind Integration (Incubation)을 Check하고 Next를 눌러 설치과정을 모두 진행하면 기본적인 준비는 모두 완료됩니다.

Memory Leak Code

Memory Leak Code

Memory Leak을 검사하기 위한 Source Code가 위와 같다고 가정해 봅시다.

위의 Code에서 malloc() 호출 후에 System에 반환하지 않았기 때문에 Memory Leak이 발생할 것을 알 수 있습니다.

Eclipse - Profile

Eclipse - Profile

이제 이 Program을 Valgrind를 통해 Memory Leak을 검사해 봅시다. Run -> Profile을 Click합니다.

Profile As

Profile As

처음 Profile을 실행하게 되면 Profile As Dialog가 위와 같이 표시됩니다. 여기서 Profile With Valgrind를 선택하고 OK를 누릅니다.

Valgrind - Memcheck

Valgrind - Memcheck

아래의 Console View에 Program이 실행되면서 출력된 내용이 표시되고, Program이 종료된 이후에 Valgrind View에 Memory Leak이 발생한 내용이 표시됩니다.

Memory Leak이 발생한 내용을 Double-click하거나 Problems View에서 해당 Problem을 Double-click하면 위의 그림과 같이 Memory Leak이 발생한 Line이 선택되면서 쉽게 확인이 가능하게 됩니다.

7. 마치면서…

지금까지 Ubuntu에서 Valgrind를 사용하여 Memory Leak을 검사하는 여러가지 방법들을 알아봤습니다. Console 기반이라 쓰기 어렵다고 느껴질 수도 있지만, Front-end와 같이 사용하면 그다지 어렵게만 느껴지지 않을 것입니다.

Valgrind를 사용하여 Debugging과 Profiling을 수행함으로서, 개발하는 Application에 대한 안정성과 성능을 높이는 계기가 될 수 있기를 바랍니다.

Subclipse는 형상관리 툴인 Subversion을 Eclipse와 통합하여 사용할 수 있게 도와주는 Eclipse Plug-in입니다. 최신 Eclipse인 3.5 Galileo에서 Subclipse를 사용하여 기존 SVN 저장소와 연동하여 프로젝트를 관리하는 방법을 설명하도록 하겠습니다.

Flash/Flex Builder도 Eclipse 기반으로 되어 있기 때문에 마찬가지로 Subclipse를 통하여 Flex Project를 관리할 수 있습니다. Plug-in version이 아닌 Flash/Flex Builder를 설치할 경우에는 Subclipse가 제대로 설치되지 않을 수도 있습니다.

1. Eclipse의 Software Update로 Subclipse 설치

먼저 Eclipse Galileo를 실행시킨 후, Window->Preferences를 클릭합니다. Preferences Dialog에서 Install/Update의 Available Software Sites를 클릭하면 아래와 같은 화면이 나옵니다.

fb4-subclipse01

Subversion Site를 추가하기 위해서 Add button을 클릭합니다.

fb4-subclipse02

Name 과 Location에 다음과 같이 입력합니다.

1
2
Name : Subclipse 1.6.x (Eclipse 3.2+)
Location : http://subclipse.tigris.org/update_1.6.x

Subclipse 1.8.x를 사용하려면 다음과 같이 입력합니다. (Eclipse 3.2 이상)

1
2
Name : Subclipse 1.8.x (Eclipse 3.2+)
Location : http://subclipse.tigris.org/update_1.8.x

OK를 누르면 Subclipse site가 추가됩니다. Test Connection button을 누르면 Connection 확인을 할 수 있습니다. Connection이 올바르게 되었다면 아래와 같은 Dialog가 표시됩니다.

fb4-subclipse03

이제 주소가 등록되었으니 Preferences Dialog를 OK를 눌러서 닫은 후에, Help->Install New Software를 클릭하면 아래와 같은 Dialog가 화면에 표시됩니다.

fb4-subclipse04

Dialog에서 Work with Combobox의 버튼을 눌러서 방금 추가한 Subclipse의 주소를 선택한 후, 밑에 표시되는 Plugin을 모두 Check 표시하고 Next를 클릭합니다.

fb4-subclipse05

설치될 Plugin이 목록으로 표시됩니다. Next를 클릭합니다.

fb4-subclipse06

License의 동의하는지 여부를 물어봅니다. I agree the terms of the license agreements를 선택하고 Finish를 클릭합니다. 그러면 Download및 Install이 실행됩니다.

fb4-subclipse07

도중에 Plugin의 Security관련 경고가 뜨는데 그냥 OK를 누르세요.

fb4-subclipse08

설치가 완료되면, Eclipse를 다시 실행해도 되겠냐고 물어봅니다. Yes를 클릭하여 Eclipse를 다시 실행하면 Subclipse 설치는 완료됩니다.

2. 기존의 SVN 저장소를 등록하기

이제 설치가 완료되었으니 SVN 저장소에 올려져 있는 Project를 Checkout 받기 위해서는 저장소를 등록을 위해 SVN Repositories View를 통해 작업해야 합니다. SVN Repositories View를 Eclipse에 표시하기 위해서 Window->Show View->Other를 클릭하면 아래와 같은 Dialog가 표시됩니다.

fb4-subclipse09

SVN->SVN Repositories를 클릭하고 OK를 누릅니다.

fb4-subclipse10

SVN Repositories View가 Eclipse 하단에 표시됩니다. 이제 저장소를 등록하기 위해서 SVN Repositories View 위에 Add SVN Repository button을 클릭합니다.

fb4-subclipse11

SVN 저장소를 추가하는 Dialog입니다. Location의 URL에 SVN저장소의 URL을 입력하고 Finish를 클릭합니다.

Linux에서 Eclipse를 사용하는 경우 Failed to load JavaHL Library라는 Error가 발생하는 경우가 있습니다. Ubuntu에서 Eclipse에 Subclipse 1.6.x를 설치한 경우(1.8.x는 아직 해결할 수 없음), Terminal에서 다음과 같이 입력합니다.

1
# sudo apt-get install libsvn-java

그리고, Eclipse Directory의 eclipse.ini에서 -vmargs 다음 줄에 아래의 내용을 추가한 후, Eclipse를 실행하여 Add SVN Repository를 다시 실행하면 됩니다.

1
2
-Djava.library.path=/usr/share/java
-Djava.library.path=/usr/lib/jni

fb4-subclipse12

SVN 저장소에 접근시에 로그인이 필요하다면 위와 같은 Dialog가 표시됩니다. Username, Password를 입력합니다. Password를 계속 입력하는 것이 귀찮으면 Save Password를 Check 하고 OK를 누릅니다. 정상적으로 SVN 저장소와 연결되었다면 아래의 화면과 같이 저장소의 정보를 SVN Repositories View에 표시됩니다.

fb4-subclipse13

3. 등록된 SVN 저장소에서 Project를 Checkout 받기

Checkout을 간단하게 말하면, 저장소에 있는 Project를 내 PC로 Download받는 것을 의미합니다. 방금 등록한 저장소에 있는 Project를 Checkout하기 위해서 SVN Repositories View에서 받은 폴더 위에 Mouse 오른쪽 클릭으로 Popup을 띄우면 아래와 같이 나옵니다.

fb4-subclipse14

여기서 Checkout을 클릭하면 아래와 같이 Checkout Dialog가 화면에 표시됩니다.

fb4-subclipse15

Checkout Dialog에서는 Checkout을 받는 여러가지 Option들이 있는데, Check out as a project in the workspace를 Click하고 Next를 누릅니다.

fb4-subclipse16

Eclipse Workspace Location에 Project를 Checkout하게 되는데, 다른 곳에 받는 다면 Check를 해제하고 경로를 지정합니다. 여기서는 그냥 Default workspace에 Checkout할 것이기 때문에 그냥 Finish를 클릭합니다.

fb4-subclipse17

저장소의 Root directory를 Checkout할 경우 위와 같은  Message가 표시됩니다. 여기서는 Root Directory부터 받을 것이기 때문에 Yes를 클릭합니다. (저장소의 Root를 Checkout하는 경우 외에는 이 Message가 표시되지 않습니다.)

fb4-subclipse18

저장소에서 Project를 Download하여 workspace에 저장하는 Dialog가 표시되면서 Checkout이 완료됩니다. 완료된 후에는 Project Explorer에 해당 Checkout 받은 Project가 표시됩니다.

4. 마치면서

이상으로 Eclipse 3.5 Galileo에서 Subclipse plugin을 설치하고 저장소를 등록하여 SVN에 등록된 Project를 Checkout하는 방법을 알아보았습니다. 다음에는 Subclipse의 기능에 대한 Post를 올리도록 하겠습니다.

– God Bless..

Doxygen은 여러 Programming Language를 위한 문서화 도구입니다. Source Code를 문서화한다는 것은 Code내의 주석을 통하여 Code의 구조와 Interface를 문서로 만드는 것을 의미합니다.

Doxygen을 사용하면 C++, C, C#, Fortran, Java, Objective-C, PHP, Python 등의 언어를 사용한 Source Code에 Doxygen에서 정의한 Style로 주석을 작성하면 자동으로 문서를 생성할 수 있게 됩니다.

생성된 문서는 마치 MSDN이나 기타 Live API Document와 같은 형식으로 Web Browser, PDF Reader, CHM Help 등으로 열람이 가능합니다. 이것은 여럿이 동시에 작업하는 Project에 더욱 유용합니다.

이번 Post에서는 Borland C++ Builder 6로 작성한 Project를 Doxygen을 사용하여 문서화하는 방법을 다루도록 하겠습니다.

1. Doxygen 설치

Doxygen 자체는 Source Code의 주석을 사용하여 문서를 자동으로 생성하는 도구로서 IDE와 통합되어 동작하지 않습니다. 다만 Doxygen에서 정의한 Style에 주석을 Project 개발시에 Source Code에 작성하면 됩니다. (Java, Flex의 경우에는 문서화 도구인 JavaDoc, ASDoc Style로 작성한 주석을 바로 Parsing하여 Eclipse에서 해당 Class나 Method에 대한 주석을 바로 확인할 수 있습니다.)

또한 Doxygen은 Cross-Platform Tool로서 Windows, Mac OS X, Linux (or Unix-like OS)에서 사용이 가능합니다. 이것은 Windows Application의 Source Code를 Doxygen에서 지정한 형식으로 주석을 작성해 놓으면, Web Server가 동작하는 다른 OS에서 Doxygen을 사용하여 Source Code 문서를 생성할 수 있다는 것을 말합니다. 한마디로 해당 Project에 대한 API Web Service(like MSDN)를 운영할 수 있게 됩니다.

이제 어느정도 설명이 끝났으니 설치를 해보도록 합시다. Doxygen의 Homepage에 접속합니다.

Doxygen Site

Doxygen Site

Program을 Download하기 위해서 오른쪽의 Download를 Click합니다.

Doxygen Download

Doxygen Download

여러 OS에 대한 Binary가 존재하는데 여기에서는 32-bit binary distribution for Windows XP/Vista/7 Section의 설치 File을 Download합니다.

Doxygen Install

Doxygen Install

Download한 설치 File을 설치합니다. 설치 중간에 위와 같이 Doxygen 구성요소가 나오는데 여기에서 Doxywizard GUI를 선택합니다.

Doxywizard를 사용하면 Command-line 기반의 Doxygen을 좀 더 편리하게 쓸 수 있습니다.

Graphviz Site

Graphviz Site

그리고 한 가지 더 설치해야 할 Tool이 있습니다. Doxygen은 문서를 생성할 때 Class나 Method의 관계를 나타내기 위해서 Graphviz라는 Tool을 사용합니다. 이번에는 Graphviz를 설치하도록 합시다.

Graphviz의 Homepage에서 왼쪽 Download를 Click합니다.

Graphiviz License Agreement

Graphiviz License Agreement

License 동의를 위해서 맨 아래쪽의 Agree를 Click합니다.

Graphviz Download

Graphviz Download

Windows – Stable and Development Windows Install Packages를 Click하여 Download한 후 설치하면 모든 준비는 완료됩니다.

2. Source Code에 문서화를 위한 Comment 작성

BCB6 - Doxygen Test Project

BCB6 - Doxygen Test Project

설치가 모두 끝났으니 이제 Source Code에 Doxygen Style의 주석을 달아봅시다. Style 및 사용하는 Metatag는 여러가지가 있는데 여기서는 간단하게 주로 사용하는 것을 Template 형태로 적어보도록 하겠습니다.

좀 더 자세한 내용을 알기 원한다면 아래의 Doxygen Manual을 참조하기 바랍니다.

2.1 Class comment template

Class에 대한 주석을 작성할 때는 아래와 같이 작성하면 됩니다. 아래의 예제에서는 Class에 대한 주석 뿐만 아니라, 전역 변수, Method에 대한 주석도 설명하고 있습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
/**
 * 짧은 Class 설명
 *
 * @author  ioriy2k <ioriy2k@ioriy2k.pe.kr>
 *
 * 긴 Class 설명을 여기에 적습니다.
 */

class Test {

private:

    /// 전역변수에 대한 한 줄 설명
    bool test_flag;

    /**
     * 전역변수에 대한 긴 설명을 작성할 수 있습니다.
     * 여러 줄로 표현이 가능합니다.
     */

    bool test_flag1;

public:

    /// Method에 대한 한 줄 설명    
    Test();
};

위와 같은 주석을 작성한 후, Doxygen으로 문서를 생성한 모습은 다음과 같습니다.

HTML - Class Description

HTML - Class Description

2.2 Method comment template

Class의 Metho에 대한 주석을 작성할 때는 다음과 같이 작성하면 됩니다.

1
2
3
4
5
6
7
8
9
10
11
/**
 * 짧은 Method 주석
 *
 * 긴 Method 주석을 여기에 작성합니다.
 *
 * @param    run    Parameter명을 먼저 적고 그 이후에 변수에 대한 정보를 적습니다.
 * @return return 값이 존재하는 경우 Return 값에 대한 정보를 적습니다.
 */

bool Test::RunTest(int run) {

}

Parameter가 여러 개일 경우에는 Parameter의 순서대로 @param을 사용하여 설명을 적습니다. 개인적으로는 Debugging을 하기 위해서 header를 반복해서 살펴야 하는 Case를 가능하면 피하기 위해서 Method 주석은 header보다는 cpp에 적는 편입니다.

위와 같이 작성한 주석을 가지고 Doxygen으로 문서를 생성한 모습은 다음과 같습니다.

HTML - Method Description

HTML - Method Description

2.3 Mainpage comment template

Mainpage는 Doxygen 문서의 Mainpage(index.html)를 주석으로 생성하는 것을 의미합니다. Mainpage 주석은 Source에 오직 한 군데만 작성해야 하며 이 곳은 주로 Project의 개관, 알아두어야 할 정보나 Compile 방법 등을 적어 놓는데 사용합니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
/**
 * @mainpage Project 제목
 *
 * @section overview Overview
 *
 * Section에 대한 설명을 여기에 적습니다.
 *
 * @section list List
 *
 * 다음과 같이 순서가 없는 List를 작성할 수 있습니다.
 *
 * - List 1
 * - List 2
 *
 * 다음과 같이 순서가 있는 List를 작성할 수 있습니다.
 *
 * -# List 1
 * -# List 2
 */

위와 같은 Mainpage Comment를 Doxygen으로 문서화하면 다음과 같은 모습이 됩니다.

HTML - Mainpage

HTML - Mainpage

3. 마치면서…

이상으로 Doxygen을 설치하는 방법과 문서 생성을 위해 Source Code에 주석을 다는 방법을 알아봤습니다. 다음 Post에서는 Source Code에 작성한 주석을 Doxywizard를 사용해서 HTML과 CHM 문서로 만드는 방법을 알아보도록 하겠습니다.

이전 Post에 이어서 이번 Post에서는 Eclipse를 사용하여 Autotools Project를 직접 만들어 보면서 개발하는데 발생하는 여러가지 문제들을 해결해 보도록 하겠습니다.

5. Autotools Project 생성

설치 및 설정을 마쳤으니 이제 Eclipse를 사용해서 Autotools Project(C Project)를 만들어 봅시다.

Eclipse - New Project

Eclipse - New Project

C Project를 새로 만들기 위해서 Eclipse를 실행한 다음, File -> New -> C Project를 Click합니다.

C Project

C Project

C Project Dialog에서 다음의 항목을 입력한 후 Next를 누릅니다.

  • Project Name : Project의 이름을 입력합니다.
  • Project Type : GNU Autotools -> Hello World ANSI C Autotools Project를 선택합니다. Empty Project를 선택하면 거의 처음부터 Autotools Project를 만드는 것이나 마찬가지이기 때문에 편의를 위해서 이것을 선택합니다.
  • Toolchains : GNU Autotools Toolchain을 선택합니다.
C Project - Basic Settings

C Project - Basic Settings

그 다음에는 Project의 기본 정보를 입력하고 Next를 Click합니다. Author, Copyright notice은 Main Source File에 주석으로 추가되는 내용이니 편하게 적으면 됩니다. 각 항목에 다음과 같이 입력합니다.

  • Author : Project의 개발자의 이름을 입력합니다.
  • Copyright notice : Project의 License를 입력합니다.
  • Hello world greeting : Hello World 대신 다른 Text를 Console에 출력하려면 여기에 Text를 입력합니다.
  • Source : Project Directory에서 Source File들이 위치할 Directory 이름을 입력합니다.
C Project - Select Configurations

C Project - Select Configurations

마지막으로 Project의 설정을 지정할 수 있습니다. 여기서는 Finish를 눌러 그대로 진행합시다.

Eclipse - Created Project

Eclipse - Created Project

Project가 생성된 모습은 위의 그림과 같습니다. 이전 Post에서 언급한 configure.ac, Makefile.am 등이 생성되어 있는 것을 볼 수 있습니다.

GNU Autotools가 적용된 Project는 Build System을 자동으로 생성하기 위한 File들 외에 다음과 같은 Text File들이 기본적으로 포함되어 있어야 합니다.

  • AUTHORS : Project 개발에 참여한 사람들의 이름을 적습니다.
  • ChangeLog : Project의 각 Version Release에 대한 변경사항을 적습니다.
  • COPYING : Project License를 적습니다. License 원문이 대부분 여기에 위치합니다.
  • NEWS : Project와 관련된 소식을 여기에 적습니다.
  • README : Project에 대해서 사용자에게 알려야 할 기본적인 사항을 여기에 적습니다.

그림에서 방금 언급한 Text File들이 자동으로 추가된 것을 확인할 수 있습니다. (세부적인 내용은 본인이 직접 작성해야 합니다.) 그리고 생성 시에 입력한 Source Directory에 Main Source File(예제에서는 hello.c)이 위치한 것을 볼 수 있습니다.

Eclipse - Project Properties

Eclipse - Project Properties

하지만, Autotools에 관련된 설정이 Project에 제대로 적용되지 않았기 때문에 지금 상태에서는 Build도 제대로 수행되지 않을 것입니다. 설정을 위해서 Project -> Properties를 Click합니다.

Properties - Autotools Settings

Properties - Autotools Settings

Project Properties에서 Autotools -> General을 선택한 다음, Tools Settings Tab에서 위의 그림과 같이 입력하여 해당 Program의 경로(/usr/bin)를 추가하고 OK를 누릅니다.

Eclipse - Makefile.am

Eclipse - Makefile.am

그 다음, Project Explorer에서 src/Makefile.am을 Double-Click하여 엽니다. 이전에도 설명했지만 Makefile.am은 Makefile을 자동으로 생성하기 위해 필요한 File들을 만들어 주는 Automake를 위해서 필요한 File입니다.

src/Makefile.am을 열어보면 위와 같은 내용을 하고 있을 것입니다. 2가지의 Macro가 표시되어 있는데 각각은 다음과 같은 의미가 있습니다.

  • bin_PROGRAMS : 최종 결과물(Binary)의 이름을 입력합니다. Default로 위의 그림과 같이 a.out이 설정되는데 원하는 이름으로 바꾸면 됩니다.
  • a_out_SOURCES : 최종 결과물을 Build하기 위해서 Compile해야 할 Source를 적습니다. 주의해야 할 것은 위에서 최종 결과물의 이름을 바꾸었다면 _SOURCES 앞을 그 이름으로 변경시켜줘야 한다는 것입니다.

최종 결과물이 a.out으로 나오는 것은 너무 옛날 방식이니 이름을 바꿔보도록 합시다. 위의 예제에서의 Project 이름이 hello이니 최종 결과물의 이름도 동일하게 바뀌도록 다음과 같이 Makefile.am을 수정합니다.

1
2
bin_PROGRAMS=hello
hello_SOURCES=hello.c
Eclipse - Build Project

Eclipse - Build Project

src/Makefile.am을 저장한 다음, 이제 Build를 수행해 봅시다. Project -> Build Project를 Click합니다.

Eclipse - Build Finished

Eclipse - Build Finished

설정이 제대로 되었다면 위의 그림과 같이 Build가 완료되면서 여러가지 File이 생성될 것입니다. 여기서 생성된 File들은 Build를 명령을 통해서 내부적으로 Automake, Autoconf가 실행되면서 생긴 File들입니다.

그리고 생성된 Build System을 사용해서 configure Script와 make를 실행하여 Build가 완료되면 최종 결과물이 생성됩니다. 그림에서 보면 src/Makefile.am에 지정한 hello라는 최종 결과물(Binary)가 생성된 것을 Project Explorer를 통해 확인할 수 있습니다.

Eclilpse - Run

Eclilpse - Run

이제 생성된 최종 결과물을 실행해 봅시다. Run -> Run을 Click합니다.

Launch Debug Configuration Selection

Launch Debug Configuration Selection

처음 Run이나 Debug를 실행하게 되면 위의 그림과 같은 Dialog가 표시됩니다. 이 Dialog에서는 Debugging을 위한 Debugger를 선택할 수 있습니다. Remote Debugging을 사용하지 않기 때문에 gdb/mi를 선택하고 OK를 누릅니다.

Eclipse - Run (Finished)

Eclipse - Run (Finished)

정상적으로 실행되었다면, 위의 그림과 같이 아래의 Console View에 Hello World가 출력될 것입니다.

6. Source 추가하기

Eclipse CDT를 통해 생성한 다른 C/C++ Project와는 다르게 Autotools를 사용한 Project에서는 새로운 Source를 추가하더라도 Build에 자동으로 포함되지 않습니다.

지금부터 Source를 직접 추가해보면서 새로 생성한 Source File을 Build에 포함하는 방법을 알아봅시다.

Eclipse - hello.c

Eclipse - hello.c

Main Source File(위의 예에서는 hello.c)을 열어보면 위와 같은 내용일 것입니다. 위에서 Hello World를 출력하는 Code를 변경해서 새로 추가한 Source에서 Hello World를 출력하도록 만들어 보겠습니다.

Eclipse - New Header File

Eclipse - New Header File

새로 정의할 Function의 Prototype을 Include해서 사용할 수 있도록 먼저 Header File을 새로 만들어 봅시다. File -> New -> Header File을 Click합니다.

New Header File

New Header File

New Header File Dialog에서는 Header File을 생성하기 위한 기본적인 정보를 입력합니다.

기본적으로 Source Folder에는 Project를 생성 시에 지정한 Source Directory가 기본적으로 입력되어 있으며, Template은 C의 기본적인 Header의 내용이 입력된 Template이 설정되어 있습니다.

Header File에 새로 생성할 Header File의 이름(위의 예에서는 hello1.h)을 적고 Finish를 누릅니다.

Eclipse - hello1.h

Eclipse - hello1.h

새로 생성된 Header File의 모습입니다. 중복으로 이 File을 Include했을 경우를 위해서 Header File의 이름을 Symbol로 Define한 것을 할 수 있습니다.

이제 여기에 새로 생성할 Hello, World 출력 함수를 위해서 #define과 #endif 사이에 다음과 같이 입력하고 저장합니다.

1
2
3
4
#include <stdio.h>

/* Say hello */
extern void say_hello(char *);
Eclipse - New Source File

Eclipse - New Source File

Hello World를 출력할 함수의 Prototype을 Header에 정의했으니 이제 이 함수를 구현할 Source File을 만들어 봅시다. File -> New -> Source File을 Click합니다.

New Source File

New Source File

New Source File Dialog에서는 Source File을 생성하기 위한 기본적인 내용을 입력합니다.

Source Folder는 Project 생성 시에 설정한 Source Directory가 기본적으로 입력되어 있으며, Template은 C Source의 Template이 설정되어 있습니다.

Source File에 새로 생성할 Source File의 이름(위의 예에서는 hello1.c)를 입력하고 Finish를 누릅니다.

Eclipse - hello1.c

Eclipse - hello1.c

새로 생성된 Source File의 모습입니다. 주석으로 생성된 File의 이름과 작성자, 그리고 생성 날짜가 자동으로 입력된 것을 알 수 있습니다.

이제 이 Source에 Header에서 선언한 함수를 다음과 같이 구현해 봅시다.

1
2
3
4
5
6
7
8
9
#include "hello1.h"

/**
 * Say hello
 */

void say_hello(char *str)
{
    printf("%s\n", str);
}
Eclipse - hello.c (Modified)

Eclipse - hello.c (Modified)

새로운 추가한 Source에 원하는 Code를 구현했으니 Main Source File을 수정해 봅시다.

Main Source File(위의 예에서는 hello.c)에서 새로 생성한 Source의 함수(위의 예에서는 hello1.c의 say_hello())를 호출하여 Hello World를 출력하도록 수정하면 다음과 같습니다.

1
2
3
4
5
6
7
8
#include <stdlib.h>
#include "hello1.h"

int main(void) {

    say_hello("Hello World");
    return EXIT_SUCCESS;
}
Eclipse - Makefile.am (Modified)

Eclipse - Makefile.am (Modified)

이제 새로운 Source File을 추가해서 Hello World를 구현하는 과정은 모두 마쳤습니다. 하지만 이대로는 Build에 포함되지 않기 때문에 Build에 새로 추가한 Source를 추가해 봅시다.

위의 그림과 같이 src/Makefile.am을 열어서 _SOURCES에서 Main Source File(위에서는 hello.c) 뒤에 한 칸 띄어서 새로운 추가한 Source File(위에서는 hello1.c)을 적어줍니다.

Eclipse - Build Project

Eclipse - Build Project

src/Makefile.am을 수정하기만 하면 그 이후에 나머지 필요한 과정은 Build 시에 자동으로 실행됩니다. 이제 모든 준비가 끝났으니 Project -> Build Project를 Click합시다.

Eclipse - Run

Eclipse - Run

Build가 완료된 후, Run -> Run을 Click하여 Build된 Binary를 실행하면 위와 같이 동일하게 Console View에 Hello World가 출력되는 것을 확인할 수 있습니다.

7. Debugging

이번에는 Debugging에 대해서 한 번 살펴봅시다. 기존의 다른 Project와는 다르게 Autotools Project에서는 Breakpoint와 상관없이 Program Counter가 이러저리 왔다갔다 하면서 제대로 Debugging이 이루어지지 않습니다. 왜 그럴까요?

Eclipse - Compiler Option

Eclipse - Compiler Option

Build 시에 Console의 내용들을 살펴보면 답을 쉽게 찾을 수 있습니다. 위의 그림에 표시한 것과 같이 Compile과 Link 시에 Compiler(GCC)에 사용된 Option을 보면 -g -O2가 적용되어 있는 것을 확인할 수 있습니다.

-g는 Debugging을 가능하게 Compile하는 Option, -O2는 Code를 Optimizing하는 Option입니다. 두 개를 동시에 쓰게 되면 Debugging을 위한 Data가 제대로 생성되지 않아서 Debugging를 제대로 할 수 없게 됩니다. (-O2로 인해 -g가 상쇄되는 효과)

Compile 시에 -g -O2 Option이 들어가는 것은 Shell의 환경변수인 CFLAGS와 관계되어 있습니다. CFLAGS는 C Source File을 Compile할 때 Compiler에 설정하는 Option을 지정하는 Shell 환경변수입니다. (C++의 경우는 CPPFLAGS)

기본적으로 사용자가 CFLAGS를 지정하지 않을 경우 configure Script에서는 Code Optimizing을 위해서 -g -O2를 사용하도록 되어 있습니다. 그러나 이 설정으로는 Debugging이 불가능하니 CFLAGS를 새로 지정하여 configure Script를 실행해 주면 문제가 해결될 것입니다.

Eclipse - Manage Build Configurations

Eclipse - Manage Build Configurations

이것을 응용해서 Build Configuration(Project의 Properties를 묶어놓은 Group을 의미)을 생성해서 Debugging을 위한 설정을 따로 관리해 봅시다.

Build Configuration으로 관리하게 되면 MS의 Build System에서 Release와 Debug를 구분하는 것과 유사하게 Release Build와 Debugging을 위한 Build를 쉽게 구분하여 Build 할 수 있게 됩니다.

Debugging을 위한 Build Configuration을 생성하기 위해서 Project -> Build Configurations -> Manage를 Click합니다.

Manage Configurations

Manage Configurations

Manage Configurations Dialog에서 New를 누릅니다.

Create New Configuration

Create New Configuration

Create New Configuration Dialog에서 Name에는 새로 생성할 Configuration의 이름인 Debug를 입력합니다.

그리고 기본적으로 생성되어 있는 Configuration인 Build (GNU)을 토대로 변경하기 위해서 Copy settings from에서 Existing configuration을 선택한 다음 Build (GNU)를 선택하고 OK를 누릅니다.

Eclipse - Project Properties

Eclipse - Project Properties

그 다음 OK를 눌러 Manage Configuration Dialog를 닫은 후, Debug Configuration의 설정을 수정하기 위해서 Project -> Properties를 Click합니다.

Properties - configure Settings

Properties - configure Settings

Project Properties에서는 각각의 Build Configuration을 따로 설정할 수 있습니다. 위에서 configure Script 실행시 CFLAGS를 지정해 주면 된다고 언급했기 때문에 Autotools -> Configuration Settings를 통해 설정해 봅시다.

그 다음, Configuration Combobox에서 방금 생성한 Build Configuration인 Debug를 선택하고, 아래의 Treeview에서 configure를 선택합니다. 그리고 Command에 다음과 같이 입력하고 Apply를 Click합니다.

1
CFLAGS="-g3 -O0" configure
Properties - C/C++ Build

Properties - C/C++ Build

그리고 생성된 Debug Configuration의 설정으로는 Build 시에 Compile된 결과물을 저장하기 위한 Directory가 따로 생성됩니다.

하지만 굳이 구분할 필요는 없기 때문에 생성하지 않도록 변경하기 위해서 Build location을 수정합시다. (취향에 따라 다른 이름을 입력해서 사용해도 됩니다.)

Project Properties Dialog에서 C/C++ Build의 Configuration Combobox에서 Debug를 선택한 다음, Builder Settings Tab의 Build Location -> Build Directory를

1
${workspace_loc/hello}/build-Debug

에서,

1
${workspace_loc/hello}

로 변경합니다. (위의 내용은 hello Project의 예임)

Eclipse - Set Active Configuration

Eclipse - Set Active Configuration

Project Properties Dialog를 OK를 눌러 닫은 후에, 현재 지정된 Build Configuration을 변경하기 위해서 Project -> Build Configurations -> Set Active -> Debug를 Click합니다.

그리고 변경된 Build Configuration이 Project에 적용될 수 있도록 Project -> Reconfigure Project를 Click하여 configure Script를 다시 실행하도록 합시다.

Eclipse - Compiler Option (Changed)

Eclipse - Compiler Option (Changed)

이제 준비가 완료되었습니다. Project -> Build Project를 눌러 Build를 완료하면 위의 그림과 같이 Compile 시에 Compiler Option이 -g -O2에서 -g3 -O0로 변경된 것을 확인할 수 있습니다.

Eclipse - Toggle Breakpoint

Eclipse - Toggle Breakpoint

이제 Breakpoint를 설정해 봅시다. 위의 그림과 같이 Main Source File (위의 예에서는 hello.c)의 say_hello()를 호출하는 Line에 Breakpoint를 설정하기 위해서 Cursor를 위치하고 Run -> Toggle Breakpoint를 Click합니다.

Eclipse - Debug

Eclipse - Debug

그리고 Debugging을 위해서 Run -> Debug를 Click합니다.

Debugging

Debugging

Debug가 시작되면 위의 그림과 같이 Eclipse의 Perspective가 Debug로 변경되면서 설정한 Breakpoint에 Program Counter가 위치하는 것을 확인할 수 있습니다.

8. 마치면서…

지금까지 간단하게 Ubuntu에서 Eclipse를 사용해서 Autotools Project를 만드는 방법을 알아봤습니다.

아직은 Autotools Support Plugin 자체가 Incubation 단계라서 부족한 부분들이 보이지만, 이 Plugin을 사용하면 Eclipse를 통해서 조금은 편리하게 Autotools가 적용된 Project를 개발할 수 있는 것 같습니다.

Eclipse CDT에서 Autotools를 사용하는 방법에 대한 더 자세한 내용을 알기 원한다면 아래의 Link를 방문해 보기 바랍니다.


이전에 Eclipse CDT를 사용하여 개발했던 Project에 Autotools를 적용하기 위한 방법을 찾다가 Eclipse Plugin을 살펴보니 Incubation 중에 Autotools Support for CDT를 찾을 수 있었습니다.

그것을 사용해서 기존의 Project를 Autotools Project로 만들어 보니, 기존에 Autotools를 조금 사용할 줄 알면 편리하게 개발할 수 있다는 생각이 들더군요.

그래서 이번 Post에서는 Project를 만들면서 경험했던 삽질들을 정리할 겸해서, Ubuntu에서 Eclipse CDT를 사용하여 Autotools Project를 생성하여 개발하고 Debugging하는 방법을 적어보도록 하겠습니다.

1. Autotools?

먼저 Autotools가 무엇인지 모르는 분들을 위하여 간단하게 설명해 보겠습니다. Linux에서 Apache나 PHP와 같은 Open-source Project를 Compile 해 본 경험이 있다면 대부분 다음과 같은 과정을 거쳤을 것입니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# ./configure
checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
checking for a thread-safe mkdir -p... /bin/mkdir -p
checking for gawk... no
checking for mawk... mawk
checking whether make sets $(MAKE)... yes
checking for gcc... gcc
checking whether the C compiler works... yes
(blah blah....)

# make
make  all-recursive
make[1]: Entering directory `/home/ioriy2k/workspace/test'
Making all in src
make[2]: Entering directory `/home/ioriy2k/workspace/test/src'

gcc -DHAVE_CONFIG_H -I. -I..     -g -O2 -MT test.o -MD -MP -MF .deps/test.Tpo -c -o test.o test.c
mv -f .deps/test.Tpo .deps/test.Po
gcc  -g -O2   -o test test.o  
(blah blah...)

# sudo make install
Making install in src
make[1]: Entering directory `/home/ioriy2k/workspace/test/src'
make[2]: Entering directory `/home/ioriy2k/workspace/test/src'

test -z "/usr/local/bin" || /bin/mkdir -p "/usr/local/bin"
  /usr/bin/install -c test '/usr/local/bin'
(blah blah...)

물론 Project Source에 따라 약간씩 차이가 있겠지만 위와 유사한 방법으로 Compile하여 설치하는 것이 보통일 것입니다. Autotools는 위와 같은 Build System을 Source Code에 만들어 주는 Tool입니다.

그러면 Autotools로 위와 같은 Build System을 만드는 이유는 무엇일까요? 이 Build System을 사용하게 되면 여러 Unix 계열 OS에 Porting 할 수 있도록 편의를 제공합니다.

그리고 Source Package를 Build할 System이 Build에 필요한 Library나 Tool을 가지고 있는 지를 Check하여 없을 경우에는 미리 경고를 표시할 수 있습니다. 또는 Source Code와 연계하여서 OS에 따라 제공하지 않는 Method를 따로 구현해서 제공할 수도 있습니다.

이 외에도 Autotools를 사용하면 여러가지 이득을 볼 수 있습니다. 물론 Autotools를 사용하여 Source Package에 Build System을 구축해 놓으면 다른 사람들에게 전문적인 Project인 것처럼 보이게 하는 효과도 있습니다. :)

Autotools는 Automake, Autoconf, Libtool 등의 Package로 구성되어 있으며 각 Package는 다음과 같은 기능을 합니다.

  • Automake : Source Code를 Build하기 위해 사용되는 make를 위해서 여러 OS에 Porting할 수 있는 Makefile을 자동으로 생성합니다. 생성을 위해서는 Makefile.am을 작성해야 합니다.
  • Autoconf : 각 OS의 환경을 Check하고 Build에 필요한 환경 File을 생성해 주는 configure Script를 자동으로 생성합니다. 생성을 위해서는 configure.ac를 작성해야 합니다.
  • Libtool : Source Code의 최종 결과물이 실행 File이 아닌 Shared Library나 Static Library를 만드는데 사용하는 Tool입니다. Automake와 Autoconf와 같이 사용될 경우, configure.ac와 Makefile.am을 통해서 간접적으로 사용됩니다.

Autoconf - Automake Process (from Wikipedia)

Source Code에 Autotools로 Build System을 구축하는 방법은 위의 그림과 같은 순서로 이루어 집니다. 약간 복잡해 보이지만 다음과 같이 설명할 수 있습니다.

  1. Makefile.am : automake를 실행하기 위해서 Makefile.am을 만듭니다.
  2. autoscan : Source code가 있는 Directory에서 autoscan을 실행하여 configure.ac를 자동으로 생성합니다.
  3. aclocal : configure.ac에 지정한 Macro에 대한 정보를 가지고 m4 macro를 생성합니다.
  4. autoheader : configure.ac에 지정한 정보를 가지고 config.h.in을 생성합니다. 이것은 나중에 config.h를 만드는 기초자료로 사용되며, Source code에서 config.h를 include하여 해당 Symbol의 상태를 이용하여 System dependent한 구현들을 상황에 맞게 처리할 수 있게 됩니다.
  5. automake : Makefile.am과 configure.ac의 정보를 가지고 Makefile.in을 생성합니다.
  6. autoconf : aclocal.m4와 configure.ac를 가지고 configure Script를 자동으로 생성합니다.
  7. configure : System을 Check하고 Build를 하기 위한 정보를 수집하여 저장하고 make를 위한 Makefile을 생성합니다.
  8. make : configure를 통해 생성된 Makefile을 가지고 Buld를 수행합니다.

어느 정도 감이 오신 분도 있을 것이고, 아닌 분도 있을 것이라고 생각이 됩니다. (Unix-like System에서 개발해 본 경험이 없는 분들은 좀 어려울 지도..) 저의 부족한 설명보다 더 자세하고 쉽게 설명한 아래의 문서들을 보시면 좀 더 쉽게 이해할 수 있을 겁니다.

2. 설치

Autotools가 무엇인지 알게 되었다면 이제 개발에 필요한 Eclipse와 Autotools를 설치해 봅시다.

Autotools의 전부를 이해하지 못한다 해도 이 Post에 순서도 차근차근 따라하다 보면 쉽게 Project를 만들 수 있으니 걱정하지 않아도 됩니다. :)

2.1. Eclipse 설치

Autotools Project를 만들기 위해서 Eclipse를 설치합니다. 설치 방법은 2가지가 있는데 개인의 취향에 따라 아래의 2가지 방법 중 하나를 선택하면 됩니다.

Method 1: Eclipse IDE for C/C++ Linux Developers 설치

첫 번째 방법은 C/C++ 개발을 Eclipse 상에서 수행하기 위해 필요한 Plugin을 미리 설치해 놓은 Package를 Download해서 사용하는 것입니다. 굳이 Plugin Download에 시간을 들일 필요가 없이 한방에 설치할 수 있습니다.

먼저 Eclipse의 Download Page에 Web Browser로 접속합니다.

Eclipse Downloads

Eclipse Downloads

Eclipse IDE for C/C++ Linux Developer의 오른쪽에 Linux 32bit, Linux 64bit 중에서 설치된 OS의 Architecture에 맞는 것을 Click합니다.

Eclipse Downloads - Mirror Selection

Eclipse Downloads - Mirror Selection

그 다음, Download를 위한 Mirror가 Page 상단에 위의 그림과 같이 표시되는데 그 Link를 Click하면 Download가 시작됩니다.

Download한 Eclipse Package는 Terminal에서 다음과 같이 입력하여 압축을 해제합니다.

1
# tar xvzf eclipse*.tar.gz -C ~

위의 명령을 사용하면 ~/Eclipse Directory에 설치됩니다. Directory를 변경하고 싶다면 -C Option 뒤에 설치할 Directory를 입력하면 됩니다.

이제 설치는 모두 완료되었습니다. 그러나 Eclipse를 실행하기 위해서는 JRE 또는 JDK가 필요합니다. Ubuntu Natty Narwhal 11.04의 경우는 다음 Post를, Ubuntu Oneiric Ocelot 11.10의 경우는 다음 Post를 참고하여 설치하면 됩니다.

Method 2: Eclipse CDT Plugin 설치

두번째 방법은 기존에 사용하던 Eclipse에 Plugin 형태로 설치하여 사용하는 방법입니다. Eclipse의 최신 Version인 Eclipse Classic 3.7.1 Indigo를 예로 들어 설명하겠습니다.

Eclipse - Install New Software

Eclipse - Install New Software

Eclipse를 실행한 후, Help -> Install New Software를 Click합니다.

Available Software

Available Software

Available Software Dialog에서 Work With Combobox의 Indigo를 선택합니다. 잠시 기다리면 아래에 설치 가능한 Plugin List가 표시되는데, 여기서 위의 그림과 같이 Programming Langauages의 다음 항목을 Check한 다음 Next를 누릅니다.

  • Autotools support for CDT (Incubation)
  • C/C++ Development Tools
  • C/C++ Library API Documentation Hover Help (Incubation)
Install Details

Install Details

설치될 Plugin의 구체적인 목록이 표시됩니다. Next를 누릅니다.

Review Licenses

Review Licenses

설치될 Plugin의 License가 표시됩니다. 오른쪽 아래의 I accept the terms of the license agreement를 Check하고 Finish를 누릅니다.

Installing Software

Installing Software

Plugin Site에서 설치할 Plugin을 자동으로 Download한 후 설치됩니다.

Restart

Restart

설치가 완료되면 Eclipse를 다시 시작하겠는지 물어보는 Dialog가 표시되는데 Restart Now를 Click하여 재시작하면 Plugin 설치가 모두 완료됩니다.

2.2. Autotools 설치

개발을 위한 IDE인 Eclipse를 설치했다면 이제 Autotools를 System에 설치해 봅시다. Ubuntu의 Repository에 Package가 등록되어 있으므로 Terminal에서 아래와 같이 입력하면 Autotools가 System에 설치됩니다.

1
# sudo apt-get install build-essential autoconf automake libtool

3. Eclipse 설정

설치가 완료되었으니 Eclipse로 Project를 만들기 이전에 개발에 편리한 Setting으로 설정해 봅시다. 먼저, 내용을 설명하기 이전에 Test 환경에 대한 정보를 적어보면 다음과 같습니다.

  • Ubuntu Natty Narwhal 11.04 64bit
  • Eclipse 3.7.1 Indigo
  • Eclipse IDE for C/C++ Linux Devlopers 1.4.1 (C/C++ Development Tools 8.0)
  • Autotools support for CDT (Incubation) 3.0.1
  • autoconf 2.67, automake 1.11.1 and libtool 2.2.6b

위에서 Home Directory의 eclipse Directory에 Eclipse의 압축을 해제했다면 다음과 같이 입력하여 Eclipse를 실행합니다.

1
2
$ cd ~/eclipse
eclipse$ ./eclipse
Workspace Launcher

Workspace Launcher

처음 실행한 경우 위의 그림과 같이 Workspace를 설정하는 Dialog가 표시됩니다. Workspace는 Project를 개발하기 위한 작업공간(Directory)을 나타냅니다. 원하는 Directory를 선택한 다음 OK를 누릅니다.
(실행할 때마다 묻는 것이 귀찮다면 use this as the default and do not ask again을 Check하면 됩니다.)

Eclipse - Open Perspective

Eclipse - Open Perspective

먼저 C/C++ Project를 개발할 환경으로 설정해야 합니다. (Plugin으로 설치한 경우에만 필요) Window -> Open Perspective -> Other를 Click합니다.

Open Perspective

Open Perspective

Open Perspective Dialog에서 C/C++을 선택하고 OK를 누릅니다.

Eclipse - Preferences

Eclipse - Preferences

C/C++을 개발할 환경이 표시되면 이제 개발에 편리한 설정을 해 봅시다. Window -> Perferences를 Click합니다.

Preferences - Key Scheme

Preferences - Key Scheme

CDT가 Eclipse에 설치되면 Key Scheme으로 Visual Studio 항목이 생기게 됩니다. Visual Studio의 단축키에 익숙하다면 General -> Keys -> Scheme -> Microsoft Visual Studio를 선택하면 편리하게 Eclipse를 사용할 수 있습니다.

Visual Studio Key Scheme을 설정하게 되면 Debugging 시에 F10 Key(Step Over)가 Unity의 단축키와 맞물려서 제대로 동작하지 않을 것입니다. F10 Key를 제대로 사용하려면 아래와 같이 Terminal에서 입력하면 됩니다.

1
$ gconftool-2 --type string --set /apps/compiz-1/plugins/unityshell/screen0/options/panel_first_menu ""
Preferences - Documentation Tool

Preferences - Documentation Tool

그리고 C/C++ -> Editor의 Option 중에 Documentation tool comments라는 Section이 있습니다. C/C++ Project를 개발할 경우, Project의 문서화를 위해서 문서화 도구에서 지정한 주석을 사용하게 되는데 여기서 문서화 도구의 종류를 설정하면 주석 입력시 자동으로 해당하는 문서화 도구에 맞는 주석양식이 자동으로 입력됩니다.

또한 그 주석의 내용을 가지고 주석이 해당하는 Class나 Method에 Mouse Cursor가 위치했을 때 주석을 내용을 Tooltip으로 자동으로 표시합니다.

C/C++ 개발시 문서화 도구로 Doxygen을 주로 사용하기 때문에 위의 그림과 같이 Workspace default에 Doxygen을 선택하면 됩니다. Doxygen의 주석 양식과 사용방법이 궁금하다면 Borland C++ Builder 6: Doxygen으로 Source Code 문서화하기 (Part 1)을 참고하기 바랍니다.

이 외의 Preferences 설정은 자신에 맞게 설정해 주면 됩니다. 잘 모르겠다면 나머지는 변경하지 말고 위에 언급한 설정만 적용해도 충분합니다.

4. 마치면서…

이제 Eclipse를 사용해서 Autotools Project를 생성하기 위한 모든 준비가 끝났습니다. 다음 Post에서는 직접 C/C++ Project를 생성해 보고, 새로운 Source를 추가하는 방법과 Debugging을 하는 방법 등을 알아보도록 하겠습니다.