SqueakByExample:6.3

From 흡혈양파의 번역工房
Revision as of 06:21, 12 March 2013 by Onionmixer (talk | contribs) (번역수정)
Jump to navigation Jump to search

몬티첼로(Monticello)

2.9장 에서 스퀵의 패키징 도구인 몬티첼로에 대해 간단하게 알아봤습니다. 하지만, 몬티첼로에는 알려드린 내용보다 더 많은 기능이 있습니다. 이는 몬티첼로가 패키지를 관리하기 때문입니다. 그렇지만 이 장 에서는 몬티첼로에 관해 말씀드리기 전에 알아야할 중요한 내용인, 패키지는 정확히 무엇인지 부터 설명하도록 하겠습니다.


패키지:스퀵 코드의 선언적 분류(declarative categorization)

패키지 시스템은 단순하며, 스몰토크 소스 코드의 체계를 구성하는 가볍고 간략한 방법입니다. 패키지 시스템은 덧붙여 6.2장 에서 살펴본 오래된 작명관례 라고 불리는 방법을 사용합니다..


예를 들어 설명해 보겠습니다. 스퀵에서 관계형 데이터 베이스를 사용하기위해 개발하고 있는 프레임 워크의 이름을 짓는다고 가정해 봅시다. 만들어지는 프레임워크를 SqueakLink라고 부르고, SqueakLink 프레임워크에 작성된 모든 클래스들을 포함하는 일련의 시스템 카테고리를 만들었습니다.


Category 'SqueakLink-Connections' contains OracleConnection MySQLConnection PostgresConnection
Category 'SqueakLink-Model' contains DBTable DBRow DBQuery


위에서 보이는것처럼 여러개의 카테고리와 클래스등등이 만들어지겠죠. 하지만 저 클래스들 모두에 일일히 코드를 넣어줘야 하는건 아닙니다. 예를 들자면, SQL 친화적인 상태로 오브젝트를 변환해주는 메소드 등이 있을 수 있습니다..

Object>>asSQL
String>>asSQL
Date>>asSQL


이 메서드들은 카테고리 SqueakLink-ConnectionsSqueakLink—Model에 있는 클래스들과 동일한 패키지에 속해 있습니다. 그러나 분명한 것은 전체 클래스 오브젝트는 여러분의 패키지에 속해 있지 않습니다! 그러므로, 비록 다른 패키지에 클래스의 나머지가 남아 있을 지라도, 특정한 메서드들을 패키지에 넣어야 합니다.

이 방법을 여러분이 수행하려면 *squeaklink로 작명된 (초기 별표와 소문자 이름에 주의합니다) 프로토콜(오브젝트, 문자열, 날짜 등)에 메서드들을 배치하여야 합니다. SqueakLink의 조합은-…카테고리들 그리고 *squeaklink 프로토콜은 SqueakLink로 작명된 패키지를 형성합니다. 좀 더 정확히 말씀드리자면, 패키지에 발생하는 작업에 대한 규칙은 다음과 같습니다.


Foo로 작명된 패키지는 다음을 포함합니다:

  1. 카테고리 Foo 또는 Foo로 시작하는 이름들에 있는 모든 클래스의 정의
  2. *foo로 작명된 프로토콜에 있는 모든 클래스 속의 모든 메서드 정의들 또는 *foo-로 시작하는 이름들 (이 이름 비교를 할 때, 이름에 있는 글자들의 대소문자는 무시됩니다)
  3. 카테고리 Foo 속에 있는 모든 메서드들 또는 Foo-로 시작하는 이름으로 시작하는 모든 메서드들, *로 시작하는 이름을 가진 프로토콜 속에 있는 메서드들은 제외


이 규칙들의 결과로, 각 클래스 정의와 각 메소스들의 정의는 정확히 하나의 패키지에 속하게 됩니다. 마지막 규칙에서의 예외는 반드시 시행되어야 하며, 그 이유는 그 메서드들이 반드시 다른 패키지에 소속되어야 하기 때문입니다. 규칙 2에서 대소문자 구별을 무시하는 이유는, 관례적으로 카테고리 이름들이 CamelCase(그리고 스페이스를 포함하지 않음)를 사용하는 반면, 프로토콜 이름들은 (스페이스를 포함할 수 있음) 모두 소문자 이기 때문입니다.

