Subversion(SVN)의 설치와 사용 (Ubuntu Feisty)

1. 설치

apache2와 svn과 apache2에서 svn을 사용하기 위한 모듈을 각각 설치한다.

sudo apt-get install apache2
sudo apt-get install subversion
sudo apt-get install libapache2-svn

이제 프로젝트 저장소(Repository)를 생성한다. 여기서는 tbpcb라는 프로젝트의 저장소를 /home/svn/tbpcb에 생성하는 것을 기준으로 설명한다.

/home/svn# sudo svnadmin create tbpcb
/home/svn# sudo chmod -R g+sw tbpcb
/home/svn# sudo chown -R www-data:www-data tbpcb

svn의 설정파일을 다음과 같이 편집한다. 예제는 아이디와 비밀번호를 통해 인증을 받아야 svn에 접근할 수 있도록 한다.

sudo vi /etc/apache2/mods-available/dav_svn.conf

<Location /svn/tbpcb>
  DAV svn
  SVNPath /home/svn/tbpcb

  AuthType Basic
  AuthName “Subversion Repository”
  AuthUserFile
/etc/apache2/dav_svn.passwd
   
  Require valid-user
</Location>

dav_svn.conf 파일에서 지정한 인증파일(dav_svn.passwd)에 아이디와 비밀번호를 추가하기 위해 htpasswd2를 사용한다. 여기서는 reshout라는 유저의 아이디와 비밀번호를 dav_svn.passwd에 저장한다. 유저를 추가하고 싶다면 -n 옵션을 써서 출력되는 내용을 dav_svn.passwd에 추가해 주면 된다.

/etc/apache2# sudo htpasswd2 -c -m dav_svn.passwd reshout

2. 사용

svn 저장소에 프로젝트를 처음 올릴 때 (import)

svn import -m “Initial Import” src http://192.168.12.12/svn/tbpcb

svn 저장소에서 프로젝트를 처음 받아 올 때 (check out)

svn co http://192.168.12.12/svn/tbpcb src

작업한 내용을 저장소에 반영할 때 (commit)

svn ci

저장소의 변경사항을 내 작업 공간에 반영할 때 (update)

svn up

코딩하기 좋은 폰트

소스코드를 들여다 보는 일이 삶의 커다란 부분이다 보니 코딩할 때 사용하는 폰트에 민감한 편이다. 심플하고 깔끔하면서도 수려한 것을 좋아하는 개인적인 성향도 무시할 수 없을 것이다. 아마 별로 이런쪽으로 무감각했다면 “굴림체”만 쓰고 있었겠지. “굴림체”의 한글은 여전히 아주 깔끔하고 만족스럽지만 코딩할 때의 영문 “굴림체”는 영 매력이 없다!

얼마전 웹서핑 중에 우연히 Finding the Best Programmer’s Font라는 제목의 웹페이지를 찾아가게 되었고 몇 가지 시도해본 중에 괜찮다고 생각되는 폰트 3가지를 소개하고자 한다. 개인적인 선호도 순서대로 나열해 보았다. 스크린 샷은 Putty로 해당 폰트를 사용한 것이다.

1. Monaco
귀여운 느낌이 들면서도 깔끔한 폰트로 최근에 애용하고 있다.

사용자 삽입 이미지
2. Bitstream Vera Sans Mono
참고한 사이트에서 1위를 차지한 폰트. 정갈하고 절제된 멋이 일품. 허나 다소 심심한 느낌.

사용자 삽입 이미지
3. Anonymous
힘이 느껴지면서도 깔끔한 맛이 있다. 숫자 0의 표현이 인상적인 폰트.

사용자 삽입 이미지

여러분은 어떤 폰트가 가장 맘에 드시나요?

스프링노트, 내가 찾던 바로 그 툴!

사용자 삽입 이미지
사람의 기억력이라는 것에는 한계가 있기에 한번 봤던 것들을 체계적으로 관리해 놓고 활용하는 것이 일 또는 공부의 능률을 향상시키는데 커다란 역할을 한다. 특히 한달 동안 파견근무로 SI일을 하면서 절실히 깨달았다. 개발과정에서 무수히 등장하는 이전 시스템의 테이블과 컬럼들 그리고 그 것이 매핑되는 새로운 테이블과 컬럼들을 매번 뒤지고 다니자면 짜증이 밀려오는 것은 시간문제! 이대로는 안되겠다 싶어 포스트잇을 활용해보기도 하고 엑셀파일에 기록하기도 하면서 나름의 효율적인 자료정리 방법을 찾아 나섰다.

