2015. 3. 14. 22:06
  • FileVersion 클래스 구현에서 눈여겨 봐야할 점은 생성자(constructor)에서 인자(parameter) 값을 검사하는 로직이다.
    객체지향 프로그래밍이 절차적(혹은 함수형) 프로그램과 다른 점은 데이터(혹은 상태)와 데이터를 조작하는 메소드(혹은 행위)를 결합시킨 구조를 가지고 있다는 점이다. 이러한 구조의 잇점을 최대한 활용하기 위해서는 객체에 값이 설정 혹은 변경될 때 해당 값이 적합한지 여부를 검사하는 로직을 구현해야 한다. 단지, 인터페이스와 클래스를 사용한다고 해서 훌륭한 객체가 되는 것이 아니다.
  • 전달되는 값 (인자, parameter)이 유효한 것인지 판정해 잘못된 값이 입력되었을 경우, 즉시 오류를 발생시켜 문제가 발생하더라도 그 원인이 외부에 있음을 알아내기 쉽고, 원인을 빠르고 명확하게 파악할 수 있도록 하는 기법을 방어적 프로그래밍이라 한다.


FileVersion.java


public class FileVersion {
	private int sequence;
	private Date createDate;
	private String description;

	/**
	 * 파일 버전 생성자.
	 * 
	 * @param sequence
	 *            버전 순번.
	 * @param createDate
	 *            버전 생성 일시
	 * @param description
	 *            버전 설명
	 * @throws IllegalArgumentException
	 *             1보다 작은 순번 혹은 날짜가 입력되지 않은 경우 예외 발생.
	 */
	public FileVersion(int sequence, Date createDate, String description) {
		if (sequence < 1) {
			throw new IllegalArgumentException("sequence must greater than 0");
		}

		if (createDate == null) {
			throw new IllegalArgumentException("Must specify valid date");
		}

		this.sequence = sequence;
		this.createDate = createDate;
		this.description = description;
	}
Posted by 곽중선
2015. 3. 12. 02:48

DocAr 에서 수집하는 문서는 웹 페이지(HTML), MS-Office 문서(파워포인트, 워드, 엑셀), 텍스트(text), PDF 등 다양하며 이러한 문서들의 원본 파일 자체와 추출한 색인 정보를 함께 저장해야 한다. 문서의 물리적인 속성을 나타내는 파일(File) 클래스에 대한 설계를 마친 후, 문서 클래스의 색인 속성에 대한 상세 설계를 진행한다. 문서의 색인 속성은 다양하며, 개별 속성에 대한 관련 기능 및 데이터 구조에 대한 설계가 필요하다.

 속성 명칭

 설명 

 제목

 원본 파일의 명칭 혹은 문서의 첫 단락에 표시된 제목, HTML의 title tag 혹은 게시물의 제목

 작성자

 문서의 최초 작성자 정보. 이름, ID, e-mail, homepage (facebook 등) 정보 

 작성 일시

 문서를 최초 생성한 일시 혹은 최종 변경 일시

 키워드

 문서의 핵심 혹은 요약된 정보를 나타내는 복수의 명사 

 요약

 문서의 핵심 부분 혹은 축약된 내용

 원본 링크

 웹 상에서 다운로드한 문서일 경우 웹 문서에 대한 링크

 문서 형식

  XML, PDF, Word 등 파일 포맷(format) 에 따른 유형


  • 제목 : 문서의 제목은 파일 형식(format)에 따라 명시적으로 추출할 수 있는 경우가 있고, 명시적으로 추출할 수 없는 경우가 존재한다. HTML 형식에서는 title 태그를 이용해 문서의 제목을 추출할 수 있지만, 대다수의 문서 형식은 명시적인 필드(field)가 지정되어 있지 않다. 따라서, 파일 형태로 존재할 경우에는 파일의 명칭을 제목으로 사용할 수 있다.

