이번 장의 내용은 Trac을 사용하는데는 꼭 하지 않아도 상관없는 내용입니다. 하지만 Trac이 서브버전을 사용하고 있고 서브버전 설치에 대해서도 알아봤으니 서브버전을 설정하는 법에 대해서도 알아보도록 하겠습니다. Trac만을 사용하겠다시는 분은 이번장을 넘어가셔도 상관없습니다. 4장. Trac On Windows - Subversion 설정 및 실행해보기 3장까지 해서 Trac을 설정해 보았습니다. 프로젝트 참여자 각자 모두가 어차피 서브버전을 설치해서 사용할 거니깐... 서브버전을 꼭 웹과 연동되어야 하는 것은 아닙니다. 하지만 웹과 연동을 시켜 놓으면 좋은 점이 있습니다. 먼저 웹에서 소스를 열람해 볼 수 있습니다. 그런데 이부분은 Trac을 통해서도 가능합니다. 또 다른 장점은 서브버전으로 소스를 체크아웃 할때 svn 프로토콜 뿐만이 아니라 http프로토콜도 사용할 수 있습니다. http프로토콜을 사용할 수 있다는 것은 일반적으로 방화벽 때문에 생기는 문제들을 해결할 수 있습니다. 왜냐면 80포트는 일반적으로 풀려 있기 때문이죠. 설정할 필요가 있던 없던 설명은 하도록 하겠습니다. 자 우리 한번 해봅시다. 1. 서브버전과 아파치와의 연동 이미 3장에서 아파치에 서브버전에 관한 Test프로젝트 저장소도 만들었고 서브버전 모듈들도 이미 설정했고 가상디렉토리도 설정해서 간단한 테스트도 해 보았습니다. 서브버전 가상디렉토리 설정 이야기는 여기서 부터 시작합니다. 3장에서 httpd.conf에 설정했던 내용을 다시 한번 보겠습니다. DAV svn SVNPath "D:/Trac/SvnRepo/Projects/Test" ▲ dav_svn_module 테스트 페이지 설정 위에서 DAV라는 것은 "Distributed Authoring and Versioning"(분산 저작 및 버전관리)의 약자로 여기서는 정확히 "Web-based Distributed Authoring and Versioning"(웹 기반 분산 저작 및 버전 관리)가 되겠습니다. 즉 Web을 이용해서 웹페이지를 올리는 것 같지 한다는 이야기죠. 일반 웹브라우저는 WebDAV를 지원하지는 않구요. 특수한 클라이언트가 있어야 합니다. 여기서는 아파치에 서브버전의 DAV모듈을 로드하여 서브버전 클라이언트와 WebDAV프로토콜을 사용하여 소스를 받고 올리게 한다는 것입니다. WebDAV에 대한 자세한 사항은 http://www.webdav.org/ 를 참조하세요. 1) 인증 처리 추가 위의 설정의 가상디렉토리를 접근하는 URL은 http://localhost:88/svn/Test입니다. 그런데 이곳은 아무나 접근을 해서 볼 수 있게 되어 있습니다. 그래서 인증을 추가해 보겠습니다. 인증 파일은 3장에서 만들었던 D:\Trac\.htpasswd 파일을 사용하도록 하겠습니다. DAV svn SVNPath "D:/Trac/SvnRepo/Projects/Test" AuthName "Subversion Test repository" AuthType Basic Require valid-user AuthUserFile "D:/Trac/.htpasswd" ▲ 서브버전 인증 추가 설정 이제 다시 웹으로 접속해 보면 아까와는 달리 BASIC인증 대화상자가 나타납니다.
((-------IMAGE-------))

