- 파일(file) 클래스는 문서(document) 객체에 포함되는 객체이다. 그리고, 버전 정보는 파일에 포함되는 속성이다.
'버전 정보'는 객체로 봐야 하는가? 혹은 기본형 데이터 타입(primitive type)의 집합으로 정의해야 하는가? 이에 대해 답을 하기 위해 몇가지 문제를 검토해 봐야 한다. - 기본형과 객체형의 차이
- 객체지향 프로그래밍 언어에서 기본형 데이터는 정수 및 실수 값을 나타내는 숫자형(number type), 문자형(character type), 부울린형(boolean type), 바이트형(byte type) 등이 있다. 기본형과 객체형의 차이는 기본형은 데이터 만을 담을 수 있고, 메소드(기능)은 포함하지 못한다는 점이다.
- 기본형 타입은 하나의 값(value) 만을 담을 수 있고, 객체형 혹은 클래스는 복수의 속성 혹은 값들을 담을 수 있다.
- 동적인 측면에서의 설계
버전 정보는 버전 순번(version sequence), 버전 생성일시(generation time), 버전 설명(description) 등 3가지 항목으로 구성된다. 각각의 항목은 버전 정보가 생성된 이후에 수정되어서는 안된다. 즉, 버전 정보는 읽기 전용 (read-only) 혹은 불변(immutable 타입)이다. 따라서, 필요한 기능은 생성자와 조회 메소드 (read-only access methods) 뿐이다. 객체 혹은 클래스를 소프트웨어의 동적인 부품(part)으로 보는 관점에서는 버전 정보를 굳이 클래스로 식별(혹은 분리)하는 것이 좋은 선택은 아니다. 파일 객체 내에 버전 객체를 포함시키면, 버전 숫자를 얻기 위해 파일 객체에서 버전 객체를 꺼낸 후에 다시 버전 객체에서 버전 숫자 조회 메소드를 호출해야 하는 번거로움이 있다. - 정적인 측면(구조적인 측면)에서의 설계
객체지향 설계의 목적은 주어진 문제를 최대한 빠르게 풀어내는 프로그램을 제작하는 것이 아니다. 최대한 빠르거나, 최소한의 자원(메모리/네트워크 사용량 등)을 사용하는 프로그램을 작성하는 기법을 연구하는 것은 '알고리즘'의 고유 영역이다. 객체지향 설계의 목적은 '인간'의 사고 체계를 바탕으로(응용하여) 현실 세계의 문제를 가상 공간(컴퓨터)내에 이식하는 것이다.
버전 정보를 앞서 제시한 3개의 항목으로 분리하여 표현하는 것보다, 버전 정보라는 하나의 객체로 표현하는 것이 인간이 소프트웨어 구조를 인지(recognition)하는데 있어서 유리하다. 달리 말해, 직관적인 구조라고 할 수 있다. - 위와 같은 이유 (컴퓨터보다는 인간 지향)로 파일 클래스를 '파일'과 '버전' 클래스로 분리한다.
2015. 3. 11. 18:43
2015. 3. 11. 17:54
- 파일 클래스의 역할(role)은 문서의 바이너리 형식 데이터(binary formatted data)를 표현(묘사)하는 것이다.
표현(represent) 한다는 용어를 사용한 이유는 파일 객체는 물리적인 파일 그 자체가 아니기 때문이다. 달리 말해 파일 객체는 물리적 파일의 제한적인 특성만을 담고 있는 것이다. - 파일(file) 클래스는 문서(document) 객체에 포함되는 객체이다. (has-a relationship)
객체는 상태(state)와 행위(behavior)로 구성된다. 따라서, 파일 클래스를 설계하기 위해 필요한 상태와 행위들을 정의한다. - 파일 클래스에 포함되어야 하는 '상태(state)' 혹은 속성(property)들은 다음과 같다.
- 위치(location) : 물리적인 저장 매체(storage media) 내에서 실제 파일 데이터가 존재하는 주소(address). 주소 체계(addressing scheme)는 별도의 설계가 필요하다.
- 크기 (size) : 바이너리 데이터의 길이, 64 bit 정수로 표현해야 함.
- 체크섬 (check sum) : 바이너리 파일의 지문(finger print), 파일의 중복 검사에 이용된다. DocAr 내에서 동일한 내용을 가진 파일이 중복해서 존재하는 것을 막기 위해 모든 파일에 대한 디지털 지문을 생성하고, 새로운 파일 등록을 수행할 때마다 이미 등록되어 있는 파일들의 디지털 지문과 대조하여 이미 존재하는 파일인지 검사하고, 중복을 방지한다.
- 버전 정보 (version info) :문서 내에서 파일 내용이 여러 번 변경되었을 경우, 현재 파일의 변경된 순서(혹은 순번), 최초 등록된 파일은 1번을 부여받는다. 또한 버전 정보에는 해당 버전에 대한 변경 일자와 간단한 설명(comment)이 포함될 수 있다.
- 파일 클래스에 포함되어야 하는 '행위(behavior)' 혹은 메소드(method)들은 다음과 같다.
- 파일 인스턴스를 생성하는 생성자(constructor)
- 속성값을 반환하는 getter 메소드들 (location, size, checksum, version)
- '객체의 정의'를 적용하기(applying definition of object : self-contained entity)
- 객체는 데이터와 데이터를 조작하는 프로시져로 구성된 필요한 모든 것을 자체적으로 담고 있는 독립체이다.
an object is a self-contained entity that consists of both data and procedures to manipulate the data.
좋은 객체(혹은 잘 설계된 객체)는 자기 자신을 초기화하고, 데이터를 조작하기 위해서 외부의 도움(혹은 조작)을 필요로 하지 않아야 한다. 객체를 사용(혹은 호출)하는 프로그램이나 프로그래머는 특정 객체를 사용할 때, 다른 클래스를 사용하지 않고도 해당 객체를 제어할 수 있어야 한다는 말이다. (현실적으로 완벽히 지키기 어렵다. 설계자가 지향해야 하는 자세라고 생각하는 것이 타당하다.) - 파일 객체가 '바이너리 데이터'를 표현 한다는 것은 바이너리 데이터를 사용(조작)하는 관점에서 필요한 정보와 기능을 모두 제공해야 한다는 말이다. 파일 객체를 생성하는 수단 (엄밀히 말하자면 생성 시 외부에서 주어진 데이터를 이용해 스스로를 초기화하는)으로 생성자 메소드, 그리고 파일에 대한 각종 속성 정보를 조회할 수 있는 메소드와 바이너리 데이터를 제공하는 메소드를 선언한다.
- 객체의 행위에 대한 설계 리뷰(review)
- 파일 객체를 변경(수정)하는 메소드가 필요한가? DocAr 내에서 파일 객체는 물리적인 바이너리 데이터라는 실체에 대한 그림자이지, 그 자체를 나타내는 것이 아니다. 실체(물리적 파일)이 변경될 경우, 새로운 파일 객체를 생성해야 하며, 내용이 변경된 파일은 다른 버전의 파일이 된다. 따라서, setter 메소드는 선언하지 않는다. (설계자의 사상 혹은 의도를 반영하는 것이기에 모든 데이터를 다루는 객체가 변경 메소드를 제공하지 않는다고 이해해서는 안된다.) 달리 설명하자면, DocAr의 File 인스턴스는 읽기 전용(read-only) 인스턴스라고 말할 수 있다.
- 파일 객체를 삭제하는 메소드가 필요한가? JDK에서 제공하는 java.io.File 클래스는 delete 메소드를 제공한다. 그렇다면, DocAr의 File 클래스 또한 delete() 메소드를 제공해야 하는가? 얼핏 보기에 그럴듯 하지만, DocAr의 File 인스턴스는 Document 인스턴스에 종속되어 있다. Document 내에 서로 다른 버전의 파일 객체가 존재할 수 있으며, Document 인스턴스는 하나 이상의 File 인스턴스를 소유해야 한다. 즉, File 인스턴스와 File에 연결된 물리적인 파일이 삭제될 경우, Document 인스턴스의 상태가 변경되거나, Document 인스턴스가 함께 삭제되어야 한다. 삭제 행위를 File 클래스와 Document 클래스 양쪽에 두는 것보다 Document 클래스에서만 제공하는 것이 구현의 복잡도를 낮출 수 있으며, File과 Document를 이용해 코딩하는 사용자(개발자)에게 보다 단순한 관점(view)을 제공한다.
2015. 3. 11. 11:49
- DocAr 시스템 설계는 상향식(bottom-up)으로 진행하는 것을 원칙으로 한다. 가장 기본이 되는 작은 모듈(혹은 컴포넌트)를 선정하고 해당 컴포넌트에 대한 충분한 설계가 진행된 후에 보다 큰 모듈을 설계하는 것이다. 가장 먼저 설계하는 대상은 '문서(document)이다. (원칙적으로는 상향식 설계를 진행하나, 특정 컴포넌트 혹은 클래스를 세분화 해야 할 필요가 있을 경우, 하향식 설계가 중간에 진행될 수 있다.)
- 용어에 대한 정의 : DocAr(Document Achieve) 에서 문서(document)란 '수집', '보관 및 분류', '정보 추출' 및 '검색'의 대상이 되는 모든 전자적 데이터(electronic data)를 의미한다. 각 문서는 독립적이어야 하며, 다른 문서에 대한 참조(reference)를 가질 수 있지만, 다른 문서의 일부가 되어서는 안된다.
- 메타 데이터의 개념 이해 (위키피디아 발췌 및 번역)
Metadata is "data about data".[1] There are two "metadata types;" structural metadata, about the design and specification of data structures or "data about the containers of data"; and descriptive metadata about individual instances of application data or the data content.
메타 데이터는 "데이터에 대한 데이터"이다. [1] "메타 데이터 유형;"은 두 가지가 있다. 구조적 메타 데이터(structural metadata)는 데이터 구조에 대한 디자인 및 사양(specification) 또는 "데이터 컨테이너에 대한 데이터"이며, 서술적 메타 데이터(descriptive metadata)는 개별 응용 데이터 인스턴스 혹은 컨텐츠에 관한 데이터이다.
Metadata was traditionally in the card catalogs of libraries. As information has become increasingly digital, metadata are also used to describe digital data using metadata standards specific to a particular discipline. By describing the contents and context of data files, the usefulness of the original data/files is greatly increased.
메타 데이터는 전통적인 형태는 도서관의 카드 카탈로그였다. 정보가 점자 디지털화되면서, 메타 데이터는 특정 분야의 메타 데이터 표준에 따라 디지털 데이터를 설명하는데 사용되고 있다. 컨텐츠와 데이터 파일의 맥락(context)을 설명함으로써 원래 데이터의 활용도(유용성)은 크게 증가된다.
For example, a webpage may include metadata specifying what language it is written in, what tools were used to create it, and where to go for more on the subject, allowing browsers to automatically improve the experience of users. Wikipedia encourages the use of metadata by asking editors to add category names to articles, and to include information with citations such as title, source and access date.
예를 들어, 웹 페이지가 어떤 언어로 씌여진 것인지, 어떤 툴(tool)을 이용해 작성되었는지, 어떤 주제를 포함하는가 등의 메타 데이터를 포함한다면 브라우자가 자도으로 사용자의 경험을 향상시킬 수 있다. 위키 백과는 편집자들이 기사에 카테고리 이름을 추가하고, 제목, 원본, 작성 일자와 참고문헌 등의 메타 데이터를 적극 활용하도록 권장한다.
The main purpose of metadata is to facilitate in the discovery of relevant information, more often classified as resource discovery. Metadata also helps organize electronic resources, provide digital identification, and helps support archiving and preservation of the resource. Metadata assists in resource discovery by "allowing resources to be found by relevant criteria, identifying resources, bringing similar resources together, distinguishing dissimilar resources, and giving location information."
메타 데이터의 주요 목적은 관련 정보를 탐색하기 용이하도록 하며, 탐색 과정에서 분류가 잘 될 수 있도록 하는 것이다. 메타 데이터는 전자 문서를 조직화하는데 도움을 주며, 디지털 식별자를 제공할 뿐 더러 문서를 보관하고, 보존하는데 도움을 준다. 메타 데이터를 문서를 탐색하는데 있어, "관련 있는 분류하고, 자원을 식별하며, 유사한 자원들을 묶어 주거나, 관련이 없는 문서를 구분하고, 문서의 위치 정보를 제공하는 등"의 도움을 준다. - 문서의 속성 : 문서는 파일(file)과 메타 데이터(meta data or index)로 구성된다.. 파일은 해당 문서 내용(content)을 담고 영구 저장 매체 (디스크 등)에 기록된 전자적 데이터를 의미한다. 메타 데이터는 문서의 제목(title, but optional), 작성자, 작성 및 변경 일자, 키워드 및 인덱스 정보, 원본 링크 (웹 링크), 문서의 형식(파일 확장자 혹은 파일 형식, 포맷), 문서에서 추출된 색인 등 문서를 분류하고 검색하는데 활용되는 문서에 연관된 데이터들을 말한다.
- 제목(title) : 원본 파일의 명칭 혹은 문서의 첫 단락에 표시된 제목, HTML의 title tag 혹은 게시물의 제목들이 문서 제목의 후보가 될 수 있다. 이중에서 게시물의 제목 혹은 HTML의 title tag 등이 우선순위가 높고, 파일 명칭은 우선 순위가 낮다. 만일, 제목을 추출할 수 없을 경우에 제목은 비울 수 있다.
- 작성자(author) : 문서의 최초 작성자 정보. 이름, ID, e-mail, homepage (facebook 등) 정보를 포함할 수 있다.
- 작성일시 및 변경일시 : 문서 자체의 생성 일시 정보를 사용하거나, 만일 작성 일시 정보를 파악할 수 없다면, DocAr 에 문서를 등록한 시점을 작성일시로 설정한다. 문서에 새로운 버전이 추가된 경우, 변경 일시를 업데이트 한다.
- 키워드(keyword) : 문서의 핵심 혹은 요약된 정보를 나타내는 복수의 명사 단어를 키워드라고 한다. 문서를 등록한 사람이 직접 입력하거나, 자동으로 추출할 수 있다.
- 요약(abstract) : 문서의 핵심 부분 혹은 축약된 내용을 말한다.
- 인덱스(index) : 문서 검색을 위한 단어의 집합
- 원본 링크 (original link) : 웹 상에서 다운로드한 문서일 경우 웹 문서에 대한 링크, 다운로드 문서가 아닐 경우 원본 링크가 존재하지 않는다.
- 문서 형식 (format) : XML, PDF, Word 등 문서의 바이너리 데이터 형식을 의미한다.
- 텍스트 (text) : 그래픽 출력을 위한 양식(layout) 정보를 제거한 순수 텍스트 형태의 데이터.
- 문서와 물리적인 속성의 관계 : 일대다(1:n)의 관계를 가실 수 있다. 문서의 내용(content)와 위치 정보 및 버전 정보 (버전 번호, 변경 시각)를 결합한 것을 '파일'이라고 정의한다. 따라서 문서는 하나 이상의 파일을 가질 수 있다. 하나의 문서에 포함된 복수의 파일이 같은 내용과 버전 번호를 가질 수 있다. 백업 및 공유 등의 이유로 복수의 저장소(repository)에 동시에 존재할 수 있기 때문이다.
- 문서와 색인 속성 간의 관계 : 일대일(1:1) 관계를 가진다. 만일 문서의 파일이 버전업되면 색인 속성도 갱신되어야 한다.