클래스 PackageInfo는 이러한 규칙들을 사용하며, 이 규칙들에 대한 감각을 익히는 방법은 이 클래스로 실행하는 것입니다.


Squeak comment.png이 작업을 여러분의 이미지에 시도하면, 클래스 PackageInfo와 RefactoringBrowser를 포함하여야 합니다.


리펙토링 브라우저 코드(the refactoring browser code)는 패키지 이름으로서, RefactoringEnging과 함께 패키지 작명 관례(package naming convetions)를 사용합니다. 워크스페이스에서, refactory := PackageInfo named: 'RefactoringEngine'와 함께 이 패키지의 모델을 만듭니다.


refactory := PackageInfo named: 'RefactoringEngine'.


이제 이 패키지를 자세히 살피는 작업이(introspect) 가능합니다. 예를 들면, refactory 클래스는 리펙토링 엔진(Refactoring Engine)과 리펙토링 브라우저(Refactoring Browser)를 만드는 긴 클래스의 목록을 리턴할 것입니다. refactory coreMethods 는 그 클래스들에 있는 모든 메서드들을 위한 MethodReferences 목록을 리턴할 것입니다. refactoryextensionMethods 는 아마도, 가장 흥미로운 쿼리들 중의 하나일 것입니다: 이것은 RefactoringEngine에 포함되었지만 RefactoringEngine 클래스 내부에는 포함되지 않은, 모든 메서드들의 목록을 리턴 할 것입니다. 이 목록은 예를 들어, ClassDescription»chooseThisClassInstVarThenDo: and SharedPool class»keys 를 포함할 것입니다.

패키지들은 스퀵에 비교적 새로운 추가물 이지만, 패키지 작명 관례(the package naming convettions)가 이미 사용중인 것들에 기초하였었기 때문에,코드로 작업을 하기 위해 명백하게 채택되지 않은 옛코드를 분석하기 위한 목적으로 PackageInfor 사용도 가능합니다.


Squeak comment.png(PackageInfo named: 'Collections') externalSubclasses를 평가합니다, 이 표현식은 Collections 패키지에 없는 Collection 의 모든 서브클래스들의 목록을 답으로 내놓을 것입니다.


여러분은 또한 전체 패키지의 변경 세트(change set)를 얻기 위해 PackageInfo의 인스턴스에 fileout을 발송할 수 있습니다. 패키지들의 좀더 세련된 버전화를 위해, 우리는 몬티첼로(Monticello)를 사용합니다.


몬티첼로 기본사항(Basic Monticello)

몬티첼로는 미국의 3 번째 대통령 토머스 제퍼슨의 산 꼭대기 집과(the mountaintop home)과 종교의 자유를 위한 버지니아의 법령의 저자의 이름을 본 딴 것입니다. 이 이름이 의미하는 것은 이탈리아어로 “작은 산” 이며, 그러므로, 항상 이탈리어로 “c” 로 발음되며, 이 음절은 chiair:Mont-y’-che-llo 에서 “ch” 와 같습니다.


그림 6.12: 몬티첼로 브라우저(Monticello browser)


그림 6.12에서 보이는 것 처럼, 여러분이 몬티첼로 브라우저를 열 때, 두 개의 목록 패널들을 볼 수 있으며, 버튼들의 열을 볼 수 있습니다. 왼쪽의 패널은 여러분이 실행하고 있는 이미지에 로드된 패키지들의 모든 것들을 열거하였으며 패키지의 특별한 버전은 이름 뒤 괄호에 보입니다.

오른쪽의 패널은 몬티첼로가 알고 있는 모든 소스코드 저장소들을 열거하며, 그 이유는 보통, 그 저장소들로부터 코드를 로드 하였기 때문입니다. 만약 여러분이 왼쪽 패널에서 패키지를 선택하셨다면, 오른쪽 패널은 오직 선택된 패키지의 버전을 포함하고 있는 저장소들만을 보여드리기 위해 필터링 되었을 것입니다.