  • 작성자 : 문서의 작성자 정보는 일반적으로 문서 자체에서 추출할 수 없는 정보이다. 따라서, DocAr 에 문서를 등록할 때 작성자 정보를 입력 받거나, DocAr 사용자 정보를 작성자 정보로 활용할 수 있다. 작성자 정보는 하나 이상의 필드 (성명, e-mail 주소, 홈페이지 주소 등)로 이루어져 있으므로 별개의 클래스로 분리하는 것도 고려할 필요가 있다.

  • 작성 일시 : 파일 형태로 존재하는 문서는 파일의 생성(변경) 일시를 작성일시로 설정할 수 있다. 만일 문서의 생성일시를 정확히 확인할 수 없을 경우, DocAr에 등록하는 시점을 생성일시로 사용해야 한다.

  • 키워드 : 문서의 검색 정확도 향상 및 분류에 활용하기 위해 핵심 단어들을 입력 받는다. 문서를 분석해서 키워드를 추출하는 방법과 사용자가 직접 입력하는 방법 등을 고려할 수 있다.

  • 요약 : 검색 결과에 문서의 요약된 정보를 출력할 경우, 사용자가 원하는 문서인지 여부를 빠르게 파악할 수 있다. 문서의 앞 문단을 추출해서 자동으로 요약을 생성하는 방법을 고려해 볼 수 있다.

  • 원본 링크 : 인터넷 등에서 다운로드 받은 문서인 경우, 해당 문서의 출처를 남겨두는 것은 향후에 문서가 갱신되었을 때 다시 다운로드 받을 수 있고, 관련 정보를 찾거나 유용한 웹 사이트 목록을 작성하는데 활용할 수 있다.

  • 문서 형식 : 문서의 포맷(format) 정보는 문서를 조회할 수 있는 프로그램을 선택 및 실행하기 위해 필요하다. 더불어 검색 시 특정 형식의 문서를 제한함으로써 검색의 정확도를 높일 수 있다. 문서 형식은 문자열 필드로 저장할 수도 있지만, 오류 혹은 부정확성를 방지하기 위해 - 예를 들어, html/htm/HTML 등 같은 타입을 다른 문자열로 입력할 수 있음 - 별개의 타입(enum 등)으로 분리하는 것이 낫다.

위와 같은 색인 속성 설계를 통해 확인할 수 있는 통찰(insight)은 다음과 같다.

  • 문서(Document) 클래스의 속성 중에서 일부 속성은 기본형(primitive type)으로 정의(선언)할 수 없고, 별개의 타입으로 분리해야 한다.
  • 물리적인 파일을 입력 받아 문서를 생성하기 위해서는 다양한 추출/분석/사용자 입력 등의 전처리(preprocessing) 및 가공 작업을 필요로 한다는 것을 알 수 있다. 따라서, 물리적 파일 정보를 인자로 입력 받아 문서 객체를 생성하는 생성자를 만들기 보다는 문서 객체 생성을 수행하는 클래스(빌더, 팩토리 등)를 분리하는 것이 유리하다.
  • 속성의 일부를 분리하고, 문서 생성에 필요한 전처리 작업 등 추가 요건이 발생한다 즉, 설계는 한번에 완료되는 것이 아니라, 반복(iteration)을 통해 정교화 시키는 과정을 거쳐야만 한다.

각 속성에 대한 구체적인 데이터 타입 설계를 진행한다.


  • 제목 : 문서의 제목은 문자열(String) 타입으로 충분하다, 자바의 문자열 집합(character-set)은 유니코드(Unicode)를 사용하기 때문에 다국어 지원 또한 문제는 없다. 다만, 직렬화(serialization) 처리 시에는 인코딩(encoding)에 유의해야 한다.

  • 작성자 : 작성자 정보는 성명, ID, 이메일 주소 등의 기본형 데이터 항목들을 구성된 복합(complex type)이므로 별도의 클래스를 선언하는 것이 타당하다. 타입 명칭은 Writer로 선언한다.

