이번 문서에서는 http://spring.zeroboard.com/prj_wiki/570428 에서 도출된 기본 기능을 바탕으로 각 기능별 상세내용을 정의합니다. 위키의 가장 큰 특징 중 하나인 '버젼컨트롤'이 이번 문서의 이슈인데, 여러가지 기술적으로 고려해야할 사항이 많네요..

언제나 그렇듯, 모든 부분에서 의견을 환영합니다. 놀아주실분도 환영합니다.emoticon 



버젼 컨트롤 기능의 상세


버젼 컨트롤 - 문서의 수정이력을 별도로 보관하고 문서의 내용을 이전의 버젼으로 Rollback(돌아가기)할 수 있는 기능.

1. 버젼 히스토리의 생성

1.1. 버젼은 어떻게 나누는가?
- 문서의 총 용량(byte)를 기준으로 하거나 md5 해쉬를 통해 변경을 확인
- md5 해쉬를 (16bit만 해도 충분?) 이용하여 해쉬값이 바뀌면 문서의 내용이 변경된것으로 판단하고 새로운 버젼으로 정의
- 해쉬를 사용한다면 해쉬생성에 소요되는 시간이 전체 실행시간에 얼마만큼의 영향을 끼치는지 확인해 볼 필요가 있을듯
- 해쉬를 사용하여 문서의 변경을 확인한다면 버젼컨트롤을 주제하는 테이블에 md5해쉬값 또한 보관하고 있어야 한다.

1.2. 최신문서를 DB에 저장
- DB에 저장해 두면 ZBXE의 내부 검색을 통한 검색이 가능하다.

1.3. 기존의 문서는 별도의 파일로 저장하고 보관
- 기존버젼의 문서는 검색의 필요가 없기 때문에  별도의 파일을 만들어서 DB의 오버헤드를 줄인다.
- version 관리 정책 초안 : zero님의 제안 

(http://spring.zeroboard.com/prj_wiki/371656 에서 인용)
작성된 페이지는 고유 퍼머링크를 가지고 document module, 즉 게시물과 같은 구조로 데이터를 입력한다.
    : update가 발생하게 되면 수정 전 글을 따로 정한 format의 문서로 저장하고 db update를 한다.
     이럴 경우 최신 페이지들을 대상으로 검색등이 가능하다.
     ./files/wiki/모듈명/.../고유번호.글버전.txt 등으로 규칙을 정해서 저장하면 될듯 합니다.


1.3.1. 이전버젼 문서를 저장할 때 파일의 형식에 대한 고민
- 문서의 raw를 저장하는것이 line by line의 diff를 구현하는데 도움이 될 것으로 보인다.
- 어차피 raw문서의 용량이 1MB를 넘는 경우는 발생하지 않을것으로 보이기 때문에 해쉬를 통한 변경의 확인이 시스템 퍼포먼스에 큰 영향을 끼치지는 않을듯?

1.3.2. 보관시 오래된 히스토리를 gz로 보관하는것은 어떨지?
- 베니님의 제안

(http://spring.zeroboard.com/prj_wiki/403987 에서 인용)
2) 버전 관리


제로님 의견과 비슷합니다. doku처럼 오래된 히스토리를 아예 gz로 묶어서 저장하는 방식이라면 좋을것 같고 '히스토리' 내용에 대한 저장이 아주 중요하지는 않은 사용처도 있으므로 오래된 어카이브를 어떻게 관리할지 관리해주는 모듈이 있어주면 편할 것 같습니다.

- 오래된 문서버젼의 보관기준에 대한 고민이 필요, 혹은 이것을 옵션으로 두어 관리자가 선택하도록 하는 방법은 어떨지?



2. 버젼 히스토리의 열람

2.1. 위키모듈로 생성된 페이지에 'Version info(수정이력)'버튼 표시
- 혹은 문서의 하단(혹은 별도의 레이어)에 more/less 형태로 뿌려주는것도 좋을듯

2.2. Version info는 버젼을 최근버젼이 위로 올라오도록(내림차순) 리스팅
- 리스트에 표시될 내용 : 버젼 넘버 / 변경내용(작성자의 코멘트) / 작성자 / 수정일자

2.3 문서의 각 버젼별 변경된 내용을 비교할 수 있는 기능. 
(ex: r1.0과 r1.5의 diff 표시 - 새로 추가된 내용, 변경된 내용과 삭제된 내용에 밑줄을 긋거나 배경색을 바꾸어 표시)

2.4. Rollback
- 이전문서로 돌아갈 수 있는 기능 관리권한자가 리스트에서 해당 버젼 옆에 표시되어 있는 Rollback을 클릭하면 (confirm메시지를 표시한 후) 이후버젼을 무시하고 이전버젼으로 Rollback


2.5. History Purge
버젼 히스토리를 비우는 기능. 버젼히스토리에 큰 의미가 없는 경우 이것을 Purge하여 리소스를 절약할 수 있다.  History의 전체를 Purge 하거나 선택한 버젼, 혹은 개별로 Purge할 수 있다면 어떨지? -> 오래된 항목을 gz로 저장한다면 일부 버젼만을 삭제하기가 복잡해질듯?
- Purge의 경우 전체 히스토리를 삭제 (물론 관리권한자에게만 허용)
- 히스토리 리스트에서 관리권한이 있는 사용자는 문서 버젼별로 삭제 가능




버젼컨트롤에 대해서는 조금 더 고민을 해 봐야겠습니다. 조금 더 고민을 해서 정리를 깔끔하게 해야겠네요.. ^^;;;

profile
한때, 웹사이트의 모든것을 혼자 다 만들 수 있다고 자만했던 웹사이트 제작자이자 울트라삽질러. -_-
지금, 언제나 사진에 목마른, 부족한 자신에 좌절하며 도전하는 쌈마이.

길스튜디오 실장 (http://gilstudio.co.kr)
핫셀클럽 운영자 (http://hasselclub.net)