디렉토리에 있는 저장소들 중의 하나는 패키지 캐쉬라고 지명된 디렉토리이며, 이것은 여러분의 이미지가 실행중인 디렉토리의 서브 디렉토리입니다. 여러분이 원격 저장소(remote repository)로부터 코드를 로드 하시거나 작성하실 때, 복사본이 패키지 캐쉬에 저장되며, 이것은 만약 네트워크가 사용 가능하지 않을 때 유용하며, 여러분은 또한 패키지에 접근할 필요가 있습니다. 또한, 만약 여러분이 예를 들어 이메일 첨부파일로 직접 몬티첼로(.mcz) 파일을 받으셨다면, 그 파일에 접근하기 위한 가장 편리한 방법은 패키지-캐쉬 디렉토리에 배치하는 것입니다.

목록에 새로운 저장소를 더하려면 +Repository 를 클릭하고, 팝업 메뉴에서 저장소의 종류를 선택합니다. HTTP 저장소를 더해봅시다.


Squeak comment.png몬티첼로를 열고 +Repository 버튼을 누르고 HTTP를 선택합니다. Dialog를 읽고 편집합니다.


그림 6.13:저장소 브라우저(A Repository browser)


MCHttpRepository
  location: 'http://squeaksource.com/SqueakByExample'
  user: ''
  password: ''


그 다음 이 저장소에서 저장소 브라우저(repository browser)를 열기 위해 Open을 클릭합니다. 여러분이 그림 6.13과 같은 모습을 보실 수 있어야만 합니다. 왼쪽온, 저장소에 있는 모든 패키지의 목록이며, 만약 여러분이 하나를 선택하면, 오른쪽에 있는 패널은 이 저장소에 있는 선택된 패키지의 모든 버전을 보여드릴 것입니다.

만약 여러분이 버전들 하나를 선택하면, 그 버전을 Browse(검색)하실 수 있으며(여러분의 이미지에 로드하지 않고), 그것을 Load 할 수 있거나 또는 선택된 버전을 로드함으로써 여러분의 이미지에 가한 Changes 들을 볼 수 있습니다. 여러분은 또한 패키지의 버전의 Copy 본을 만들어, 다른 저장소에 쓰기를 할 수 있습니다.

여러분이 보실 수 있듯이, 패키지의 이름을 포함하고 있는 버전들의 이름은, 버전의 저자와 버전 번호의 이니셜입니다. 버전 이름은 또한 저장소에 있는 파일 이름입니다. 이 이름들을 절대로 변경하시지 마십시오. 몬티첼로의 수정 작업은 이 이름들에 기초해 있습니다. 몬티첼로 버전 파일들은 단지 Zip archives 이므로, 마약 여러분이 zip 도구로 이 파일 압축을 해제하여 파일의 항목들을 보는 방법이 궁금하시다면, 가장 최상의 방법은 몬티첼로 자체를 사용하는 것입니다.

몬티첼로로 패키지를 만들려면, 두 가지 작업을 하셔야 합니다: 몇 가지 코드를 쓰고 몬티첼로에게 그것에 관해 말하셔야 합니다.


그림 6.14 "SBE" 패키지들에 있는 두 개의 클래스들


Squeak comment.pngSBE-Monticello 라 불리는 카테고리를 만들고, 몇 개의 클래스를 그림 6.14에서 보이는 것 처럼, 집어넣습니다. 또한 현존하는 클래스에 메서드를 만들고, 그림 6.15에서 보이는 것 처럼 규칙들을 사용하여 여러분의 클래스들과 동일한 패키지에 그 메서드를 집어 넣습니다- 그림 6.15를 보십시오.


몬티첼로에게 여러분의 패키지에 관해 말하려면, +Package 를 클릭하고, 패키지의 이름을 타이핑 합니다. 이번 경우는 “SBE”입니다. 몬티첼로는 SBE를 그 자체의 패키지의 목록에 더할 것입니다. 패키지 엔트리는 이미지에 있는 버전이 어떤 저장소에도 기록되지 않았다는 것을 보여드리기 위해 *(별표)로 표시될 것입니다.