  • 작성 일시 : 자바에서 날짜 타입은 java.util.Date 와 java.sql.Date 2가지가 제공된다. util 패키지에 선언된 것은 오로지 날짜만 포함할 수 있고 시/분/초 정보는 담을 수 없다. 작성 시간까지 구분해야 한다면 java.sql.Date 클래스를 사용해야 한다. DocAr 에서는 java.sql 패키지에 포함된 타입을 사용한다.

  • 키워드 : 키워드는 복수의 단어로 구성된다. 하나의 문서에 설정된 키워드들은 중복되지 않아야 하므로, 중복을 허용하지 않고 복수의 문자열을 담을 수 있는 타입을 사용해야 한다. Set<String> 타입을 사용하면 된다.

  • 요약 : 문서의 핵심 내용을 짧게 정리한 요약은 긴 문자열이며, 태그(tag) 등을 포함하지 않는 문자열이어야 한다. String 타입으로 선언한다.

  • 원본 링크 : 외부의 웹 사이트 혹은 내부의 파일 시스템의 파일 주소(혹은 경로)를 모두 포함할 수 있는 주소 체계는 URL이다. java.net.URL 타입으로 선언한다.

  • 문서 형식 : 다양한 문서 타입이 존재하나 현실적으로 모든 유형의 문서 형식을 읽고 쓸 수는 없다. 일반적으로 공개된 문서 형식은 HTML, XML, PDF, MS-Word, MS-Powerpoint, MS-Excel 등이다. 시스템 기능 개선에 따라 향후에 지원할 수 있는 문서 형식이 늘어날 수 있지만, 개선이 빈번하게 발생하는 것은 아니기 때문에 지원 가능한 문서 형식이 고정되어 있다고 여겨도 무방하다. 따라서 문서 형식은 enum 타입으로 선언한다.




Posted by 곽중선
2015. 3. 12. 02:04
  • 객체(혹은 인스턴스)를 생성하는 기법
    • 객체를 생성하는 기법은 여러가지가 있으나 크게 2가지로 분류할 수 있다. 생성자를 이용하는 것과 그외의 방법.
    • 생성자 메소드를 이용하는 방법
      : 다수의 클래스는 생성자 메소드를 제공하며, new 연산자와 생성자 메소드를 조합하여 객체를 생성할 수 있다. 이 때, 객체의 초기 값(initial value)은 생성자 메소드의 인자(parameter)로 전달한다.
    • 인스턴스를 생성하는 클래스를 제공하는 방법
      : 특정 클래스의 객체를 생성하고 초기 값을 설정하는 절차를 해당 클래스의 외부에서 수행한다. 팩토리 패턴(factory pattern), 빌더 패턴(builder pattern) 등 디자인 패턴(design pattern)에서 소개하는 객체 생성 기법을 사용하는 것이다. 객체를 임의로 생성하지 못하도록 제한해야 하거나, 객체를 생성하는 절차 혹은 계산 작업이 복잡한 경우에 사용된다.

  • File 객체 생성 기법 선택
    • File 객체 내에 포함되는 속성들은 '위치', '크기', '체크섬', '버전정보' 등이다.
    • '위치'와 '크기'는 물리적인 파일 정보를 통해 손쉽게 얻어낼 수 있다.
    • 그러나, 체크섬은 파일의 컨텐트(content)를 이용해 계산해야 한다. 
    • 버전 정보는 파일을 포함하고 있는 문서의 상태(state)를 바탕으로 계산해야 한다.
    • 따라서, File 클래스의 객체를 생성하는 기법은 'File 클래스의 인스턴스'를 생성하는 클래스를 별개로 만들거나, File 객체를 포함하는 Document 클래스에 기능을 부여하는 방법을 고려해야 한다. 둘 중에서 어떤 방식을 사용할 것인지는 Document 클래스 설계 단계에서 구체화하도록 한다.


Posted by 곽중선