종이에 정리하는 방법은 확실히 한계가 있다. 추가 및 삭제를 자주 하다보면 글자가 종이에서 옮겨가거나 지워질 수 없는터라 불편한 점이 이만저만이 아니다. 결국 컴퓨터에 정리하는게 정답이라 생각되지만 문제는 자료를 체계적으로 정리할 수 있도록 도와주는 툴이 있어야 한다는 것. 그동안 그나마 자료를 정리하기에 적합하다고 생각했던 툴이 바로 moniwiki 였는데 올블로그를 서핑 중 스프링노트의 동영상을 보고나서 감동 받았다.

moniwiki의 방식을 따라가면서도 사용의 편리함과 외모의 수려함을 더했다! 편집이 간편하고 쉬울 뿐더러 상위, 하위 페이지 개념이 있어 페이지를 찾아 이동하거나 페이지 사이의 관계를 체계적으로 관리하기에 유용하다. 많은 사람들이 스프링노트에 애정을 가지고 개선할 부분에 대하여 거침없이 의견을 쏟아내고 있으니 좀 더 완성된 서비스가 되길 기대해 본다.

스프링노트 사이트를 방문해보면 여러가지 활용예제들을 볼 수 있다. 나의 경우 프로젝트 관련 자료들을 체계적으로 정리하고 월간, 주간, 일간 계획을 기록한다. 앞으로 공부하면서 얻은 전산관련 지식들을 잘 정리해 두면 두고두고 요긴하게 사용할 수 있을 것이다.

자료정리에 어려움을 겪는 분들은 한번쯤 고려해보세요.

프로프레임 4.0

대우증권에 파견나가서 하고 있는 일은 대우증권의 차세대 시스템을 구축하는 것인데, 이때 사용되는 우리회사의 솔루션은 티맥스와 프로프레임이다. 티맥스는 미들웨어로서 프로프레임은 프레임워크로서의 위상을 가지며 이 둘은 물론 서로 긴밀히 연동되어 동작한다.

기존의 신한은행 프로젝트와 SK Telecom 프로젝트에서는 프로프레임 3.0이 사용되었는데, 이번 대우증권 프로젝트는 프로프레임 4.0이 처음 사용되고 있다. 그만큼 새로운 도전이기에 다소 파일럿 프로젝트의 성격을 가지게 되고 개발과정에서 변동사항이 있어 어려움을 겪기도 한다.

“프로프레임 4.0 사상”이라고 부를 만큼 프로프레임 4.0의 개발방법론은 기존의 날코딩과 확연히 다르다. 회사 보안상, 대우증권 업무 프로세스 보안상 스크린 샷을 보여드릴 수는 없지만 대략적으로 소개하자면, 가장 눈에 띄는 것은 EMB Desiner라고 할 수 있다. 프로그램을 작성하는데 있어 코드부터 작성하는 것이 아니라 업무의 플로우를 순서도 그리듯이 사각형과 화살표를 사용하여 나타낸다. 이는 DB접근에 해당하는 DBIO 모듈이나 비지니스 모듈 등을 끌어와 붙이는 작업을 포함한다. 모듈을 끌어다 쓰는 경우에는 Pro Mapper를 통해 입, 출력 데이터를 매핑한다.

프로젝트를 진행할 때 일주일에 한번씩 회의를 갖는다. 이 시간에는 프로프레임 4.0을 사용하여 시스템을 개발하면서 생각해볼만한 개선사항, 표준안등을 토론한다. 그리고 토론결과의 일부는 연구소로 피드백되어 프로프레임 4.0의 개선을 도모하고 있다.

우리회사가 만든 미들웨어 위에, 우리회사가 만든 프레임워크와 개발툴을 사용하여 시스템을 구축하면서 회사에 대한 자부심이 커가는 요즘이다.

View

이클립스의 기본적인 사용자 인터페이스는 크게 view와 editor로 구성됩니다. 이 글에서는 매우 간단한(!) VICODE의 Log View를 가지고 View의 구현방법을 소개하겠습니다.

사용자 삽입 이미지
먼저 plugin.xml에서 View를 확장하는 부분을 보겠습니다.