초기에는, 그림 6.16에서 보이는 것 처럼, 이 패키지와 관련된 저장소만이 여러분의 패키지 캐쉬에 있게 될 것입니다. 그것은 괜찮습니다: 여러분은 여전히 코드를 저장할 수 있으며, 그 작업은 코드가 패키지 캐쉬에 기록되도록 할 것입니다. Save를 클릭하면, 그림 6.17에서 보이는 것처럼 조금 후 저장할 패키지의 버전을 위한 로그 메시지를 제공을 권유 받을 것입니다. 여러분이 이 메시지를 수락하면, 몬티첼로는 패키지를 저장할 것입니다. 이 작업을 가리키기 위해 몬티첼로 패키지 패널에 있는 이름을 꾸미는 별표가 제거될 것이며 버전이 추가될 것입니다.

만약 패키지에 변경사항을 만드셨다면(클래스 중의 하나에 메서드를 추가하라고 말함으로써)별표는 여러분이 저장되지 않은 변경사항들을 갖고 있다는 것을 보여드리며 다시 나타날 것입니다. 만약 여러분이 패키지 캐쉬에 있는 저장소 브라우저를 열면, 저장된 버전을 선택할 수 있고 Changes 들과 다른 버튼들을 사용할 수 있습니다. 여러분은 물론 저장소에 새로운 버전을 저장할 수 있습니다. 일단 저장소 뷰(the repository view)를 Refresh 하셨다면, 그림 6.18과 같이 되어야만 합니다.

패키지 캐쉬기 아닌 저장소에 새로운 패키지를 더하시려면, 필요한 경우 추가하여, 먼저 몬티첼로가 저장소에 관하여 알도록 만들어야만 합니다.


그림 6.15: "SBE" 패키지에 있게 될 확장 메서드(extension method)


그림 6.16: 몬티첼로에 있는 아직까지 저장되지 않은 SBE 패키지


그 다음 패키지 캐쉬 저장소 브라우저에 있는 Copy 를 사용하실 수 있으며, 패키지가 복사되어야만 될 저장소를 선택하실 수 있습니다. 또한 그림 6.19에 보이는 것처럼 노랑버튼 메뉴 아이템 add to package 를 사용하여 패키지와 원하는 저장소를 조합시킬 수 있습니다. 일단 패키지가 저장소에 관하여 알게 되면, 여러분은 몬티첼로 브라우저에 저장소와 패키지를 선택하고 Save 를 클릭하여 새로운 버전을 저장할 수 있습니다.


그림 6.17: 패키지의 새로운 버전을 위한 로그 메시지 제공하기


그림 6.18: 현재 패키지 캐쉬에 있는 우리의 패키지의 두 개의 버전


물론, 여러분은 SqueakSource에 있는 SqueakByExample 저장소는 world 읽기 가능하지만, world 쓰기는 가능하지 않으므로, 만약 이곳에서 쓰기를 시도하고 저장하면, 반드시 에러메시지를 보시게 될 것입니다. 그럼에도 불구하고, http://www.squeaksource.com에 있는 웹 인터페이스 (the web interface)를 사용하여 여러분 자신만의 저장소를 만들 수 있으며, 여러분의 작업을 저장하기 위해 이 웹 인터페이스를 사용할 수 있습니다. 이 웹 인터페이스는 특별히, 만약 여러 개의 컴퓨터를 사용한다면, 친구와 여러분의 코드를 공유하기 위한 메커니즘으로 매우 유용합니다. 만약 여러분이 쓰기 허락을 갖고 있지 않은 저장소에 쓰기를 시도하고 저장을 시도하셨다면, 그럼에도 불구하고 버전은 패키지 캐쉬에 기록될 것입니다.


그림 6.19: 패키지와 조합된 저장소들의 세트에 저장소 추가하기


그러므로, 여러분은 저장소 정보를 편집(몬티첼로 브라우저에서 노랑 버튼)하거나 또는 다른 저장소를 선택하고, 그 다음 패키지 캐쉬 브라우저(package-cache browser)로 부터 Copy를 사용하여 복구(recover)할 수 있습니다.

Notes