로그인이 되면 소스의 내용을 볼 수 있습니다. 2) 다중 프로젝트 설정 Trac에서도 그랬지만 서브버전이 하나의 프로젝트만 관리하지는 않겠죠? 그래서 여러 프로젝트를 보기 위한 설정을 하도록 해보겠습니다. D:\Trac\SvnRepo\Projects 디렉토리에 Test 서브버전 저장소 뿐만 아니라 ProjectA, ProjectB라는 저장소도 생성하십시오. 귀찮으면 Test를 복사해서 이름이라도 바꾸십시오. 그런 다음 httpd.conf파일에서 아까 설정했던 부분을 다음과 같이 변경합니다. DAV svn SVNParentPath "D:/Trac/SvnRepo/Projects" AuthName "Subversion Projects" AuthType Basic Require valid-user AuthUserFile "D:/Trac/.htpasswd" ▲ 다중 프로젝트 설정 여기서 조금 특이한 부분은 SVNParentPath입니다. 이게 한단계 상위의 Path를 맵핑시키고 각각의 프로젝트를 http://localhost:88/svn/ProjectA, http://localhost:88/svn/ProjectB, http://localhost:88/svn/Test URL로 접근할 수 있도록 해줍니다. 웹브라우져 뿐만이 아니라 서브버전 클라이언트로도 같은 URL로 접근할 수 있습니다. 예를 들면 다음과 같이 해서 체크아웃 할 수 있습니다. C:\testsvn>svn co http://localhost:88/svn/Test Test 체크아웃된 리비전 0. ▲ 아파치와 연동하여 저장소 소스 체크아웃하기 위에서 보면 서버를 지정하기 위해 http프로토콜을 사용하고 있음을 알 수 있습니다.
만약 웹브라우저로 소스를 열람하는 것과 체크아웃하는 것은 아무나 할 수 있도록 하고 커밋은 지정된 사용자만 할 수 있게 하려면 위의 내용을 다음과 같이 바꾸면 됩니다. DAV svn SVNParentPath "D:/Trac/SvnRepo/Projects" AuthName "Subversion Projects" AuthType Basic AuthUserFile "D:/Trac/.htpasswd" Require valid-user ▲ 모두에게 열람 및 체크아웃하게 하고 지정된 사용자만 커밋 가능 설정 여기서 커밋 가능한 사용자는 따로 서브버전 저장소에 설정하여야 합니다. 2. 서브버전 서버(svnserve) 사용 어찌 어찌 하다보니깐 순서가 바뀐 것 같은 느낌이 듭니다. ㅎㅎ 원래 서브버전의 다른 강좌에서는 서브버전으로 우선 서비스를 하는 것을 모두 설명한 다음에 아파치와 연동하는 것을 이야기 하는데 이야기를 Trac에 촛점을 맞춰서 시작하다 보니 거꾸로 온 듯한 느낌은 들지만 뭐 이해하시는 대는 문제가 없을 듯합니다. ㅎㅎ 서브버전을 설치하면 svn.exe라는 파일을 사용할 수 있는데 이것이 바로 서브버전의 클라이언트에 해당합니다. 그럼 서버는 어떤 것이냐면... svnserve.exe라는 파일입니다. 물론 로컬 컴퓨터에서 혼자만 사용할 거라면 svnserve.exe으로 서버를 동작시키지 않고도 로컬 파일 시스템은 사용할 수 있습니다. 이번 장에서는 svnserve.exe에 의해 서버를 띄우고 이를 통해(아파치와 연동하지 않고) 서브버전을 사용하는 것에 대해서 설명하도록 하겠습니다. 1) svnserve 서버 띄우기 svnserve는 커맨드 창에서 다음과 같이 실행할 수 있습니다. C:\>start svnserve --daemon --root D:\Trac\SvnRepo\Projects\Test ▲ 윈도우즈에서 서브버전 서버 실행하기 /home>svnserve --daemon --root /Trac/SvnRepo/Projects/Test ▲ 유닉스/리눅스에서 서브버전 서버 실행하기 위와 같이 실행하면 아무 메시지도 나타나지 않는 새로운 창이 뜨게 됩니다. 무소식이 희소식이라고 아무 메시지도 안나오는게 정상적으로 동작하는 것입니다. 사실은 문제가 있더라도 아무 메시지가 출력되지 않습니다. 다음과 같은 명령으로 서브버전 서버에서 소스를 체크아웃 할 수 있습니다. C:\testsvn>svn co svn://localhost/ Test 체크아웃된 리비전 0. ▲ 서브버전 서버와 연동하여 저장소 소스 체크아웃하기 이번에는 서버를 지정하기 위해 svn프로토콜을 사용하고 있군요. 포트번호는 특별히 지정하지 않았는데요. 서브버전은 기본으로 3690번 포트를 사용합니다. 만약 포트를 7000번으로 바꾸고 싶다면 svnserve를 실행할 때 --listen-port 7000 와 같은 옵션을 추가해 줍니다.
위의 명령에서 start는 새로운 창으로 띄워서 실행하라는 의미입니다. 유닉스나 리눅스의 경우는 start라는 명령은 사용하지 않습니다. --daemon은 백그라운드로 돌아라는 명령인데 그렇다고 --daemon을 생략하면 실행됐다가 바로 죽어버립니다. 그래서 반듯이 줘야 합니다. --root는 서브버전 저장소가 어디인지를 알려주기 위해 사용합니다. 위의 설정으로는 Test 프로젝트에만 접근 가능합니다. 위의 명령에서 서브버전 저장소를 Test까지 주지 않고 Projects까지 주면 Test뿐만 아니라 ProjectA, ProjectB 모두를 꺼내볼 수 있습니다. 새창이 떠있을 때는 사실 문제의 소지가 있습니다. 뭐 창이 하나 떠 있어서 귀찮다는거 말고도 누군가 실수로 창을 닫아 버리거나 컴퓨터를 재 부팅 했을 경우 다시 띄워줘야 정상적인 서비스가 가능하다는 것이죠. 물론 시작프로그램에 등록하면 재 부팅 문제는 해결할 수 있겠네요. 어찌 되었건 창이 띄는게 맘에 안든다면 다음과 같이 할 수 있습니다. C:\>start /B svnserve --daemon --root D:\Trac\SvnRepo\Projects\Test ▲ 윈도우즈에서 새창 띄우지 않고 서브버전 서버 실행하기 보시면 /B옵션을 추가 했다는 것을 아시겠죠? 이런 경우는 svnserve를 죽이기 위해 작업관리자를 사용해서 작업종료를 해야 합니다. 하지만 가장 중요한 문제가 하나 더 남아 있는데 서브버전 서버를 컴퓨터에 로그인 하지 않으면 실행되지 않는 다는 것이 큰 문제입니다. 즉, 컴퓨터가 시작되면서 바로 서비스가 실행되지 않는다는 것이죠. 이문제를 해결하기 위해서는 svnserve를 서비스로 등록하여야 합니다. 2) svnserve 서버 서비스로 등록하기 서비스로 등록하는 방법으로는 여러가지가 있습니다. 또한 이런 걸 도와주는 툴들도 인터넷 상에 돌아다닙니다. 툴을 사용하실려면 다음의 URL을 참고하세요. http://dark.clansoft.dk/~mbn/svnservice/ http://www.pyrasis.com/main/SVNSERVEManager 여기서는 이런 툴 없이 그냥 맨손으로 서비스에 등록하도록 하겠습니다. 우선 서비스에 등록하기 위해 필요한 준비물은 sc.exe라는 프로그램입니다. 일반적으로 Windows의 system32디렉토리에 존재합니다. 이 프로그램은 서비스 제어 프로그램의 윈도우즈에서 제공하고 있습니다. sc.exe의 기본 사용법은 다음과 같습니다. sc [command] [service name] ... ▲ sc.exe의 사용법 사용법은 command에 따라 다양하시만 여기서는 서비스 등록, 제거, 일부 값 변경에 관한 내용만 알아보도록 하겠습니다. <server>는 \\MyCom 과 같이 서비스를 제어하고 싶은 컴퓨터의 이름을 적는 부분인데 자신의 로컬 컴퓨터를 대상으로 한다면 생략하여도 됩니다. command는 다음의 값을 사용하면 됩니다. - 서비스의 등록: create - 서비스의 제거: delete [service name]은 서비스로 등록할 때 등록자가 임의로 그 서비스의 이름을 지정하는 것입니다. <option>은 각 command마다 다른데 우리가 필요한 몇가지만 보도록 하겠습니다. binpath= : 서비스를 제공할 파일의 전체 경로를 적어 줍니다. start= : 서비스를 시작 유형을 자동(auto), 수동(demand), 사용안함(diabled)으로 지정할 수 있습니다. displayname= : 서비스를 확인시키기 위해 사용될 이름을 지정합니다. 뭐 이정도만 알면 될 것 같습니다. 옵션을 지정할 때 주의 해야 할 점이 하나 있는데 "옵션명= 옵션값"을 지정하되 = 다음에는 꼭 스페이스가 있어야 합니다. 그렇지 않으면 오류가 납니다. 자 그럼 이제 서브버전을 서비스에 등록해 보도록 하겠습니다. svnserve에 지정하는 옵션 중 서비스에 등록할 때는 --deamon 대신에 --service를 사용해야 합니다. sc create "Subversion Serve" binpath= "C:\Program Files\Subversion\bin\svnserve.exe --service --root D:\Trac\SvnRepo\Projects" ▲ sc를 이용한 svnserve 서비스 등록 서비스 관리자에 가서 보면 "Subversion Serve"라는 이름으로 서비스가 등록되어 있는 것을 확인 하실 수 있을 것입니다.
((-------IMAGE-------))