<extension
         point=”org.eclipse.ui.views“>
      <view
            category=”kr.ac.kaist.vicode”
            class=”kr.ac.kaist.vicode.view.log.LogView
            icon=”icons/esterel_image.gif”
            id=”kr.ac.kaist.vicode.logview”
            name=”Log”/>
      <category
            id=”kr.ac.kaist.vicode”
            name=”VICODE”/>
   </extension>

org.eclipse.ui.views 확장점을 사용합니다. 해당 View를 포함할 카테고리를 지정하고 View를 표현하는 아이콘을 정의합니다. 이제 LogView.java 코드를 보겠습니다. 그렇게 길지 않으니 전체 코드를 늘어놓고 글을 이어나가도록 하지요.

public class LogView extends ViewPart
{
 private Table table;
 private TableColumn[] columns;
 private final String[] TABLE_COLUMN_NAMES = { “Message”, “Location”, “Time” };
 private final int[] TABLE_COLUMN_WIDTH = { 400, 400, 150 };
 public LogView()
 {
  super();
 }
 public void createPartControl(Composite parent)
 {
  table = new Table(parent, SWT.BORDER | SWT.V_SCROLL);
  columns = new TableColumn[TABLE_COLUMN_NAMES.length];
  for(int i=0, n=TABLE_COLUMN_NAMES.length; i < n; i++)
  {
   columns[i] = new TableColumn(table, SWT.NONE);
   columns[i].setText(TABLE_COLUMN_NAMES[i]);
   columns[i].setWidth(TABLE_COLUMN_WIDTH[i]);
  }
  table.setHeaderVisible(true);
  table.setLinesVisible(true);
 }
 public void setLog(String message, String location)
 {
  Date date = new Date();
  SimpleDateFormat dateFormat = new SimpleDateFormat(“hh:mm:ss”);
  String dateString = dateFormat.format(date);
  TableItem ti = new TableItem(table, SWT.NONE);
  ti.setText(0, message);
  ti.setText(1, location);
  ti.setText(2, dateString);
  for (int i = 0; i < columns.length; i++)
  {
   columns[i].pack();
  }
 }
 public void clearLog()
 {
  table.clearAll();
 }
 public void setFocus()
 {
  table.setFocus();
 }
}

View를 구현한 클래스는 ViewPart 클래스를 상속합니다. 예제의 Log View 처럼 단순히 정보를 보여주는 View를 구현하는 경우에는 createPartControl() 메서드에서 보여주고 싶은 위짓을 정의하는 것으로 간단히 View를 구성할 수 있습니다. View에 Action을 추가한다던가 워크벤치의 다른 View 혹은 Editor와 상호작용하도록 하려면 조금 더 복잡해지겠지요.

여기서 한가지 명확히 해야할 것은 JFace viewer의 위상입니다. JFace viewer는 모델-뷰 구조를 기반으로 사용자가 쉽게 유려한 viewer를 만들 수 있도록 돕기 위해 제작된 일종의 UI 프레임워크입니다. 따라서 JFace viewer를 제작할 때 모델의 데이터를 뷰에 전달하는 Contents Provider, Label Provider 등을 구현해야 하는 것이죠. 중요한 것은(!) JFace viewer는 이클립스에서 UI를 표현할 수 있는 어떤 곳에도 붙일 수 있다는 것 입니다. 마법사의 한 페이지에 붙일 수도 있고 Editor에 붙일 수도 있죠. 이 글에서 말하는 Viewer가 아닌 View는 이클립스 워크벤치의 일부로서 화면에 정보를 나타내기 위한 부분이라고 생각할 수 있습니다. 구현하기에 따라서는 ViewPart를 상속하여 Editor의 역할을 수행하도록 만들 수도 있습니다.

본론으로 돌아와서 createPartControl() 메서드에서 SWT의 table 컨트롤을 추가하고 초기화 합니다. View에 정보를 제공하고자 하는 다른 클래스에서는 clearLog(), setLog() 메서드를 이용해서 View에 포함된 table 위짓에 값을 추가 및 삭제하게 됩니다. LogView의 인스턴스는 id를 이용해서 다음과 같이 얻을 수 있습니다.
 

 public void init(IWorkbenchWindow window)
 {
  this.window = window;
 }

 …
 LogView logView =
    (LogView) window.getActivePage().findView(IResourceIDs.LOG_VIEW_ID);