시작시키면 시작도 되구요. 정지 시키면 정지도 됩니다. 물론 정상적으로 설치 했을 경우에 말이죠. ㅎㅎ 만약에 잘못 등록해서 서비스에서 제거해야 한다면 다음과 같이 합니다. sc delete "Subversion Serve" ▲ sc를 이용한 svnserve 서비스 제거 자 이제 서비스에도 등록했겠다. 이제 서브버전에 더 상세한 설정을 해 보도록 하겠습니다. 3. 서브버전 권한 설정 이미 해보셨겠지만 현재 상태에서 서브버전의 저장소는 읽기 전용으로 동작합니다. 즉, 체크아웃은 되지만 체크인은 되지가 않습니다. 좀 이상하다고 생각하실지 모르겠습니다. 이전에 아파치에서는 인증을 통해서 체크인도 했었는데 svnserve로는 커밋을 못한다니... 아파치와 연결해서 사용할 때는 httpd.conf에 설정한 값에 의해 서브버전이 행동을 합니다. 저장소의 설정과는 상관없이 말이죠. 하지만 svnserve는 아파치에 설정했던 것과 아무 상관없이 동작합니다. 사실 이게 설정했던 것과는 상관없습니다. svnadmin으로 저장소를 생성하면 기본적으로 읽기 전용으로 만들어 집니다. 이제 권한을 변경해 보겠습니다. 1) svnserve.conf 설정 및 인증 추가하기 각 서브버전의 저장소를 들여다 보면 conf라는 디렉토리가 있습니다. 우리가 실습하고 있는 예 중 하나로 보면 D:\Trac\SvnRepo\Projects\Test\conf 디렉토리가 되겠죠? 거기로 가서 svnserve.conf라는 파일을 열어보세요. 보시면 아시겠지만 대부분은 #으로 주석처리되어 있습니다. 그래서 읽기 전용인 것입니다. 그럼 12라인쯤에 보면 anon-access = read 라는 부분이 주석 처리되어 있습니다. 이 의미는 익명(로그인하지 않고)으로 서브버전 저장소에 저장하는 사용자에게 어떤 권한을 부여할지를 결정합니다. 사용할 수 있는 값으로는 read, write, none 중에 하나를 설정할 수 있습니다. read는 읽기전용이구요, write는 읽고 쓸수 있게 권한을 부여하는 것이구요. none의 경우는 읽지도 못하게 할때 사용합니다. 우선 #을 지우시고 값을 read로 그대로 놔 둡니다. 즉, 익명의 사용자는 읽어볼 수 만 있게 하는 것이죠. 그 다음 라인은 auth-access = write 라고 적혀 있는데 역시 주석처리 되어 있군요. auth-access는 로그인 한 사용자에 대한 권한을 지정하는 것입니다. 이 것도 그냥 주석만 풀어 주세요. 즉, 인증이 된 사용자는 읽고 쓰기가 모두 가능하게 하는 것이죠. 그 다음은 18라인 쯤 보면 passwd-db = passwd 라고 적혀 있는 라인이 보입니다. 뭐 주석처리 되어 있지만 인증을 하기 위한 사용자 명과 암호를 설정한 파일이 어디 있는지 지정하는 곳입니다. 지금 현재는 같은 디렉토리에 passwd라고 지정되어 있군요. 다른 디렉토리에서 사용자 계정을 관리하고 싶다면 해당 파일의 경로와 이름을 적어 주면 됩니다. 우선은 이것도 값을 그대로 두고 주석만 제거하세요. 그리고 제일 마지막 라인의 realm = My First Repository 부분의 주석을 제거하고 "My First Repository"라고 되어 있는 부분을 여러분이 쓰고 싶은 문자열을 쓰세요. 이 값은 인증을 요구할 때 표시되는 인증을 요청하는 곳의 명칭으로 사용됩니다. 저는 여기에 "Test Repository"라고 쓰도록 하겠습니다. 그리고 같은 디렉토리에 보면 passwd파일이 하나 있습니다. 이 파일은 위의 svnserve.conf파일의 passwd-db항목에 설정한 파일이죠? 이 파일을 열어 보시면 다 주석으로 처리되어 있네요. 사용자명과 암호를 =로 구분하여 적으면 됩니다. 즉, pooh라는 사용자명과 1234라는 암호를 부여하려면 파일의 제일 아래에 pooh=1234 라고 적어주면 됩니다. 아직 서브버전은 암호화된 인증 파일을 지원하고 있지 않습니다. 그래서 그냥 암호자체를 적어야 합니다. 좀 찝찝하기는 하지만 현재로선 별수가 없습니다. 어찌되었건 실습을 위해 passwd에 pooh = 1234 와 scott = 1234 를 지정하시기 바랍니다. 참고로 위의 설정 값들은 라인의 첫번째 컬럼부터 시작해야 합니다. 제일 앞에 공백과 같은 것이 있을때는 설정파일 오류가 납니다. 자 여기까지 했으면 svn으로 다시 한번 해 보죠. D:\testsvn>svn co svn://localhost/Test Test 체크아웃된 리비전 0. D:\testsvn>cd Test D:\testsvn\Test>copy con readme.txt 읽어보세요 ^Z 1개 파일이 복사되었습니다. D:\testsvn\Test>svn import -m "readme 추가" svn://localhost/Test 인증 영역(realm): Test Repository 'administrator'의 암호: 인증 영역(realm): Test Repository 사용자명:pooh 'pooh'의 암호:**** 무시함 '.svn' 추가 readme.txt 커밋된 리비전 1. D:\testsvn\Test> 위의 예를 보면 svn://localhost/Test 에서 체크아웃하고 거기에 readme.txt 파일을 하나 생성한 후 이 파일을 import시키고 있습니다. 그런데 체크아웃할 때는 암호를 물어보지 않지만 import할때는 저장소에 쓰기작업이기 때문에 암호를 물어보고 있습니다. 맨 처음에는 윈도우즈의 계정인 administrator의 암호를 물어 보게 됩니다. 하지만 우리는 pooh라는 사용자만 만들었죠? 그래서 그냥 앤터를 칩니다. 그럼 다시 사용자명 부터 물어보게 됩니다. 그리고 위에서 svnserve.conf에서 realm에 설정했던 값이 어디에 출력되는지도 한번 확인해 보시기 바랍니다. 2) 디렉토리, 파일별 권한 설정하기 위의 예에서는 한번의 인증으로 저장소의 모든 파일을 읽고 쓸 수 있는 상태가 되었음을 알 수 있습니다. 이런 경우라면 특별히 보호되어야 하는 파일이나 디렉토리를 지키기가 힘들겠죠? 그래서 이번에는 각 디렉토리 혹은 파일에 사용자별로 권한을 설정하는 방법에 대해서 알아 보겠습니다. svnserve.conf에서 우리가 아직 건드리지 않은 값이 하나 있죠? 약 25번째 라인 쯤에 authz-db = authz 라는 부분입니다. authz-db 항목은 파일이나 디렉토리별로 권한을 부여할 수 있는 설정을 저장하고 있는 파일을 설정하는 부분입니다. 뭐 또 주석만 제거하세요. 그리고 한가지만 더 수정할게 있는데요. authz-db를 사용하려면 anon-access = none 으로 설정되어야 합니다. 이 값이 설정되어 있으면 authz-db의 설정값과 충돌이 생겨서 읽거나 쓸수있는 상황이 생깁니다. 역시 authz라는 파일도 같은 디렉토리에 샘플이 있습니다. [groups] 세션에서 그룹을 대표하는 이름을 만들 있습니다. 예를 들어 ATeam = pooh, scott 과 같이 지정합니다. 이 예는 pooh와 scott이라는 사용자를 ATeam이라고 정하는 것입니다. 팀명을 사용할 때는 @ATeam 이라고 하면 됩니다. 그리고 나머지 세션은 제한을 두고 싶은 실제 저장소내 디렉토리 혹은 파일의 경로입니다. 각 디렉토리 혹은 파일별 권한을 설정하기 전에 우선 모든 사용자가 저장소의 / 디렉토리는 읽고 쓰게 해 주어야 합니다. 다음과 같이 해서 모든 사용자가 읽고 쓸 수 있게 해 줍니다. [/] * = rw 여기서 [/]는 저장소의 /디렉토리에 대한 접근 권한을 지정한다는 의미로 사용되며 *는 누구나 라는 의미이며 r은 읽기 가능 w는 쓰기 가능의 의미를 가지고 있습니다. 즉, rw는 읽고 쓰기가 모두 가능하게 지정하는 것입니다. 만약 읽지도 쓰지도 못하게 하려면 = 다음에 아무값도 적지 않으면 됩니다. 그럼 pooh 사용자가 readme.txt 파일을 읽지 못하게 하려면 다음과 같이 설정하면 됩니다. [/readme.txt] pooh = 이렇게 설정하면 됩니다. 위에서 이야기 한 내용을 모두 한번에 표시하면 다음과 같은 식이겠죠? [groups] ATeam = pooh, scott [/] * = rw [/readme.txt] pooh = [/temp] @ATeam = r 내용을 보면 이제 이해가 가실 거라 생각됩니다. 한가지 꼭 명심하셔야 할 것은 이렇게 설정했다고 해서 아파치를 통해 WebDAV로 접근하는 사용자에게도 통하는게 아니라는거 꼭 명심하시기 바랍니다.
by Anna 안나 2008. 7. 11. 20:56