ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2...

318
보고서 디자인 가이드 ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 () 캡소프트 회사명 : (주) 캡소프트 주소(본사) : 경기도 성남시 분당구 이매동 105-3 에이스빌딩 4층 주소(서울사무소) : 서울시 서초구 서초동 1558-17 서초빌리지프라자 2층 201호 전화 : 0505-987-5616 팩스 : 0505-987-0888 기술지원 : 0505-998-0888,1888 기술지원 메일 : [email protected] 1 / 318

Transcript of ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2...

Page 1: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

ReportExpress Enterprise V. 2.0.1

보고서 디자인 가이드

(주) 캡소프트

회사명 : (주) 캡소프트

주소(본사) : 경기도 성남시 분당구 이매동 105-3 에이스빌딩 4층

주소(서울사무소) : 서울시 서초구 서초동 1558-17 서초빌리지프라자 2층 201호

전화 : 0505-987-5616

팩스 : 0505-987-0888

기술지원 : 0505-998-0888,1888

기술지원 메일 : [email protected]

1 / 318

Page 2: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

목차

1 장. 서문...................................................................................................................................... 91.1 보고서 디자이너의 기능........................................................................................................91.2 웹 커뮤니티.......................................................................................................................101.3 ReportExpress 상용 라이센스.............................................................................................101.4 사용된 코드.......................................................................................................................12

2 장. 시작하기..............................................................................................................................132.1 플랫폼 요구사항.................................................................................................................132.2 다운로드...........................................................................................................................132.3 보고서 디자이너 설치하기...................................................................................................142.4 처음 보고서 디자이너 실행하기............................................................................................142.5 JDBC 연결 만들기...............................................................................................................162.6 첫 번째 보고서 만들어보기..................................................................................................19

2.6.1 예제 데이터베이스 사용하기.........................................................................................192.6.2 보고서 도우미 사용하기...............................................................................................20

3 장. 보고서의 기본 표기방식.........................................................................................................263.1 보고서의 생명주기..............................................................................................................263.2 RXXML 소스와 ReportExpress 파일.....................................................................................273.3 데이터소스와 프린트 포맷...................................................................................................293.4 표현식..............................................................................................................................303.4.1 표현식의 타입.................................................................................................................303.4.2 표현식 연산자와 객체 메쏘드............................................................................................31

3.4.3 표현식에서 If-Else 구조 사용하기.................................................................................333.5 표현식으로 자바 언어 사용하기............................................................................................343.6 표현식으로 그루비 언어 사용하기.........................................................................................353.7 표현식으로 자바스크립트 사용하기.......................................................................................363.8 보고서 디자이너에서 ReportExpress 익스텐션 사용하기.........................................................363.9 간단한 프로그램.................................................................................................................36

4 장. 보고서 구조.........................................................................................................................384.1 밴드.................................................................................................................................. 384.1.1 보고서 속성....................................................................................................................41

4.1.2 컬럼(다단)..................................................................................................................434.1.3 고급 보고서 옵션들.....................................................................................................47

2 / 318

Page 3: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

4.1.3.1 스크립틀릿(Scriptlet)...........................................................................................474.1.3.2 리소스 번들........................................................................................................474.1.3.3 질의...................................................................................................................484.1.3.4 필터 표현식........................................................................................................484.1.3.5 속성...................................................................................................................484.1.3.6 새 페이지에서의 타이틀과 요약.............................................................................504.1.3.7 페이지 헤더와 풋터에 요약하기.............................................................................524.1.3.8 유동적인 열 풋터 옵션..........................................................................................524.1.3.9 출력 순서...........................................................................................................534.1.3.10 데이터 없이 출력...............................................................................................544.1.3.11 포맷 팩토리 클래스............................................................................................544.1.3.12 가져오기...........................................................................................................54

4.2 밴드 다루기.......................................................................................................................544.2.1 밴드 높이...................................................................................................................554.2.2 표현식에 따른 출력.....................................................................................................564.2.3 나뉨 타입(Split Type)..................................................................................................56

4.3 요약 밴드..........................................................................................................................575 장. 보고서 요소(ELEMENTS)........................................................................................................58

5.1 요소 사용하기....................................................................................................................595.1.1 포맷팅 툴...................................................................................................................635.1.2 보고서 인스펙터를 사용하여 요소를 관리하기.................................................................655.1.3 기본 요소 속성...........................................................................................................665.1.4 요소의 커스텀 속성.....................................................................................................695.1.5 그래픽 요소들.............................................................................................................70

5.1.5.1 선......................................................................................................................705.1.5.2 사각형................................................................................................................715.1.5.3 타원...................................................................................................................71

5.2 이미지 사용하기.................................................................................................................715.2.1 패딩과 경계................................................................................................................765.2.2 데이터베이스에서 이미지 불러오기(BLOB 필드)..............................................................765.2.3 동적으로 이미지 만들기...............................................................................................77

5.3 텍스트 사용하기.................................................................................................................805.3.1 정적 텍스트................................................................................................................845.3.2 텍스트 필드................................................................................................................84

3 / 318

Page 4: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

5.4 다른 요소들.......................................................................................................................875.4.1 서브리포트.................................................................................................................875.4.2 프레임.......................................................................................................................895.4.3 차트..........................................................................................................................905.4.4 크로스탭....................................................................................................................905.4.5 페이지/컬럼 나누기.....................................................................................................90

5.5 커스텀 컴포넌트와 범용 요소 추가하기.................................................................................905.6 앵커.................................................................................................................................. 90

5.6.1 하이퍼링크 타입.........................................................................................................915.6.2 하이퍼링크 매개변수...................................................................................................925.6.3 하이퍼링크 툴팁.........................................................................................................92

6 장. 필드, 매개변수 그리고 변수....................................................................................................936.1 필드 사용하기....................................................................................................................94

6.1.1 SQL 질의로부터 필드 등록하기.....................................................................................956.1.2 SQL 질의 디자이너 사용하기........................................................................................986.1.3 자바빈으로 부터 필드 등록하기....................................................................................996.1.4 필드와 텍스트필드....................................................................................................100

6.2 매개변수 사용하기............................................................................................................1006.2.1 질의에서 매개변수 사용하기.......................................................................................1026.2.2 IN 과 NOT IN 구문....................................................................................................1036.2.3 내장된 매개변수.......................................................................................................1036.2.4 프로그램으로 부터 매개변수 넘기기............................................................................104

6.3 변수 사용하기..................................................................................................................1066.4 보고서 생성과정에서 요소의 처리.......................................................................................109

7 장. 밴드와 그룹.......................................................................................................................1117.1 밴드 수정........................................................................................................................1117.2 그룹 사용하기..................................................................................................................1137.3 다른 그룹 옵션들..............................................................................................................121

8 장. 폰트와 스타일....................................................................................................................1248.1 폰트 사용하기..................................................................................................................1248.2 트루타입 폰트 사용하기....................................................................................................1258.3 폰트 익스텐션 사용하기....................................................................................................1268.4 캐릭터 인코딩..................................................................................................................1328.5 유니코드 캐릭터 사용하기.................................................................................................132

4 / 318

Page 5: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

8.6 스타일 사용하기...............................................................................................................1328.7 스타일 조건 생성..............................................................................................................134

9 장. 템플릿...............................................................................................................................1389.1 템플릿 구조 살펴보기.......................................................................................................1399.2 그룹................................................................................................................................1429.3 컬럼 헤더........................................................................................................................1439.4 반복 밴드........................................................................................................................1439.5 반복 타입과 다른 옵션들...................................................................................................1449.6 새로운 템플릿 만들기.......................................................................................................1449.7 템플릿을 설치하고 사용하기..............................................................................................146

10 장. 서브리포트......................................................................................................................15010.1 서브리포트 만들기..........................................................................................................150

10.1.1 부모 보고서에 서브리포트를 연결하기.......................................................................15110.1.2 서브리포트 지정하기...............................................................................................15210.1.3 데이터소스 설정.....................................................................................................15310.1.4 매개변수 넘겨주기..................................................................................................154

10.2 단계별 예제...................................................................................................................15510.3 서브리포트로부터 리턴받는 값.........................................................................................16310.4 서브리포트 도우미 사용하기............................................................................................166

10.4.1 서브리포트 도우미를 사용하여 새로운 보고서 만들기..................................................16610.4.2 서브리포트 도우미에서 기존 보고서 지정하기.............................................................168

11 장. 데이터소스와 질의 실행기..................................................................................................17111.1 보고서 엔진에서 데이터소스를 다루는 방식.......................................................................17111.2 보고서 디자이너에서의 데이터소스와 연결........................................................................17211.3 JDBC 연결을 만들고 사용하기..........................................................................................175

11.3.1 ClassNotFoundError..............................................................................................17711.3.2 URL이 올바르지 않은 경우.......................................................................................17711.3.3 연결에 사용한 매개변수가 틀린 경우.........................................................................17811.3.4 서비스 뷰를 통해 JDBC 연결 만들기..........................................................................178

11.4 JDBC 연결 사용하기........................................................................................................18011.4.1 필드 등록...............................................................................................................18011.4.2 레코드의 정렬과 필터링...........................................................................................181

11.5 RXDataSource 인터페이스..............................................................................................18311.6 데이터 소스의 타입.........................................................................................................184

5 / 318

Page 6: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

11.6.1 자바빈즈 데이터소스 사용하기..................................................................................18411.6.2 자바빈즈 데이터소스의 필드.....................................................................................18611.6.3 XML 데이터 소스 사용하기.......................................................................................18911.6.4 XML 데이터소스를 위한 필드 등록............................................................................19111.6.5 XML 데이터소스와 서브리포트..................................................................................19411.6.6 CSV 데이터소스 사용하기........................................................................................19811.6.7 CSV 데이터소스용 필드 등록....................................................................................20011.6.8 RXEmptyDataSource 사용하기.................................................................................20111.6.9 HQL 과 하이버네이트 연결 사용하기.........................................................................20211.6.10 새로운 RXDataSource를 구현하는 방법...................................................................20511.6.11 직접 만든 RXDataSource를 디자이너에서 사용하기..................................................207

11.7 데이터소스 내보내기와 가져오기......................................................................................21011.8 커스텀 언어와 질의 실행기 만들기....................................................................................211

11.8.1 커스텀 언어를 위한 질의 실행기 만들기.....................................................................21311.8.2 FieldsProvider 만들기.............................................................................................219

12 장. 차트................................................................................................................................22412.1 간단한 차트 만들기.........................................................................................................22412.2 데이터셋 사용하기..........................................................................................................23012.3 값에 하이퍼링크 걸기......................................................................................................23012.4 차트 속성......................................................................................................................23112.5 차트 테마 사용하기.........................................................................................................232

12.5.1 차트테마 디자이너 사용하기.....................................................................................23312.5.1.1 차트 테마 XML 소스 편집하기................................................................................23412.5.2 차트테마용 보고서 익스텐션 만들기..........................................................................235

13 장. 리스트, 테이블, 바코드......................................................................................................23713.1 리스트..........................................................................................................................237

13.1.1 리스트 컴포넌트 사용하기........................................................................................23713.1.2 리스트 요소의 매개변수와 변수.................................................................................24113.1.3 리스트 컴포넌트의 이슈들........................................................................................24413.1.4 출력 순서: 수직과 수평 리스트..................................................................................24513.1.5 리스트의 다른 사용.................................................................................................246

13.2 테이블..........................................................................................................................24613.2.1 테이블 만들기.........................................................................................................24613.2.2 테이블 구조............................................................................................................250

6 / 318

Page 7: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

13.2.2.1 테이블 요소....................................................................................................25013.2.2.2 컬럼 그룹.......................................................................................................25213.2.2.3 테이블 셀.......................................................................................................253

13.2.3 테이블 레이아웃 편집하기........................................................................................25313.2.4 데이터셋 실행 편집하기...........................................................................................25413.2.5 컬럼 사용하기.........................................................................................................255

13.3 바코드..........................................................................................................................25613.3.1 바코드 사용하기.....................................................................................................25713.3.2 Barbecue 컴포넌트.................................................................................................25813.3.3 Barcode4J 컴포넌트................................................................................................259

14 장. 서브데이터셋...................................................................................................................26214.1 서브데이터셋 만들기.......................................................................................................26214.2 데이터셋 실행 만들기......................................................................................................26414.3 예제 서브데이터셋 살펴보기............................................................................................265

15 장. 크로스탭..........................................................................................................................27015.1 크로스탭 도우미 사용하기...............................................................................................27015.2 행과 열 그리고 측정 사용하기..........................................................................................276

15.2.1 셀 수정하기............................................................................................................27915.2.2 측정에 대한 설명....................................................................................................279

15.3 크로스탭 요소 속성 수정하기...........................................................................................28015.4 크로스탭 매개변수..........................................................................................................28115.5 크로스탭 데이터 사용하기...............................................................................................28215.6 크로스탭 합계 변수 사용하기...........................................................................................283

16 장. 현지화.............................................................................................................................28716.1 리소스 번들 베이스 이름 사용하기....................................................................................28716.2 지역화된 문자열 가져오기...............................................................................................29216.3 메시지 포맷하기.............................................................................................................29216.4 지역화된 보고서 적용하기...............................................................................................29216.5 특정 로케일과 시간대를 사용하여 보고서 생성하기.............................................................293

17 장. 스크립틀릿......................................................................................................................29517.1 RXAbstractScriptlet 클래스에 대하여...............................................................................29517.2 간단한 스크립틀릿 만들기...............................................................................................29717.3 디자이너에서 스크립틀릿 테스트하기................................................................................30117.4 디자이너 객체에 접근하기...............................................................................................303

7 / 318

Page 8: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

17.5 스크립틀릿 디버깅하기...................................................................................................30417.6 스크립틀릿을 사용하는 보고서 배치시키기........................................................................306

18 장. 기타 도구들.....................................................................................................................30718.1 포스트잇 도구................................................................................................................307

18.1.1 현재 날짜 도구.......................................................................................................30818.2 페이지 번호, 총 페이지수와 Page X of Y 도구....................................................................309

18.2.1 페이지 번호 도구....................................................................................................30918.2.2 단일 텍스트필드에 Page X of Y 출력하기..................................................................309

18.3 백분율 도구...................................................................................................................31018.4 디자인 밑그림으로 배경 이미지 사용하기..........................................................................31118.5 예제 실행 방법...............................................................................................................313

부록 A 차트 테마 예제.................................................................................................................314

8 / 318

Page 9: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

1 장. 서문

RX2.0 디자이너는 ReportExpress 엔진을 통해 자바 어플리케이션에서 복잡한 보고서를 생성시킬 수 있는 웹

리포팅 디자인 도구입니다. 100% 순수 자바로 작성되었으며, 바코드와 차트 컴포넌트는 GNU 범용 공증 라이

센스에 따라 배포되는 오픈소스가 사용되어 있습니다. 보고서 디자인의 편의성을 위해 직관적인 다양한 그

래픽 인터페이스를 사용하여 여러분이 필요로 하는 보고서를 보다 쉽고 빠르게 만들도록 합니다. RX2.0 디

자이너는 ReportExpress의 모든 기능들에 액세스할 수 있는 기술을 처음 접하는 엔지니어 뿐만 아니라 숙련

된 사용자 또한 프로젝트 협업을 통한 보고서 개발 과정을 통해 소요되는 시간을 단축할 수 있도록 하는 개

발 방법론을 지원하고 있습니다.

RX2.0 보고서 디자이너는 넷빈 클라이언트 플랫폼을 기반으로 만들어진 자바 데스크탑용 어플리케이션입니

다. 따라서, 전체적인 개발도구의 인터페이스는 넷빈 IDE와 동일하며, 보고서 코어쪽의 설계는 전통적인 보

고서 개발 인터페이스를 그대로 유지하였기 때문에 보고서 서식 개발에 친숙한 UI를 유지하면서, 보다 유연

하게 새로운 기능을 넷빈 플러그인으로 만들어낼 수 있게 하였습니다.

이 보고서 디자이너 메뉴얼은 간단한 보고서에서 시작하여 차트, 이미지, 서브리포트등과 같은 복잡한 기능

까지 마스터할 수 있도록 여러분을 돕는 것이 목적입니다. 이번 장은 다음과 같은 섹션으로 구성되어 있습니

다:

• 보고서 디자이너의 기능

• 웹 커뮤니티

• ReportExpress 상용 라이센스

• 사용된 코드

1.1 보고서 디자이너의 기능

다음에 나열된 항목들은 보고서 디자이너 2.0.X 버전에서의 주요 기능입니다:

• ReportExpress XML 스키마 기반(http://www.cabsoftware.com/reportexpress/xsd/reportexpress.xsd).

• 보고서 제작을 위한 WYSIWYG 에디터. 사각형, 선, 타원, 텍스트필드, 정적텍스트, 차트, 서브리포트

및 크로스탭을 그리기 위한 위젯 제공.

• 표현식 작성을 위한 문법 하일라잇팅을 지원하는 내장 에디터.

• 유니코드와 비-라틴어 언어 지원(한국, 러시아, 중국, 일본 등).

• 보고서 구성 요소의 계층구조 브라우징(인스펙터창).

• 보고서 컴파일러, 채우기 및 내보내기의 통합.

• JDBC에서 접근할 수 있는 모든 데이터베이스 지원.

• 데이터소스의 모든 종류에 대한 가상 지원. 보고서와 서브리포트를 자동 생성하는 보고서 도우미.

• 문서 템플릿에 대한 지원.

• 트루타입 폰트 지원.

• I18N 지원(자바 리소스 번들).

9 / 318

Page 10: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

• 플러그인을 통한 기능 확장.

• 차트 지원.

• 표준 객체(페이지 번호 등)에 대한 라이브러리 관리.

• 드래그 앤 드롭 기능.

• 제한없는 편집 되돌리기/복원.

• 크로스탭 생성을 위한 도우미.

• 스타일 라이브러리.

• 통합 미리보기 뷰어.

• 오류 관리자.

• SQL 과 MDX 질의 디자이너를 통합한 인터페이스 지원.

• 어도브사의 플래쉬를 기반으로한 시각 컴포넌트의 지원.

• Mac OSX 에서 보고서 디자이너 설치.

• 다중 밴드와 동일 타입의 서브밴드 그리고 새로운 페이지 포맷 대화창과 같은 향상된 페이지 포맷팅.

• 그룹에 대한 함께 유지(Keep Together) 와 풋터 위치(Footer Position) 속성.

• 질의편집기와 필드 프로바이더 에서 커스텀 질의 언어 사용 가능.

1.2 웹 커뮤니티

캡소프트의 보고서 디자이너 개발팀에서는 개발 프로젝트에 이슈관리와 버저닝을 사용하고 있습니다. 또한,

자동화된 빌드 환경을 구축하여 개발 구성원들이 매일 새로운 기능들을 추가하고 보고된 버그를 수정하며

기능향상을 위한 요구를 검토하고 반영하는 작업을 하고 있습니다. 보고서 디자이너의 공식 웹사이트는

http://www.cabsoftware.com/reportexpress 입니다. 보고서 디자이너를 사용하면서 도움이 필요하게 되면, 캡소

프트의 기술지원 포럼을 이용해 보십시오. 이 포럼에 질문을 올려놓게 되면, 도움을 받을 수 있습니다. 질문

뿐 아니라 기능상의 제안이나 의견제시를 통해 활발한 토론을 벌이실 수도 있습니다. 요청하신 질문이나 요

구사항은 먼저 이슈트래커를 통해 고유한 Id가 할당되며, 캡소프트의 기술지원팀에서 이에 대한 추적을 통

해 일정 수립 및 문제해결 작업을 시작하고 완료하는 워크플로우를 따라 처리하고 있습니다. 기술지원포럼

에서 이러한 서비스를 받으시려면, 유지보수 계약을 통해 가능하게 되며, 이에 대한 궁금한 사항은

[email protected] 으로 메일을 주십시오.

1.3 ReportExpress 상용 라이센스

ReportExpress 서버와 보고서 디자이너는 상용 라이센스를 필요로 합니다. 상용 라이센스는 라이센스 관리자

를 사용해서 설치할 수 있습니다.

라이센스 관리자 대화창은 도움말→ 라이센스 설정을 선택하면 됩니다:

라이센스 설치를 클릭하고 사용할 라이센스 파일을 선택해 주십시오. 보고서 디자이너는 사용자 디렉터리에

지정한 라이센스 파일을 license.lic 이름으로 복사하게 됩니다. 라이센스가 올바르지 않으면, 이에 대한 문제

점 메시지가 보여지게 되며, 해당 안내에 따라 진행하십시오.

10 / 318

Page 11: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

상용 라이센스를 구매하지 않는 경우, 평가판 라이센스 기간이 지나면, 보고서 디자이너에서는 시작할 때마

다 다음 메시지를 보여줍니다. 하지만, 여전히 보고서 디자이너를 사용할 수 있습니다.

그림 1-1 라이센스 관리자 대화창

그림 1-2 라이센스 파일 선택창

11 / 318

Page 12: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

그림 1-3 활성화된 라이센스 정보

1.4 사용된 코드

ReportExpress에서는 다음과 같은 언어를 표현식에서 지원하고 있습니다:

• Java• JavaScript• Groovy

이 문서의 모든 예제 표현식은 자바스크립트로 작성되었습니다.

12 / 318

Page 13: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

2 장. 시작하기

이번 장에서는 보고서를 사용하기 위해 필요한 기본 지식에 대해 배우게 됩니다. 즉, 보고서를 설치하고 간

단한 보고서를 만드는 방법이 포함되어 있습니다.

이 장은 다음과 같은 섹션들로 구성되어 있습니다:

• 플랫폼 요구사항

• 다운로드

• 개발 버전

• 보고서 컴파일하기

• 보고서 디자이너 설치

• 윈도우용 설치프로그램

• 처음 보고서 디자이너 실행해보기

• JDBC 연결 만들기

• 첫 번째 보고서 만들기

2.1 플랫폼 요구사항

보고서 디자이너는 썬 자바 2 SDK 1.5 버전 이상이 필요합니다. 소스코드로 부터 빌드하거나 플러그-인을 만

들기 위해서는 넷빈 IDE와 넷빈 플랫폼 6.5.1도 필요합니다.

하드웨어는 다른 자바 프로그램처럼 RAM을 많이 사용하기 때문에 최소한 1기가 이상이 장착되어 있어야

하며, 디스크의 여유공간은 250MB 이상입니다. 본 문서에서 다루는 몇몇 기능들은 프로페셔널 버전을 필요

로 합니다. 기능에 대한 사항들은 스페셜 노트에서 확인할 수 있습니다.

보고서 디자이너에서 파일 선택시 문제가 없으려면, 윈도우 비스타를 사용하는 사용자는 반드시 자바 1.5.0_17-b04

이상의 버전을 설치해 주십시오. 윈도우 7인 경우라면 1.6.0_18-b03 혹은 1.7.0-b74 를 설치해 주시기 바랍니다.

2.2 다운로드

제품 다운로드 사이트(http://www.cabsoftware.com/download)에서 보고서 디자이너를 직접 다운로드 받을 수

있습니다. 4개의 다른 배포판을 다운받을 수 있습니다:

• RX2.0 디자이너-x.x.x.zip. ZIP 포맷의 공식 바이너리 배포판.

• RX2.0 디자이너-x.x.x.tgz. TAR GZ 포맷의 공식 바이너리 배포판.

• RX2.0 디자이너-x.x.x-windows-installer.exe. 공식 Win32 설치파일.

• RX2.0 디자이너-x.x.x.dmg. 맥 OSX용 공식 바이너리 배포판.

x.x.x 는 보고서 디자이너의 버전1입니다*. 각 배포판은 프로그램을 사용하기위해 필요한 써드파티 파일들과

1 디자이너 2.0 이상부터는 버전 번호에 “nb” 접두어(넷빈을 의미하는)가 포함되어 있습니다. 이 접두어는 버전 2.0에서 넷빈 플랫폼을

기반으로 전면 수정되면서부터 도입되었습니다.

13 / 318

Page 14: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

부가적인 파일들을 모두 포함하고 있습니다.

보고서 디자이너는 넷빈 IDE 6.x용 네이티브 플러그-인도 지원합니다. SourceForge 혹은 NetBeans 에서 플러

그인을 다운받을 수 있습니다.

2.3 보고서 디자이너 설치하기

보고서 디자이너의 바이너리 파일을 다운받은 후, 다음 단계를 진행합니다:

1. 선택한 디렉터리에 배포판 압축파일을 풉니다. 예) c:\devel (유닉스 시스템상에서는 /usr/devel).

2. 커맨드 프롬프트나 쉘을 열고, 압축을 푼 디렉터리로 이동 후, RX2.0 디자이너 디렉터리 밑에 있는

bin 디렉터리까지 이동하십시오. 그런 다음 다음 명령어를 실행시킵니다(윈도우 탐색기에서 해당 폴

더를 찾아 이동 후, 더블클릭해서 실행시키셔도 됩니다): rxdesigner.exe

유닉스 머신일 경우, 설치 스크립트를 실행가능하도록 하기 위해 chmod +x 명령어를 사용합니다. 그런

후, 루트 디렉터리에서 다음 명령어를 실행시켜 주십시오: ./rxdesigner

2.4 처음 보고서 디자이너 실행하기

보고서 디자이너를 처음 실행하게 되면, 보고서를 디자인하기 위해 필요한 몇가지 설정작업을 해주어야만

합니다. 보고서에서 사용할 데이터소스, 보고서 미리보기에서 사용될 외부 뷰어 프로그램, JDBC 드라이버 경

로등에 대한 설정이 필요합니다.

14 / 318

그림 2-5 옵션 창 – 일반 옵션들

Page 15: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

보고서 디자이너에서 도구 → 옵션을 선택하면, 그림 2-5과 같은 설정창이 보입니다.

RX디자이너 항목이 서식 디자인 작업에 필요한 옵션을 설정하는 항목입니다. 나머지 일반, 편집기, 글꼴 및

색상, 키맵, 기타 항목은 디자이너 개발 기본 플랫폼인 넷빈플랫폼의 설정에 사용되는 항목입니다.

이 설명서에서는 이 부분에 대해서는 설명하지 않겠습니다.

일반 탭은 보고서 디자인을 위한 화면 기본값을 설정하는 부분입니다. 유닛은 편집에 사용되는 편집 화면의

기본 단위를 결정하는 부분입니다. 기본으로 mm로 되어 있습니다. 자석 붙이기 효과 끄기 옵션은 서식 디자

인시에 추가하는 개별 컨트롤 들이 가까운 컨트롤에 붙도록 하여 쉽게 모양을 잡을 수 있도록 하는 기능입

니다. 이 기능을 끄면 컨트롤을 겹쳐 놓아야 하는 경우 사용 할 수 있습니다.

보고서 기본값 탭의 언어는 디폴트로 사용할 스크립트 언어를 바꿀수 있습니다.

지금은 일단, 뷰어탭(그림 2-6)을 클릭하여 보고서 미리보기에서 사용할 외부 뷰어 어플리케이션 설정을 하

겠습니다. 외부 뷰어 프로그램을 설정하지 않으면, 해당 포맷의 미리보기가 동작하지 않습니다. 기타 다른 기

능에 대해서는 장 후반부에 다루도록 하겠습니다.

설정한 외부 뷰어의 동작여부는 빈 보고서를 만들어서 테스트하면 됩니다:

1. 파일 → 새로만들기를 선택하여 빈 보고서를 만드십시오.

2. 보고서를 저장하십시오.

15 / 318

그림 2-6 옵션 창 - 뷰어

Page 16: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

3. 툴바에서 미리보기 버튼을 누르십시오.

오류가 나지 않는다면, 보고서 디자이너는 내부적으로 ReportExpress 파일을 생성해서 미리보기에 빈 페이지

를 보여주게 됩니다. 이 화면이 보인다면, 여러분은 보고서 디자이너를 올바르게 설치하고 설정까지 마친것

입니다.

보고서 디자이너는 보고서 디자이너 템플릿을 XML 파일로 저장하며, 저장된 파일은 확장자가 rxxml이 됩니다. 템

플릿의 컴파일된 버전은 바이너리 파일이고 확장자가 report 가 됩니다. 컴파일된 보고서 파일로 실제 보고서를 만들게

됩니다.

윈도우와 Mac OSX 운영체제에서는 뷰어에 대한 설정을 반드시 하지 않아도 됩니다. 외부 뷰어가 설정되지

않았을 경우엔 시스템에서 기본으로 설정된 프로그램을 이용하여 파일을 열게 됩니다.

2.5 JDBC 연결 만들기

보고서에 데이터를 채우기 위한 일반적인 데이터소스는 관계형 데이터베이스입니다. 그래서 이제 여러분에

게 보고서에서 JDBC 연결을 설정하는 방법을 보여드리겠습니다:

1. 도구바 → 보고서 데이터소스를 클릭하고 보고서 데이터소스 목록 윈도우에서 신규 버튼을 클릭합

니다. 새로운 연결 설정을 위한 윈도우창이 나타나게 됩니다. (그림 2-7 참고).

16 / 318

그림 2-7 데이터소스 타입 선택창

Page 17: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

2. Database JDBC Connection 을 선택하고 다음 버튼을 클릭합니다.

3. Database JDBC Connection 창에서 연결에 대한 이름을 입력(가령 “ReportExpress Sample”)하고, 적합한

JDBC 드라이버를 선택합니다(그림 2-8). 보고서에서는 대부분의 JDBC 드라이버에서 사용하는 URL 표기를

인식합니다. JDBC URL Wizard에서 서버의 주소와 데이터베이스명을 입력하고 도우미 버튼을 클릭하면 자동

으로 연결 URL을 만들어줍니다.

4. 연결 설정을 완료하기 위해서는 데이터베이스에 접근할 때 필요한 계정과 암호를 입력합니다. 암호를 저

장하고자 한다면, 암호저장 체크박스를 선택합니다. 다음 단계를 진행하기전에 연결 설정에 대한 테스트를

수행하는 것을 권장합니다. 테스트는 설정창 하단에 위치한 테스트버튼을 클릭하면 됩니다. 보고서에서는 다

음과 같은 SQL-호환 데이터베이스 시스템에 대한 JDBC 드라이버를 지원합니다:• HSQL• MySQL• PostgreSQL

보고서에서 ClassNotFound 오류가 리턴된다면, 선택한 데이터베이스 드라이버에 대한 JAR 아카이브가 클래스

경로내에 포함되어 있지 않은 것입니다. 이런 경우에는 다음과 같은 두 가지 해결방법이 있습니다:

• 필요한 JAR를 보고서 클래스경로에 추가합니다. 보고서 클래스 경로를 추가하려면, 메뉴 항목에서

도구 → 옵션 을 선택하고, RX디자이너 카테고리 아래에서 클래스경로 탭으로 이동하세요. 그런 후,

17 / 318

그림 2-8 내장된 JDBC 드라이버를 사용하여 JDBC 연결

Page 18: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

경로 목록에 JAR를 추가합니다.

• 서비스창을 통해 새로운 드라이버를 등록합니다. 두 번째 방식을 선호하신다면, 서비스창(윈도우 →

서비스 혹은 컨트롤키+5)을 열은 후, 데이터베이스 노드를 선택하고 드라이버 노드로 이동하십시오.

드라이버 노드에서 오른쪽 마우스를 클릭해서 새로운 드라이버 메뉴를 선택합니다. 그러면 그림 2-9

에서 보여지는 대화창이 팝업됩니다:

그림 2-9 외부 JAR 메뉴에서 오라클 드라이버를 적재

보고서를 닫지 않으면서 테스트를 다시하려면, /lib 디렉터리에 JDBC 드라이버를 복사한다음 테스트버튼을

다시 클릭합니다. 보고서는 자동으로 필요로하는 JAR 파일의 위치에서 드라이버를 적재합니다. 11 장에서는

보다 상세하게 다양한 데이터소스를 설정하는 방법에 대하여 설명하고 있으니 참고하십시오.

테스트가 성공하게 되면, 저장 버튼을 눌러 새로 설정한 연결을 저장합니다. 이제 새로 설정한 데이터소스가

메인 도구바의 데이터소스 드롭다운 목록에 보여질 것입니다(그림 2-11). 이 연결항목을 선택하고 연결을 활

성화시킵니다. 연결을 활성화 시키는 또 다른 방법은 데이터소스창을 연 후(그림 2-10) :

1. 도구 메뉴에서 보고서 데이터소스 메뉴 항목(또는 툴바에서 데이터소스 드롭다운 목록 옆의 버튼을

클릭)을 선택합니다.

2. 활성화시킬 데이터소스를 선택합니다.

18 / 318

Page 19: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

3. 기본으로 설정 합니다.

선택된 데이터소스는 보고서를 채울때 사용되며, 다른 오퍼레이션에서도 사용되는데, 그 중에 하나는 SQL

질의를 통해서 필드를 선택해서 가져오는 것 입니다. 보고서와 데이터소스 사이의 연결은 타이트하지 않으

므로 여러분은 다른 데이터소스를 사용해서도 보고서를 실행시킬 수 있지만, 한번에 하나의 데이터소스만

사용할 수 있습니다. 후에 서브리포트를 사용하여 여러 데이터소스를 사용해서 보고서를 만드는 방법에 대

해 알아보도록 할 것입니다.

데이터소스 드롭다운 메뉴에서는 활성화된 데이터소스의 선택이 가능합니다. 활성화된 데이터소스창의 우

측에 있는 ▼ 버튼을 클릭하면 드롭다운 메뉴가 나타납니다. 여기서 사용할 데이터소스를 선택하면 됩니다.

2.6 첫 번째 보고서 만들어보기

이제 보고서를 설치하고 설정을 해준 후, 데이터베이스 사용을 위한 JDBC까지 준비되었으므로 보고서 도우

미를 사용하여 간단한 보고서를 만드는 과정을 진행하겠습니다. 이 문서에서 제공하는 예제와 이후 과정을

위해서는 자바로 만들어진 경량의 관계형 데이터베이스인 HSQLDB를 사용합니다. 물론 JDBC 드라이버도

제공됩니다. 여러분은 HSQLDB 웹사이트에서 이 데이터베이스에 대해 보다 자세한 사용법을 배울 수 있습

니다. 본 문서에서 HSQLDB의 자세한 내용은 다루지 않을것입니다.

2.6.1 예제 데이터베이스 사용하기

예제 보고서를 위해서는 보고서 설치시 함께 설치되는 예제 데이터베이스를 사용할 것 입니다. 예제 데이터

19 / 318

그림 2-10 데이터소스창

그림 2-11 데이터소스 드롭다운 메뉴

Page 20: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

베이스 서버를 시작하는 방법은 다음과 같습니다:

1. 커맨드 프롬프트(또는 쉘)를 실행하신 후, 보고서를 설치한 디렉터리로 이동하십시오. 보고서 홈 디

렉터리 아래에서 demo/hsqldb 로 이동합니다.

2. Ant 로 다음 명령어를 실행시키십시오(Ant가 먼저 설치되어 있어야 합니다): ant runServer

또는, 한줄로 다음 명령어를 실행시킵니다: java -cp ..\..\lib\hsqldb-1.7.1.jar org.hsqldb.Server

이제 데이터베이스 서버가 시작되고, 보고서에서 사용할 수 있게 되었습니다.

2.6.2 보고서 도우미 사용하기

다음 테이블 목록은 예제 데이터베이스에 연결할 때 사용되는 매개변수입니다:

매개변수 값

Name Sample

JDBC Driver Org.hsqldb.jdbcDriver

JDBC URL Jdbc:hsqldb:hsql://localhost

Username sa

Password

연결 설정시 암호저장 체크박스를 선택하고 저장합니다.

1. 파일→ 새로만들기 선택. 이제 보고서를 단계별 설정을 통해 만들어주는 도우미창이 나타납니다(그림

2-12). 템플릿을 선택한 후에는 보고서를 저장할 위치와 이름을 선택합니다.

그림 2-12 보고서 도우미 : 템플릿 선택

20 / 318

Page 21: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

2. 템플릿을 선택하고 보고서 도우미 실행 버튼을 클릭해서 보고서를 생성하는 과정을 시작합니다. 선

택한 템플릿을 복사한 간단한 보고서를 만들려면 이 템플릿 열기 버튼을 클릭해주기만 하면 됩니다.

하지만, 여기서는 도우미를 사용하도록 하겠습니다.

3. 세 번째 단계에서는 앞에서 설정했던 JDBC 연결을 선택하게 됩니다. 도우미는 SQL 질의가 사용할

연결을 찾은 후, 질의문을 입력할 텍스트 영역에 프롬프트가 나오게 됩니다(그림 2-14). 선택적으로

우리는 질의 디자이너(디자인 질의 버튼 클릭)를 사용해서 비쥬얼한 질의 디자인이 가능합니다. 이

제 여러분이 최소한의 SQL 사전 지식을 갖고 있다는 가정하에서 다음과 같은 간단한 질의문을 직접

입력하겠습니다:

select * from address order by city

21 / 318

그림 2-13 보고서 도우미 : 새로 만들 보고서의 이름과 위치 설정

그림 2-14 보고서 도우미 : SQL 질의

Page 22: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

4. 다음 버튼을 누릅니다. 질의문에서 사용된 “order by”는 다음 단계에서 선택하는 정렬 순서에서 중요

합니다. 보고서는 address 테이블에서 필드들을 읽은 후, 다음 단계 도우미창에 보여줍니다(그림2-15).

5. 보고서에서 출력할 필드들을 선택한 후 포함시키고 다음 버튼을 클릭합니다.

6. 이제 보고서에서 출력할 필드를 선택했기 때문에 이 필드들 중에서 어떤 필드를 정렬의 기준으로 할

지를 선택합니다. 정렬할 필드는 어느것이나 가능합니다(그림 2-15 참고). 도우미를 사용하는 경우,

최대 4개 까지의 그룹을 만들 수 있습니다. 그룹의 갯수에는 제한이 없으며, 이 후에 더 많은 수의 그

룹을 추가시킬 수 있습니다.

7. 이 보고서에서는 CITY 필드에 대한 간단한 그룹을 정의합니다. 그림 2-16과 같은 모습이 됩니다.

22 / 318

그림 2-15 보고서 도우미 : 필드 선택

그림 2-16 보고서 도우미 : 그룹만들기

Page 23: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

8. 그룹만들기를 완료한 후, 다음 버튼을 클릭합니다.

9. 도우미의 마지막 화면이 나타나게 되며, 지금 까지 작업한 결과가 보여지게 됩니다. 마침 버튼을 클

릭해서 보고서 중앙에 보여지는 보고서를 생성합니다.

10. 미리보기 버튼을 클릭하면 최종 결과를 확인할 수 있습니다.

23 / 318

그림 2-16 보고서 도우미 : 완료

그림 2-17 디자인 윈도우

Page 24: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

미리보기 버튼을 클릭할 경우, 보고서가 컴파일되어 ReportExpress 파일을 생성하며 지정한 데이터소스를 사

용하여 보고서의 내용을 채우게 됩니다. 디자이너의 메인창 아랫부분에 있는 출력창을 통해 진행상황을 추

적할 수 있습니다.

어떠한 이유에 의해서 보고서 미리보기가 실패하면, 보고서 문제창 부분에서 문제사항들을 확인할 수 있으

며, 다른 오류들의 추적정보들(완전한 스택 트레이스)은 출력창에서 볼 수 있습니다.

지금 만든 예제에서는 오류없이 잘 동작할 것이며, 여러분은 그림 2-18와 같은 미리보기를 확인할 수 있습니

다.

다음과 같은 사항을 확인해보십시오:

24 / 318

그림 2-18 미리보기 결과 화면

Page 25: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

• 윈도우 툴바에 있는 디스크 모양의 아이콘을 클릭해서 보고서를 저장할 수 있습니다. 보고서는 PDF

나 HTML과 같은 다양한 포맷으로 보고서를 저장시킬 수 있습니다.

• 특정한 포맷으로 자동으로 보고서를 내보내기 위해서는 해당 포맷을 위한 올바른 뷰어 어플리케이

션이 실행되어져야 합니다. 미리보기 메뉴에서 보고서 포맷을 선택할 수 있습니다.

• 미리보기 창에서 보고서를 실행시키려면, 미리보기의 툴바에 있는 새로고침 버튼을 클릭하면 되며,

보고서 디자인을 변경하였다면, 디자인을 저장한 후 다시 미리보기 버튼을 클릭합니다.

25 / 318

Page 26: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

3 장. 보고서의 기본 표기방식

보고서 디자이너의 엔진은 ReportExpress입니다. 이번 장에서는 보고서 디자이너의 동작원리를 이해할 수 있

도록 ReportExpress Report의 기본 개념에 대해서 설명할 것입니다.

ReportExpress API는 보고서 정의를 XML 문법을 사용하며, 여러분이 프로그램 할 때 참조하게 되는 세부 라

이브러리 문서는 http://www.cabsoftware.com/reportexpress/docs/api/ 에 기술되어 있습니다. 다른 정보들과 예제

들은 ReportExpress 사이트에서 직접 얻을 수 있습니다 : http://www.cabsoftware.com/reportexpress/spotlight/resources.htm

ReportExpress의 라이센스는 디자이너와 서버용으로 구분되어 있습니다. 디자이너 라이센스의 경우에는 보

고서 디자이너를 사용하여 보고서를 만들고 미리 볼 수 있도록 하기 위해 발급됩니다. 서버상에서 인쇄물을

생성할때는 런타임 실행파일은 서버용 라이센스를 따로 받아서 사용하셔야 합니다. 올바른 상용 라이센스

없이는 오직 개발 도구로만 사용할 수 있으며, 제품 테스트를 위한 시험용 라이센스의 신청은

http://www.cabsoftware.com/rxlicense 에서 신청하시면, 메일로 신청하신 라이센스를 자동 발급해드립니다.

이번 장에서 다루게 될 섹션들은 다음과 같습니다:

• 보고서의 생명주기

• RXXML 소스와 ReportExpress 파일

• 데이터소스와 인쇄 포맷

• 버전간의 호환성

• 표현식

• 표현식으로 자바 사용하기

• 표현식으로 그루비 사용하기

• 표현식으로 자바스크립트 사용하기

• 간단한 프로그램

3.1 보고서의 생명주기

일반적으로 보고서라 하면, 최종 결과문서 즉 PDF나 Excel 파일과 같은 문서를 떠올리게 됩니다. 하지만, 이

것은 보고서 생명주기에서 가장 마지막 단계일 뿐입니다. 보고서는 제일 먼저 보고서 서식을 디자인하는 것

부터 시작됩니다. 보고서를 디자인 한다는 의미는 데이터로 채워지게 되는 영역을 갖는 서식을 만든다는 것

입니다. 하나의 페이지상에서 이렇게 데이터로 채워지게 되는 영역들이 정의되고 그 안에 들어가게 되는 내

용에 맞춰 늘어나게 되는 등 일련의 작업들이 이루어지게 됩니다. 보고서 디자인을 마치면, RXXML확장자를

갖는(“RX”는 ReportExpress를 의미함) XML 구문으로 구성된 템플릿을 저장합니다. 이렇게 저장된 템플릿은

보고서의 레이아웃에 대한 정보와 연산을 수행하기 위한 복잡한 수식, 데이터소스 이외에 필요로 하는 부가

적인 데이터를 가져오기 위한 질의등과 같은 다양한 기능들이 포함되게 됩니다. 이러한 다양한 기능들은 차

차 설명드리도록 할 것입니다.

RXXML은 그 자체로는 사용을 할 수 없습니다. 성능 향상과 보고서를 실행시키는 프로그램 상에서 잇점들

26 / 318

Page 27: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

을 얻기 위해서 보고서 디자이너는 RXXML을 컴파일해서 실행가능한 바이너리 파일인 ReportExpress 포맷

으로 저장합니다. ReportExpress 파일은 ReportExpress에서 보고서 템플릿과 데이터소스를 합해주는 과정인

보고서 생성에서 사용됩니다. 이렇게 해서 생성된 결과물은 “메타 프린트”즉, 보고서 아웃풋의 중간단계로써

보고서 생명주기에서 최종 단계에 해당되는 마지막 문서 포맷으로 변환시킬 수 있는 상태가 됩니다. 생명주

기는 다음 두 개의 구분되는 액션셋트로 나눌 수 있습니다:

• 개발 단계에서 수행되는 태스크(보고서를 설계하고 디자인하여 ReportExpress 파일의 소스가 되는

RXXML을 만들어 나아감).

• 런타임에서 실행되어야만 하는 태스크(ReportExpress파일을 로딩하고, 보고서를 채운 다음 최종 포맷

으로 프린트를 내보내기).

보고서의 생명주기상에서, 보고서 디자이너의 제일 큰 역할은 보고서를 디자인하고 미리보기를 통해 최종

모양을 확인하면서 원하는 포맷으로 내보내는 과정을 확인함으로써 ReportExpress 파일을 만드는 것입니다.

물론, 보고서 디자이너는 다양한 종류의 데이터소스를 지원함으로써 보고서 개발자가 자신의 데이터소스를

갖고 테스트 할 수 있도록 지원하므로 보고서의 개발과 테스트 모두를 가능하게 합니다.

3.2 RXXML 소스와 ReportExpress 파일

앞에서 기술하였듯이 ReportExpress는 보고서를 XML 형식으로 정의합니다. XML 문서는 XML 스키마 문서

를 사용하여 유효성을 검증해야만 합니다(reportexpressreport.xsd).

RXXML 파일은 섹션들의 셋트로 구성되며, 섹션중에는 보고서의 물리적인 특성인 페이지의 크기, 필드의 위

치 및 밴드의 높이들 그리고 논리적인 특성인 매개변수들과 변수 그리고 데이터 선택을 위한 질의 정의등으

로 구성되어 있습니다.

다음은 이전 장에서 설명했던 보고서(그림 2-19)의 소스코드 입니다.

코드 예제 3-1 간단한 RXXMXL 파일 예제<?xml version="1.0" encoding="UTF-8"?><ReportExpress xmlns="http://www.cabsoftware.com/reportexpress" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.cabsoftware.com/reportexpress http://www.cabsoftware.com/reportexpress/xsd/reportexpress.xsd" name="report3" language="groovy" pageWidth="842" pageHeight="595" orientation="Landscape" columnWidth="802" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20">

<property name="rxreport.zoom" value="1.0"/><property name="rxreport.x" value="0"/><property name="rxreport.y" value="0"/><queryString language="SQL">

<![CDATA[select * from address order by city]]></queryString><field name="ID" class="java.lang.Integer"/><field name="FIRSTNAME" class="java.lang.String"/><field name="LASTNAME" class="java.lang.String"/><field name="STREET" class="java.lang.String"/><field name="CITY" class="java.lang.String"/><group name="CITY">

27 / 318

Page 28: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

<groupExpression><![CDATA[$F{CITY}]]></groupExpression></group><background>

<band splitType="Stretch"/></background><title>

<band height="79" splitType="Stretch"/></title><pageHeader>

<band height="35" splitType="Stretch"/></pageHeader><columnHeader>

<band height="29" splitType="Stretch"><staticText>

<reportElement isPrintRepeatedValues="false" x="12" y="0" width="100" height="29"/>

<textElement/><text><![CDATA[FIRSTNAME]]></text>

</staticText><staticText>

<reportElement isPrintRepeatedValues="false" x="114" y="0" width="100" height="29"/>

<textElement/><text><![CDATA[LASTNAME]]></text>

</staticText></band>

</columnHeader><detail>

<band height="32" splitType="Stretch"><textField>

<reportElement x="12" y="0" width="100" height="32"/><textElement/><textFieldExpression class="java.lang.String"><!

[CDATA[$F{FIRSTNAME}]]></textFieldExpression></textField><textField>

<reportElement x="114" y="0" width="100" height="32"/><textElement/><textFieldExpression class="java.lang.String"><!

[CDATA[$F{LASTNAME}]]></textFieldExpression></textField>

</band></detail><columnFooter>

<band height="45" splitType="Stretch"/></columnFooter><pageFooter>

<band height="54" splitType="Stretch"/></pageFooter><summary>

<band height="42" splitType="Stretch"/></summary>

</ReportExpress>

RXXML파일의 작성과정(ReportExpress 클래스의 사용)에서 XML은 파싱되어 ReportExpressDesign 객체(메모

리상에서 정교한 XML 컨텐츠를 표현할 수 있도록 해주는 풍부한 데이터 구조체)에 적재됩니다. 세부적인 작

업 없이 RXXML내에서 사용된 표현식이 어떤 언어를 사용했는지 상관없이 ReportExpress는 전체 보고서를

표현해주는 특별한 자바 클래스를 생성합니다. 그런 후 보고서는 컴파일되고 ReportExpress 파일로 인스턴스

화 시킨 후, 직렬화 과정을 거칩니다.

28 / 318

Page 29: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

ReportExpress의 빠른 동작속도는 모두 이렇게 네이티브한 자바의 바이트코드로 컴파일된 보고서의 형태 때

문으로 보고서 구조의 유효성 검증은 런타임이 아닌 편집과정에서 이루어집니다. ReportExpress 파일에는 보

고서에서 사용되는 이미지와 리소스번들(서로 다른 언어권에서의 처리를 위한) 혹은 스크립트릿과 외부 스

타일 정의등과 같은 관계없는 리소스는 포함되지 않습니다. 이러한 모든 리소스들은 호스트 어플리케이션에

의해 제공되며 런타임에서 위치하게 됩니다.

3.3 데이터소스와 프린트 포맷

동적 데이터소스로 부터 컨텐츠를 공급하지 않는다면, 아무리 보고서가 복잡하고 정교하더라도 실제 보고서

로써의 의미가 없어집니다. 보고서 엔진에서는 다음 두 가지 방법으로 출력 보고서에 대한 데이터를 채우는

방법을 지정할 수 있습니다. 두 방식 모두에서 그림 3-1에서 보여지는 RXDataSource라고 불리는 범용 인터페

이스를 사용하여 표현됩니다.

그림 3-1 보고서 생성을 위한 데이터소스와 매개변수의 플로우

데이터소스는 11장. 데이터소스와 질의 실행기에서 따로 다루고 있습니다. 보고서 디자이너에서 사용되는 방

식과 커스텀 데이터소스를 정의하는 방법(필요에 의해서 보고서 엔진에 넘겨줘야 하는 경우)에 대해서도 설

명하고 있습니다.

RXDataSource는 테이블 형태(열과 행으로 구성된)로 읽을 수 있는 레코드들의 셋트도 가능합니다. 보고서에

지정한 질의문을 실행시키도록 관계형 데이터베이스에 대한 JDBC 커넥션(인스턴스화시키고 오픈된)을 사용

하여 명시한 데이터소스로부터 데이터를 가져와 보고서를 채울수도 있습니다.

데이터소스를 통해 넘겨받은 데이터가 여러분의 요구에 충족되지 않는다면, 보고서 실행시 조건에 따라 특

정한 값을 지정해줄 필요가 있습니다. 이를 위해서는 이름/값 쌍으로 된 매개변수를 프린트 엔진쪽에 “전달”

해주는 것도 가능합니다.

매개변수를 사용할 경우에는 보고서에서 “사전 선언”을 해주어야만 합니다. fillManager 를 통해

29 / 318

Page 30: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

ReportExpressPrint 객체로 ReportExpress 파일과 데이터소스를 연결시킬 수 있습니다. 이렇게 만들어진 객체는

RXExporter 인터페이스를 구현한 적절한 클래스를 통해 원하는 포맷으로 내보낸 후 실제 출력물을 만들어

내게 됩니다.

보고서 엔진에서는 PDF, XLS, CVS, XML, RTF, ODF, TEXT, HTML 및 SWF와 같은 포맷으로 파일을 생성할

수 있는 이미 정의된 익스포터(exporters)들이 있습니다. 화면상에서 보고서를 보고 하드카피로 출력하기 위

해서는 RXViewer 클래스를 사용합니다.

3.4 표현식

전문가가 아니더라도 보고서를 디자인할 수 있도록 디자이너를 설계했음에도 불구하고, 여전히 보고서내의

많은 설정은 동적인 값을 설정하기 위한 스크립트들을 필요로 합니다. 즉, 어떤 요소를 조건에 따라서 보이

게 하거나 감추거나 또는 특정한 연산을 수행하거나 문자열의 조작등과 같은 작업을 위해서는 최소한의 스

크립트 언어에 대한 지식을 가져야만 합니다.

다행스럽게도 디자이너에서 사용할 수 있는 스크립트는 세 가지 언어중에 하나를 사용할 수 있으며, 자바스

크립트와 그루비는 매우 간단하여 프로그래밍적인 지식없이도 사용이 가능합니다.

보고서에서의 모든 수식은 표현식을 통해 정의됩니다. 기본 표현 언어는 자바입니다만, 자바스크립트나 그루

비를 사용하는 것을 권장합니다. 이 두개의 언어는 자바를 사용할 때에 비해서 매우 단순하고, 여러분이 자

바를 모를 경우에 사용할 수 있는 소수의 언어중 하나입니다. 사용할 언어는 문서의 속성이므로 인스펙터 뷰

창에서 문서의 루트 노드를 선택한 후, 속성뷰 창에서 언어 속성을 찾아서 사용할 언어를 설정해주어야 합니

다. 다음 섹션에서 언어들에 대해 살펴보게 되겠지만, 여기서는 “표현식”의 정의에 대해서만 설명하도록 하

겠습니다. 표현식을 위해 선언하는 타입과 왜 이것이 보고서에서 중요한지에 대해 특히 더 많은 설명을 하도

록 하겠습니다.

표현식이란 어떤 값들을 연산하여 그 결과를 리턴해주는 수식입니다. 표현식을 수식으로 이해하고자 하신다

면, 엑셀의 셀에 대한 정의를 떠올려보십시오. 하나의 셀은 간단한 값이 될 수도 있고, 다른 값을 참조하는 복

잡한 수식이 될 수도 있습니다. 보고서에서도 필드 요소, 매개변수 및 변수를 참조해서 수식을 사용할 수 있

습니다. 여기서 중요한 것은 여러분이 작성할 표현식이 무엇이든간에 연산된 결과를 리턴해준다는 것입니다.

(리턴되는 값에는 “널”이 올 수도 있지만, 여전히 값으로 여겨지게 됩니다)

3.4.1 표현식의 타입

표현식의 타입이란 리턴된 결과값의 특성입니다. 즉, 타입은 표현식이 사용되는 컨텍스트에 따라 결정되게

됩니다. 가령, 조건의 평가를 위해 표현식을 사용한 경우에는 부울린(true 혹은 false) 타입이 됩니다. 텍스트

필드에 보여지게 되는 표현식을 만들었다면, 리턴되는 값은 문자열이거나 숫자(정수 혹은 배정수) 타입이 될

것입니다. 이제 우리는 표현식의 타입에 대한 선언을 텍스트, 숫자, 부울린 그리고 범용 객체값으로 제한할

것 입니다.

30 / 318

Page 31: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

불행히도, ReportExpress는 조금은 형식적이며 표현식의 타입을 설정하는 것에 매우 예민할 경우가 많습니다.

사용하는 언어에 상관없이 여기서는 자바 타입에 대해서만 설명하도록 하겠습니다. 주요한 타입들은 다음과

같습니다:

java.lang.Boolean 부울린 값을 표현하도록 정의된 객체. 값으로는 true 와 falsejava.lang.Byte 바이트를 표현하도록 정의된 객체

java.lang.Short 단정수를 표현하도록 정의된 객체

java.lang.Integer 정수를 표현하도록 정의된 객체

java.lang.Long 장정도 정수(long integer)를 표현하도록 정의된 객체

java.lang.Float 부동소수를 표현하도록 정의된 객체

java.lang.Double 실수를 표현하도록 정의된 객체

java.lang.String 텍스트를 표현하도록 정의된 객체

java.util.Date 날짜나 타임스탬프를 표현하도록 정의된 객체

java.lang.Object 범용 자바 객체

앞에서도 언급했듯이 출력여부를 결정하기 위한 표현식이 조건에 대한 결정값에 사용될때는 리턴 타입이

java.lang.Boolean 으로 지정되어야 합니다. 텍스트 필드에 보여줄 숫자에 대한 표현식을 작성한다면, 타입은

java.lang.Integer 나 java.lang.Double 이 될 것입니다. 다행스럽게도, 자바스크립트와 그루비에서는 타입에 대한

엄격성이 없기 때문에 언어 자체적으로 값에 대한 타입을 적합한 형식으로 다루거나 암묵적인 캐스트(타입

변환)가 이루어집니다.

3.4.2 표현식 연산자와 객체 메쏘드

자바에서 연산자는 그루비와 자바스크립트에서도 유사합니다. 이들 언어가 모두 동일한 기본 문법을 공유하

기 때문입니다. 연산자는 단항 오퍼랜드(unary operators)에 적용되거나 두개의 오퍼랜드(binary operators)에 적

용될 수 있습니다.

표 3-2 표현식 연산자

연산자 설명 사용예

+ 더하기 (두 숫자를 더하거나 두 문자열을 합함) A + B

- 빼기 A - B

/ 나누기 A / B

% 나머지 값 구하기. 정수로 나눈 나머지 값을 리턴 A % B

|| 부울린 연산자 OR A || B

&& 부울린 연산자 AND A && B

== 같다2 A == B

31 / 318

Page 32: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

&& 부울린 연산자 AND A && B

!= 다르다3 A != B

! 부울린 연산자 NOT !A

다음 테이블(표 3-2)에는 일련의 연산자가 나옵니다. 완전한 목록은 아닙니다. 대표적인 것만 추린 것이며,

변수에 1을 더해줄 때 단항 연산자에 ++ 로 표현하는 방법과 x + 1 과 같이 표현하는 방법이 있습니다.

표현식에서는 보고서내에 정의한 매개변수, 변수 그리고 필드들을 참조하여 표 3-3에서 요약한 문법을 사용

할 수 있습니다.

표 3-3 보고서 객체를 참조하기 위한 문법

문법 설명

$F{필드명} 필드이름을 지정(“F”는 필드를 의미함)

$V{변수명} 변수이름을 지정

$P{매개변수명} 매개변수 이름을 지정

$P!{매개변수명} $P{매개변수}가 Prepared statement의 인자값을 이용하여 데이터소

스를 처리하는것과 다르게, “where contactname like ‘홍%’”문 처럼

조건문 자체를 매개변수로 넘겨서 처리하고자 할 경우 사용하는

특수한 문법

$R{리소스키} 문자열을 현지화하는 특수한 문법

다음 장에서는 필드, 변수 그리고 매개변수의 특성에 대해 다루게 됩니다. 여기서는 이것들이 항상 객체를

표현(즉, 널값일수도 있음)하는 것으로 알고 있으면 됩니다. 보고서에서 이것을 선언할 경우에는 타입까지 지

정해 주어야 합니다. $R{리소스키} 문법은 문자열을 현지화시킬 때 사용합니다. 17장. “현지화”에서 상세하

게 다루어지고 있습니다.

표현식의 잠재적인 복잡성에도 불구하고, 일반적으로는 값을 리턴해주는 간단한 연산이 대부분입니다. 자주

쓰는 코드의 묶음(snippet)이나 많은 명령을 포함한 셋트가 아니어서 복잡한 명령이나 흐름 처리 키워드-

switch문, 루프, while 조건 반복문등을 사용할 수 없습니다.

대부분의 경우에 유용하면서 간단한 if-else 표현식 정도가 알맞습니다. 표현식은 값을 리턴해주는 임의의 연

산(때로는 복잡해지기도 하는)입니다. 여러분은 표현식을 모든 산술적인 연산 혹은 객체 메쏘드를 호출해서

만들 수 있지만, 결국 표현식은 하나의 값을 나타내는 것임을 명심하십시오. 자바에서는 모든 이러한 연산들

2 자바에서 == 연산자는 두 원형 값의 비교에만 사용됩니다. 객체의 경우에는 “equals” 메쏘드를 사용해야 합니다. 즉, “test” ==

“test” 와 같이 사용할 수 없습니다. 이런 경우에는 “test”.equals(“test”) 로 사용해야 합니다.

3 != 은 두 원형 값의 비교에만 사용됩니다.

32 / 318

Page 33: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

이 합계 연산자(+)를 제외하고는 원형 값들에 대해서만 가능합니다. 합계 연산자가 문자열에 적용될 경우에

는 “문자열 합치기” 효과를 내게됩니다. 즉 : $F{city} + “, ” + $F{state} 의 결과는 다음과 같은 문자열이 만들어

지게 됩니다: 서초구,서울시

표현식내의 모든 객체들은 메쏘드를 포함할 수 있습니다. 메쏘드는 0개 이상의 인수를 취할 수 있으며, 값을

리턴하거나 하지 않을 수도 있습니다. 표현식 내에서는 값을 리턴해주는 메쏘드만을 사용할 수 있습니다. 그

렇지 않을 경우에는 여러분의 표현식에서 아무것도 리턴받지 못하게 됩니다. 메쏘드를 호출하는 방법은 다

음과 같습니다: Object.method(argument1, argument2, and so on.)

사용 예제:

표현식 결과값

“test”.length() 4

“test”.substring(0,3) “tes”

“test”.startsWith(“A”) false

“test”.substring(1,2).startsWith(“e”) true

각 개체의 모든 메쏘드들은 일반적으로는 “자바독”이라고 불리는 일련의 문서내에 설명되어 있습니다. 이 문

서는 인터넷에서 구할 수 있습니다. 여러분은 표현식을 괄호안에 넣음으로써 보다 읽기좋게 할 수 있습니다.

3.4.3 표현식에서 If-Else 구조 사용하기

표현식내에서 if-else 와 같은 구문을 만드는 방법은 물음표 연산자를 사용하는 것 입니다. 사용 방법은 :

(($F{name}.length() > 50) ? $F{name}.substring(0,50) : $F{name})

문법은 다음과 같습니다.

(<조건>) ? <참일때의 값> : <거짓일때의 값>.

이것은 매우 유용하며, 재귀적 호출도 가능하므로 값이 참인지 거짓인지에 따라서 또 다른 표현식의 조건으

로 사용할 수 있기까지 합니다.

(($F{name}.length() > 50) ? (($F{name}.startsWidth(“A”)) ? “AAAA” : “BBB”) : $F{name})

위 표현식의 필드이름이 50자보다 크고 “A”로 시작할 경우에는 문자열 “AAAA”를, 50자보다 길지만 “A”로 시작하지 않는

다면 “BBB”를 리턴하고, 이 두개의 경우 모두에 일치하지 않는다면 원래의 필드값을 리턴하게 합니다.

표현식이 복잡성을 내포함에도 불구하고(다수의 if-else 구문사용등) 필요로 하는 값을 정의하는데는 불충분

합니다. 가령, 여러분이 로마표기법 숫자를 출력해야 한다거나 요일로 변환된 값을 보여주고 싶을때는 다음

에서 보여지듯이 정적으로 선언해야만 하는 외부 자바 클래스 메쏘드를 사용해서 전달시키게 됩니다. :

33 / 318

Page 34: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

MyFormatter.toRomanNumber( $F{MyInteger}.intValue() )

여기서 함수 오퍼랜드인 toRomanNumber 는 MyFormatter 클래스의 정적 메쏘드이며, 인수로 int를 넘겨받아서

로마식 표기법으로된 숫자를 리턴하게 됩니다. Integer 형식을 int 로 변환하는 것은 iniValue() 메쏘드에 의해

이루어지며, 오직 자바 언어를 사용할 경우에만 필요로 하게 됩니다.

이렇한 기법은 많은 사용에 씌여집니다. 즉, CLOB 필드로부터 텍스트를 읽거나 해쉬맵(키/값의 쌍 세트를 표

현하는 자바 객체)에 값을 추가할 때 등입니다.

3.5 표현식으로 자바 언어 사용하기

우선, 보고서 디자이너에서 다른 두개의 언어에 비해 자바를 선호해야 할 이유가 전혀 없다는 것부터 말씀드

리겠습니다.

자바 표현식의 예는 다음과 같습니다: • “This is an expression”• new Boolean(true)• new Integer(3)• (($P{MyParam}.equals("S")) ? "Yes" : "No")

주의해야 할 첫 번째 사항은 각 표현식이 자바의 객체를 표현한다는 것입니다. 즉, 각 표현식의 결과는 비원

형(non-primitive) 값이 됩니다. 객체와 원형값의 차이는 자바에서만 다르지만 매우 중요합니다: 원형값은 숫

자 5 나 부울린 값 true등이 해당됩니다. 원형값에 대한 연산의 결과는 새로운 원형값이 됩니다. 즉, : 5+5의 결과는 원형값 10 이 됩니다. 객체는 메쏘드를 가질수 있고 널일수도 있으며 대부분의 경우 키워드 “new”

를 통해 인스턴스화 되어야만 하는 복합적인 타입입니다. 표현식 예의 두 번째 경우(new Boolean(true))를 보

면, 원형값 true를 객체가 감싸고 있습니다. 그루비와 자바스크립트 언어처럼 스크립트 기반에서는 원형값은

자동적으로 객체에 랩핑되어서 원형값과 객체사이의 차이가 약합니다.

자바 언어를 사용할 경우에는 표현식의 결과는 반드시 객체이어야 하기 때문에 5+5 와 같은 표현식은 사용

할 수 없으며, 따라서 다음과 같이 고쳐서 사용해야 합니다: new Integer( 5 + 5 )

이렇게 수정된 표현식은 원형값 10을 표현하는 Integer 타입의 새로운 객체를 만들게 됩니다. 여러분이 자바

를 표현식의 기본 언어로 설정한다면, 다음과 같은 표현식을 사용할 수 없음에 주의해야 합니다: • 3 + 2 * 5• true• (($P{MyParam} = = 1) ? "Yes" : "No")

위의 표현식에서는 객체 사용이 올바르지 않습니다. 특히, 첫 번째와 두 번째 표현식은 결과값이 객체가 아

닌 원시타입(첫 번째는 integer, 두 번째는 boolean)이기 때문입니다. 세 번째 표현식은 MyParam 매개변수를

원형 타입으로 가정하여 = = 연산자를 사용해서 int 타입과 비교하도록 했지만, 잘못된 사용입니다. 실제 보

고서에서는 매개변수, 변수 및 필드는 항상 객체로 다루어지므로 원형값과 비교할 수 없고 수식표현에 직접

사용할 수 없습니다.

34 / 318

Page 35: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

3.6 표현식으로 그루비 언어 사용하기

ReportExpress의 모듈화 아키텍쳐는 자바 이외의 다른 언어도 지원가능하게 하는 플러그인 방법을 제공합니

다. 기본적으로 제공되는 언어에는 두 개가 더 존재합니다: 그루비와 자바스크립트가 그것입니다.

그루비는 자바 2 플랫폼에 대한 온전한 언어입니다. 그루비 언어 내부에서는 자바에서 사용되는 모든 클래스

와 JARs 를 이용할 수 있습니다. 표 3-4에는 자바와 그루비로 작성된 표현식을 비교해보았습니다.

표 3-4 그루비와 자바 코드 예제

표현식 설명 자바 그루비

필드 $F{field_name} $F{field_name}

두개의 배정도 필드의 합 new Double($F{f1}.doubleValue() + $F{f2}.doubleValue() )

$F{f1} + $F{f2}

숫자의 비교 new Boolean($F{f}.intValue() ==1 ) $F{f} == 1

문자열의 비교 new Boolean($F{f} != null && $F{f}.equals(“test”)) $F{f} == “test”

올바른 그루비 표현식은 다음과 같습니다: new RXEmptyDataSource($F{num_of_void_records})

RXEmptyDataSource은 비어있는 레코드셋트(모든 필드가 널을 의미)를 생성하는 ReportExpress의 클래스입니

다. 그루비에서 아무런 문제없이 이 클래스(순수한 자바클래스)를 인스턴스화 하는 방법을 보여주고 있습니

다. 그루비에서는 다음과 같이 간단한 표현식도 가능합니다: 5+5

그루비에서는 자동으로 원형값 10을 적절한 객체로 감싸줍니다. 실제로는 보다 다양한 작업이 가능합니다.

가령, 이 값을 String 타입의 객체로 다루어지게 함으로써 다음과 같은 표현식도 가능합니다: 5 + 5+ ”my value”

이러한 표현식의 결과가 합리적인 것이냐는 것과는 별개로, 위의 표현식은 여전히 유효하며 그 결과로써

String 타입의 객체를 리턴해주게 됩니다: 10 my value

객체와 원형값 사이의 차이점을 접어두면, 그루비에서는 서로 다른 타입의 객체와 원형값을 비교할 수 있으

므로 다음과 같은 표현식도 정당합니다: $F{Name} == “John”

위의 표현식은 true 혹은 false를 리턴하게 됩니다. 또한, 그루비에서는 표현식을 매우 간결하게 표시하며 자

바를 사용했을때 널 객체에 대해서 NullPointerException 예외를 던졌던 표현식에 대해서도 결코 오류를 던지

지 않게 됩니다. 결국, 그루비를 사용하면 자바를 모르는 사람들도 ReportExpress를 이용할 수 있게 된 것입니

다.

35 / 318

Page 36: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

3.7 표현식으로 자바스크립트 사용하기

JavaScript는 자바나 그루비와 매우 유사한 문법을 갖는 인기있는 스크립팅 언어입니다. 오픈 소스 Rhino 자

바스크립트 구현 라이브러리를 도입해서 지원합니다.

자바스크립트는 자바나 그루비와는 일부분에서 상이한 일련의 함수와 객체 메쏘드들의 셋트로 구성됩니다.

가령, String.startsWith(...) 메쏘드는 자바스크립트에는 없습니다. 하지만, 자바 객체를 사용할 수는 있기 때문

에 다음과 같이 할 수 있습니다: (new java.lang.String("test")).startsWith("t")

이처럼 사용하는것은 자바스크립트에서는 올바른 사용법입니다. 여러분도 보셨듯이, 자바스크립트에서는 자

바 객체를 생성하고(여기서는 java.lang.String), 객체의 메쏘드를 사용할 수 있습니다. 자바스크립트는 다른 언

어를 잘 모르는 분들에게는 최고의 선택이 될 것입니다. 배우기 쉽고 웹상에 풍부한 도움말과 예제들이 존재

하기 때문입니다. 자바스크립트를 사용할 경우 얻을 수 있는 또 하나의 장점은 런타임에 해석되지 않고, 순

수한 자바 바이트코드로 생성된다는 것 입니다. 따라서, 자바 자체와 동일한 성능을 기대할 수 있게 됩니다.

3.8 보고서 디자이너에서 ReportExpress 익스텐션 사용하기

ReportExpress에서는 기능의 확장을 위해 몇 가지 방식이 제공됩니다. 일반적으로는 익스텐션(컴포넌트, 폰

트, 질의 실행기, 차트 테마등과 같은)은 JARs 형태로 패키징되어 있습니다. 보고서 디자이너에서 이러한 익

스텐션을 사용하려면, classpath에 JARs를 추가해주기만 하면 됩니다. 보고서 디자이너의 classpath는 정적인

경로를 설정해서 다시 불러들일 수 있게 되어야 합니다. 올바른 설명자를 필요로 하지 않거나 특별한 적재

메커니즘(스크립틀릿과 커스텀 데이터소스와 같은) 때문에 정적인 경로가 아니더라도 다시 로딩될 수 있는

객체들과는 달리 익스텐션은 반드시 고정으로 정해진 경로로 설정해주십시오.

3.9 간단한 프로그램

이제 3장을 마무리하면서 ReportExpress에서 RXEmptyDataSource(필드없이 0개 이상의 레코드들을 제공하는

데이터소스 유틸리티)를 사용하여 ReportExpress 파일로부터 PDF 파일을 생성하는 간단한 예제를 보여드리

겠습니다. 예제에서 사용되는 test.reportexpress는 코드 예제 3-1에서 제공된 것을 컴파일한 버전입니다.

코드 예제 3-2 ReportExpressTest.javaimport net.sf.ReportExpress.engine.*;import net.sf.ReportExpress.engine.export.*;import java.util.*;public class ReportExpressTest {

public static void main(String[] args) {

String fileName = "/devel/examples/test.reportexpress";

String outFileName = "/devel/examples/test.pdf";

HashMap hm = new HashMap();

try {

ReportExpressPrint print = ReportExpressFillManager.fillReport(xfileName, hm, new RXEmptyDataSource());

36 / 318

Page 37: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

RXExporter exporter =

new net.sf.ReportExpress.engine.export.RXPdfExporter();

exporter.setParameter(RXExporterParameter.OUTPUT_FILE_NAME,outFileName);

exporter.setParameter(RXExporterParameter.REPORTEXPRESS_PRINT, print);

exporter.exportReport();

System.out.println("Created file: " + outFileName);

} catch (RXException e) {

e.printStackTrace();

System.exit(1);

} catch (Exception e) {

e.printStackTrace();

System.exit(1);

}

}}

37 / 318

Page 38: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

4 장. 보고서 구조

이번 장에서 우리는 보고서의 스타일과 조직을 결정하는 템플릿을 구성하는 보고서의 구조를 분석할 것입

니다. 보고서를 구성하는 부분들에 대해 알아보면서 보고서 디자이너가 보고서를 출력양식으로 만들때 입력

받은 데이터와 어떤 관계로 반응하게 되는지도 살펴볼 것 입니다.

• 밴드

• 밴드 사용하기

• 요약

4.1 밴드

보고서는 페이지의 타입으로 정의됩니다. 페이지는 “밴드”라고 부르는 수평방향으로 구분된 영역으로 나뉘

어 집니다. 보고서를 인쇄하기 위해 실행할 경우 데이터가 보고서에 결합되는데, 각각의 밴드로 구분된 섹션

들은 사전에 정의된 기능과 보고서 디자이너가 설정한 룰에 따라서 여러번 출력되어 집니다. 즉, 페이지 헤

더는 새로운 페이지가 시작될 때마다 반복되며, 반복 밴드는 각 데이터 레코드마다 반복되어 출력됩니다.

그림 4-1에서는 새로운 그룹들이 추가되어 총 9개의 사전에 정의된 밴드로 나뉘어 있는 페이지 타입입니다.

실제로 보고서 디자이너는 모든 그룹에 대해 각각 헤드 밴드(그룹 헤더)와 요약되는 밴드(그룹 풋터)의 쌍을

관리합니다. 반복, 그룹헤더 및 그룹 풋터 밴드는 보다 여러개의 밴드로 나뉘어질 수도 있으므로 반복1, 반복

2 등과 같이 표시되게 됩니다.

밴드는 항상 사용 가능한 페이지의 폭만큼의 너비를 갖습니다. 즉, 오른쪽과 왼쪽 여백을 제외하게 됩니다.

하지만, 높이는 디자인 과정에서 정해준다 해도 밴드에 속한 보고서 요소에 내용이 채워지는 것에 따라서 변

경됩니다. 따라서, 밴드의 높이는 해당 페이지의 아랫쪽 방향으로 늘어나게 됩니다. 일반적으로 이러한 동작

방식은 밴드내에 서브리포트 혹은 텍스트필드 요소가 존재하여 컨텐츠가 채워짐에 따라 일어나게 됩니다.

보통, 밴드의 높이를 지정한다는 것은 해당 밴드의 최소 높이를 의미하게 되는 것입니다. 모든 밴드의 높이

가 컨텐츠에 따라서 동적으로 늘어나지는 않습니다. 컬럼 풋터, 페이지 풋터 및 최종 페이지 풋터 밴드가 예

외에 해당됩니다.

일반적으로 모든 밴드의 높이(백그라운드는 제외)의 합은 항상 페이지 높이에 윗쪽과 아랫쪽 여백을 뺀 수

치보다 작거나 같게 됩니다. 이런 룰은 실제 적용시에는 더욱 복잡해지게 됩니다. 특정한 경우에는 고려해야

할 사항을 위한 옵션들이 존재하기 때문입니다. 가령, 타이틀 밴드가 다른 페이지에 인쇄될 때는 페이지 풋

터와 최종 페이지 풋터가 서로 다른 크기가 될 수 있으며 함께 고려되지 않을 수도 있습니다. 편의상 밴드의

최대 가능한 크기는 보고서 디자이너에서 디자인할 때 동적으로 계산되어 사용자가 틀린 밴드 높이를 지정

(컴파일시 레이아웃 검증 오류를 만들어내는)하지 않도록 합니다.

38 / 318

Page 39: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

그림 4-1 문서에 미리 정의된 밴드들

다음 항목들은 미리 정의된 밴드들입니다:

타이틀 타이틀 밴드는 보여지는 밴드의 가장 처음에 위치합니다. 오직 한번만 만들어지며 분리된

페이지에 출력될 수 있습니다. 선언된 크기를 고려하여 디자인시 보고서 페이지의 높이(윗

쪽과 아랫쪽 마진을 포함)를 초과할 수 없습니다. 분리된 페이지상에 타이틀이 출력된다면,

이 밴드의 높이는 모든 밴드 높이의 총계를 구하는 계산에 포함되지 않습니다.

페이지 헤더 페이지헤더 밴드는 페이지 상단에 헤더를 정의할때 사용합니다. 이 밴드내에 수직으로 높

이가 변경이 되는 컴포넌트(길이가 긴 텍스트를 포함하는 텍스트필드와 서브리포트등)를

39 / 318

Page 40: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

포함할 경우를 제외하고는 일반적으로는 디자인할 때 지정한 높이가 최종 보고서 생성 단

계를 거칠때까지 변경되지 않습니다. 페이지 헤더는 인쇄되는 모든 페이지에서 디자인시에

정의한 위치에 동일하게 찍히게 됩니다. 타이틀과 요약 밴드는 별도 페이지상에 출력될 때

페이지 헤더를 포함하지 않습니다.

컬럼 헤더 컬럼헤더 밴드는 각각의 디테일 컬럼의 시작부분에서 출력됩니다. 컬럼의 개념은 이번 장

의 나중에 다루게 될 “컬럼”에서 자세하게 설명할 것 입니다. 일반적으로는 테이블형 보고

서에서 컬럼의 이름을 포함하는 라벨이 위치되는 곳이 바로 컬럼 헤더 밴드가 됩니다.

그룹 헤더 보고서는 0개 이상의 그룹밴드를 가질 수 있습니다. 그룹밴드는 반복 밴드에 위치하는 레

코드들의 그룹핑에 대한 컬렉션을 가능케 합니다. 그룹헤더는 항상 그룹풋터와 짝으로 구

성됩니다. 헤더와 풋터는 각각 보여주기 위한 속성이 다를 수 있습니다. 각각의 그룹별로

서로 다른 속성값들이 지정됩니다. 어떻게 동작하는가에 대한 결정은 그래픽 관점에서 이

루어집니다. 그룹헤더가 시작되면 항상 새로운 페이지에서 출력되도록 하거나 새로운 컬럼

에서 출력되도록 지정할 수도 있습니다. 그룹이 한 페이지 내에서 찍히다가 다음 페이지로

넘어갈 정도가 되면 다른 페이지에서도 그룹헤더가 출력되도록(마치 페이지 헤더와 같이,

하지만 그룹 레벨에 한정되어) 할 수도 있습니다. 그룹헤더가 출력될 때 필요로 하는 최소

높이도 지정할 수 있습니다. 이렇게 지정한 높이를 초과하게 되면, 그룹헤더 밴드는 새로운

페이지에서 출력됩니다. 그룹헤더가 동작하는 다른 방식에 대한 설정은 풋터의 위치 속성

과 함께 유지(keep together) 속성을 통해서도 이루어집니다.

그룹헤더와 그룹풋터 밴드는 세분화 시킬수 있습니다. 여러분은 그룹헤더와 풋터의 기존

밴드 아래에 만들어 줄 수 있으며, 이 경우 일련번호 1부터 시작됩니다. 이번 장 후반부에서

그룹에 대해 상세하게 다룰 것입니다.

반복 반복 밴드는 출력을 위해 제공되는 데이터 소스에서 읽혀지는 각각의 레코드마다 일대일

대응됩니다. 경험상으로 볼 때 대부분의 출력 요소들이 놓여지는 곳이 됩니다. 보고서는 여

러개의 반복 밴드를 가질 수 있습니다. 기본 보고서에서는 오직 한 개의 반복 밴드만을 포

함하지만, 반복 밴드내에 서브-밴드 셋트로 나뉘어 지게 할 수 있습니다.

그룹 풋터 그룹 풋터 밴드는 하나의 그룹의 완성된 셋트가 됩니다. 일반적으로 이곳에는 그룹내의 누

적된 누계 필드라든지 그룹별 분리에 대한 그래픽적인 요소인 선과 같은 것들이 포함됩니

다. 반복과 그룹헤더 밴드처럼, 그룹 풋터 밴드도 여러개의 밴드로 나눌 수 있습니다.

컬럼 풋터 컬럼 풋터 밴드는 각 컬럼의 끝에 나타나게 됩니다. 이 밴드의 크기는 런타임에서 조정되지

않습니다. 서브리포트 혹은 여러 줄로 구성되는 텍스트를 포함하게 될 텍스트필드와 같이

높이가 변경되는 요소를 포함하고 있더라도 크기의 변화가 없습니다.

페이지 풋터 페이지 풋터 밴드는 모든 페이지마다 페이지 헤더가 출력되면 나타나게 됩니다. 컬럼 풋터

밴드처럼 실행시에 크기의 변경이 일어나지 않습니다.

최종 페이지 풋터보고서에서 마지막 페이지상에 출력될 풋터를 다른 페이지들에서 출력되는 풋터들과 다르

게 하고자 할 경우에는 최종 페이지 풋터 밴드를 이용합니다. 이 밴드의 높이를 0으로 설정

하면, 최종 페이지 풋터를 무시하고 다른 일반적인 페이지들과 동일한 레이아웃으로 구성

됩니다.

요약 요약 밴드는 총 합계, 평균 또는 보고서의 마지막에 넣어주고자 하는 것들에 관련된 필드들

40 / 318

Page 41: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

을 넣어주는 곳입니다. 다른 시스템에서는 이 밴드를 “보고서 풋터”라고도 부릅니다.

백그라운드 백그라운드 밴드는 보고서에 워터마크나 이와 유사한 효과(전체 페이지를 감싸고 있는 프

레임처럼)를 원하는 사용자들의 요청에 의해 만들어졌습니다. 이 밴드 높이의 최대값은 페

이지 높이와 동일해질 수 있으며, 백그라운드 밴드에 포함된 컨텐츠는 다른 밴드에서 정의

된 페이지 컨텐츠에 영향을 받지 않고 모든 페이지상에 보여질 수 있습니다.

빈 데이터 빈 데이터 밴드는 데이터소스에서 어떠한 레코드도 반환되지 않을 경우에만 출력되는 부

가적인 보고서 섹션입니다. 보고서의 속성 데이터가 없을때를 데이터없음 섹션으로 지정합

니다. 이 밴드가 다른 모든 밴드들 대신에 출력되므로, 높이는 여백을 제외한 보고서 페이

지의 높이와 동일해질 수 있습니다.

4.1.1 보고서 속성

이제 보고서를 구성하는 각각의 파트들(여러분이 새로 추가해서 만들게 되는)을 살펴볼 차례입니다. 파일 메

뉴에서 새로 빈 보고서를 선택한 후, 문서의 이름을 입력하고 완료 버튼을 클릭하게 되면 비어있는 새로운

보고서가 메인 윈도우의 디자인 영역에 나타나게 됩니다.

41 / 318

그림 4-2 메인 디자인 윈도우상에서 새로운 빈 보고서

Page 42: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

속성 뷰(메인윈도우의 왼쪽 측면에 위치)에는 보고서 인스펙터 뷰에서 현재 선택한 보고서 객체의 속성 혹

은 디자인 영역에서 선택한 것(밴드나 요소)에 대한 속성을 보여주게 됩니다. 새로운 보고서를 생성할 경우

에는 속성 쉬트는 보고서 속성을 보여주게 됩니다. 보고서 인스펙터상에서 루트 노드(보고서 이름으로 보여

지는)를 선택하면 언제든지 보고서의 속성을 속성 쉬트로 볼 수 있습니다. 또는 메인 윈도우에서 문서의 바

깥쪽 영역을 클릭해서도 보고서의 속성을 쉬트에 보여지도록 할 수 있습니다.

첫 번째 속성은 보고서의 이름입니다. 이 이름은 논리적인 이름으로써 소스 파일의 이름과는 별개이며, 오직

ReportExpress 라이브러리(가령 보고서를 컴파일 했을 때 임시로 생성되는 자바 파일에 대한 기본 이름에 사

용됨)에 의해서만 사용됩니다.

페이지 크기는 보고서에서 가장 중요한 속성이 될 것입니다. 보고서 디자이너와 ReportExpress에서 사용되는

단위는 픽셀(75 dpi 해상도를 갖는)입니다. 표 4-1에 표준 페이지 포맷에 대한 목록과 이 항목들이 갖는 크기

를 픽셀로 제공하고 있습니다. 일반적으로 통용되는 포맷의 완전한 목록은 위키피디아에서 확인할 수 있습

니다:

표 4-1 많이 사용하는 페이지 포맷의 크기

포맷 고유 단위계 크기 픽셀 크기

(전체 숫자로 올림처리)

A4 210 x 297 mm 623 x 878

A5 148 x 210 mm 435 x 623

A6 105 x 148 mm 308 x 435

US Letter 8.5 x 11 inches 638 x 825

US Legal 8.5 x 14 inches 638 x 1050

너비와 높이를 수정함으로써, 여러분이 원하는 크기의 보고서를 만들 수 있습니다. 페이지 방향 옵션으로는

가로방향(Landscape)과 세로방향(Portrait)이 있지만, 실제로는 별 의미가 없습니다. 종이의 방향과 무관하게

페이지 크기를 너비와 높이 속성에서 지정했기 때문입니다. 하지만, 일부 보고서 내보내기에서는 프린터에

보고서의 방향을 결정하기 위해 이 속성을 사용합니다.

페이지 여백 크기는 페이지 포맷 윈도우창 여백 섹션 아래에 있는 네 개의 필드를 사용하여 지정합니다. 페

이지 속성을 보다 쉽게 설정하려면 포맷→페이지 포맷 메뉴를 클릭해서 페이지 포맷 대화창을 여십시오(그

림 4-3).

42 / 318

Page 43: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

포맷 드롭다운 목록에는 표4-1에 나열한 미리 선언한 셋트들이 들어있습니다. 대화창 하단부에 위치한 단위

선택을 통해 여러분은 표시되는 단위를 바꿀 수 있습니다.

4.1.2 컬럼(다단)

앞에서 살펴본 것처럼(4.1, “밴드” ) 보고서는 밴드라고 하는 수평방향 섹션으로 나뉘어져 있습니다. 보고서

를 구성하는 페이지는 제공되는 데이터 소스의 레코드들과 무관하게 표시되는 부분(타이틀 섹션 또는 페이

지 풋터 등)과 레코드들에 의해 영향을 받는 그룹헤더/풋터 그리고 반복 밴드등에 의해 출력되는 섹션들로

구성됩니다. 이것들 중에 반복 영역은 사용 가능한 공간의 효율을 위해서 수직방향으로 진행되는 컬럼으로

나뉘어질 수 있습니다.

여기서 문맥상 의미로 볼때 “컬럼”의 개념은 “필드”와 쉽게 혼동될 여지가 있습니다. 컬럼은 레코드 필드에 연결되

지 않기 때문에 페이지의 레이아웃으로 정의하며, 테이블등과 같이 출력할 데이터의 포맷에 밀접하게 엮여지지 않은 것

이라고 보시면 됩니다. 즉, 여러분이 열 개의 필드를 갖는 레코드들을 출력하고자 할 경우, 보고서의 형태를 테이블 모양

으로 만들고자 한다면 열 개의 컬럼을 만드는 것 보다는 한 개의 컬럼을 갖는 보고서에서 열 개의 필드를 표시하는 정

적텍스트와 텍스트필드 요소를 배치시키는 것이 좋습니다. 컬럼을 사용한다는 것은 신문의 지면에서 보여지는 것 처럼

여러 개의 컬럼으로 나뉘어진 텍스트줄들로 구성하여 가독성을 향상시키고 페이지 공간의 효율적인 사용을 목적으로

하게 되는 것입니다.

43 / 318

그림 4-3 페이지 포맷 대화창

Page 44: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

그림 4-4 아웃라인 뷰에서 보고서 객체

아래의 그림들에서 두 가지 예를 들어보겠습니다. 첫 번재 보여지는 그림은 단일 컬럼으로 보고서를 설정하

는 방법입니다. 이 방식이 보고서의 기본이고 대부분의 설정에 사용됩니다. 이 경우 페이지의 크기는 A4 입

니다.

그림 4-5 이름의 집합을 보여주도록 디자인된 단일 컬럼 보고서의 레이아웃

보고서 속성 뷰에서 값들을 설정하게 됩니다. 컬럼의 갯수는 1이고, 그 너비는 전체 페이지 너비에서 여백을

제외한 수치(555 픽셀)와 동일합니다. 컬럼이 한 개만 있기 때문에 컬럼 사이의 공간 값은 의미가 없으며 값

은 0으로 설정합니다(이 속성은 컬럼의 갯수가 1인 경우에는 비활성화 됩니다).

44 / 318

Page 45: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

그림 4-6 단일 컬럼 레이아웃을 사용한 보고서의 결과

그림 4-6에서 보여지듯이, 페이지상의 대부분 영역이 사용되지 않고 있습니다(그림에서는 첫 번째 페이지만

표시하였지만, 다른 나머지 페이지들도 이처럼 비슷한 모양으로 출력됨). 실제로 각 레코드는 페이지상에서

수평방향으로의 영역을 모두 점유하고 있습니다. 이런 경우, 페이지를 두 개의 컬럼으로 나누게 되면 첫 번

째 컬럼 영역에 데이터가 채워져 끝까지 이르게 되면 두 번째 컬럼 영역에서 출력하게 됩니다. 그림 4-7에서

는 두 개의 컬럼 보고서를 위한 값을 설정하는 모습입니다.

그림 4-7 2-컬럼 보고서 설정

컬럼의 갯수 속성을 2로 설정한 경우, 보고서 디자이너는 자동으로 페이지 너비와 여백을 고려해서 최대 컬

럼 폭을 계산합니다. 컬럼 사이의 공간을 늘리려면, 컬럼 여백 속성의 값을 증가시키면 됩니다.

45 / 318

Page 46: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

그림 4-8 이름의 셋트를 보여주는 2-컬럼 보고서 레이아웃

디자이너에서는 컬럼의 경계와 사이 공간을 표시해줍니다.

그림 4-9 2-컬럼 레이아웃을 사용한 보고서의 결과

그림 4-9에서 알 수 있듯이, 페이지 공간이 보다 효율적으로 사용되었습니다.

여러 개의 컬럼으로 구성된 형식은 일반적으로 매우 긴 목록형 보고서에서 사용됩니다(대표적인 예: 전화번

호부). 페이지 여백, 컬럼 너비 그리고 컬럼 사이의 공간의 총 합은 페이지 너비보다 작거나 같아야만 합니다.

이 조건을 만족하지 못하게 되면, 보고서를 채우는 과정에서 오류가 발생될 수 있습니다.

46 / 318

Page 47: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

하나 이상의 컬럼으로 작업할 경우, 여러분은 필드, 이미지등의 요소를 첫번째 컬럼 영역내에 위치시켜야만

합니다. 디자이너상에서는 나머지 컬럼의 영역도 표시는 되지만 이것은 단지 참고용일 뿐, 어떠한 요소도 디

자인시에 이곳에 위치할 때는 첫번째 컬럼의 부분으로 처리합니다. 여러분은 실제로 디테일 템플릿만을 정

의했기 때문에 수평방향 밴드의 영역 외부에 요소를 위치시키지 말라는 제약이 없습니다만, 이 경우 페이지

바깥쪽에 요소를 넣게 되어 결국 출력할때는 보여지지 않습니다.

그림 4-10 보고서의 요소(텍스트필드, 이미지 등등)를 위치시킬 유효 영역

그림에서 “피해야할” 영역을 보여주고 있습니다. 페이지 여백과 첫 컬럼의 우측영역에는 요소를 위치시키면

안됩니다. 물론, 요소를 위치시키는 룰은 한 개의 컬럼일 경우에도 적용됩니다.

4.1.3 고급 보고서 옵션들

지금까지는 레이아웃과 관련된 기초적인 특성만을 보여드렸습니다. 이제 우리는 보다 고급 옵션에 대해서도

살펴볼 것 입니다. 일부 옵션들은 다음 장에서도 지속적으로 간략하거나 세부적으로 다룸으로써 아주 상세

한 내용까지 언급하게 될 것입니다. 하지만, 일부 옵션들은 나중에 여러분이 ReportExpress에 매우 친숙해졌

을 때 비로소 이해하여 유용하게 사용할 것들도 있습니다.

4.1.3.1 스크립틀릿(Scriptlet)

스클립틀릿이란 보고서를 생성하는 과정 즉, 새로운 페이지의 시작이나 그룹의 마지막 단계에서 지정한 이

벤트에 따라 실행되는 메쏘드를 갖는 자바 클래스입니다. MS의 액세스나 엑셀과 같은 시각적인 도구에 친숙

한 사용자라면, 스크립틀릿은 삽입된 이벤트나 함수(즉, 텍스트필드의 표현식)에 관련된 프로시져 모듈과 비

교할 수 있겠습니다. 스크립틀릿 속성에는 메인 스크립틀릿만을 지정하지만, 다른 스크립틀릿은 보고서 인스

펙터를 이용해서 보고서에 추가할 수 있습니다. 18장 “스크립틀릿”에서 보다 상세하게 설명하겠습니다.

4.1.3.2 리소스 번들

리소스 번들이란 보고서를 현지화 하고자 할 경우 사용되는 속성입니다. 리소스 번들은 보고서 내에서 사용

된 정적텍스트, 문장 및 표현식 등을 하나의 언어를 사용한 문자들을 포함하는 파일들의 셋트입니다. 리소스

47 / 318

Page 48: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

번들 속성에 지정할 것은 번역될 언어로 만든 파일의 기본이름의 접두어입니다. 특정한 언어권에 필요한 파

일이름을 만들기 위해서는 접두어에 언어/나라 이니셜(즉, “_ko_KR”은 한국어-한국입니다) 문자가 추가되고,

확장자는 .properties 입니다. 현지화에 대한 내용은 17장 “현지화”에서 상세하게 다룰 것 입니다.

사용가능한 리소스가 없는 경우, 리소스가 없는 경우의 타입 속성에서 어떻게 처리할지에 대한 옵션을 지정

할 수 있습니다. 가능한 옵션의 목록은 다음 테이블에 표시하였습니다:

옵션 설명

널 타입 “Null” 문자를 출력(기본값)

Empty 타입 아무것도 출력하지 않음

키 타입 찾지 못한 키의 이름을 출력

오류발생 보고서를 채우는 과정을 중지하고 예외를 던짐

4.1.3.3 질의

질의 속성은 데이터를 선택하기 위한 질의를 지정할 때 사용합니다. 질의 언어는 데이터셋 질의 속성에서 언

어 설정을 통해 지정됩니다. 속성 쉬트상에 질의와 질의 언어가 존재하더라도, 전용 툴바 버튼을 통해 질의

편집기를 사용하여 편집하는 것이 훨씬 편리합니다.

4.1.3.4 필터 표현식

필터 표현식은 질의 편집기에서 편집될 수 있는 또 다른 속성입니다. 보고서의 모든 객체(매개변수, 변수 그

리고 필드)에서 데이터소스로부터 읽혀진 레코드를 사용할지를 결정하는 부울린 표현식입니다.

다음은 필터 표현식의 사용예 입니다:

• 필드 FIRSTNAME이 “L”로 시작되는 레코드만 필터링함:• JavaScript: $F{FIRSTNAME}.substr(0,1) == "L"• Groovy: $F{FIRSTNAME}.startsWith("L")

• 필드 FIRSTNAME의 길이가 5개 이하인 레코드만 필터링함:• JavaScript: $F{FIRSTNAME}.length < 5• Groovy: $F{FIRSTNAME}.length() < 5

• 필드 FIRSTNAME이 매개변수 NAME과 같은 레코드만 필터링함: • JavaScript: $F{FIRSTNAME} == $P{NAME}• Groovy: $F{FIRSTNAME} == $P{NAME}

4.1.3.5 속성

보고서에서 이름/값의 쌍으로 된 셋트를 정의할 수 있습니다. 이 쌍으로 된 것들을 “보고서 속성”이라고 부릅

니다. 이름과 값은 단순한 문자열이며 많은 유용성을 갖고 있습니다. 가령, 특수한 내보내기 기능을 유도할

때라든지, ReportExpress의 기본값을 오버라이딩 한다든지 할 때 사용됩니다. 동일한 종류의 속성이 보고서

요소의 설정에도 사용될 수 있음을 여러분들에게 보여드릴 것입니다. 속성을 편집할 경우, 그림 4-11 대화창

이 나타나게 됩니다. (보고서 인스펙터의 보고서명을 선택하고 보고서 등록정보에서 “속성”을 클릭한 후

48 / 318

Page 49: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

를 클릭하여 사용)

그림 4-11 속성 대화창

추가 버튼을 클릭해서 새로운 속성을 만듭니다. 새로운 윈도우가 열립니다(그림 4-12).

49 / 318

그림 4-12 보고서 속성 – 속성 추가

Page 50: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

대화창을 통해 여러분은 속성의 이름과 값을 지정할 수 있습니다. 윈도우 하단에는 특수한 의미를 갖고 있는

속성의 목록이 나타납니다. 이것을 더블-클릭해서 속성의 이름 필드에 이름으로 지정할 수 있습니다. 나열된

특정한 의미를 갖는 속성들은 완전한 목록은 아니지만 ReportExpress에서 이해할 수 있는 중요한 속성들은

포함되어 있습니다. 목록을 스크롤하게 되면, 여러분은 이 속성들을 사용해서 매우 다양한 작업들이 가능하

다는 것을 인지하게 될 것입니다. 가령 보고서를 지정한 포맷으로 내보내려할 때 사용될 수 있는 – 엑셀로

내보낼 때는 페이지별로 나가는 것을 방지하고, PDF로 내보낼 때는 파일 암호화를 한다든지 – 속성을 설정

할 수 있습니다. 더 나아가서 문서에서 사용되는 차트의 테마를 지정할 수도 있습니다.

4.1.3.6 새 페이지에서의 타이틀과 요약

새 페이지에 제목 옵션을 지정하면 타이틀 밴드의 끝쪽에 페이지 넘김을 해서 새로운 페이지에서 타이틀 밴

드가 출력되게 합니다. 기본적으로 이 옵션은 활성화되어 있지 않습니다. 예를 들자면, 그림 4-13에서 처럼

간단한 보고서에서 옵션을 변경해도 디자인 윈도우에서는 그 모습이 변경되지 않습니다. 편집기에서 타이틀

밴드는 항상 다른 밴드들보다 윗쪽(백그라운드 밴드가 존재할 경우에는 예외)에 위치하게 됩니다. 보고서를

실행하면 타이틀 밴드가 별도의 페이지에 출력되며, 이것은 새 페이지에 제목 옵션 값에 적용을 받은 것입니

다.

그림 4-14 와 그림 4-15 는 같은 보고서지만, 첫번째 출력에서는 새로운 페이지에 타이틀을 출력해주는 옵션

이 없는 경우이고, 두번째 것은 이 옵션을 true로 설정했을 때 입니다.

50 / 318

그림 4-13 타이틀 밴드

Page 51: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

그림 4-15에서 볼 수 있듯이, 새 페이지에 제목 옵션을 활성화시키면 타이틀이 출력되는 페이지상에는 어떤

밴드도(페이지 헤더와 풋터 조차도) 출력되지 않습니다. 하지만 페이지는 총 페이지수에는 포함됩니다.

51 / 318

그림 4-14 타이틀 밴드의 기본 출력 형태

Page 52: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

4.1.3.7 페이지 헤더와 풋터에 요약하기

새 페이지에 제목 옵션은 요약 밴드에 대해서도 가능합니다. 이 둘의 차이점은 요약 밴드는 마지막 페이지에

출력된다는 것입니다. 요약 밴드만을 포함한 새로운 페이지를 출력할 수 있게 됩니다.

기본적으로는 요약 밴드(한 페이지 이상에 걸쳐 늘어날 수 있는)는 페이지 헤더와 풋터를 포함하지 않습니

다. 페이지 헤더와 풋터에 요약하기 옵션을 변경하면 요약 밴드가 렌더링될 때 헤더와 풋터 밴드(보고서에서

정의했다면)가 추가되는 효과를 가져옵니다.

4.1.3.8 유동적인 열 풋터 옵션

이 옵션은 컬럼 풋터를 컬럼의 마지막 위치대신 마지막 반복 밴드(또는 그룹 풋터) 바로 다음에 강제적으로

출력할 수 있게 합니다. 가령, 보고서 요소를 사용하여 테이블을 만들었다면 이 옵션이 사용됩니다

(ReportExpress tables.rxxml 예제에서 자세하게 다루고 있습니다).

52 / 318

그림 4-15 새 페이지에 타이틀 밴드 출력

Page 53: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

4.1.3.9 출력 순서

출력 순서 옵션은 여러 컬럼을 사용하는 페이지상에서 데이터를 출력하는 방식을 결정합니다. 기본 설정은

수직방향입니다. 따라서, 레코드들은 하나씩 차례대로 출력되는데 이전 컬럼이 페이지의 끝에 도달했을 때만

다음 컬럼으로 넘어가서 출력됩니다. 이것은 신문이나 전화번호부와 같은 방식입니다.

수평방향 출력 순서는 페이지의 가로방향을 가로지르면서 출력되어 다음 행으로 넘어가기 전까지 다른 모

든 컬럼들을 채우게 됩니다. 위의 두 그림에서 출력 순서가 어떻게 진행되는지를 그리고 있습니다. 이 그림

에서 볼 수 있듯이 출력되는 이름들은 알파벳 순서입니다. 그림 4-16에서는 세로 방향으로 출력(첫번째 컬럼

부터 채운 뒤에 다음 컬럼으로 넘어가서 채워짐)이 되고, 그림 4-17은 가로 방향 순서(가로 방향으로 컬럼들

에 값을 채운 후 다음 행으로 넘어감)입니다.

53 / 318

그림 4-16 수직 출력 순서(Vertical Print Order ) 그림 4-17 수평 출력 순서(Horizontal Print Order)

Page 54: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

4.1.3.10 데이터 없이 출력

출력 번호만 제공되는 비어있는 데이터셋이나 연관된 SQL 질의에서 받아온 레코드가 없는 경우, 빈 파일이

생성되거나 0 바이트 길이의 스트림이 되돌아 옵니다. 이런 기본 동작방식은 데이터가 없을때 옵션을 수정하

여 변경시킬 수 있습니다. 이 옵션은 데이터가 없는 경우 무엇을 할지를 지정하게 됩니다. 다음 테이블에 사

용가능한 옵션의 값과 의미를 설명하였습니다.

값 설명

페이지 없음 기본 값. 최종 결과는 빈 버퍼.

빈 페이지 빈 페이지를 돌려줌.

반복밴드를 제외한 모

든 섹션들

반복 밴드를 제외한 다른 모든 밴드들로 구성된 페이지를 돌려줌.

데이터없음 섹션 빈 데이터밴드를 출력.

4.1.3.11 포맷 팩토리 클래스

포맷 팩토리 클래스란 com.cabsoft.rx.engine.util.FormatFactory 인터페이스를 구현한 클래스입니다. 클래스의 커스텀 구

현을 설정할 수 있으므로 숫자와 날짜등의 기본 포맷 템플릿을 지정하는데 사용됩니다.

4.1.3.12 가져오기

가져오기 속성은 자바-스타일의 import 지시어를 완전하게 참조하는 클래스(java.util.List 등과 같은)의 형태나

와일드 카드 표기법(java.util.*) 형태로 추가할 때 사용됩니다. 사용 목적은 자바와 동일하여 표현식내에서 완

전한 참조 형식없이 클래스를 참조하기 위함입니다.

4.2 밴드 다루기

새로 빈 보고서를 만들경우, 기본 템플릿에서는 미리-정의된 밴드들(백그라운드, 타이틀, 페이지 헤더, 컬럼

헤더, 반복, 컬럼 풋터, 페이지 풋터 그리고 요약)로 구성된 하나의 셋트를 제공합니다. 보고서 인스펙터에서

보고서를 구성하는 다른 컴포넌트들과 함께 사용가능한 밴드들을 확인 할 수 있습니다.

54 / 318

Page 55: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

그림 4-18 밴드 속성 대화창

보고서에 밴드를 추가하려면, 보고서 인스펙터에서 밴드를 오른쪽 클릭한 후 나타난 메뉴중에서 밴드 추가

항목을 선택하십시오. 보고서 인스펙터내에서 회색으로 보여지는 밴드(마지막 페이지 풋터와 데이터 없음)

는 보고서에 존재하지 않는 것입니다. 즉, 이 밴드를 사용하려면 밴드를 추가해주어야 합니다. 백그라운드 밴

드의 미리 정의된 높이는 0 입니다. 따라서, 디자이너상에서는 보여지지 않지만 보고서에는 존재합니다.

보고서에서 밴드를 제거하려면, 보고서 인스펙터에서 밴드상에서 오른쪽 클릭을 하고 나타난 메뉴에서 밴드

삭제 항목을 선택합니다.

원치않는 밴드는 그 높이를 0 으로 설정하면 되지만, 마지막 페이지 풋터 밴드의 경우는 예외입니다. 이 밴드

는 기본 템플릿에 해당되지 않습니다. 보고서 상에서 마지막 페이지에서 페이지 풋터 밴드를 자동으로 대체

하기 때문에 보고서에서 마지막 페이지 풋터를 원할 경우에는 반드시 추가해 주어야만 합니다.

밴드의 속성은 보고서 인스펙터상에서 밴드를 선택함으로써 수정할 수 있습니다. 또는 메인 디자이너 영역

상에서 밴드의 임의의 프리 부분(밴드내에 속해있는 요소나 밴드 경계 외곽을 제외한 곳)에서 마우스 클릭

을 통해서 수정할 수도 있습니다.

4.2.1 밴드 높이

밴드 높이는 밴드의 디자인 높이입니다. 4장 첫 부분에서 설명하였듯이 밴드 높이는 보고서 내용을 채우는

과정중에 변화될 수 있습니다. 일반적으로 밴드의 높이는 밴드내의 하나 이상의 요소에서 값이 빈 경우 옵션

에 선 제거를 설정하고 이 요소들에 대한 수평방향 공백까지 보고서를 채우는 과정상에서 제거되도록 하는

조건을 모두 설정하더라도 지정한 값보다 작아지지 않습니다 (값이 없는 경우 선 제거하는 방법은 다음 장

에서 다루어집니다). 밴드 높이 속성을 수정할 경우, 보고서는 페이지상에서 여유있는 공간을 계산하고 새로

운 페이지에서의 타이틀과 요약 부분이 차지하는 공간과 같은 고려해야될 옵션들까지 확인해서 수정값을

55 / 318

Page 56: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

받아들여도 되는지 검증하게 됩니다. 수정될 값이 이러한 요구치에 부합되지 않을 경우, 보고서는 가능한 값

의 범위를 제시하게 됩니다.

4.2.2 표현식에 따른 출력

표현식에 따른 출력(Print When Expression)은 밴드를 감추고 보고서 출력에 포함되는 것을 막도록 하는 부울

린 표현식(true 혹은 false로 리턴되어야만 하는)입니다. 표현식은 보고서 내에서 이 밴드가 참조될 때마다 매

번 평가되어집니다. 따라서, 보고서 인스펙터 예제상에서는 타이틀 밴드는 오직 한번만 평가하지만, 페이지

헤더 밴드는 새로운 페이지가 만들어 질 때마다 표현식을 평가하며 반복 밴드는 새로운 데이터 레코드를 처

리할 때마다 평가하게 됩니다.

그림 4-19 메인 디자인 윈도우에서의 보고서 인스펙터

표현식을 사용함에 있어서, 여러분은 모든 보고서 객체(필드, 매개변수 및 변수)에 대해 사용가능합니다.

4.2.3 나뉨 타입(Split Type)

나뉨 타입(Split Type) 속성은 페이지에서 남아있는 공간내에 하나의 밴드를 온전하게 렌더링시킬 수 없는 경

우에 대한 컨트롤을 위해 사용합니다. 밴드는 내용을 채우는 과정상에서 동적으로 늘어날 수 있다는 것을 염

두하고, 현재 페이지나 컬럼상에서 더이상 밴드의 높이를 맞춰줄 수 없을 경우를 처리하기 위한 설정입니다.

보고서의 XSD 스키마에서 나뉨 타입에 대한 옵션은 다음과 같습니다:

56 / 318

Page 57: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

옵션 설명

늘임 밴드가 나뉨이 허용되지만, 밴드에서 정의해준 높이내에서 이루어지지 않습니다. 이 타입은 밴드가 펼

쳐지도록 설정되고 선언된 밴드의 높이보다 커질때에 한해서만 적용됩니다. 가령 밴드의 높이를 100

픽셀로 선언했다면, 밴드는 최초 100픽셀 내에서는 나뉘어지지 않습니다. 100 픽셀을 넘어설 경우에만

나뉨이 발생해야만 합니다. 즉, 밴드의 총 높이가 110 픽셀이라면, 마지막 10 픽셀에서 나뉨이 일어날

수 있습니다.

방지 처음 나뉨이 발생할 경우에 밴드의 나뉨을 막습니다. 다음 페이지에서는 몇 번이라도 나뉘어지게 됩니

다. 만일 현재 페이지상에서 밴드를 렌더링 해주기에 공간이 부족하다면, 전체 밴드는 다음 페이지상

에 렌더링됩니다. 만일, 다음 페이지상에서도 여전히 공간이 부족하다면 남은 밴드에 대한 부분은 횟

수에 제한없이 나뉘어질 수 있습니다.

즉시 밴드는 필요한 경우에는 어디에서나 나뉘어질 수 있지만, 현재 페이지상에서 최소 하나의 요소는 출력

된 이후이어야 합니다.

4.3 요약 밴드

이 시점에서, 여러분은 한 페이지를 구성하는 구조에 대한 이해가 반드시 필요하고, 여러 밴드로 어떻게 나

뉘어져 있는지를 알아야만 합니다. 또한, 밴드의 조건에 대한 특성을 이해함으로써 보고서 페이지상에 밴드

들이 어떻게 포함되는지를 보고서가 판단하는지도 알 수 있어야 합니다. 밴드에는 우리가 출력할 컨텐츠를

추가하게 됩니다.

다음 장에서는 그룹 헤더와 그룹 풋터 밴드를 어떻게 사용하는지에 대해 알아보고 새로운 컬럼이나 새로운

페이지에서 밴드 그룹을 어떻게 위치시켜야 하는지에 대한 옵션들에 대해서 살펴보도록 하겠습니다.

57 / 318

Page 58: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

5 장. 보고서 요소(ELEMENTS)

이번 장에서는 보고서에 삽입되는 주요 객체들에 대한 설명과 그 특성에 대해 살펴보겠습니다. 보고서의 기

본 유닛은 요소입니다. “요소”가 의미하는 바는 텍스트 문자열이나 사각형등과 같은 그래픽적인 객체입니다.

워드프로세서 소프트웨어와 다르게, 보고서 디자이너에서는 선이나 단락같은 개념은 존재하지 않습니다. 보

고서 디자이너에서는 모든것(텍스트, 테이블 등)이 요소를 사용해서 만들어집니다. 이러한 접근 방식은 현재

대부분의 보고서 어플리케이션에서 따르는 모델입니다. 다음은 ReportExpress 라이브러리에서 제공되는 11개

의 기본 요소입니다:

• 선

• 사각형

• 타원

• 정적 텍스트

• 텍스트필드 (또한 단순 필드)

• 이미지

• 프레임

• 서브리포트

• 크로스탭

• 차트

• 브레이크

이 요소들을 조합함으로써, 모든 종류의 보고서를 만들 수 있게 됩니다. 또한, ReportExpress에서는 개발자가

직접 제네릭 요소를 구현하고 보고서 디자이너에서 사용할 수 있도록 하는 플러그인(커스텀 컴포넌트)을 만

들 수 있습니다.

모든 요소는 공통적인 속성(높이, 너비, 위치 및 놓여질 밴드)을 갖고 있습니다. 그 외의 속성들은 요소의 타

입에 따라 달라지게 됩니다. 그래픽 요소들은 모양을 만드는데 사용되며, 이미지를 표시합니다. 여기에는 선

과 사각형, 타원 그리고 이미지 요소가 사용됩니다. 텍스트 요소는 라벨이나 필드(정적 텍스트와 텍스트 필

드)와 같은 텍스트 문자열을 출력할 때 사용합니다. 프레임 요소는 일련의 요소들을 그룹핑해서 주변에 경계

선을 칠해줄 수 있습니다. 서브리포트, 차트 그리고 크로스탭등의 요소는 보다 복합적인 요소로서 이번 장에

서는 후반부에 간단하게 설명하고 자세한 내용은 별도의 장으로 분리해서 다루도록 하겠습니다. 마지막으로

페이지상에서 고정된 위치나 컬럼에서 넘김(브레이크)을 할때 사용하는 특수한 요소도 있습니다.

요소들은 밴드내에 삽입되고 각 요소는 밴드와 뗄 수 없는 관계를 갖습니다. 만일 요소가 밴드 안쪽에 완전

하게 속하지 않게되면, 보고서 컴파일러는 해당 요소의 위치가 잘못되었다는 메시지를 표시합니다. 보고서

디자이너에서는 이런 경우 해당 요소의 경계선을 붉은 색으로 표시하여 알려줍니다. 이러한 오류를 무시한

채로 보고서를 컴파일하게 되면, 밴드를 벗어난 요소들은 출력되지 않게됩니다.

58 / 318

Page 59: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

이번 장에서는 다음과 같은 섹션들로 구성하였습니다:

• 요소 사용하기

• 이미지 사용하기

• 텍스트 사용하기

• 다른 요소들

• 커스텀 컴포넌트와 제네릭 요소 추가하기

5.1 요소 사용하기

요소는 팔레트 영역에 위치하며, 보통 팔레트는 메인 윈도우의 오른쪽 상단에 있습니다(그림 5-1).

그림 5-1 팔레트 도구

보고서내에 요소를 삽입하려면, 팔레트에서 요소를 드래그하여 보고서 밴드내에 놓아주면 됩니다. 이러한 과

정을 통해 밴드내에 놓여지는 요소는 표준 크기로 생성되며 보고서 인스펙터내에 나타나게 됩니다.

요소를 선택하는 방법은 디자이너에서 해당 요소를 선택하거나 보고서 인스펙터내에서 선택합니다. 요소의

위치는 드래그를 하여 조정해주며, 크기를 조정하기 위해서는 먼저 요소를 선택한 후 오렌지색으로 선택된

프레임의 모서리 부근을 드래그하면 됩니다.

그림 5-2 다른 요소들과 정렬에 대한 제안

59 / 318

Page 60: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

요소를 드래깅 하거나 크기를 조절할 때는 보고서 디자이너에서 다른 요소들과 정렬하기 쉽도록 가이드라

인을 보여주게 됩니다. (그림 5-2)

요소의 움직임을 보다 세밀하게 조정하고자 한다면 화살표키를 사용합니다. 화살표키로 요소를 움직일 경우

에는 한 번 누를때 마다 1 픽셀씩 이동하게 됩니다. 쉬프트키와 함께 화살표키를 누르면 10 픽셀씩 움직입니

다.

페이지상에서 위치의 기준점을 잡아서 요소들을 정렬할 필요가 있는 경우라면, 메뉴에서 보기 → Report

Designer → 격자 보이기를 선택하여 디자인 팬에 모눈 표시를 키면 됩니다.

요소의 움직임을 모눈 단위로 하게 할려면, 보기 → Report Designer → 격자따라 이동을 선택합니다.

그림 5-3 가이드라인

가이드라인은 보고서에서 요소의 위치를 잡는데 매우 유용한 도구입니다. 가이드라인의 달라붙는 효과(자석

붙이기 효과)를 사용하면 요소의 위치를 올바르게 잡아주는 작업이 매우 쉬워집니다. 가이드라인을 보이게

하려면, 수평룰러나 수직룰러를 클릭한 후 원하는 위치에 가이드라인을 드래그시킵니다(그림 5-3). 기본적으

로 룰러는 측정 단위로써 인치를 사용합니다. 옵션 패널(도구 > 옵션)에서 다른 단위계를 사용하도록 설정할

수 있습니다.

원할 때면 언제든지 가이드라인을 드래그해서 그 위치를 변경할 수 있습니다. 이 경우 다른 요소들의 위치는

바뀌지 않습니다. 가이드라인을 제거하려면, 디자인 팬의 윗쪽이나 왼쪽 코너로 드래그합니다. 요소의 위치

를 정의해주는 윗쪽 좌표와 좌측 좌표값은 항상 요소가 속한 부모 밴드에 상대적인 값입니다. 요소가 프레임

안에 들어갈 경우라면 프레임 요소에 상대적인 값이 됩니다. 요소를 처음 위치시켰던 밴드에서 다른 밴드로,

또는 프레임으로 이동시키려면 보고서 인스펙터에서 해당 요소 노드를 이동을 원하는 밴드나 프레임 노드

쪽으로 드래그 합니다(그림 5-4).

60 / 318

Page 61: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

그림 5-4 다른 밴드로 요소를 이동시키는 방법

디자이너 윈도우에서 여러분은 한 밴드에서 다른 밴드로 요소를 드래그할 수 있지만, 이런 방법으로는 부모

밴드를 변경할 수 없습니다. 요소는 반드시 밴드내에 포함되어 있어야 하지만, 이러한 룰에 예외는 허용됩니

다. 보고서 디자이너에서는 요소의 부모밴드 변경없이 보고서 어느곳이라도 요소를 옮길 수 있도록 허용하

고 있습니다.

일반적인 룰을 따른다면, 요소는 반드시 자신의 부모밴드 영역내에 존재해야 하며, 밴드에 그 일부만 걸쳐지

게 하거나 다른 밴드쪽으로 옮길 수가 없습니다. 이렇게 디자인 오류가 존재하면, 보고서 문제사항 창 내에

오류 표시가 나타나며, 보고서는 실행되지 않습니다. 그림 5-5에서 부모밴드가 타이틀인 텍스트 요소를 볼

수 있습니다. 그림에서는 이 요소가 타이틀 밴드 아래에 위치한 페이지 헤더 밴드쪽까지 걸쳐져 있으므로,

보고서 문제 뷰내에 요소의 위치가 올바르지 않다는 경고문구가 나타나게 됩니다.

그림 5-5 올바르게 위치되지 않은 요소

61 / 318

Page 62: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

요소의 속성 편집은 등록정보 쉬트를 이용할 수 있습니다. 등록정보 쉬트 뷰는 메인 디자이너 윈도우의 오른

쪽 측면에 자리잡고 있습니다. 등록정보 쉬트는 요소에 대해서만 사용되지는 않습니다. 보고서를 구성하고

있는 모든 컴포넌트들의 속성을 편집할 수 있습니다. 즉, 페이지 포맷, 밴드의 옵션, 매개변수, 변수 그리고 필

드 옵션등 모든 속성 편집에 사용됩니다. 디자이너 또는 보고서 인스펙터뷰에서 어떤 객체를 선택한다면, 등

록정보 쉬트는 선택된 개체의 옵션들을 보여주게 되어 있습니다.

그림 5-6 등록정보 쉬트 뷰

화살표 툴을 사용하여 요소들의 범위를 감싸는 사각형을 그려주면, 해당 영역내에 포함되는 모든 요소들이

선택됩니다. 사각형 영역을 그려주는 방향에 따라서, 사각형 영역내에 온전하게 포함된 것들만 선택되거나

걸쳐져서 선택된 것도 모두 선택될 수 있습니다.

62 / 318

Page 63: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

그림 5-7 왼쪽에서 오른쪽으로 선택하기 그림 5-8 그려진 영역내에 온전히 포함된 요소들만 선택됨

여러 요소들을 선택하는 또 다른 방법은 컨트롤키를 누른채로 원하는 요소들을 클릭하는 것입니다. 선택된

여러 요소들에 대해 한 번에 모두 같은 속성의 값을 지정해줄 수도 있습니다. 하지만, 선택된 요소가 두 개이

상일때는 선택되어진 요소들이 갖는 공통 속성들만이 보여지게 되고, 수정할 수 있습니다. 선택되어진 요소

들 사이의 공통 속성의 값이 다른 경우에는 그 값은 비워져 보이게 됩니다. 다른 요소들과 다른 값을 설정하

기 위해서는 한 번에 한 개의 요소만을 선택해서 속성을 수정해야 합니다.

5.1.1 포맷팅 툴

63 / 318

그림 5-9 포맷팅 툴 뷰

Page 64: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

디자이너 윈도우상에서 요소들을 보다 쉽게 조작할 수 있도록 도와주는 툴들이 제공됩니다. 포맷팅 툴뷰를

사용하기 위해서는 창(W) → 포맷팅 도구 를 선택하면, 툴뷰가 보이게 됩니다. 각 툴은 최소 요구사항(한개 또

는 다수의 선택)에 부합될 경우에만 활성화되어 집니다. 표 5-1에서 사용가능한 툴의 목록을 각 툴의 최소

요구사항과 어떤 작업을 수행하는지에 대한 간단한 설명을 추가해서 나열하였습니다.

표 5-1 포맷팅 툴

아이콘 툴 설명여러개

선택?

왼쪽으로 정렬 기준 요소의 좌측면을 기준으로 정렬 √

오른쪽으로 정렬 기준 요소의 우측면을 기준으로 정렬 √

윗쪽으로 정렬 기준 요소의 상단면을 기준으로 정렬 √

아랫쪽으로 정렬 기준요소의 하단면을 기준으로 정렬 √

수직축으로 정렬 선택한 요소들을 기준 요소의 수직 중앙축을 기준으로 정렬 √

수평축으로 정렬 선택한 요소들을 기준 요소의 수평 중앙축을 기준으로 정렬 √

너비 같게 선택한 요소들을 기준 요소의 넓이와 같도록 설정 √

너비 같게(최대기준) 선택한 요소들중에 제일 너비가 긴 요소의 너비만큼으로 설정 √

너비 같게(최소기준) 선택한 요소들중에 제일 너비가 짧은 요소의 너비만큼으로 설정 √

높이 동일하게 선택한 요소들을 기준 요소의 높이와 같도록 설정 √

높이 동일하게(최대

기준)

선택한 요소들중에 제일 높은 요소의 높이로 설정 √

높이 동일하게(최소

기준)

선택한 요소들중에 제일 낮은 요소의 높이로 설정 √

크기같게 선택한 요소들을 기준 요소의 크기로 설정 √

수평방향으로 가운데 선택한 요소를 밴드의 수평 중앙으로 위치시킴

수직방향으로 가운데 선택한 요소를 밴드의 수직 중앙으로 위치시킴

가운데 선택한 요소를 밴드의 중앙에 위치시킴

왼쪽 붙이기 요소들을 수평방향에서 좌측으로 이동시켜 서로 붙여줌 √

64 / 318

Page 65: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

너비 같게 선택한 요소들을 기준 요소의 넓이와 같도록 설정 √

오른쪽 붙이기 요소들을 수평방향에서 우측으로 이동시켜 서로 붙여줌 √

수평 공간 같게 요소들 사이의 수평방향 여백을 동일하게 해줌 √

수평 공간 늘이기 요소들 사이의 수평방향 여백을 오른쪽으로 5픽셀만큼 증가시킴 √

수평방향 공간 줄이

요소들 사이의 수평방향 여백을 좌측으로 5픽셀만큼 감소시킴 √

수평 공간 제거 요소들을 좌측으로 이동시켜 수평방향 여백을 제거함 √

수직 공간 같게 요소들 사이의 수직방향 여백을 동일하게 함 √

수직 공간 늘이기 요소들 사이의 수직방향 여백을 아랫쪽으로 5픽셀씩 증가시킴 √

수직방향 공간 줄이

요소들 사이의 수직방향 여백을 윗쪽으로 5픽셀씩 감소시킴 √

수직 공간 제거 요소들 사이의 수직방향 여백을 제거함 √

부모에 맞추기 요소의 컨테이너(밴드, 셀 또는 프레임) 크기에 맞도록 요소의 크기

를 증가시킴

부모 너비에 맞추기 요소의 컨테이너(밴드, 셀 또는 프레임) 너비에 맞도록 요소의 너비

를 증가시킴

부모 높이로 맞추기 요소의 컨테이너(밴드, 셀 또는 프레임) 높이에 맞도록 요소의 높이

를 증가시킴

테이블로 조직 선택한 요소들의 윗면을 일치시키고 그들 사이의 수평 여백을 동일

하게 해서 테이블 효과처럼 보이게 한다

5.1.2 보고서 인스펙터를 사용하여 요소를 관리하기

보고서 인스펙터에는 보고서 구조를 완전하게 보여주게 됩니다. 루트 노드는 페이지 자체를 나타내기 때문

에 루트 노드를 선택하면, 이미 앞장에서 언급한것처럼 모든 일반적인 보고서 속성을 수정할 수 있게 됩니

다. 루트 노드 다음에 오는 노드들은 스타일, 매개변수, 필드 및 변수 그리고 다른 보고서 객체(서브데이터세

트처럼 존재할 경우)들을 나타냅니다.

이러한 노드들 다음에는 밴드가 옵니다. 각 밴드는 요소들을 포함하게 됩니다. 프레임과 같은 컨테이너 요소

는 서브노드 형태로써 자신에 속한 요소를 표시합니다. 인스펙터내의 요소 순서는 뷰의 z-축 순서이기 때문

에 중요합니다. 즉, 인스펙터 뷰상에서 다른 요소보다 먼저 위치한 요소가 먼저 출력됩니다. 가령, 어떤 요소

가 앞서서 출력된 요소들에 겹쳐지게 되면 덮여질 것 입니다.

65 / 318

Page 66: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

일부 내보내기(HTML 내보내기와 같은)에서는 요소의 오버랩핑을 지원하지 않으므로 덮여진 요소의 부분은

렌더링하지 않습니다. 어떤 경우에는 조건에 따른 출력 옵션을 사용하여 두 개 이상의 중첩된 요소들 중 하

나만을 출력할 수도 있습니다. 간단한 속임수를 사용하여 조건에 따라서 다른 형태의 컨텐츠가 출력되도록

하는 효과를 얻게 됩니다. Z-축 순서를 변경하기 위해서는 인스펙터내에서 요소를 드래그해서 옮겨도 되지

만 메뉴에서 위로 보내기와 아래로 보내기를 사용해도 됩니다. 여기서 기억해야될 점은 목록의 제일 윗쪽에

위치된 요소가 먼저 출력되므로 윗쪽 레이어로 요소를 올리려면 목록의 아랫쪽으로 이동시켜야 한다는 것

입니다. 모든 요소들은 복사해서 붙여넣을 수 있지만, 차트와 크로스탭은 제외됩니다. 요소를 붙여넣으면 이

전 컨테이너(밴드, 셀 또는 프레임)에서 설정되어 있던 윗쪽/좌측 좌표를 그대로 갖고 있게 됩니다. 새로 붙여

넣어진 컨테이너가 이전 컨테이너보다 작을 경우에는 컨테이너 경계 밖으로 나간 부분을 조정해주어야 합

니다. 보고서 인스펙터는 디자이너상에서는 볼 수 없거나 다른 요소들 때문에 쉽게 선택할 수 없는 경우에

도 쉽게 요소를 선택할 수 있게 합니다.

5.1.3 기본 요소 속성

모든 요소는 공통 속성 셋트나 속성들을 갖습니다. 위에서 살펴보았던 그림 5-1 처럼 요소의 등록정보 뷰에

나타납니다. 이 속성들은 페이지상에서 요소의 위치에 대한 정보와 관련되어 있습니다. 아래에서 속성들에

대한 설명을 표형식으로 정리했습니다.

그림 5-10 에서는 보고서 디자이너가 밴드(보다 큰 의미에서는 컨테이너)에 속한 요소를 밴드에 상대적인 위

치로 어떻게 처리하는지를 보여주고 있습니다. 밴드의 너비는 항상 문서의 페이지 너비에 좌측과 우측 여백

을 뺀 수치와 같습니다. 높이는 밴드의 타입과 속해있는 요소들에 따라 변화됩니다.

표 5-2 요소의 위치와 연관된 속성들

속성 설명

위 요소가 속한 컨테이너의 윗쪽 좌표로부터 요소의 상단면까지 떨어진 정도

왼쪽 컨테이너의 좌측 시작면으로부터 요소의 좌측면까지 떨어진 정도

너비 요소의 너비

66 / 318

그림 5-10 요소의 위치 설정

Page 67: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

높이요소의 높이. 실제로는 다른 속성들에 의해 출력되는 과정에서 요소의 높이가 증가될 수

있기 때문에 디자인시 지정하는 높이는 최소 높이를 의미함

* 좌표와 크기는 항상 픽셀로 표시되며, 픽셀은 1인치당 72픽셀(72 dpi)의 해상도임

표 5-3 다른 요소 속성들

속성 설명

전경색 텍스트 요소와 선 및 요소의 모서리를 칠하는 색

배경색요소의 배경으로 채워지는 색. 몇몇 요소는 기본 속성이 투명한 배경을 갖기 때

문에 배경색을 칠하려면 불투명 속성을 설정해야 함

불투명

요소의 배경을 투명하게 할지에 대한 옵션. 투명성은 요소의 배경색이 지정되었

을 경우에만 적용됨.

* 일부 내보내기 포맷에서는 투명 속성을 지원하지 않음

스타일보고서 내에서 하나 이상의 스타일을 지정해서 사용한다면, 지정한 스타일 목록

중에서 하나를 선택해서 스타일을 적용시킬 수 있음

속성 설명

보고서에서 각 요소들은 모두 각자 고유한 이름(보고서 디자이너에서 자동으로

붙여줌)으로 식별되며, 런타임에서 프로그램이 수정해야 할 필드의 속성 처리에

이 이름을 사용함

위치 타입

보고서가 채워지는 과정에서 밴드의 높이가 변화될 경우, 윗쪽 좌표를 어떻게

해주어야 하는지에 대한 옵션. 다음과 같은 세 개의 값중에서 선택합니다:

• 윗쪽으로 고정 : 이 타입이 미리 설정해준 타입. 좌표값은 절대 변경되지

않는다

• 유동 : 이전 요소의 높이가 증가함에 따라서 이 요소는 밑으로 밀려서

출력되게 한다

• 밑선에 고정 : 밴드의 아랫면으로부터 떨어진 정도를 항상 일정하게 유

지하게 함. 보통 레코드들 사이의 구분을 위한 선에 사용함

늘리기 타입 이 속성은 출력 과정을 진행하면서 요소의 높이를 어떻게 결정하는가에 대한 옵

션이다. 다음과 같은 세 개의 값 중에서 선택한다:

• 늘리지 않음 : 이 타입이 미리 설정된 타입으로, 요소의 높이 설정값이

유지되도록 한다

• 밴드 높이에 따름 : 요소의 높이가 밴드의 증가된 크기에 비례해서 증가

되도록 함. 테이블 경계선 처리를 위해 수직방향으로 그려준 선에 이 옵

션을 사용함.

67 / 318

Page 68: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

속성 설명

• 제일 높은 객체에 따름 : 이웃한 요소의 변화에 따라 자신의 높이도 변

경하게 함. 보고서 디자이너에서 관리되지 않는 요소 그룹 메커니즘때문

에 이 옵션은 요소 그룹에도 사용함.

반복값 출력 이전 레코드에서 사용된 것과 동일한 값으로 요소를 출력할지를 결정하는 옵션

빈 경우 선 제거

객체가 보여지지 않을 때 객체에 의해 점유되고 있던 수직방향 여백을 없애는

옵션. 표현식에 따라 출력 속성과 텍스트필드의 빈 경우 선 제거 속성이 적용되

는 조건에서 요소는 보여지게 될지 결정된다.

요소들이 위치하는 페이지를 격자라고 하고, 요소가 점유하는 영역을 선으로 본

다면 아래의 그림에서 요소 A에 대한 선을 생각해보자. 이 선을 제거하려면 이

선과 공유하고 있는 부분의 모든 요소들이 널이어야만 한다(즉, 출력되지 않는

다).

첫 번째 전체 밴드에 출력

밴드가 현재 페이지나 컬럼에서 넘쳐나게 될때, 다음 페이지나 컬럼에 요소를

출력하게 하는 옵션. 반복값 출력 속성을 활성화시켰을 때, 이 옵션은 매우 유용

합니다.

반복밴드가 오버플로우할

경우 출력

밴드의 모든 영역을 현재 페이지나 컬럼내에서 출력할 수 없는 경우, 다음 페이

지나 컬럼에 요소를 출력할지에 대한 옵션

그룹 변경시 출력

이 콤보박스에서는 모든 보고서 그룹이 나타납니다. 이 그룹중에 하나를 선택하

게 되면, 선택한 그룹 변경과 관련된 표현식에서 요소의 출력을 결정합니다. 즉,

선택한 그룹이 새로 시작될때만 출력됩니다.

표현식에 따라 출력

3장에서 설명했던 것과 유사한 표현식으로써, 반드시 부울린 객체를 리턴하도록

해야 합니다. 요소와의 관련성되었을 뿐만 아니라 밴드와도 관련되어 있습니다.

표현식이 false를 리턴하면, 요소는 숨겨집니다. 빈 표현식이나 널값은 new

Boolean(true)로 표현식을 처리하여 무조건 요소를 출력하게 됩니다.

Properties expressions 각각의 요소에 대해 정의될 수 있는 키/값의 쌍으로된 셋트입니다.

68 / 318

Page 69: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

5.1.4 요소의 커스텀 속성

각 요소에 대해서 커스텀 속성 셋트를 정의하는 것이 가능합니다. 각 속성은 키/값(모두 간단한 문자열)의 쌍

입니다. 값은 표현식을 사용해서 생성시킬 수 있습니다(물론, 표현식의 리턴은 문자열이 되어야 합니다). 요

소의 커스텀 속성은 요소를 선택했을 때 등록정보 쉬트에 보여지는 속성 표현식 속성을 수정하여 설정합니

다(그림 5-11).

그림 5-11 커스텀 요소 속성

커스텀 요소 속성은 다양한 용도로 사용할 수 있습니다. 가령, 특정한 포맷으로 내보낼때 지정한 요소에 대

한 특정한 동작을 지정하거나 어떤 문자들을 텍스트필드처럼 다루어야 하는지를 설정하는 등 다양하게 사

용될 수 있습니다.

69 / 318

그림 5-12 커스텀 속성 대화창

Page 70: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

커스텀 속성을 만들게 되면, 속성 대화창에서 중요하게 다루어지는 공통 속성 키를 간단한 설명과 함께 목록

을 제공합니다. 표현식을 사용하려면, 표현식 사용 체크박스를 체크합니다. 텍스트 영역은 표현식을 입력하

는 영역이고, 버튼 클릭시 표현식 편집창이 열리게 됩니다.

5.1.5 그래픽 요소들

그래픽 요소들은 선과 사각형등과 같은 그리기 객체를 말합니다. 일반적으로 데이터와는 연결되지 않으나,

출력되는 문서를 보다 읽기 편하고 미적인 관점에서 마음에 들수있게 합니다. 펜은 모양을 그리거나 이미지

에서는 요소의 경계선을 그리는데 사용됩니다. 속성은 펜 대화창에서 편집합니다(그림 5-13).

그림 5-13 펜 정의

선의 너비를 설정할 수 있으며(너비가 0이면, 선을 그리지 않는다는 의미가 됨), 네 가지 다른 스타일중에서

하나를 고를 수 있습니다: 일반, 대쉬, 점선 그리고 더블.

기본적으로 선을 칠할때 사용되는 색은 요소의 전경색이 되지만, 다른 색으로 지정해줄 수 있습니다. 색을

기본값으로 리셋하려면, 펜 아이템을 선택해서 속성 쉬트에서 기본값으로 복원을 선택해야 합니다. 펜의 기

본값은 요소에 따라 다릅니다. 선, 사각형 그리고 타원은 기본 1 픽셀의 너비이지만, 이미지에서의 기본 선 너

비는 0입니다. 채우기 속성은 오직 채움 한 개의 값만이 가능합니다.

5.1.5.1 선

보고서에서는 선이 사각형의 대각선으로 정의됩니다(그림 5-14).

그림 5-14 탑-다운 타입의 선 요소

선은 펜 설정을 사용해서 그려집니다. 펜 속성을 설정하지 않는다면, 전경색은 기본색이며, 선 너비는 1 픽셀

70 / 318

Page 71: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

이 되고 normal 스타일로 그려집니다. 선만이 가진 속성으로는 선 방향이 있습니다. 이 속성은 두 개의 사각

형에서의 대각선 종류를 가리킵니다: 위에서 아래로의 대각선(Top Down)과 아래서 위로 가는 대각선(Bottom Up).

5.1.5.2 사각형

사각형 요소는 다른 요소들을 감싸는 프레임을 그릴때 주로 사용됩니다. 요소들간의 오버래핑을 방지하기

위해서 요소들을 감쌀 때는 프레임 요소 사용을 권장합니다. 선 요소와 유사하게, 사각형의 경계는 펜 설정

을 통해 그려지게 됩니다. 펜 속성값을 설정하지 않게되면, 전경색을 사용(기본적으로는 검정색)하고 1 픽셀

너비의 normal 스타일 선을 사용합니다. 배경색은 요소의 투명 속성을 설정하지 않을 경우, 지정한 색으로 칠

합니다.

그림 5-15 반경 20의 값을 갖는 사각형 요소

보고서에서는 모서리를 곡면처리한(그림 5-15) 사각형도 지원하고 있습니다. 둥근 모서리는 Radius 속성을 사

용해서 지정하며, 지정한 값은 모서리 부근의 픽셀단위로 된 곡률반경입니다.

5.1.5.3 타원

그림 5-16 타원 요소와 점유하게 되는 사각형 경계

타원은 별도의 속성없는 유일한 요소입니다. 타원은 사각형처럼 최대 높이와 너비를 사용해서 그려집니다

(그림 5-16). 경계선은 펜 설정을 사용해서 칠해집니다. 지정하지 않았을 경우에는 전경색을 사용(기본값은

검정색)하고, 1픽셀 너비의 normal 스타일 선을 사용합니다. 배경색은 투명 옵션을 정의하지 않았을 경우, 지

정한 배경색으로 칠합니다.

5.2 이미지 사용하기

이미지는 그래픽 요소중에서 가장 복잡한 요소입니다(그림 5-17). 이미지 요소는 보고서에 래스터 이미지

(GIF, PNG 및 JPEG 이미지 포맷)를 삽입할 때 사용할 수 있습니다. 이미지 요소는 스윙 컴포넌트나 렌더링

코드를 커스터마이징 해서 렌더링을 하는 캔바스 객체로도 사용할 수 있습니다.

71 / 318

Page 72: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

그림 5-17 이미지 요소

팔레트에서 디자이너쪽으로 이미지 요소를 드래그시켜 놓으면, 파일 선택창이 나타납니다. 보고서에서 사용

할 이미지를 지정해주는 가장 쉬운 방법입니다. 보고서 디자이너는 선택한 이미지를 어디에도 저장하지 않

고 단지 파일의 위치만을 이용합니다. 보고서가 실행될때 선택한 이미지 파일의 위치에 대한 절대 경로를 만

들어주는 표현식을 통해 이미지를 사용합니다. 절대 경로를 리턴해주는 표현식에서는 이미지 표현식 속성에

대한 값으로 설정해주게 됩니다. 다음과 같은 간단한 표현식을 예로 들어보겠습니다:

"C:\\Documents and Settings\\Test\\Desktop\\splashscreen.png"

이 예제는 자바(그루비 혹은 자바스크립트로 작성할 수도 있음) 표현식으로써, 파일 경로에 대한 값만으로 구성되지 않

습니다. 쌍따옴표를 시작과 마지막에 사용했고 역슬래쉬(\)는 또다른 역슬래쉬의 이스케이프(\\)입니다. 이미지 표현식

클래스는 이미지 표현식에 의해 리턴되는 객체의 종류로 지정합니다. 위의 예제같은 경우라면,

java.lang.String이 됩니다만, 사용할 수 있는 옵션은 더 있습니다.

표 5-4 에서 이미지 표현식 클래스가 가질 수 있는 값과 이미지 표현식 결과가 어떻게 해석되어 사용되는지

에 대한 설명을 요약해 놓았습니다.

표 5-4 이미지 표현식 클래스 값

타입 번역

java.lang.String

파일의 이름처럼 해석되는 문자열. 절대경로처럼 문자열을 해석하려고 함. 해당 경

로에서 파일을 찾지 못하면, 지정된 이름으로 클래스경로로 부터 리소스를 로딩하려

고 한다. 올바른 표현식은 다음과 같다:

“C:\\devel\\report\\myImage.jpg”

“com/mycompany/resources/icons/logo.gif”

72 / 318

Page 73: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

java.io.File이미지로서 로딩할 파일 객체를 지정한다. 올바른 표현식은 다음과 같다:

new java.io.File(“c:\\myImage.jpg”)

java.net.URL

java.net.URL 객체를 지정합니다. HTML 포맷으로 내보내는 보고서에서 유용합니다.

올바른 표현식은 다음과 같습니다:

new java.net.URL(“http://127.0.0.1/test.jpg”)

java.io.InputStream

읽을 준비된 java.io.InputStream 객체를 지정합니다. 이미지가 파일에 존재하지 않는

다면, 즉 데이터베이스로부터 이미지를 읽어들여 읽기가능한 inputStream으로 리턴

해줄 경우에 사용합니다. 올바른 표현식은 다음과 같습니다:

MyUtil.getInputStream(${MyField})

java.awt.Image

java.awt.Image 객체를 지정합니다. 이미지를 동적으로 생성시키려고 객체를 리턴해

줄 수 있기 때문입니다. 올바른 표현식은 다음과 같습니다:

MyUtil.createImage()

RXRenderable com.cabsoft.rx.engine.RXRenderable 인터페이스를 사용하는 객체를 지정합니다.

이미지 파일의 경로를 표현식내에서 완전한 절대 경로로 설정함으로써 명시적으로 이미지를 추가할 수 있

습니다. 가장 쉽게 이미지를 보고서에서 사용할 수 있는 방식이지만, 보고서를 웹으로 서비스할 경우에는 치

명적인 결함을 갖습니다. 바로 보고서를 서비스받는 다른 컴퓨터에는 지정된 경로에 이미지 파일이 없기 때

문입니다.

다음 두 가지 경우가 실제적인 좋은 예가 됩니다:

• 이미지가 들어있는 폴더를 이미지 표현식에 매개변수화 해서 다음과 같은 표현식으로 처리합니다:

$P{이미지_디렉터리} + “myImage.png”

런타임에서 매개변수의 값을 넘겨받아서 설정되어 집니다. 매개변수의 값이 제공되지 않을 경우 기

본값을 리턴할 수 있습니다(매개변수를 생성하고 기본값을 정해주는 방법은 다음장에서 다루게 됩

니다). 이런 방식의 장점은 매개변수로 지정하는 위치가 보고서내에서 직접적으로 지정하지 않았기

때문에 동적으로 변경시킬 수 있다는 점입니다.

• 두번째는 classpath를 사용하는 경우입니다. 보고서에서 클래스들과 리소스들을 찾는 디렉터리와

JAR 파일의 위치를 classpath에 지정합니다. JVM을 사용하는 어플리케이션에서는 classpath에 디렉터

리를 쉽게 추가할 수 있습니다.

보고서 디자이너에서 classpath를 추가하기 위해서는 옵션대화창(도구 > 옵션 > RX디자이너 > 클래스경

로)을 사용합니다. 이미지가 클래스경로내에 존재하면, 클래스경로에 대한 상대적인 경로인 리소스

이름으로 이미지를 찾아 렌더링시킬 수 있습니다. 보고서를 어느 디렉터리내에 설치한 경우

(c:\test\myReport.rxxml), 이 디렉터리내에 “myImage.png”라는 이름을 갖는 이미지 파일을 사용한다고

생각해 보겠습니다. 보고서에서 이미지 표현식을 myImage.png 로 설정하여 사용할 수 있습니다. 보고

서가 위치한 디렉터리는 클래스경로에 포함되므로 이미지는 자동으로 찾습니다.

이렇한 과정은 클래스경로의 서브디렉터리에 위치한 이미지에서도 적용됩니다. 여러분은 유닉스 스

타일의 경로 표기법으로 서브디렉터리의 경로를 지정하면 됩니다. 즉, 이미지가 c:\test가 아닌

73 / 318

Page 74: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

c:\test\images 디렉터리에 위치해 있다면, 표현식으로 /images/myImage.png 를 사용하여 서브디렉터리

에서 이미지를 찾도록 할 수 있습니다.

이렇게 리소스 위치를 찾는 방법은 보고서의 다른 부분(서브리포트 ReportExpress 파일, 리소스번들,

스크립틀릿 클래스등등)에서도 적용가능합니다.

이제 다른 남아있는 옵션들도 살펴보겠습니다:

표 5-5 이미지 표현식 클래스 옵션들

옵션 설명

이미지 스케일 이미지가 요소 크기내에서 어떻게 적용되는지를 지정합니다. 다음 세가지 값중에서

선택합니다:

클립 이미지 크기를 변경하지

않음

프레임 채우

이미지를 요소 크기에

맞춤(변경작업 수행)

모양 유지 이미지는 자신이 갖는

원래의 비율을 유지한

채로 요소의 크기에 맞

춰짐

오류타입 이미지 로딩 실패시에 어떻게 처리해야 하는지를 지정합니다:

오류 보고서 생성을 멈추고 자바 예외를 발생시킴

비움 이미지는 출력하지 않고 빈 공간으로 대신한다

아이콘 원래의 이미지대신 아이콘을 출력시킨다

로딩 지연 보고서를 채우는 시점에서 이미지 로딩을 하지 않게 합니다. 이미지는 보고서가 내

보내기될 때 로딩됩니다. URL로부터 이미지를 로딩시킬 경우 유용합니다.

캐쉬사용 한번 로딩된 이미지를 메모리상에서 유지시켜 다시 이용할 수 있게 합니다. 캐쉬에

74 / 318

Page 75: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

로딩 지연 보고서를 채우는 시점에서 이미지 로딩을 하지 않게 합니다. 이미지는 보고서가 내

보내기될 때 로딩됩니다. URL로부터 이미지를 로딩시킬 경우 유용합니다.

이미지를 유지하는 것은 오직 이미지 표현식 클래스가 java.lang.String 인 경우임에

주의하십시오.

수직정렬 요소 영역에 관련된 이미지의 수직방향 정렬을 지정합니다. 지정 가능한 값으로는 :

위 요소 영역의 윗면으로 정렬시킨다.

가운데 요소 영역의 수직으로 중간부분에 이미지를 정렬시킨다.

아래 요소 영역의 하단면으로 정렬시킨다.

수평정렬 요소 영역에 관련된 이미지의 수평방향 정렬을 지정합니다. 지정 가능한 값으로는 :

왼쪽 요소 영역의 좌측면에 이미지를 정렬시킨다.

가운데 요소 영역의 수평방향으로 중심부에 이미지를 정렬시킨다.

오른쪽 요소 영역의 우측면에 이미지를 정렬시킨다.

처리시점 이미지 표현식을 평가하는 시점을 지정합니다. 이미지 표현식은 보고서 엔진에서

보고서를 생성하는 동안 요소를 처리할때(이 시점은 “now”가 됨) 평가되거나, 지연

시킬 수도 있습니다. 이미지의 처리가 완료되지 않을경우에 따라서 그 계산 또한 의

존성을 갖기 때문에 표현식의 평가가 지연될 수 있습니다. 표현식의 평가시점은 다

른 표현식들(텍스트필드와 변수에서 사용되는)에서도 마찬가지로 적용됩니다. 표현

식의 평가시점에 대해서는 다음 장에서 자세하게 다루도록 하겠습니다. 평가시점으

로 설정할 수 있는 값들은 다음과 같습니다:

지금 즉시 표현식을 평가한다.

보고서 보고서 마지막에서 표현식을 평가한다.

페이지 페이지 끝에서 표현식을 평가한다.

컬럼 컬럼의 끝에서 표현식을 평가한다.

그룹 처리그룹에서 지정해준 그룹에서 표현식을 평가한다.

밴드 현재 밴드의 표현식을 처리한 후, 이 표현식을 평가한다. 서브리포트

에서 리턴받은 값을 사용해서 표현식을 평가할 때 사용함.

처리그룹 표현식 설정을 위해서는 우선 그룹값에 대한 설명부터 읽어보십시오.

75 / 318

Page 76: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

5.2.1 패딩과 경계

이미지 요소(텍스트 요소 포함)에서는 프레임을 보이게 할 수 있거나 네 면에 대한 패딩을 지정할 수도 있습

니다. 패딩은 요소의 경계와 컨텐츠 사이의 공간입니다. 경계선과 패딩은 요소에서(또는 인스펙터 뷰에서 요

소 노드) 마우스 오른쪽 클릭을 통해 지정해줄 수 있고 메뉴 항목에서 패딩과 경계를 선택해서도 지정해 줄

수 있습니다. 이제 그림 5-18과 같은 대화창이 열립니다.

그림 5-18 패딩과 경계선

앞에서도 이야기한 것처럼 모든 측정 단위는 항상 픽셀(72 dpi)로 설정됩니다. 네 면에 대한 경계선은 미리보

기 프레임을 통해서 개별적으로 편집이 가능합니다. 어떤 면도 선택하지 않았다면, 모든 면에 대해 적용되어

집니다.

이미지 요소는 하이퍼링크 기능을 가질 수 있습니다. 모든 내보내기 포맷이 이것을 지원하지는 않지만,

HTML, PDF 및 XLS에서는 동작합니다. 하이퍼링크를 정의하려면, 이미지 요소의 오른쪽 클릭으로 나타나는

하이퍼링크 메뉴항목을 선택합니다. 하이퍼링크 정의를 할 수 있도록 대화창이 열립니다. 이번 장 후반부에

서 대화창을 사용하여 하이퍼링크를 정의하는 방법에 대해 보다 자세하게 설명하겠습니다.

5.2.2 데이터베이스에서 이미지 불러오기(BLOB 필드)

데이터베이스에 저장된 이미지를 출력하고자 할때는(즉, BLOB 컬럼을 사용), BLOB 값을 가져오는 필드(다

음 장에서 보고서의 필드에 대한 자세히 다루게 됩니다)를 java.awt.Image 타입으로 설정해 주어야 합니다. 디

자이너의 반복 밴드 영역에 팔레트에서 이미지 요소 도구를 선택하여 드래그해서 이미지 요소를 만드십시

오. 이때 파일을 선택하는 대화창에서 취소 버튼을 누릅니다. 그런 후, 이미지 요소 속성쉬트에서 이미지 표

현식 클래스를 java.awt.Image로 변경하고 이미지 표현식에 필드 객체(즉, $F{블럽_필드명})를 설정해주면 됩니

다.

76 / 318

Page 77: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

5.2.3 동적으로 이미지 만들기

이미지를 동적으로 만들려면 자바에 대한 지식을 필요로 합니다. 이제 여러분에게 보고서에서 출력할 이미

지를 수정하거나 만들어주는 최적의 방법에 대해서 설명하도록 하겠습니다. 보고서에서 이미지를 동적으로

생성하는 방법은 다양합니다. 첫번째 방법은 java.awt.Image 객체를 생성하는 클래스를 작성하고 이미지 요소

의 이미지 표현식에서 이 클래스의 메쏘드를 호출해주는 방법입니다. 표현식은 다음과 같은 모양이 됩니다:

MyImageGenerator.generateImage()

여기서 MyImageGenerator는 java.awt.Image 객체를 리턴해주는 정적인 메쏘드 generateImage()를 갖는 클래스 입니다. 이

방식의 문제점은 지정한 너비와 높이를 갖는 래스터 이미지를 생성하기 때문에 문서를 확대하거나 최종 포맷으로 PDF

가 될 경우 이미지 품질의 저하입니다.

일반적으로는 문서에 렌더링되는 이미지의 최적의 포맷은 SVG(원래 캡쳐된 해상도와 상관없이 고해상도 이미지 품질

을 보장)로 이야기합니다. 커스텀 이미지를 쉽게 만들기 위해서, RXRenderable 인터페이스를 제공하므로 개발자는 이 인

터페이스를 구현하여 최적의 렌더링 결과를 얻을 수 있습니다. 이 인터페이스를 처음 사용할때 편리하도록

RXAbstractSVGRenderable 클래스도 준비되어 있습니다. 오직 하나의 메쏘드만 구현하면 됩니다:

public void render(Graphics2D g2d, Rectangle2D rect)

이미지를 렌더링할 코드를 이 메쏘드에 넣어주어야 합니다. 코드 5-1 에서는 그라디언트 배경을 사용하는 이미지 요소내

에 “ReportExpress!!”라는 텍스트를 외곽선을 주어 칠해기 위해 RXAbstractSVGRenderable을 간단히 구현한 코드를 보여

주고 있습니다.

예제 코드 5-1 동적으로 이미지 생성package com.cabsoft.rx.samples;

import java.awt.Color;import java.awt.Font;import java.awt.GradientPaint;import java.awt.Graphics2D;import java.awt.Rectangle;import java.awt.Shape;import java.awt.font.FontRenderContext;import java.awt.font.TextLayout;import java.awt.geom.AffineTransform;import java.awt.geom.Rectangle2D;

/**

*

* @author [email protected]

*/public class CustomImageRenderer extends RXAbstractSvgRenderer {

public void render(Graphics2D g2d, Rectangle2D rect) throws RXException {

AffineTransform savedTrans = g2d.getTransform();

Font savedFont = g2d.getFont();

g2d.setPaint(new GradientPaint(0, 0, Color.ORANGE, 0, (int) rect.getHeight(), Color.PINK));

77 / 318

Page 78: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

g2d.fillRect(0, 0, (int) rect.getWidth(), (int) rect.getHeight());

Font myfont = new Font("Arial Black", Font.PLAIN, 50);

g2d.setFont(myfont);

FontRenderContext frc = g2d.getFontRenderContext();

String text = new String("ReportExpress!!!");

TextLayout textLayout = new TextLayout(text, myfont, frc);

Shape outline = textLayout.getOutline(null);

Rectangle r = outline.getBounds();

g2d.translate((rect.getWidth() / 2) - (r.width / 2), rect.getHeight() / 2 + (r.height / 2));

g2d.setColor(Color.BLACK);

g2d.draw(outline);

g2d.setFont(savedFont);

g2d.setTransform(savedTrans);

}}

결과는 그림 5-20에 표시하였습니다. CustomImageRenderer 클래스는 RXAbstractSvgRenderer 인터페이스를 구

현하였습니다. 렌더러는 fillRect 메쏘드에서 배경색을 그라디언트 페인트를 사용해서 칠하여

“ReportExpress!!!” 외곽선 텍스트 모양을 만들고, 변환을 통해 가운데에 위치시키게 됩니다.

그림 5-20 커스텀 RXRenderable 객체를 사용하여 렌더링시킨 이미지 요소

위의 코드로 얻어지는 JAR파일을 클래스경로에 추가한 후 이미지 속성에서 이미지 표현식과 이미지 표현식

클래스를 설정합니다. 이미지 요소 표현식에 설정한 사항은 다음과 같습니다:

new com.cabsoft.rx.samples.CustomImageRenderer()

그런 다음, 이미지 표현식 클래스를 com.cabsoft.rx.engine.RXRenderable 로 설정해주었습니다. 구현한 클래스에는

어떠한 인수도 넘겨주지 않았지만, 최종 사용자 환경에서 이미지 생성시 렌더러에게 추가적인 정보를 넘겨

줄 수도 있습니다. 이런 방식은 이미지를 수정(회전, 변환등)할 수 있게 하거나, 이미지에 워터마크를 삽입한

다든지 스윙 컴포넌트를 집어넣어줄 수도 있게 합니다.

코드 5-2 에서는 스윙 컴포넌트인 JTable을 출력하는 방법을 보여주고 있습니다. 앞에서 보여주었던 예제와

크게 다르지는 않습니다. 아이디어는 제공된 Graphics2D에 스윙 컴포넌트를 강제적으로 칠해주도록 하는 것

뿐입니다. 이러한 코드로 얻어지는 결과는 믿기지 않을 정도로 좋으며, 내장된 미리보기 컴포넌트를 사용하

78 / 318

Page 79: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

거나 PDF로 내보낼 경우에도 품질의 저하가 없습니다.

예제코드 5-2 JTable 출력하기

package com.cabsoft.rx.samples;

import java.awt.Graphics2D;import java.awt.geom.AffineTransform;import java.awt.geom.Rectangle2D;import javax.swing.JTable;import javax.swing.table.DefaultTableModel;import javax.swing.table.JTableHeader;import net.sf.ReportExpress.engine.RXAbstractSvgRenderer;import net.sf.ReportExpress.engine.RXException;

/**

*

* @author Cabsoft

*/public class SwingComponentRenderer extends RXAbstractSvgRenderer {

public void render(Graphics2D g2d, Rectangle2D rect) throws RXException {

AffineTransform trans = g2d.getTransform();

DefaultTableModel model = new DefaultTableModel(

new Object[][]{

{"수성", "NO"},

{"금성", "NO"},

{"지구", "YES"},

{"화성", "YES"},

{"목성", "YES"},

{"토성", "YES"},

{"천왕성", "NO"},

{"해왕성", "YES"},

{"명왕성", "YES"}},

new String[]{"Planet", "Has satellites"});

JTable table = new JTable(model);

table.getColumn("Planet").setWidth(100);

table.getColumn("Has satellites").setWidth(100);

table.setSize(table.getPreferredSize());

JTableHeader tableHeader = table.getTableHeader();

tableHeader.setSize(tableHeader.getPreferredSize());

tableHeader.paint(g2d);

79 / 318

Page 80: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

g2d.translate(0, tableHeader.getHeight());

table.paint(g2d);

g2d.setTransform(trans);

}}

5.3 텍스트 사용하기

보고서에서 텍스트를 보여주기 위해 고안된 두 개의 요소가 있습니다: 정적 텍스트와 텍스트 필드.

첫 번째 요소는 라벨이나 디자인시에 정적인 텍스트를 출력하는 용도로 사용되며, 보고서가 만들어질 때 변

경되지 않습니다. 이러한 요인 때문에 라벨 출력에 텍스트 필드를 사용해야 할 필요도 생깁니다. 정적 텍스

트 요소는 동적으로 텍스트를 보여줄 수 없으므로 서로 다른 언어를 사용하여 보고서를 서비스할 경우 해당

로케일로 설정한 리소스번들을 이용할 수 있도록 라벨에도 텍스트필드 요소를 사용하게 될 수 있다는 의미

80 / 318

그림 5-22 이미지 요소안쪽에 JTable 출력한 모습

Page 81: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

입니다.

텍스트 필드는 정적 텍스트 문자열과 유사한 방식으로 동작하지만, 컨텐츠를 표현식으로 제공할 수 있습니

다. 표현식은 리턴하는 값의 타입으로 문자열뿐만 아니라 다양한 종류가 올 수 있으며, 그 값에 대한 포맷 패

턴(숫자값과 날짜 형식에 적용가능한)까지도 지정해줄 수 있습니다. 텍스트 필드 요소는 텍스트에 임의의 길

이를 동적으로 지정해줄 수 있기 때문에 텍스트가 정렬되는 방식과 위치, 행 넘김등과 같은 사항들을 처리하

게 할 수 있는 옵션들을 제공하고 있습니다. 텍스트 필드 요소는 필요하다면 컨텐츠에 맟추기 위해서 수직방

향으로 높이가 늘어나게 됩니다. 기본 텍스트 요소는 경계선이 없고 검은 전경색을 갖습니다. 이러한 모든

속성들은 요소 속성 쉬트와 패딩과 경계선 팝업 메뉴를 사용하여 공통 부분을 수정할 수 있습니다. 텍스트필

드 요소 역시 하이퍼링크를 지원합니다. 하이퍼링크에 관련된 사항은 이번 장의 후반부에서 자세하게 다룰

것입니다. 정적 텍스트와 텍스트 필드는 텍스트 정렬과 폰트 설정을 위해 공통 속성을 공유합니다. 다음 옵

션들에 대해 살펴보도록 하겠습니다:

옵션 설명

폰트명 폰트 이름. 시스템내에서 찾을 수 있는 모든 폰트를 목록으로 보여줍니다. 다른 텍스트 문서에

서 흔히 일어나는 현상인 다른 컴퓨터에서는 찾을 수 없는 폰트를 사용할 경우를 피하기 위해

서는 사용할 폰트를 선택할 때 매우 주의해야 합니다. PDF로 내보낼 경우에는 PDF에서 사용

할 폰트가 따로 존재하므로 이 속성은 무시됩니다. 폰트사용에 대한 상세한 정보는 “폰트”만을

별도의 장으로 제공하여 다루고 있습니다.

크기 폰트의 크기. 정수만이 가능합니다. 즉 10.5와 같은 수치를 설정해줄 수 없습니다.

진하게

기울게

텍스트 스타일을 진하게 하거나 기울게 설정합니다. 이 두 속성은 PDF로 내보낼 경우에는 적

용되지 않습니다. PDF는 PDF 폰트속성에서 설정해야 합니다.

밑줄

취소선

텍스트 스타일을 밑줄 긋기와 가운데 줄 긋기로 설정합니다.

PDF 폰트명

PDF에 포함

PDF 인코딩

이 플래그는 8.3 폰트 확장 사용에서 설명하였습니다.

수평 정렬 요소내에 텍스트를 수평방향으로 정렬하도록 지정합니다.

수직 정렬 요소내에 텍스트를 수직방향으로 정렬하도록 지정합니다.

회전 텍스트를 어떻게 출력할지를 지정해줍니다. 가능한 값은 다음과 같습니다:

없음 텍스트를 일반적인 방식, 즉 왼쪽에서

오른쪽으로 위에서 아래 방향으로 출

력하게 됩니다.

81 / 318

Page 82: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

왼쪽 텍스트를 반시계방향으로 90도 회전

시킴. 아랫쪽에서 윗쪽 방향으로 출력

되고, 텍스트 회전후에 수평방향과 수

직방향 정렬이 됩니다. 요소 영역내에

서 사각형의 좌측면을 따라서 아랫쪽

수직 정렬로 텍스트를 출력합니다.

오른쪽 텍스트를 시계방향으로 위에서 아랫

쪽으로 90도 회전시키고 수평과 수직

정렬은 텍스트 회전에 따라 설정됩니

다.

위아래 바꿈 텍스트를 시계방향으로 180도 회전시

킵니다.

선 간격 행간의 간격에 대한 값을 지정합니다. 사용될 수 있는 값들은 다음과 같습니다:

한배 미리 선택된 값으로, 단일 행간입니다.

1.5 한행 반의 행간을 갖게 합니다.

두배 두행의 행간을 갖게 합니다.

마크업 지정한 마크업 언어를 사용하여 텍스트 포맷을 할 수 있도록 하는 속성입니다. 사전에 포맷되

어진 문자들을 출력하고자 할 경우 매우 유용합니다. 즉, HTML과 RTF.

간단한 HTML 스타일 태그(진하게 할 때는 <b> 태그, 기울게 하려면 <i> 태그 등)는 텍스트 일

부분을 강조하기 위해 사용될 수 있습니다. 사용 가능한 값은 다음과 같습니다:

None 테스트에 어떠한 작업도 하지 않고 제공되는 그대로의 모습으로 출력하게

합니다.

Styled HTML과 유사한 태그 셋트를 사용하여 텍스트를 포맷팅할 수 있게 하는 마

크업으로 자바 환경에서 많이 사용하고 있습니다. 텍스트중 일부에만 적용

되는 폰트, 색, 배경색, 스타일등에 지정할 수 있습니다. 대부분의 경우에는

프로그램적으로 텍스트를 포맷하지 않아도 충분합니다.

HTML 보고서에 HTML 텍스트를 출력하고자 한다면, 이 옵션을 선택하십시오. 이

옵션의 주요 목적은 텍스트를 포맷팅하는 것이기 때문에 테이블이나 이미지

추가등과 같은 포맷 태그는 가능하지 않습니다.

82 / 318

Page 83: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

RTF 이 옵션으로 설정하면, 컨텐츠는 RTF 코드로 해석됩니다. RTF는 순수한 텍

스트내에 문서 포맷 형식까지 저장해 놓은 인기있는 문서 형식입니다.

워드 등 편집기로 작업하고 RTF 형식으로 저장한 후 텍스트 편집기로 내용

을 복사하여 사용합니다.

보고서 폰트 모든 문자 속성에서 사용하게 되는 미리 선정한 폰트의 이름입니다. 이 속성은 더이상 사용하

지 않으며, 호환성 때문에 그대로 남겨놓았습니다. 때문에 이 속성부분이 가운데 줄이 그어져

있습니다. 문서 전체에 적용될 텍스트 스타일을 지정하기 위해서는 스타일을 사용합니다. 8장

에서 자세히 다루어집니다.

간단한 사용을 위해, 텍스트 속성에서 자주 사용되는 속성들은 텍스트 요소를 선택했을 때 표시되는 텍스트

툴바를 사용합니다(그림 5-24).

그림 5-24 텍스트 툴바

폰트 크기 선택 우측에 있는 두 개의 버튼은 폰트크기를 키우거나 줄이는데 사용됩니다.

83 / 318

그림 5-23 마크업들과 스타일을 사용하여 텍스트 포맷한 모습

Page 84: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

5.3.1 정적 텍스트

그림 5-25 정적 텍스트 요소

정적 텍스트 요소는 동적으로 변경되지 않는 텍스트를 보고서에 보여줄 때 사용됩니다(그림 5-25). 범용 텍

스트 요소와 이 요소를 구별하는 유일한 매개변수는 텍스트 속성으로 보여줄 텍스트를 지정해주는 용도입

니다. 일반적인 텍스트로서 표현식이 아니므로 자바, 그루비 또는 자바스크립트 문법에서 처리할 때도 쌍따

옴표로 감싸지 않아도 됩니다.

5.3.2 텍스트 필드

텍스트 필드는 표현식을 사용하여 임의의 텍스트 섹션(또는 숫자나 날짜)을 인쇄하게 합니다. 텍스트 필드의

대표적인 사용예는 다음과 같은 표현식을 사용하여 정적인 문자열(java.lang.String)을 출력시켜 주는 것입니

다 : "This is a text"

표현식을 사용하여 리턴되는 정적인 값을 출력하는 텍스트 필드는 정적인 필드로 대체할 수도 있습니다. 실

제로 표현식을 사용하여 텍스트 필드의 컨텐츠를 지정함으로써 생성되는 텍스트(이것이 정적인 텍스트라

할지라도)는 보다 상세하게 제어할 수 있습니다. 가장 흔한 경우로는 라벨을 리소스번들을 통해 로드해서 현

지화에 알맞게 보여줄 때 입니다.

일반적으로, 표현식에는 필드, 변수 그리고 매개변수를 포함시킬 수 있어서 필드의 값을 텍스트 필드에 출력

하고 그 값의 포맷도 지정할 수 있습니다. 이를 위해 텍스트 필드 표현식이 반드시 문자열로 리턴될 필요는

없습니다. 텍스트 필드 표현식 클래스 이름 속성에 표현식에서 리턴되는 값의 타입을 지정해주면 됩니다. 타

입에는 다음과 같은 종류가 있습니다 :

표현식 타입에 올수 있는 타입들

java.lang.Object java.sql.Time java.lang.Long

java.lang.Boolean java.lang.Double java.lang.Short

java.lang.Byte java.lang.Float java.math.BigDecimal

java.util.Date java.lang.Integer java.lang.String

java.sql.Timestamp java.io.InputStream

표현식 클래스를 올바르게 설정하지 않게되면, 보고서 생성과정에서 오류가 발생됩니다. 그루비나 자바스크

립트를 사용하여 표현식을 작성한다면, 표현식의 타입을 String으로 선택해도 보고서를 컴파일할때 오류를

유발하지 않습니다. 올바르지 않은 타입을 지정했을 때 발생되는 추가적인 영향은 값에 적용한 패턴이 동작

하지 않는다는 것입니다.

텍스트 필드에 지정할 수 있는 속성들에 대해 알아보도록 하겠습니다 :

84 / 318

Page 85: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

속성 설명

널일 경우 비워둠 True로 설정하면, 표현식의 결과가 널 객체(문자열로 변환했을때 텍스트가 “null”이

되는)인 경우 텍스트 필드의 컨텐츠를 출력하지 않습니다.

처리시점 텍스트 필드 표현식이 평가되어지는 시점을 결정하게 합니다. 다음장에서 보다 심

도있게 설명하게 됩니다.

그룹 처리 이 값을 Group으로 설정하면, 평가되는 시점은 그룹이 됩니다.

Overflow로 늘림 이 옵션을 선택할 경우, 텍스트 필드가 컨텐츠 내용에 맞추어 수직방향으로 늘어납

니다.

패턴 값을 마스크에 맞춰서 포맷해주게 합니다. 지정한 패턴에 일치하는 표현식 클래스

를 사용할때만 적용됩니다. 즉, 숫자의 포맷 마스크를 적용하기 위해서는 표현식 클

래스를 숫자 타입으로 지정해야 하며, 날짜 패턴은 날짜 타입이어야만 합니다.

다음 테이블에서는 매개변수 일부와 데이터의 예, 숫자 패턴을 제공하고 있습니다.

표 5-6 날짜 마스크 코드

마스크 코드 날짜 컴포넌트 사용 예

G 시대 지정자 AD

y 년도 1996; 96

M 년도에서의 월 July; Jul; 07

w 년도에서의 주 27

W 월에서의 주 2

D 년도에서의 일 189

d 월에서의 일 10

F 월에서의 주에 대한 일 2

E 주에서의 일 Tuesday; Tue

a Am/pm 마커 PM

H 일중 시각(0-23) 0

k 일중 시각(1-24) 24

K am/pm으로 표시한 시각(0-11) 0

h am/pm으로 표시한 시각(1-12) 12

m 시간내에서의 분 30

s 분내에서의 초 55

S 밀리세컨드 978

85 / 318

Page 86: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

z 시간대 태평양 표준시; PST; GMT-08:00

Z 시간대 -800

날짜와 시간 포맷의 사용은 다음과 같이 합니다.

표 5-7 날짜와 시간 포맷의 사용예

날짜와 시간 패턴 결과값

“yyyy.MM.dd G ‘at’ HH:mm:ss z” 2001.07.04 AD at 12:08:56 PDT

"EEE, MMM d, ''yy" Wed, Jul 4, '01

"h:mm a" 12:08 PM

"hh 'o''clock' a, zzzz" 12 o'clock PM, Pacific Daylight Time

"K:mm a, z" 0:08 PM, PDT

"yyyyy.MMMMM.dd GGG hh:mm aaa" 02001.July.04 AD 12:08 PM

"EEE, d MMM yyyy HH:mm:ss Z" Wed, 4 Jul 2001 12:08:56 -0700

"yyMMddHHmmssZ" 010704120856-0700

아래의 테이블에는 숫자 문자열에서 심볼로 파싱되는 특수한 문자들의 예를 보여주고 있습니다.

표 5-8 숫자 문자열에서 사용하는 특수 심볼

심볼 위치 현지화? 의미

0 숫자 지원 자릿수

# 숫자 지원 자릿수, 0은 제외하고 보여줌

. 숫자 지원 십진수 구분자 혹은 화폐의 십진 구분자

- 숫자 지원 음수 신호

, 숫자 지원 그룹핑 구분자

E 숫자 지원 부동소수를 구분하며, 과학적 표기법으로 나타낸 지수.

앞뒤로 따옴표할 필요가 없음

; 서브패턴 경계 지원 양의 서브패턴과 음의 서브패턴을 구별

% 전치 또는 후치 지원 100으로 곱하여 퍼센트로 보여줌

\u2030 전치 또는 후치 지원 100으로 곱하여 1000의 퍼센트로 보여줌

¤ (\u00A4) 전치 또는 후치 미지원 통화량 기호, 통화량 심볼로 대체. 더블일 경우에는 국제적인 화폐 심

볼로 교체됨. 패턴을 명시했을 경우, 화폐의 십진 구분자는 십진수 구

분자 대신 사용됩니다.

' 전치 또는 후치 미지원 앞뒤로 특수 문자로 따옴표를 사용. 가령, “#’#” 포맷은 123을 “#123”

으로 표시합니다. 단따옴표를 자체를 표시하려면 연속으로 두 번 써

줍니다: “#o’’clock”

숫자의 포맷팅 예는 다음과 같습니다.

86 / 318

Page 87: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

표 5-9 숫자 포맷팅 예제

숫자 포맷 사용 예

"#,##0.00" 1.234,56

"#,##0.00;(#,##0.00)" 1.234,56 (-1.234.56)

그림 5-26 날짜 패턴

문자열 패턴을 편리하게 지정하도록 하기위해 보고서 디자이너에서는 간단한 패턴 편집기를 제공하고 있습

니다. 패턴 편집기는 속성 쉬트에서 패턴 속성항목 옆에 “...” 으로 라벨이 붙은 버튼을 클릭하면 나타납니다.

5.4 다른 요소들

5.4.1 서브리포트

서브리포트 요소는 외부 ReportExpress 파일로 표현되는 다른 보고서를 하나의 보고서 내에 포함시킬 때 사

용하며, 부모 보고서에서 사용하는 데이터베이스 연결을 사용하거나 서브리포트 속성에서 지정한 데이터소

스를 사용하여 레코드를 공급할 수 있습니다.

87 / 318

Page 88: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

그림 5-27 서브리포트 요소

다음은 서브리포트의 특성에 대한 간단한 설명입니다:

서브리포트 표현식 런타임에서 서브리포트 표현식 클래스 객체를 리턴해주는 표현식을 지정합

니다. 서브리포트를 생성할 때 사용하는 ReportExpress 객체를 복원하기 위해

리턴되는 타입에 따라 표현식이 평가됩니다. 표현식 클래스를 java.lang.String

으로 설정할 경우에는 ReportExpress에서 이미지 요소의 이미지 표현식에서

설명한 것과 동일한 접근방식으로 파일을 찾게 됩니다.

Expreession Class 표현식의 클래스 타입입니다. 제공되는 옵션들은 각기 서로 다른 방법으로

ReportExpressReport 객체를 로딩하여 서브리포트를 채우게 됩니다.

캐쉬 사용 보고서내에서 서브리포트를 사용하게 될때마다 다시 로딩하는 것을 방지하

기 위해 보고서 객체를 메모리상에 유지시킬지를 설정합니다. 즉, 반복 밴드

에 서브리포트 요소가 위치하게 되면 메인 데이터셋트 내에서 레코드 하나당

한 번씩 출력되어집니다. 캐쉬는 서브리포트 표현식의 타입이 String 인 경우

에만(캐쉬에 대한 키값으로 이 문자를 사용하기 때문에) 작용합니다.

커넥션/데이터소스 표현식 런타임에 JDBC 연결이나 서브리포트를 채우는 RXDataSource를 리턴하게 되

는 표현식을 지정합니다. 또한 어떠한 데이터도 넘겨지지 않도록 사용자가 선

택할 수도 있습니다. 마지막 옵션은 서브리포트가 제대로 동작하도록 하기위

해 필요로 하는 일종의 편법이지만 때때로 매우 유용합니다. 데이터를 공급하

지 않는다면 일반적인 보고서와 마찬가지로 서브리포트도 빈 문서를 리턴하

게 되므로, 서브리포트 문서는 데이터가 없을때를 반복밴드를 제외한 모든섹

션들로 설정해주어야만 합니다.

매개변수 맵 표현식 런타임시에 java.util.Map 타입의 객체를 만들 때 사용하는 표현식. 서브리포트

의 매개변수를 위한 값을 설정해주기 위해서 맵에는 반드시 서브리포트에 넘

겨줄 이름/객체로 커플링된 셋트가 포함되어 있어야 합니다. 부모 리포트에서

넘겨받은 매개변수를 서브리포트의 매개변수 맵으로 넘겨주기위해 이 표현

식을 사용하지 말라는 제한은 없습니다.

매개변수 계산된 표현식을 사용해서 서브리포트의 매개변수를 위한 값을 동적으로 설

정할 때 유용한 커플링된 이름/표현식을 정의할 수 있게 합니다.

88 / 318

Page 89: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

반환값 서브리포트에서 계산한 값이나 처리되어진 값(총계와 레코드 갯수등)을 로컬

변수로 어떻게 저장할지를 지정하게 합니다.

5.4.2 프레임

프레임은 다른 요소들을 포함할 수 있으며, 포함된 주변에 경계선을 그릴 수 있습니다(그림 5-28).

그림 5-28 프레임 요소

프레임은 다른 요소들에 대한 컨테이너이기 때문에, 문서 아웃라인 뷰에서 프레임은 다른 요소들을 포함하

고 있는 노드로 표시되어 집니다(그림 5-29).

그림 5-29 아웃라인 뷰에서 표시되는 프레임

프레임은 다른 프레임도 포함할 수 있고, 이렇게 포함시키는 작업은 반복될 수도 있습니다. 프레임내에 요소

를 추가하려면, 팔레트에서 새로운 요소를 드래그하여 프레임 안쪽에 놓으면 됩니다. 또는 아웃라인 뷰를 사

용해서 밴드에서 프레임쪽으로 요소를 드래그 해주면 됩니다. 프레임 안에 위치시킨 요소들은 항상 컨테이

너 위치로부터 상대적인 위치가 됩니다. 컨테이너가 밴드일 경우라면, 요소의 좌표는 밴드의 윗쪽과 좌측면

으로부터 상대적인 거리가 됩니다. 컨터이너(요소의 부모)가 프레임이라면, 요소의 좌표는 프레임의 상단 좌

측 모서리로부터 상대적인 거리가 될 것입니다. 다른 컨테이너에 있는 요소를 드래그해서 다른 컨테이너로

옮기는 경우에는 상대적인 위치가 변경되지 않기 때문에 새로운 컨테이너 위치상에서 그 상대적인 위치를

다시 계산해주어야 합니다.

프레임내에 요소들을 집어넣고 그 경계선을 그려줄 경우에는 그냥 단순하게 사각형 요소를 사용해서 경계

선을 그릴때보다 다음과 같은 장점이 생기게 됩니다:

• 프레임을 움직이게되면, 이 프레임에 포함된 모든 요소들까지 동시에 움직이게 됩니다.

• 사각형을 사용해서 일부 요소를 오버래핑하게 되면, 사각형내의 요소들은 오버랩으로 처리되지 않

89 / 318

Page 90: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

습니다. HTML로 내보낼 경우에는 요소의 오버래핑을 지원하지 않으므로 문제되지 않습니다.

마지막으로, 프레임은 자신이 포함하고 있는 컨텐츠에 따라 자동으로 늘어나며 요소의 위치 타입 속성은 밴

드가 아닌 프레임 자신을 참조하여 보다 관리하기 쉬운 디자인을 만들어줍니다.

5.4.3 차트

차트에 관련된 자세한 사항은 12장에 기술하였습니다.

5.4.4 크로스탭

크로스탭에 관련된 자세한 사항은 16장에 기술하였습니다.

5.4.5 페이지/컬럼 나누기

페이지와 컬럼 나누기는 레포트 엔진에서 강제로 다음 페이지나 컬럼에서 출력되도록 할 때 사용됩니다.

단일 컬럼 사용의 경우 컬럼 나누기를 만나면, 페이지 나눔과 동일한 효과를 만들어 냅니다.

디자인 뷰에서는 나누기는 작은 선으로 표시됩니다. 이 크기를 조정하려고 하면, 기본 크기로 리셋되는데 이

는 보고서 디자이너에서 강제적으로 페이지나 컬럼을 나누도록 페이지상에서 수직 위치로 지정되었기 때문

입니다. 나누기의 타입은 속성쉬트에서 변경할 수 있습니다.

5.5 커스텀 컴포넌트와 범용 요소 추가하기

내장된 요소 이외에도 보고서에서는 “커스텀 컴포넌트”와 “범용 요소”라고 불리는 여러분이 직접 만들어서

플러그인 시킬 수 있는 두 개의 기술을 지원합니다. 커스텀 요소 프로바이더에서 제공하는 플러그인 없이는

할 수 있는 것이 별로 없습니다. 단지 공통 요소 속성만을 설정할 수 있습니다. 따라서, 커스텀 요소 개발자는

보고서 디자이너용 플러그인을 제공함으로써 보고서의 팔레트 아이템에 추가시키고, 이 요소가 선택될 경우

속성 쉬트에서 요소의 속성들을 수정할 수 있게 됩니다. 보다 자세한 사항은

http://www.cabsoftware.com/reportexpress/docs/api/ 를 참고하십시오.

5.6 앵커

이미지, 텍스트필드 및 차트 요소에서는 문서내에 앵커 또는 외부 소스나 다른 로컬 앵커로의 하이퍼텍스트

링크를 사용할 수 있습니다. 앵커란 문서내에 지정된 위치를 가리키는 일종의 라벨입니다. 하이퍼텍스트 링

크와 앵커는 그림 5-30에서 보여지는 하이퍼링크 대화창을 사용해서 정의하게 됩니다.

90 / 318

Page 91: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

하이퍼링크 대화창은 크게 두 부분으로 나뉘어져 있습니다. 윗쪽 영역은 앵커의 이름이 될 표현식을 지정할

수 있도록 텍스트 영역으로 되어 있습니다. 이 이름은 다른 링크에 의해 참조될 수 있습니다. 보고서를 PDF

로 내보내려고 한다면, 북마크 레벨을 사용해서 북마크 트리를 생성시켜 최종 생성된 문서의 네비게이션을

보다 쉽게 할 수 있습니다. 북마크에서 앵커를 사용하도록 하려면, 북마크 레벨을 1보다 큰 값으로 선택하면

됩니다. 레벨을 큰 값으로 사용하게 되면 중첩된 북마크를 생성시킬 수 있습니다.

아랫쪽 영역은 외부 소스나 문서내의 위치에 대한 링크 정의를 위한 사항들입니다. 하이퍼링크 타겟 옵션을

통해 현재 윈도우(이것이 기본 설정된 설정으로 타겟은 Self임)나 새로운 윈도우(타겟은 Blank)상에 지정한

링크를 보여줄지 결정할 수 있습니다. 이러한 동작에 대한 제어는 HTML과 PDF와 같은 특정한 포맷으로 내

보낼때만 의미가 있습니다.특히나 HTML과 PDF에서는 Top과 Parent 타겟을 사용하여 링크된 문서를 보여주

기 위해 현재 윈도우뿐만 아니라 이벤트가 일어난 프레임의 외부와 부모 윈도우(사용 가능할 경우라면)도

가능합니다.

아래에서 하이퍼링크 윈도우에서 텍스트 아웃라인을 지정해주는 옵션에 대해 살펴보도록 하겠습니다.

5.6.1 하이퍼링크 타입

보고서에서는 다섯가지 내장된 하이퍼링크 타입을 제공하고 있습니다 : Reference, LocalAnchor, LocalPage, RemoteAnchor, RemotePage.

어쨌든, 다른 타입들은 보고서에 구현되어 플러그인 되었습니다(드릴다운 기능을 구현하기 위해서

ReportExpress 서버에서 사용하는 ReportExecution 타입처럼).

링크 타입의 목록은 다음과 같습니다:

(일부 내보내기 포맷에서는 하이퍼텍스트 링크를 지원하지 않습니다.)

91 / 318

그림 5-30 하이퍼링크 윈도우

Page 92: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

Reference 일반적인 URL을 사용하여 지정한 외부 소스를 가리킵니다. 레코드의 드릴-다운 툴 관리

를 위해서 이상적인 방식입니다. 필요한 표현식은 오직 하이퍼링크 레퍼런스 표현식입

니다.

LocalAnchor 로컬 앵커를 지정한다는 것은 동일한 문서상에서 두 위치사이에 링크를 만든다는 것 입

니다. 목차나 요약에서 타이틀에 해당되는 챕터위치를 참조시킬 때 사용합니다. 로컬 앵

커를 만들기 위해서는 올바른 앵커 이름을 만들어주는 하이퍼링크 앵커 표현식을 사용

해야 합니다.

LocalPage 앵커를 지정하는 대신 보고서 페이지를 지정하고자 한다면, LocalPage 링크를 만들어야

합니다. 이를 위해서는 하이퍼링크 페이지 표현식에서 페이지 번호가 지정되어야 합니

다. 즉, 표현식이 Integer 객체를 리턴해야 합니다.

RemoteAnchor 외부 문서에 존재하는 특정 앵커를 지정하려면, RemoteAnchor 링크를 사용해야 합니다. 외부

파일을 가리키는 URL은 하이퍼링크 레퍼런스 표현식 필드에서 지정해야만 하고, 앵커의 이름은

하이퍼링크 앵커 표현식 필드에 지정해주어야 합니다.

RemotePage 이 링크는 외부 문서의 지정한 페이지를 가리키게 합니다. 외부 파일을 가리키는 URL에

서 처럼 하이퍼링크 레퍼런스 표현식 필드에 지정해주고 페이지 번호는 하이퍼링크 페

이지 표현식을 사용해서 지정합니다.

ReportExecution 이 링크는 다른 보고서의 실행을 지정합니다.

5.6.2 하이퍼링크 매개변수

종종 링크에 덧붙여줄 매개변수를 정의해줄 필요가 생깁니다. 링크 매개변수 테이블에서는 이를 위한 편리

한 방법을 제공하고 있습니다. 매개변수 값은 표현식을 사용하여 설정할 수 있습니다. 매개변수 표현식은

URL에서 인코딩되기 때문에 문자열로 처리합니다. 하지만, 커스텀 링크 타입을 사용할 경우라면 매개변수에

다른 타입을 설정하는 것이 나을 수도 있습니다.

5.6.3 하이퍼링크 툴팁

툴팁 표현식은 하이퍼링크를 나타내는 요소위에 마우스를 올려놓을 경우에 보여주는 텍스트(툴팁)를 설정할

때 사용합니다. 이 기능은 내보낸 포맷에서 상호작용이 가능할 때만 동작하게 됩니다.

92 / 318

Page 93: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

6 장. 필드, 매개변수 그리고 변수

보고서에서는 값을 저장할 수 있는 세 개의 객체 그룹이 있습니다:

• 필드

• 매개변수

• 변수

보고서 디자이너는 데이터소스 질의에서 이 객체들을 사용합니다. 이 객체들은 자바 클래스(String 이나

Double과 같은)에 대응되는 올바른 타입으로 선언되어져야만 합니다. 보고서 디자이너 내에서 선언한 후에

는 보고서 생성과정에서 이 객체가 수정되거나 갱신될 수 있습니다.

그림 6-1 아웃라인 뷰에서의 보고서 객체

필드, 매개변수 그리고 변수는 보고서에서 사용하기 위해서는 반드시 선언되어져야 합니다. 일단 선언한 후

에는 보고서 인스펙터 뷰(그림 6-1)를 사용하여 관리할 수 있습니다. 보고서 인스펙터에서 새로운 객체를 선

언할 수도 있고 제거할 수도 있으며 수정도 가능해집니다. 이번 장은 다음 섹션들로 구성되어 있습니다:

• 필드 사용하기

• 매개변수 사용하기

• 변수 사용하기

• 보고서 생성과정에서 요소 평가하기

93 / 318

Page 94: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

6.1 필드 사용하기

프린트는 보통 일련의 필드로 구성된 레코드의 집합을 제공하는 데이터소스로부터 만들어지기 시작합니다.

이것은 마치 SQL 질의 결과를 얻는 것과 유사하게 동작하게 됩니다. 보고서 디자이너에서는 문서 아웃라인

뷰에서 필드 노드의 자식으로 사용가능한 필드를 보여주게 됩니다. 필드를 만드려면, 필드 노드에서 오른쪽

클릭으로 필드추가 메뉴를 선택합니다. 새로 추가되는 필드는 보고서 인스펙터내에 정의되지 않은 자식 노

드로 보여지게 됩니다. 이 노드의 속성 시트에서 필드 속성을 설정해줄 수 있습니다(그림 6-2).

그림 6-2 필드 속성 대화창

필드는 고유한 이름으로 지정되어야 하며, 타입과 함께 부가적인 설명도 지정합니다. 또한, 각 필드에 대해

이름/값 쌍으로된 속성 세트를 지정해 줄 수도 있습니다. 이러한 커스텀 속성은 ReportExpress에서 직접 사용

하지는 않지만, 외부 어플리케이션이나 커스텀 모듈(특별한 질의 실행기)에서 사용할 수 있습니다. 아웃라인

뷰의 컬럼 오른쪽에 놓여진 “...” 버튼을 클릭해서 속성 편집기(그림 6-2)를 사용하여 커스텀 속성을 설정해

줄 수 있습니다.

그림 6-3 필드 – 커스텀 속성

커스텀 속성에 대해 설명하기 전에, 보고서 디자이너는 선택한 필드를 자신의 설명필드로 간주하도록 부가

적인 정보를 포함시키게 됩니다. 이러한 예로는 XML 데이터소스(데이터소스로써 XML 파일을 사용)를 사용

94 / 318

Page 95: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

할 때 필드를 정의하는 것이 될 수 있습니다. 여기서 필드 이름은 임의의 것이 될 수 있으나 설명 속성에는

XML 문서내에 있는 값을 지시하는 XPath 표현식이 들어가게 됩니다.

보고서 디자이너는 여러분이 사용할 데이터소스를 기초로 하는 필드에 대한 값을 결정합니다. 즉, SQL 질의

를 사용해서 보고서를 채울 경우에는 필드의 이름을 질의 결과셋으로 얻어지는 필드의 이름과 동일하다고

가정하게 됩니다. 여러분은 데이터소스의 필드명과 타입이 보고서의 필드 이름과 타입에 일치되는지를 확인

해야만 합니다. 이제 여러분에게 보고서 디자이너에서 제공하는 툴을 사용하여 시스템적으로 필드들을 정의

하고 설정해주는 방법을 보여드리도록 하겠습니다. 보고서에서 사용되는 필드의 갯수가 꽤 많아질 수도 있

기 때문에(간혹 백여개까지도 될 수 있음), 보고서 디자이너에서는 지정된 데이터소스 타입으로부터 선언한

필드를 처리할 수 있는 또다른 도구를 제공하고 있습니다. 텍스트필드의 컨텐츠를 설정할 때 사용한 것과 유

사한 보고서 표현식들 안에는 다음과 같은 문법을 사용하는 필드 객체를 지정합니다:

$F{<필드명>}

여기서 <필드명>은 반드시 필드의 이름으로 대체해야 합니다. 필드 표현식을 사용할때는 null 값을 가질 수

있다는 점을 명심해야 합니다. 따라서 표현식의 조건을 반드시 검증해야 합니다. 널값의 검증을 위한 자바

표현식은 다음과 같습니다:

($F{myField} != null) ? $F{myFiled}.doSomething() : null

위의 메쏘드를 통해 필드 뿐만 아니라 모든 객체의 널값 검증이 가능합니다. 그루비나 자바스크립트를 사용

할 경우에는 널값이 거의 문제를 유발하지 않습니다만, 자바 언어로 표현식을 사용할 경우에는 반드시 널 값

에 대한 처리가 이루어져야 합니다. 다른 언어에서는 널값을 빈 문자열로 리턴시켜 예외가 일어나지 않게 됩

니다. 이러한 이유로 표현식에 자바언어 대신 그루비나 자바스크립트를 사용하도록 권장하고 있습니다.

11장에서 우리는 String 이나 Integer같이 간단한 값 뿐만 아니라, 자바빈과 같은 복잡한 객체까지도 필드가

될 수 있다는 것을 배우게 됩니다. 일반적인 객체를 문자열로 변환하는 속임수로는 다음과 같이 빈 문자열을

덧붙여주는 것입니다:

$F{myfield}+ “”

모든 자바 객체는 문자열로 변경시킬 수 있습니다. 위의 표현식 결과는 각 객체 구현에 따라 달라집니다.

ToString() 메쏘드를 구현하여 처리할 수도 있습니다. 객체가 널일 경우에는 “null” 이라는 문자로된 값을 리턴

하게 됩니다.

6.1.1 SQL 질의로부터 필드 등록하기

보고서를 채우는 가장 흔한 방법은 SQL 질의를 사용하는 것 입니다. 보고서 디자이너는 질의 디자이너를 포

함해서 다양한 도구를 통해 SQL을 다룰 수 있도록 하고 있습니다. 또한 보고서내에서 사용된 질의로부터 자

동으로 필드를 가져와서 등록하게 됩니다.

95 / 318

Page 96: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

그림 6-4 질의 편집기 대화창 버튼

디자이너의 툴바에 있는 실리콘 모양의 아이콘을 클릭해서 질의 편집기 대화창을 열 수 있습니다(그림 6-4).

질의 편집기 대화창을 열기전에 활성화된 보고서 데이터소스가 존재(메인 툴바에 위치한 콤보박스에서 아

이템이 선택되어 있는지)하는지 확인하십시오.

보고서 질의 대화창에는 다섯개의 질의 도구가 들어있으며, 각각의 도구는 탭으로 선택할 수 있습니다

(그림 6-5): • 보고서 질의

• 자바빈 데이터소스

• 데이터소스 프로바이더

• CSV 데이터소스

• 엑셀 데이터소스

이제부터 보고서 질의탭의 기능에 대해 알아보도록 하겠습니다. 여기서 여러분은 보고서 디자이너에서 사용

할 질의를 지정하여 보고서 생성에서 사용할 수 있도록 합니다.

96 / 318

그림 6-5 질의 편집기 대화창

Page 97: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

보고서 디자이너에서는 보고서 생성을 위해 질의를 만들 필요가 없습니다. 실제적으로 보고서 디자이너는

질의 실행기에서 정의되지 않은 데이터소스로부터 데이터 레코드를 획득할 수 있습니다. 여기서는 질의를

만들어서 사용하도록 할 것입니다. 질의에 사용되는 언어는 질의 대화창 상단에 위치한 콤보박스에서 제공

하는 목록들중에 하나를 선택할 수 있습니다.

보고서에서는 일반적으로 많이 사용하는 질의 언어들을 지원하고 있습니다: • SQL• Hibernate Query Language(HQL)• XPath• EJBQL

• MDX (표준과 XMLA-encapsulated 버전 모두)• XMLA-MDX• xpath2• plsql

여기서는 SQL에 대해 알아보도록 하겠습니다. 여러분이 JDBC 연결을 데이터소스로 선택했다면, 보고서 디

자이너는 여러분이 입력한 SQL문에 대해 데이터소스쪽으로 연결이 가능한지를 테스트하게 됩니다. 이를 통

해 결과셋으로부터 질의에 대한 메타데이터를 사용해서 보고서에서 사용될 필드를 자동으로 식별하게 됩니

다. 디자인 툴은 윈도우 하단에 검색결과로 부터 찾은 필드들을 나열해 줍니다. 각 필드는 JDBC 드라이버를

통해 필드의 이름과 자바 타입을 결정하게 됩니다.

데이터가 많고 하나 이상의 테이블을 이용하는 질의문을 사용할 경우에는 보고서 디자이너에서 필드 이름

을 찾기위해 데이터소스를 스캔하는데 소요되는 시간이 상당히 길어질 수 있습니다. 이러한 경우, 보다 빠르

게 질의 정의단계를 끝내기 위해서는 자동으로 필드 가져오기 옵션을 꺼주면 됩니다. 질의문 작성 단계를 완

료한 후에는 필드를 자동으로 찾도록 하기위해 필드읽기 버튼을 클릭합니다. 질의에서 사용되는 모든 필드

들은 서로 구별되는 이름이어야만 합니다. 동일한 이름을 갖는 필드에 대해서는 필드의 앨리어스를 사용해

서 같은 필드의 이름을 갖지 않도록 해주십시오.

질의 실행과정에서 오류가 발생한다면(문법적인 오류 혹은 데이터베이스 연결을 사용할 수 없는 경우 등),

필드 목록대신 오류메시지가 보여지게 됩니다.

복잡하게 구성된 테이블을 이용할 경우 스캔되어진 필드이름의 갯수가 상당히 많을 수도 있습니다. 자동으

로 검출되어진 필드이름의 목록을 살펴보면서 보고서에서 사용하지 않을 필드들을 제외시켜주시는 과정을

거치도록 권장합니다. 이러한 과정을 통해 보고서에 걸리는 부하를 줄여줄 수 있습니다. 이제 확인버튼을 눌

러 목록에서 보여지는 모든 필드들을 보고서 디자인에서 사용할 수 있도록 합니다. 이렇게 해서 추가한 필드

들은 후에 아웃라인 뷰에서 제거해줄 수도 있습니다만, 질의문을 디자인하는 과정에서 사용하지 않을 필드

를 미리 제거해주는 것이 좋습니다.

97 / 318

Page 98: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

6.1.2 SQL 질의 디자이너 사용하기

보고서 디자이너에서는 SQL문을 작성하는 전문적인 지식이 없어도 간단하게 질의문을 만들 수 있도록 하기

위해 비쥬얼한 질의 디자이너를 제공하고 있습니다. 질의 디자이너버튼을 클릭하여 질의 디자이너를 사용

(JDBC 연결이 활성화되어 있고, 질의문에 사용된 언어가 SQL로 선택한 경우에만)할 수 있습니다.

보고서 디자이너에서 제공하는 SQL 질의 디자이너는 드래그앤 드롭 방식으로 질의문을 작성할 수 있게 합

니다(그림 6-6). 질의문을 작성하려면, 메인 패널쪽에 사용할 테이블을 드래그해야 합니다. 디자이너에서는

테이블간의 조인도 가능합니다. 두 테이블에 조인을 사용하기 위해서는 조인할 필드가 있는 테이블에서 해

당 필드를 다른 테이블의 필드로 드래그하십시오. 조인 타입은 조인을 표시하는 선의 중간지점에 빨간 사각

형으로된 조인 아이콘을 오른쪽 클릭하여 지정할 수 있습니다. 조건을 추가하려면, 질의 트리상에서 Where

노드를 오른쪽 클릭합니다. Group By와 Order By 노드쪽에 필드를 추가하려면, SELECT 노드아래의 필드에서

오른쪽 클릭하시면 됩니다.

98 / 318

그림 6-6 SQL 질의 디자이너

Page 99: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

6.1.3 자바빈으로 부터 필드 등록하기

보고서의 진보적인 기능중에 하나가 바로 SQL 질의문을 기반으로 하지 않는 데이터소스들을 관리할 수 있

다는 점입니다. 대표적인 예로는 자바빈 컬렉션을 데이터소스로 사용할 수 있다는 것입니다. 자바빈 컬렉션

에 대해서는 컬렉션을 구성하고 있는 각각의 항목이 하나의 레코드를 표현한다고 할 수 있겠습니다.

보고서에서는 컬렉션내의 모든 객체들을 동일한 자바 클래스의 인스턴스로 가정하게 됩니다. 이 경우, “필드

”는 바로 객체의 속성(또는 속성의 속성)이 됩니다. 질의 디자이너에서 자바빈 데이터소스 탭을 선택하여, 선

택한 자바클래스에 대응하는 필드들을 등록할 수 있습니다. 이를 위해서는 사용할 자바클래스를 보고서에서

사용하기 위한 객체로 알고 있다는 전제하에서 가능합니다.

자바 클래스의 객체를 사용하기 위한 시나리오:

com.cabsoft.rxd.examples.beans.PersonBean

이 클래스에 대한 필드를 등록하는 방법:

1. 이름 필드에 클래스 이름을 입력한 후, 속성읽기 버튼을 클릭합니다. 보고서 디자이너에서 해당 클래

스를 스캔합니다.

99 / 318

그림 6-7 자바빈 데이터소스에서 필드 등록하기

Page 100: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

2. 보고서 디자이너에서 캡쳐한 객체 속성에 대한 클래스 타입에 대해 확인해 주십시오.

3. 보고서에서 사용할 필드들을 선택하고, 선택한 필드(들) 추가 버튼을 클릭합니다.

4. 선택된 속성들에 대응하는 새로운 필드들이 보고서에 만들어져서 목록에 나타나게 됩니다. 지정된

필드에 대한 값을 가져오기 위해 호출되어야할 데이터소스 메쏘드가 설명 필드쪽에 저장됩니다.

보고서 디자이너에서는 address.state(두 속성 사이에 마침표 문자로 구분)와 같은 설명을 속성 경로로 파싱합

니다. 속성 경로는 대상 속성을 가리키는 getAddress() 함수로 넘어가서 속성의 상태를 질의하도록 getState()

메쏘드를 호출하게 됩니다. 경로의 길이에는 제한이 없으며, 보고서 디자이너는 복잡한 자바빈에 대해서도

재귀적인 속성 트리 파싱을 하여 매우 정교하게 필드를 가져와서 등록할 수 있습니다.

지금까지 필드를 등록할때 가장 많이 사용되고 있는 두 가지 도구에 대해 알아보았습니다만, 끝은 아닙니다.

필드를 등록하기 위해 사용되는 도구는 매우 다양합니다. HQL과 XML 노드 맵핑 도구도 있습니다. 이 도구

들에 대한 자세한 설명은 11장에서 다루어집니다.

6.1.4 필드와 텍스트필드

텍스트 요소에 필드를 출력하려면, 표현식을 지정해야 하며, 필드텍스트의 클래스 타입도 올바르게 설정해야

만 합니다. 또한 필드의 포맷 패턴도 정의해줄 수 있습니다. 포맷 패턴에 대한 자세한 내용은 5.3.2 “텍스트필

드”를 참고하십시오.

필드에 대응되는 텍스트 필드를 보고서 디자인상에 만들기 위해서는 보고서 인스펙터 뷰에 있는 필드를 디

자인 패널에 드래그합니다. 보고서 디자이너가 필드에 해당되는 표현식(즉, $F{선택한_필드명})을 갖는 새로

운 텍스트필드 요소를 만들고, 올바른 클래스이름도 설정해줍니다.

6.2 매개변수 사용하기

매개변수는 보고서를 사용하는 어플리케이션에서 요청하는 값을 보고서쪽에 넘겨줄 때 사용됩니다. 이렇게

넘겨진 매개변수는 보고서를 생성하는 과정에서 특정한 보고서의 기능을 설정할 때 사용되는데, 대표적인

예로는 SQL 질의문에서 조건문에 필요한 값들을 설정해주게 됩니다. 또한, 데이터소스에서 제공되지 않는

데이터를 부가적으로 제공할 때도 사용합니다. 즉, 보고서의 타이틀을 커스터마이징 한다거나, 어플리케이션

에 따라 설정해준 이미지 경로나 이미지 객체등도 매개변수로 넘겨줄 수 있습니다. 다른 보고서 객체처럼,

매개변수 또한 클래스 타입을 지정해야 하며 보고서 디자인 시점에서 이를 지정해야만 합니다(그림 6-8).

매개변수의 타입에 제한은 없습니다만, 매개변수의 이름은 고유해야만 합니다.

100 / 318

그림 6-8 매개변수 정의

Page 101: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

속성 프롬프트로 사용은 보고서에서 직접적으로 사용하지는 않습니다. 이 속성은 매개변수의 특별한 플래그

로써 외부 어플리케이션에서 사용됩니다. 보고서 템플릿에서 어떤 매개변수를 입력받을 수 있도록 프롬프트

를 보여주어야 하는지를 확인할 수 있습니다. 속성 기본값 표현식은 매개변수의 기본설정값을 지정해줄 수

있습니다. 이렇게 지정한 기본설정값은 보고서를 실행시키게 되는 어플리케이션에서 매개변수가 제공되지

않을 경우 사용되어집니다. 매개변수의 값은 매개변수 클래스에서 정의한 타입과 일치해야만 합니다. 매개변

수의 값은 데이터소스에서 첫번째 레코드를 가져오기 전에 설정되어져야만 하기 때문에, 매개변수 표현식에

서는 필드나 변수를 사용할 수 없습니다. 기본값 표현식의 값을 다른 매개변수로 지정할 수는 있지만, 보고

서 디자인할때 세심한 주의를 필요로 합니다. 보고서 디자이너는 매개변수를 선언한 순서에 따라서 파싱을

합니다. 따라서, 기본값 매개변수를 반드시 사용할 매개변수보다 먼저 정의해 주어야 합니다. 이러한 방식이

조금은 기교적으로 들리지만, 다른 매개변수에 의존하는 매개변수를 사용해서 처리해야 하는 보고서를 만들

때는 매우 유용한 팁입니다.

이제 예제를 살펴보겠습니다. 다음과 같은 질의문을 사용한다고 가정해 보겠습니다:

SELECT * from ORDERS where ORDERDATE in between $P{DATE_START} and $P{DATE_END}

이 질의문에는 두 개의 매개변수가 사용되었습니다: DATE_START 와 DATE_END, 두 매개변수 모두 자바에

서 날짜를 표현할때 사용하는 java.util.Date 클래스입니다. 이제 사용자가 상대적인 값으로 기간을 선택할 수

있게 해보겠습니다. 즉, “이번달” 이나 “오늘”처럼 시작일과 종료일을 분리시켜 입력받지 않겠습니다. 입력받

은 문자열값을 세번째 매개변수(PERIOD라고 부르겠습니다)로 설정해서 사용자나 어플리케이션 요청으로부

터 날짜 값을 입력받게 합니다. DATE_START 와 DATE_END 매개변수의 기본설정값에 대한 표현식에

PERIOD 매개변수의 값을 이용하여 계산해서 사용할 수 있도록 하겠습니다. 이러한 날짜 계산이 가능한 자

바 클래스가 만들어져 있다는 가정하에, DATE_START에 대한 기본 표현식 매개변수는 다음과 같이 됩니다:

MyPeriodCalculator.getDateStart( $P{PERIOD} )

이제 다른 매개변수에 근거하여 다른 매개변수의 기본 값을 동적으로 설정하는 방법을 배워보았습니다. 위

의 예제에서 사용한 가상의 클래스인 MyPeriodCalculator에 대한 자바코드 제작에 대한 사항은 본 문서의 범

위를 벗어나므로 다루지는 않겠습니다.

다음 섹션에서 우리는 SQL 질의내에서 매개변수를 사용하여 매개변수의 값뿐아니라, SQL 질의문의 일부분

혹은 전체까지도 지정하는 방법에 대해서 알아보겠습니다. 이러한 방법으로 여러분은 보고서 파라메터를 사

용하여 동적인 질의문을 사용할 수 있게 됩니다.

매개변수의 설명 속성은 보고서에서 직접적으로 사용하지않는 속성이지만, 프롬프트로 사용 속성처럼 다른

외부 어플리케이션에 넘겨줄 수 있습니다.

마지막으로, 필드에서 처럼 여러분이 각각의 매개변수에 이름/값 쌍으로된 속성을 지정해 줄 수 있습니다. 이

렇게 추가한 매개변수의 추가정보는 외부 어플리케이션에서 사용되는 정보가 됩니다. 디자이너에서는 이 속

성을 다른 언어를 사용하여 매개변수의 설명 속성에 포함시키거나 입력 프롬프트의 포맷에 대한 안내문으

101 / 318

Page 102: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

로 사용할 수 있습니다.

6.2.1 질의에서 매개변수 사용하기

일반적으로는 매개변수가 보고서 생성과 관련되는 질의에 사용됩니다. 이번 장에서 우리는 질의의 일반적인

타입에서 제일 흔하게 사용될 수 있는 SQL질의내에서 매개변수를 사용하는 방법에 대해 알아보겠습니다.

고객에 대한 정보를 보여주는 보고서가 있다고 가정해 보겠습니다. 보고서를 생성할때 우리는 고객 관리번

호를 지정해서 보여주게 하고 싶다면, 질의문 내의 조건에 이에 대한 정보를 넘겨주어 처리하도록 해야 합니

다. 사용된 질의는 다음과 같을 것입니다:

select * from customers where CUSTOMERID = $P{MyCustomerId}

여기서 MyCustomerID는 매개변수로써 질의문에 사용되는 매개변수를 위한 문법은 다른 매개변수를 참조하는 표현식에

서 사용했던것과 동일합니다. SQL에 매개변수가 이용되는 방식에 대한 상세한 사항은 나중에 이야기 하겠습니다. 지금

은 보고서에서 어떻게 이 질의문을 해석하는지만 언급하겠습니다:

select * from customers where CUSTOMERID = ?

물음표 문자는 SQL에서는 “질의를 실행하기전에 SQL문에 제공될 값이 들어가는 곳”이라는 표준 기호입니

다. 보고서에서 하게되는 것과 정확하게 일치합니다: 보고서에서는 질의문을 질의로 사용할 때 각 매개변수

로 넘어가는 값을 사용하여 질의를 실행합니다. 이러한 방법은 질의 문장을 매개변수를 포함시켜 만들어서

질의를 하는 방법보다 커다란 장점을 갖게 합니다. 이런 방식으로 처리하게 되면 매개변수로 넘어오는 값에

대한 유효성과 보안을 위협하는 문자열을 데이터베이스에서 처리하게 되므로 편리합니다. 이와 동시에, 질의

구조에 대한 책임을 제한하게 합니다. 즉, 매개변수내에 다른 질의문의 일부를 지정하지 못하게 합니다. 따라

서, 매개변수에 WHERE나 GROUP BY 절 전체를 넘길수가 없게 됩니다. 매개변수에 질의문의 일부분까지 포

함해서 사용하려면 다음과 같은 특수한 문법을 이용합니다:

$P!{<parameter name>}

느낌표를 $P 다음에 붙입니다. 느낌표는 보고서가 매개변수를 앞에서 언급했던 물음표(?)처럼 SQL 매개변수

로 바인딩하지 말고, 질의문의 일부분으로 사용하도록 하라고 지시하게 됩니다. 즉, "where CUSTOMERID =

5"이라는 값을 갖는 MyWhere라는 이름의 매개변수를 질의문에서 사용하려면:

select * from customers $P!{CUSTOMERID}

처럼 해야 하고, 이 경우 다음과 같이 변경되어 사용됩니다(이렇게 사용하면 SQL 매개변수 로직은 사용되지

않습니다. 따라서 SQL Injection 공격에 취약하게 됩니다!!!):

select * from customers where CUSTOMERID = 5

이와 같은 방식은 넘겨주는 매개변수가 질의문의 일부가 되기 때문에 올바른 문법이어야만 최종적으로 만

들어진 질의문 실행에서 오류가 없어진다는 것과 보안에 매우 취약해집니다. 따라서, 실제 적용시에는가급적

이면 사용하지 않도록 권장합니다.

102 / 318

Page 103: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

6.2.2 IN 과 NOT IN 구문

보고서에서는 where 조건절에 사용할 수 있는 특별한 문법을 제공합니다: IN 과 NOT IN 구문.

이 구문은 특정한 값이 일련의 범위값내에 존재하는지를 점검하고자 할 때 사용됩니다. 사용예는 다음과 같

습니다: SELECT * FROM ORDERS WHERE SHIPCOUNTRY IS IN ('USA','Italy','Germany')

위의 예에서 값의 범위세트는 USA, Italy 그리고 Germany 입니다. 매개변수로 값의 범위셋트를 리스트(혹은

java.util.Collection)나 배열로 넘겨주었다고 가정하면, 넘겨받은 매개변수를 사용하여 동적인 질의로 변경했

을 경우 다음과 같이 작성됩니다: SELECT * FROM ORDERS WHERE $X{IN, SHIPCOUNTRY, myCountries}

여기서 myCountries는 일련의 값 범위를 포함하는 셋트를 넘겨주는 매개변수의 이름이 됩니다. $X{} 구문은

세 개의 매개변수를 받습니다:

• 함수 적용 타입 (IN 또는 NOT IN)

• 판단할 필드이름

• 매개변수 이름

보고서에서는 각각의 값에 대해 특수한 문자로 처리합니다. 만일 매개변수가 널이거나 빈 리스트일 경우, 매

개변수에 값을 설정하지 않게되어 전체 $X{} 구문은 항상 true 를 리턴해주는 “0==0’’ 구문으로 처리합니다.

6.2.3 내장된 매개변수

보고서에서는 읽기는 하지만 수정할 수는 없는 내장된 매개변수(보고서 엔진에 구현된)를 제공합니다. 이 내

장된 변수들은 다음과 같습니다:

표 6-1 ReportExpress 내장 변수

매개변수 설명

REPORT_PARAMETERS_MAP fillReport 메쏘드에 넘겨주는 java.util.Map 입니다. 사용자가 정의한 매

개변수 값을 포함하고 있습니다.REPORT_CONNECTION SQL 질의를 통해 보고서를 만들때 넘겨주는 JDBC 연결입니다.REPORT_DATA_SOURCE

보고서가 JDBC 연결을 사용하지 않을때의 데이터소스입니다.REPORT_SCRIPTLET

보고서 생성과정에서 사용되는 스크립틀릿 인스턴스를 나타냅니다. 스

크립틀릿을 지정하지 않은 경우에는

com.cabsoft.rx.engine.RXDefaultScriptlet* 인스턴스를 사용합니다.IS_IGNORE_PAGINATION

이 매개변수로 시스템의 페이지별 생성을 끄거나 켤 수 있습니다. 따

라서 부울린 객체이어야만 합니다. HTML과 Excel 포맷으로 내보낼 때

를 제외하고는 기본적으로 페이지별 생성이 켜져 있습니다.REPORT_LOCALE

보고서를 채울때 사용하는 로케일입니다. 로케일을 지정하지 않았다

면, 시스템의 기본 로케일을 사용합니다.REPORT_TIME_ZONE

보고서를 채울때 사용하는 시간대 입니다. 값을 지정하지 않으면, 시스

103 / 318

Page 104: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

템의 기본값을 사용합니다.REPORT_MAX_COUNT

보고서를 채우는 레코드의 수를 제한하고자 할 때 사용됩니다. 값을

지정하지 않으면, 무제한으로 설정됩니다.REPORT_RESOURCE_BOUNDLE

보고서에서 로딩시킨 리소스번들 입니다. 보고서에 리소스번들을 제공

하는 방법은 11장에서 다루어집니다.REPORT_VIRTUALIZER

보고서를 채울 수 있도록 고안된 RXVirtualizer 인터페이스를 구현한 클래

스를 정의합니다.

REPORT_FORMAT_FACTORY com.cabsoft.rx.engine.util.FormatFactory의 인스턴스입니다. 사용자가 기본 설정

된 것을 교체시킬 수 있으며 매개변수를 사용해서 커스텀 버전을 지정할 수

있습니다. 포맷 팩토리를 지정하는 다른 방법으로는 보고서의 format factory

class 속성을 설정하는 것 입니다.

REPORT_CLASS_LOADER보고서를 채울때 사용하는 클래스 로더를 지정할 때 사용되는 매개변

수입니다.REPORT_URL_HANDLER_FACTORY URL 핸들러를 만들어줄 때 사용하는 클래스. 지정하지 않는다면, 기본

값으로 대체합니다.REPORT_FILE_RESOLVER

리소스의 위치를 해석할 때 사용하는

com.cabsoft.rx.engine.util.FileResolver의 인스턴스이며, 기본 구현된 것을

교체하기 위해 보고서에 넘겨줄 수 있음

REPORT_TEMPLATES부가적인 스타일(RXTemplate) 컬렉션으로 보고서에서 정의한 것에 추가

하여 사용할 수 있습니다.

* ReportExpress 1.0.0 부터 스크립틀릿 클래스에 캐스트 기능이 함축되어 수행됩니다. 이를 통해 스클립틀릿 클래스에서 제공하는 많

은 표현식을 간단히 사용할 수 있게 되었습니다.

6.2.4 프로그램으로 부터 매개변수 넘기기

보고서 디자이너에서는 java.util.Map 인터페이스를 상속한 클래스를 사용하여 출력을 생성하는 “caller”라는

프로그램에서 매개변수를 전달받습니다. 코드예제 3-2에서 보여주고 있는 코드중 다음 줄과 관련되어 있습

니다: ...HashMap hm = new HashMap();...ReportExpressPrint print = ReportExpressFillManager.fillReport(fileName,hm,new RXEmptyDataSource());...

fillReport 메쏘드는 매개변수로 파일 이름, 매개변수 맵, 데이터소스를 넘겨받아서 보고서 인스턴스를 생성시키도록 합니

다. 예제에서는 RXEmptyDataSource 클래스를 사용하여 더미 데이터소스를 만들고, java.util.HashMap 객체를 사용해서 빈

매개변수 맵을 만들고 있습니다. 보고서 타이틀을 지정하여 보고서를 만들도록 간단한 매개변수를 넘기는 방법을 살펴

보겠습니다.

104 / 318

Page 105: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

처음 해줄 일은 보고서에 매개변수를 만들어서 타이틀 문자열을 담게하는 것입니다. 이 매개변수의 이름은

REPORT_TITLE이라고 하고 그 클래스는 java.lang.String으로 설정합니다(그림 6-9).

다른 속성들은 그냥 놔두고 진행합니다. 특히, 기본 값 표현식은 건드리지 않겠습니다. 타이틀 밴드에 지금

만든 매개변수를 드래그해 놓으면 REPORT_TITLE 매개변수를 보여주는 텍스트필드가 만들어집니다

(그림 6-10).

위에서 보여주는 예제 보고서는 매우 간단합니다. 매개변수를 어떻게 보여주는지 알려주기 위해서 가능한

간단하게 만들었습니다. 어플리케이션에서 REPORT_TITLE 매개변수의 값을 설정하기 위해서는 앞에서 보여준 소

스코드를 다음과 같이 수정하면 됩니다:

105 / 318

그림 6-9 타이틀을 담을 매개변수 정의하기

그림 6-10 타이틀 밴드내에 REPORT_PARAMETER 를 보여주고 있는 디자인 패널

Page 106: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

...HashMap hm = new HashMap();

hm.put(“REPORT_TITLE”,”보고서 타이틀입니다”);...ReportExpressPrint print = ReportExpressFillManager.fillReport(fileName,hm,new RXEmptyDataSource());

새로 추가한 코드를 보면, REPORT_TITLE 매개변수의 값을 매개변수 맵에 넣어주었습니다. 모든 매개변수에

값을 채워서 넘겨줄 필요는 없습니다. 값을 넘겨주지 않은 매개변수는 보고서 안에 설정되어 있는 기본 값

표현식에서 할당한 값을 사용하여 할당하며, 기본값 표현식을 지정하지 않은 경우에는 빈 표현식에서 널을

리턴하게 됩니다.

위의 코드가 적용되면 보고서는 타이틀 밴드에 “보고서 타이틀입니다”라는 문자열을 출력에 포함시킵니다.

여기서는 간단한 문자열을 사용했습니다만, 보다 복잡한 객체들도 넘겨서 사용할 수 있습니다. 즉, 이미지

(java.awt.Image) 객체나 서브리포트에서 사용할 데이터를 제공하도록 설정된 데이터소스 인스턴스도 매개변

수로 넘겨줄 수 있습니다. 매개변수를 넘겨줄때 고려해야 할 중요한 사항은 바로 보고서에서 매개변수를 만

들때 설정한 클래스 타입과 동일한(또는 최소한 슈퍼 클래스를) 매개변수 값을 맵을 통해 넘겨주어야 한다는

것입니다. 그렇지 않으면 보고서를 생성하면서 오류가 발생하고 ClassCastException 을 던지게 됩니다. 즉, 매

개변수를 Integer로 선언하게 되면, java.util.Date 객체를 매개변수로 넘겨줄 수 없습니다.

6.3 변수 사용하기

변수는 누계, 합과 같이 중간 결과값을 저장할 때 사용하는 객체입니다. 필드와 매개변수에서 처럼 변수도

선언할 때 자바 타입을 지정해 주어야만 합니다. 변수를 추가하기 위해서는 아웃라인 뷰에서 변수 노드를 선

택한 후, 변수 추가 메뉴 항목을 클릭합니다.

106 / 318

그림 6-11 변수 속성 대화창

Page 107: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

그림 6-11은 변수에 대한 속성 시트입니다. 다음은 각 속성에 대한 설명입니다:

이름 변수의 이름. 보고서내에서 유일해야 합니다. 필드와 매개변수처럼 다음과 같은 문법으로 표

현식에서 참조로 사용할 수 있습니다: $V{<변수_이름>}

변수 클래스 변수의 자바 타입. 콤보 박스에서 java.lang.String 와 java.lang.Double 같이 흔하게 사용되는 타입들을

선택할 수 있습니다.

계산 변수에 의해 얻어지는 결과를 저장할 때 사용하게 되는 사전에 정의된 계산 타입. 사전에 정

의한 값이 없다면, 어떠한 계산도 자동으로 수행하지 말라는 의미가 됩니다. 보고서는 데이터

소스로부터 새로 읽어오는 레코드들 마다 변수의 값을 변경하기 위해 지정된 계산을 수행합

니다.

변수의 계산을 수행하게 한다는 것은 변수 표현식 속성에서 정의한 표현식을 처리한다는 의

미가 됩니다. 계산 타입을 지정하지 않았다면, 변수 표현식에서 수행된 결과 값을 변수로 할

당하게 됩니다. 계산 타입을 지정했다면, 표현식의 결과가 선택한 계산타입의 입력값으로 들

어가서 계산된 결과값이 변수의 값이 됩니다. 계산 타입은 표 6-2에 나열하였습니다.

리셋 그룹 리셋 타입을 그룹으로 설정한 경우, 변수를 리셋시켜야 하는 기준이 되는 그룹을 지정해줍니

다.

증가 타입 언제 변수의 값을 평가해야 하는지를 지정합니다. 기본적으로는 변수가 데이터소스로부터 레

코드를 가져올때마다 갱신됩니다만, 간혹 특정한 시점에 한해서만 계산을 수행하도록 요구되

어질 수도 있습니다. 증가 타입은 표 6-2에서 보여준 변수의 계산 타입과 동일한 타입들로 구

성되어 있습니다.보다 명확하게 증가 타입을 사용하기위해서는 다음과 같은 상황을 고려해보겠습니다: 보고서가 고객이

름을 알파벳순서로 나열하게 하고, 이름의 처음 시작하는 알파벳으로 그룹을 묶에서 출력하도록 하겠습

니다. 그러면 그룹은 알파벳 A 부터 Z까지 만들어지게 될 것입니다. 이제 각 그룹별로 해당되는 고객의

수에 대한 평균값을 구해보도록 하겠습니다. 이를 위해서는 먼저 각 그룹에 출력되는 고객수 혹은 레코

드의 갯수에 대한 평균값을 계산하는 변수를 만들어야 합니다. 이 계산이 올바르게 수행되기 위해서는

고객이름의 첫 글자가 바뀌는 시점(현재 그룹의 마지막)에서만 변수가 업데이트되어야만 합니다. 이런

경우의 증가 타입은 그룹이어야만 합니다. 즉, 새로 들어오는 값이 계산을 수행한 후 얻어지게 되는 시

점이 되겠습니다.

증가 그룹 증가 타입이 그룹으로 선택된 경우, 변수의 증가를 결정하는 기준이 되는 그룹을 지정합니다.

증가 팩토리

클래스

숫자가 아닌 타입에 대한 합계와 같은 연산을 정의할 때 유용한 RXIncrementerFactory 인터페이

스를 구현한 자바 클래스의 이름입니다. 다른 말로 하자면, 개발자가 개발한 커스텀 계산을 구현할 수

있는 기능이 제공된다고 할 수 있겠습니다.

변수 표현식 각각의 레코드를 반복해서 가져올때마다 변수에 입력값을 지정해주는 표현식입니다. 결과값

은 변수의 타입과 계산된 타입이 일치해야만 합니다. 만일 객체의 갯수를 세는 연산이었다면,

표현식은 어떠한 종류의 결과도 리턴해줄 수 있으며 표현식의 결과 타입과는 상관없이 널이

아닌 결과가 제공될 때에만 변수가 증가될 것입니다. 반대로, 합계를 내는 연산일 경우라면

107 / 318

Page 108: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

계산된 결과가 변수에서 선언한 것과 동일한 타입(Double 이나 Integer와 같은)의 객체이어야

만 합니다.

증가값 표현

변수의 초기 값을 설정해주기 위해 사용되는 표현식입니다. 비워두면, 변수는 널로 초기화됩

니다.

표 6-2 변수의 계산 타입

타입 정의

카운트 표현식 결과값의 갯수를 세어줍니다.

중복제거 카운트 표현식 결과값이 다른 갯수를 세어줍니다. 표현식 수행의 순서와는 무관합니다.

합계 반복되는 구간마다 변수의 현재 값에 표현식 결과값을 더하도록 하여 합계를 구하게 됩

니다.

평균 입력값으로 처리한 모든 표현식의 값에 대한 산술적인 평균을 계산합니다. 개발자 입장

에서 볼때 변수를 System 타입으로 선언하는 것이 프로그램내에서 변수를 선언하는 것과

매우 유사하다고 볼 것입니다.

최소값 입력받은 표현식 값중에 제일 낮은 값을 리턴합니다.

최대값 입력받은 표현식 값중에 제일 높은 값을 리턴합니다.

표준 편차 입력받은 모든 표현식의 값으로부터 표준 편차를 구해서 리턴합니다.

평방편차 입력받은 모든 표현식의 값으로부터 평방 편차를 구해서 리턴합니다.

시스템* 어떠한 계산도 수행하지 않습니다. 표현식을 수행하지도 않습니다. 보고서 엔진은 최종

값만을 이 변수에 설정해서 메모리상에 유지합니다.

맨처음 변수의 값을 초기값으로 리셋해야만 할때 지정해줍니다. 초기 값 표현식이 지정되지 않

았다면 널로 리셋됩니다. 변수의 값을 리셋한다는 것은 누계나 평균과 같은 그룹단위의

계산을 수행할 경우 중요한 기본개념이 됩니다. 표 6-3에 리셋 타입을 설명합니다.

* 개발자 관점에서 본다면, 시스템 타입으로 변수를 설정하는 것이 마치 프로그램내에서 변수를 선언한다는 것과 크게 다르지 않을

것입니다. 보고서에 엮여진 스크립틀릿이나 표현식을 통해 실행되는 여타의 자바코드에 의해서 변수의 값이 설정되게 됩니다.

표 6-3 리셋 타입

리셋타입 설명

없음 초기 값 표현식은 무시됩니다.

보고서 보고서가 생성되는 시작 시점에서 초기값 표현식을 사용하여 단 한번만 초기화되는 변수.

페이지 이 변수는 새로운 페이지마다 초기화됩니다.

열 이 변수는 새로운 컬럼마다 초기화됩니다. 보고서에 컬럼이 하나밖에 없는 경우라면 새

로운 페이지마다 초기화가 됩니다.

108 / 318

Page 109: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

그룹 이 변수는 새로운 그룹(리셋 그룹에서 지정한 그룹)이 시작될 때마다 초기화됩니다.

매개변수와 함께 보고서에서 자체적으로 내장된 변수(보고서 엔진에서 직접 관리되는)가 제공됩니다. 여러

분은 내장된 변수를 읽기만 가능하며 수정할 수는 없습니다. 표 6-4에 내장 변수 목록을 나열하였습니다.

표 6-4 내장된 변수들

변수 이름 정의

PAGE_NUMBER페이지 현재 번호. 보고서를 생성하는 시점에서 이 변수에는 페이지의 총 수가 담기

게 됩니다.COLUMN_NUMBER

컬럼의 현재 번호가 담겨 있습니다.REPORT_COUNT

지금까지 처리된 레코드중에 현재의 레코드 수가 담겨 있습니다.PAGE_COUNT

현재 페이지상에서 처리되어진 레코드의 현재 번호가 담겨 있습니다. COLUMN_COUNT

현재 만들어지는 컬럼에서 처리되어진 레코드의 현재 번호가 담겨 있습니다.

<그룹이름>_COUNT 앞에 붙인 그룹이름에 해당되는 그룹에서 처리되어진 레코드의 현재 레코드 번호가

담겨 있습니다.

6.4 보고서 생성과정에서 요소의 처리

보고서내의 요소에 대한 물리적인 위치와 보고서 생성과정에서 처리되는 요소가 갖는 위치사이에는 강한

상관 관계가 존재합니다. 보고서를 채우는 과정이 시작되면, ReportExpress는 데이터소스로부터 첫번째 레코

드를 가져와서 레코드에 매핑된 필드의 값을 갱신하고 필요한 변수의 계산을 하게 됩니다. 타이틀 밴드를 시

작으로 페이지 헤더, 컬럼 헤더, 그룹 헤더, 반복 밴드 등의 순서로 처리될 것 입니다. 모든 반복 밴드가 채워

진 다음에 엔진은 다음 번 레코드를 가져와서 다시 모든 필드들과 변수들을 업데이트하고 보고서를 채우는

과정을 계속해 나아갈 것입니다. 기본적으로는 엔진에서 보고서를 생성하는 과정중에 인지하게 되는 텍스트

필드와 이미지 요소의 표현식을 처리하게 됩니다.

109 / 318

그림 6-12 표현식을 처리하는 시점에서 Page X of Y 를 출력하는 방식

Page 110: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

가끔은 이러한 방식으로 처리되지 않았으면 하는 경우가 발생합니다. 즉, 페이지 풋터에 총 페이지수를 출력

(그림 6-12)하고자 하는 것처럼 보고서에서 계산과정을 끝까지 진행하기 전에 텍스트 필드에 그 계산된 최종

결과값을 보여주고 싶은 경우가 있습니다. 보고서내에는 총 페이지수를 담고있는 변수는 존재하지 않기 때

문에 현재 페이지 수에 대한 값을 정의한 PAGE_NUMBER 변수만이 유일합니다. 따라서, ReportExpress가 모든 계산

을 완료할 때까지 특정 요소를 채우지 않도록 대기명령을 주어야 합니다.

Page X of Y 예제를 사용하기 위해서는 다음의 두 텍스트 필드가 필요합니다:

• 현재 페이지 번호를 출력하는 텍스트 필드(문자열 “Page X of”). 여기서 X는 변수 PAGE_NUMBER의 현

재 값입니다.

• Y를 출력할 두번째 텍스트 필드(페이지 총 수)

두 번째 텍스트 필드에 대해서는 처리 시점을 보고서로 설정해서 “마지막 페이지까지 도달했을 경우” 처리하라고

지시합니다. 이 시점에서 PAGE_NUMBER의 값은 페이지 총수가 되어 있게 됩니다. 이러한 처리 방식은 어떠한 텍스트

필드나 이미지에도 사용할 수 있습니다. 즉, 그룹헤더에 누계를 출력할 수 있습니다. 이를 위해서는 그룹 내의 레코드들

을 우선 처리하고 그룹헤더에 누계를 출력해줄 텍스트 필드의 계산과 관련되는 변수는 처리시점을 그룹으로 설정(그룹

처리 속성에 적합한 그룹을 지정)해서 처리하게 됩니다.

두 개의 특정한 처리시점은 매우 세심하게 다루어져야 합니다: 밴드 와 자동

• 밴드 : ReportExpress에서 전체 밴드를 처리한 후에 계산을 수행한 결과를 담는 변수를 처리하도록

합니다. 다음의 두 경우 때문에 반복 밴드에서 사용되어지곤 합니다:

◦ 서브리포트로 부터 리턴받은 값(서브리포트에서 출력된 레코드의 갯수)

◦ 스크립틀릿과 같은 외부 에이전트에 의해 설정되는 변수의 값

• 자동 :주어진 데이터셋의 마지막 레코드가 처리되었을 때 일어나는 처리시점. 시점의 설정은 리셋

타입으로 하며, 이 경우 보고서나 그룹이 됩니다. 이 시점을 사용하여 서로 다른 시점에 결정된 혼합

된 값을 사용할 수 있게 됩니다. 즉, 필드의 현재값과 변수의 계산되어진 값을 혼합한 값. 가장 많이

쓰이는 경우는 백분율(%)입니다. 일련의 숫자가 있다고 가정해보면, 모든 숫자의 총계에 대한 각 숫

자의 발생률을 백분율로 표시하고자 할 경우가 있게 됩니다. 지금 처리시점에서의 현재 값을 보고서

가 완료된 시점에서 계산된 총 합계를 담은 변수로 나눈 결과값에 다시 100으로 나누어 백분율을 계

산할 수 있습니다.

여기서 잠시 혼동되는 사항은: 서로 다른 처리시점을 갖는 두 개의 값으로 무엇인가 해야 한다는 것

입니다. 이럴 경우를 위해 제공되는 처리시점이 바로 자동 입니다. ReportExpress는 표현식내에 사

용된 필드명에 대해서는 지금 처리시점을 사용하는 반면, 필드의 리셋타입에 대응하는 처리시점까

지 변수의 처리를 미루게 됩니다.

처리시점에 대한 다른 사용법과 리셋 타입은 19.2.2, “단일 텍스트필드에 Page X of Y 출력하기” 에서 논의되

어집니다.

110 / 318

Page 111: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

7 장. 밴드와 그룹

이번 장에서는 보고서 디자이너에서 밴드와 그룹을 어떻게 관리해야 하는지를 살펴보겠습니다. 4장에서 이

미 보고서의 구조에 대해 학습했기 때문에 보고서가 밴드로 나뉘어서 구성된다는 것은 알고 있을 것입니다.

여기서는 밴드의 속성을 어떻게 설정하는지 알아보도록 하겠습니다. 또한 그룹을 사용하는 방법을 배우게

될 것이고, 보고서 내에서 (페이지 혹은 컬럼)나뉨을 만드는 방법과 누계를 관리하는 방법도 배우게 될 것입

니다. 이번 장은 다음의 섹션으로 구성됩니다:

• 밴드 수정

• 그룹 사용하기

• 다른 그룹 옵션들

7.1 밴드 수정

ReportExpress는 보고서를 8개의 주요 밴드와 백그라운드(여기에 데이터 없음 특수 밴드 추가)로 나누고 있

습니다. 표준 밴드 셋트에 두 개의 추가적인 밴드를 각각의 그룹에 만들 수 있습니다: 그룹헤더 밴드와 그룹

풋터 밴드. 보고서 아웃라인 뷰에서 밴드를 선택할 경우, 밴드 속성이 속성 쉬트에 보여집니다(그림 7-1).

그림 7-1 밴드 속성

밴드 높이는 디자인 시점에서의 밴드 높이를 표시합니다. 보고서를 실행하는 동안 밴드내의 컨텐츠가(텍스

트필드에 긴 문자열이 들어가는 경우 텍스트 필드의 Overflow로 늘림 속성을 true로 설정했거나 서브리포트

의 높이가 늘어나서) 수직방향으로 늘어나게 되면, 이에 맞춰 밴드의 높이도 따라서 커지게 됩니다. 밴드의

높이는 픽셀(항상 동일한 1인치당 72픽셀의 해상도) 단위로 표시됩니다. 밴드의 높이는 속성쉬트에서 높이

속성값으로 설정해주거나 디자이너 윈도우에서 밴드의 하단 경계선을 드래그해서 직접 설정해주게 됩니다.

연속해서 높이가 0인 밴드들은 디자인 패널에서 작업할 때 애매모호하게 됩니다. 높이를 0으로 만들어 놓은 연속된

밴드들에 대해서 바로 위의 밴드 높이를 증가시키려면 밴드 상단 경계선을 쉬프트키를 누르면서 드래그 하면 키울 수

있습니다. 그냥 드래그하면 중첩된 밴드중에 가장 위의 밴드 높이가 증가하게 됩니다.

표현식에서 설정한 조건에 따라서 밴드를 감추거나 보여주고자 할 경우에는 표현식에 따른 출력 속성을 사용

합니다. 표현식은 반드시 부울린 값으로 리턴되어야만 합니다. 특히, 밴드를 보여주게 하려면 true를, 감추려면 false가 리

턴되게 하십시오. 표현식을 정의하지 않으면 기본값(ture)이 적용되어 밴드가 보여집니다.

111 / 318

Page 112: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

보고서는 타이틀, 페이지 헤더 그리고 풋터 및 컬럼 헤더와 풋터 밴드를 위한 공간을 페이지에 여유있게 할

당하게 됩니다. 다른 밴드 모두가 남은 공간내에 반복해서 여러번 출력된다면 한 페이지에 모두 찍어주기는

부족하게 됩니다. 결국 반복 밴드가 한 페이지에서 시작은 되지만, 다른 페이지에 걸쳐 끝나게 될 수 있습니

다. 한 밴드가 한 페이지내에서 모두 출력되도록 하고 싶다면, 분리허용 속성을 끄십시오. 밴드가 출력될 때

마다 ReportExpress가 현재 페이지에 남아있는 여유 공간을 점검해서 출력해줄 밴드를 모두 한 페이지내에

담을 수 없다고 판단하면, 다음 페이지에 출력을 시작하도록 합니다. 그렇지만 다음 페이지에서 이 밴드가

완전하게 출력될 수 있다는 의미는 아닙니다. 다음 페이지에서 출력을 시작하게 되는 밴드 역시 자신내에 존

재하는 컨텐츠에 따라 다음 페이지로 넘어가서 찍히게 될 수 있습니다.

기본 보고서 템플릿에는 마지막 페이지 풋터와 데이터 없음 밴드를 제외한 모든 사전에 정의된 밴드가 포함

되어 있습니다. 이중에서 사용하지 않을 밴드는 보고서 인스펙터에서 마우스로 선택하여 오른쪽 클릭하여

나타나는 메뉴 항목에서 밴드삭제를 선택하십시오. 보고서에서 제거된 밴드는 회색 노드로 표시됩니다(그림

7-2). 보고서에 밴드를 추가하려면, 마우스 오른쪽 버튼 클릭후, 밴드추가를 선택합니다.

그림 7-2 미리 정의된 밴드를 추가하기

일반적으로는 밴드를 제거한다고 해서 생성되는 RXXML 파일(보고서 디자인 소스)이 보다 덜 복잡해진다는

보장은 없습니다. 밴드 출력을 방지하려면, 높이를 0으로 설정해도 됩니다. 하지만, 마지막 페이지 풋터와 데

이터 없음 밴드는 높이를 0으로 설정해도 출력을 방지하지는 못합니다.

마지막 페이지 풋터 밴드를 추가한 경우에는 마지막으로 출력된 페이지의 페이지 풋터 밴드를 대체해서 출

력하기 때문에 여러분이 원하지 않더라도 이미 정해진 동작을 수행하게 됩니다. 데이터 없음 밴드는 매우 특

별한 밴드로써 데이터소스가 레코드를 포함하지 않은 경우 전체 보고서를 대체하는데 사용됩니다. 문서 레

벨에서 설정할 수 있는 데이터가 없을때 속성의 타입을 데이터없음 섹션을 선택해야 동작합니다.

112 / 318

Page 113: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

7.2 그룹 사용하기

그룹은 보고서에서 레코드를 특정한 구조로 편성할 수 있게 합니다. 그룹은 표현식을 사용하여 정의합니다.

보고서 엔진에서 이 표현식을 계산해서 표현식 값이 변경될 때 새로운 그룹을 시작시킵니다. 표현식은 특정

한 필드만을 사용해서 표현할 수도 있습니다. 즉, 도시나 국가별로 연락처 셋트를 하나의 그룹으로 묶을 수

있습니다. 하지만, 보다 복잡한 표현식을 사용해서 그룹을 만들어 줄 수도 있습니다. 가령, 연락처 이름의 시

작되는 문자를 기준으로 그룹을 만들 수가 있습니다.

그림 7-3 그룹 밴드

각 그룹은 하나 이상의 헤더와 풋터 밴드를 가질 수 있습니다. 그룹 헤더와 풋터들은 반복 밴드의 이전과 이

후에 각각 출력됩니다. 그룹의 갯수는 제한이 없습니다. 따라서, 하나의 보고서에 여러개의 그룹을 만들 수

있습니다. 첫 번째 그룹에는 국가를 기준으로 그룹화시키고, 두 번째 그룹에는 도시별로 그룹으로 묶어서 데

이터 구조를 편성시켜 보고서를 만들어 줄 수 있습니다.

보고서 인스펙터에서 그룹의 순서는 그룹들간의 포함관계 순서를 결정짓습니다. 그룹 순서는 그룹 노드(헤

더나 풋터)를 오른쪽 클릭해서 나타나는 컨텍스트 메뉴상에서 그룹 위로 이동 또는 그룹 아래로 이동 항목

을 선택해서 처리합니다(그림 7-4) .

113 / 318

Page 114: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

그림 7-4 그룹의 순서 변경하기

보고서는 그룹 표현식을 계산하여 레코드들을 그룹으로 나눕니다. 표현식의 값이 변경될 때마다 새로운 그

룹 인스턴스가 생성됩니다. 보고서 엔진 자체적으로는 명시적으로 요청하지 않는한 어떠한 레코드 정렬도

자동으로 수행하지 않기 때문에 보고서에서 그룹을 사용하려면 먼저 레코드의 정렬이 필요합니다. 만약 보

고서에서 국가별로 주소를 그룹으로 묶고자 한다면, 보고서를 실행하기전에 레코드를 국가별로 정렬시켜줘

야만 합니다. SQL 질의문내에 ORDER BY 구문을 사용해서 레코드를 정렬해 주거나 이것이 가능하지 않은

경우(XML 문서나 엑셀파일등과 같이 레코드의 정렬 방법을 제공하지 않는 데이터소스로부터 레코드를 가

져오는 경우)라면, 보고서에서 데이터 정렬을 하도록 요청할 수도 있습니다. 보고서 디자이너의 질의 대화창

에서 정렬 옵션을 사용하면 가능하게 됩니다(그림 7-5).

114 / 318

그림 7-5 정렬 옵션

Page 115: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

정렬 옵션을 사용하기 위해서는 보고서의 필드중 일부가 먼저 등록되어 있어야 합니다. 표현식을 사용해서

레코드 정렬을 할 수 없기 때문에 정렬은 오직 필드에 대해서만 가능합니다. 데이터베이스를 사용한다면 어

떤 필드라도 정렬이 가능합니다. 각각의 필드는 서로 다른 정렬 타입(내림차순과 오름차순)을 사용할 수 있

습니다. 보고서 자체적으로 정렬을 하는 경우라면 메모리상에서 정렬작업을 수행하기 때문에 데이터의 양이

클 경우라면 권장하지 않습니다. 보고서 자체에서 정렬을 사용하려면 데이터의 양이 작을 수록 좋습니다. 또

한, 보고서를 운영하는 서버의 메모리에 따라서 처리될 수 있는 데이터의 양도 달라집니다.

예제를 통해 그룹이 동작하는 방식을 이해해보도록 하겠습니다. 일단 사람들의 목록을 사용하여 그룹을 만

들어 보겠습니다. 전화번호부 처럼 성을 그룹핑해서 이름을 나열하도록 하려면, 일단 빈 보고서를 디자이너

에서 만드십시오. 그런 후, ORDER BY 구문을 포함한 SQL 질의를 사용해서 데이터베이스로부터 데이터를 가

져오게 합니다. 예제 보고서는 제품에서 제공하는 샘플 데이터베이스를 사용합니다. 이 경우, 다음과 같은 질

의문이 사용됩니다:

SELECT * FROM ADDRESS ORDER BY LASTNAME, FIRSTNAME

선택된 레코드들은 고객 목록에서 성을 기준으로 하고 다음에는 이름순으로 정렬되어 집니다. 질의로 부터

선택된 필드들은 다음과 같습니다:

ID, FIRSTNAME, LASTNAME, STREET 그리고 CITY.

그림 7-6 필드를 반복 밴드에 드래그 해서 놓기

그룹을 만들기 전에 반복 밴드에 FIRSTNAME, STREET 그리고 CITY 필드를 끌어다 놓고 모양을 잡아 주십시오(그

림 7-6). 그런 다음 그림 7-7처럼 보고서 레이아웃을 디자인하고 보고서 미리보기를 해봅니다:

115 / 318

Page 116: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

그림 7-7 그룹을 추가하기 전의 보고서 레이아웃

미리보기의 결과는 그림 7-8과 유사하게 될 것입니다.

그림 7-8 아직 그룹으로 묶이지 않은 주소록

보여지는 보고서는 단순하게 펼쳐진 주소 목록 보고서 입니다. 이제 성의 첫 글자로 레코드들을 묶어주는 그

룹을 추가하도록 하겠습니다. 성의 첫 글자를 추출하기 위해서는 다음과 같이 간단한 표현식을 사용합니다

(그루비와 자바스크립트 모두): $F{LASTNAME}.charAt(0)

앞에서 권장했던 표현식 언어로 그루비나 자바스크립트를 사용하신다면, 먼저 문서 속성에서 Language 속성을 설정해야

116 / 318

Page 117: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

합니다. 보고서에 새로운 그룹을 추가하려면, 보고서 인스펙터에서 문서의 루트 노드를 선택한 후, 오른쪽 클릭으로 보여

지는 컨텍스트 메뉴에서 보고서 그룹 밴드 추가 메뉴를 선택합니다(그림 7-10).

이제 간단한 도우미 창(그림 7-10)이 나타나게 됩니다. 여기서 그룹의 이름(여기서는 First_Letter)을 정해주고,

문자열로 부터 첫 글자를 추출하는 표현식을 추가해줍니다.

117 / 318

그림 7-9 보고서 그룹 추가

그림 7-10 그룹 도우미를 사용하여 그룹 만들기 첫 번째 단계

Page 118: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

두 번째 단계(그림 7-11)는 그룹에 헤더와 풋터 밴드 추가여부에 대한 옵션을 선택하는것 입니다. 두 개 모두

선택하고 마침 버튼을 눌러 그룹 생성과정을 마칩니다.

이제 디자인 윈도우상에 새로운 밴드 두 개(그룹 헤더와 풋터)가 보여질 것 입니다. 또한 보고서 인스펙터내

에도 추가된 그룹밴드에 대응되는 노드 두 개가 나타나게 됩니다(그림 7-12).

그림 7-12 디자인 패널에 추가된 새로운 그룹 밴드

문서에 그룹을 추가할 경우, 디자이너는 추가된 그룹에 대한 내장 변수 <그룹_이름>_COUNT의 인스턴스를

만듭니다. 예제의 경우는 First_Letter_COUNT 이름으로(그림 7-13) 만들어집니다. 이것이 표현하는 정보는 그

118 / 318

그림 7-11 그룹 도우미에서 새로운 그룹만들기 두 번째 단계

Page 119: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

룹에서 처리한 레코드의 갯수입니다. 이 변수를 보여주려면, 그룹 풋터에 텍스트 필드를 만들고 표현식에 이

변수를 사용하면 해당 그룹에 포함되어 있는 레코드의 갯수를 출력하게 됩니다.

그림 7-13 보고서 인스펙터에 추가된 그룹 노드

이제 그룹 헤더와 풋터에 컨테츠를 추가할 수 있게 되었습니다. 특히, 그룹 헤더에는 그룹의 기준이 되는 성

의 첫 글자를 보여주게 하고, 풋터에는 First_Letter_COUNT 변수를 추가합니다. 첫 글자를 보여주게 하기 위해

서 먼저 그룹 헤더에 텍스트 필드를 추가하고 표현식에 그룹에서 사용했던 것과 동일한 표현식을 지정해 주

십시오. 텍스트 필드의 클래스는 표현식 언어로 그루비나 자바스크립트를 선택했기 때문에 String으로 설정

할 수 있습니다. 자바를 사용한다면, 텍스트 필드에 사용하는 표현식을 조금 바꿔줘야 합니다. 자바의 경우,

타입을 엄격하게 일치시켜줘야 하기 때문에 charAt() 함수는 char 타입을 리턴해서 오류가 나게 됩니다. 빈 문

자열을 덧붙여주어 String 타입으로 캐스트시킬 수 있습니다. 이 방법은 말끔하지는 않지만, 자바 객체를 객

체가 널인지 확인없이도 문자열로 캐스트할 수 있는 간단한 방법입니다. 따라서, 자바언어를 사용할 경우에

는 다음과 같은 표현식을 사용합니다:

“” +$F{LASTNAME}.charAt(0)

119 / 318

Page 120: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

그림 7-14 에서 보고서의 최종 디자인을 확인할 수 있습니다:

그림 7-14 최종 레이아웃

파란색으로 표시된 필드(그룹 풋터에 있는)는 보고서 인스펙터에서 First_Letter_COUNT 변수를 끌어다가 그룹

풋터 밴드에 놓았습니다. 그룹 헤더에 동일한 값을 보여주고자 한다면, 텍스트 필드의 처리시점을 그룹으로

설정하고 그룹처리에 First_Letter을 지정해야 합니다. 처리시점에 대한 내용은 6.4 “보고서 생성과정에서 요

소처리”를 참고하십시오.

그림 7-15에서 최종으로 생성된 보고서를 확인할 수 있습니다.

120 / 318

Page 121: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

7.3 다른 그룹 옵션들

이전 예제를 통해 그룹 도우미를 사용하여 그룹을 만드는 방법을 배웠고, 그룹의 이름과 그룹 표현식을 설정

하는 것도 보았습니다. 그룹을 어떻게 보여줄지를 제어하는 옵션은 매우 다양합니다. 보고서 인스펙터에서

그룹 밴드를 선택(헤더나 풋터)하면, 속성 쉬트창에서 해당 그룹에 대한 모든 옵션들을 볼 수 있습니다

(그림 7-16):

121 / 318

그림 7-15 최종 결과

Page 122: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

그림 7-16 그룹 옵션

옵션 설명

그룹 표현식 보고서에서 각 레코드마다 계산하는 표현식. 이 표현식의 결과값이 변경되

면, 새로운 그룹이 만들어지게 됩니다. 이 표현식을 지정하지 않으면, 널과

같이 처리됩니다. 널 표현식은 그 값이 절대 변하지 않으므로, 첫 컬럼 헤더

뒤와 마지막 컬럼 풋터 전에 각각 한개의 그룹 헤더와 그룹 풋터만이 출력

됩니다.

새 컬럼에서 시작 이 옵션을 선택한다면, 그룹의 마지막에서 컬럼을 새로 시작합니다. 보고서

에 컬럼을 1로 설정한 경우에는 컬럼 나눔은 페이지 나눔이 됩니다. 따라서,

그룹이 끝나고 새로운 그룹은 새로운 페이지에서 시작됩니다.

새 페이지에서 시작 이 옵션을 선택하면, 그룹이 끝나면 페이지를 나누게 됩니다. 따라서 새로

운 그룹은 새로운 페이지에서 출력됩니다.

페이지 번호 리셋 이 옵션은 새로운 그룹의 시작에서 페이지 번호를 리셋합니다.

재출력 헤더 이 옵션을 선택하게 되면, 그룹 컨텐츠가 출력되는 페이지에서라면(출력된

보고서에서 한 페이지 이상에서 그룹의 컨텐츠가 출력 된다면) 그룹 헤더

밴드도 출력되도록 합니다.

새로운 페이지 시작을 위한 최

소 높이

이 값이 0보다 크다면, 보고서는 현재 페이지에서 남아있는 여백이 이 값보

다 적을 경우에는 새로운 페이지에 그룹을 출력하게 됩니다. 이 옵션은 한

페이지에 같이 출력되었으면 하는 필드들로 구성된 보고서 섹션에 대하여

페이지들에 걸쳐서 출력되는 것을 방지할때 사용합니다. 가령, 타이틀 다음

에 오는 텍스트 단락을 같이 보여주게 하고 싶을 경우에 사용합니다.

122 / 318

Page 123: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

옵션 설명

풋터 위치 이 옵션은 풋터 밴드의 위치를 제어하는데 사용합니다. 기본적으로는 그룹

의 마지막에 바로 위치(이전 밴드앞에 공백없이)합니다. 이러한 동작은 다

음과 같은 옵션을 사용하여 바꿀 수 있습니다:

아래부터 쌓음 그룹 풋터 섹션을 현재 페이지의 밑부분에 렌더링합니

다. 안쪽 그룹에 이 옵션이 설정되어 있다면, 바깥쪽 그

룹 풋터의 설정에 상관없이 현재 페이지의 바닥부터 차

례대로 그룹 풋터(바깥쪽 그룹 풋터, 안쪽 그룹 풋터)를

출력하게 됩니다.

아래에 강제로

놓음

그룹 풋터 섹션을 현재 페이지의 밑부분에 렌더링합니

다. 안쪽 그룹에서 이 옵션을 설정한다면, 안쪽 그룹 풋

터가 페이지 아래에 바로 출력되면서 바깥쪽 그룹 풋터

는 다음 페이지에 출력됩니다.

아래에 모음 그룹 풋터 섹션을 현재 페이지 밑부분에 렌더링합니다.

바깥쪽 그룹의 풋터도 이와 유사한 옵션으로 설정되어

현재 페이지의 밑부분에 렌더링 된다면, 어떠한 경우에

도 동작방식을 강제로 변경시킬 수 없게 됩니다.

함께 유지 이 플래그값을 사용하면, 그룹을 두 페이지나 두 컬럼에 나뉘지 않도록 하

지만, 첫 번째 나뉨만 방지합니다.

123 / 318

Page 124: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

8 장. 폰트와 스타일

폰트는 텍스트 문자들의 기능(모양과 크기)을 기술합니다. 보고서에서는 각 텍스트 요소마다 폰트 속성을 지

정해줄 수 있습니다. 스타일을 사용해서 일괄적으로 텍스트 요소들의 모양새를 정의함으로써 작업의 효율성

도 꾀할 수 있습니다. 스타일이란 미리 정의한 속성의 컬렉션으로 배경색, 경계선, 폰트등과 같은 요소의 특

성들에 대한 설정을 미리 해놓고 사용하게 하는 개념입니다. 보고서에서 사용하는 요소들 중 속성을 특별히

지정하지 않은 경우 기본값으로 적용시킬 스타일을 정의할 수 있습니다. 이번 장은 다음과 같은 섹션들로 구

성되어 있습니다:

• 폰트 사용하기

• 트루타입 폰트 사용하기

• 문자 인코딩

• 유니코드 문자 사용하기

• 스타일 사용하기

• 스타일 컬렉션 만들기

8.1 폰트 사용하기

일반적으로 폰트는 다음과 같은 기본 특성들을 정의하게 됩니다:

• 폰트 이름(폰트 패밀리)

• 폰트 크기

• 속성(굵게, 기울게, 밑줄, 가로줄 긋기)

보고서를 PDF파일로 내보낼 계획이라면, 보고서는 다음과 같은 부가적인 정보도 필요로 합니다:

PDF 폰트 이름 폰트 이름. 미리 정의된 PDF 폰트나 클래스 경로에 위치한 TTF 파일 이름

을 지정할 수 있음.

PDF embedded 외부의 트루타입폰트(TTF) 파일을 PDF 파일내에 포함시켜줄지에 대한

플래그 값.

PDF 인코딩 캐릭터를 인코딩시킬 이름을 문자열로 지정한다.

보고서를 PDF 포맷으로 내보내지 않는 한, 보고서에서는 폰트 이름과 이에 따라 지정한 속성들만을 사용합

니다. PDF 문서를 만들 경우에는 PDF 폰트 이름에 지정한 폰트를 사용합니다. 보고서 엔진에서는 PDF로 보

고서를 내보낼때 굵게, 기울게 같은 폰트 속성은 무시합니다. 이러한 속성들은 폰트 자체의 특성으로 덮어쓸

수 없기 때문입니다. 미리 정의되어 있는 PDF 폰트 목록을 살펴보았다면 다음과 같은 항목들을 보시게 됩니

다: • Helvetica• Helvetica-Bold• Helvetica-BoldOblique• Helvetica-Oblique

124 / 318

Page 125: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

여러분의 보고서에서 텍스트 포맷을 Helvetica로 하고 텍스트 필드는 굵게 렌더링하도록 했다면, PDF 폰트이

름에 Helvetica-Bold 를 선택해야 합니다. 밑줄과 가로줄 긋기같은 속성은 별도의 예외없이도 사용할 수 있습니

다.

8.2 트루타입 폰트 사용하기

별도의 트루타입 폰트를 보고서에서 사용할 수도 있습니다. 이를 위해서는 별도의 폰트파일(확장자 ttf를 갖

는 파일들)을 클래스 경로내에서 찾을 수 있어야만 합니다. 사용하고자 하는 트루타입 폰트는 보고서를 디자

인하는 시점에서 보고서 디자이너에서 사용할 수 있어야만 하고, 보고서 엔진을 탑재하는 서버에서도 보고

서를 생성할 때 클래스 경로에 사용할 폰트 파일이 있어야만 합니다. 트루타입 폰트를 PDF에 사용하기 위해

서는 문서내에 트루타입 폰트를 포함하도록 해야 합니다. 이런 경우를 위해서 보고서에는 폰트 익스텐션을

사용할 수 있습니다. 폰트 익스텐션이란 일종의 보고서 플러그인으로써 여러분의 어플리케이션에서 사용하

는 폰트를 배포하는 방식입니다. 더 자세한 내용은 이 장의 후반부에서 설명하겠습니다. 이제, 트루타입 폰트

를 사용하기 위한 오래된 방법에 대해 알아보겠습니다.

정적 텍스트와 텍스트 필드에서의 속성 쉬트 항목에는 폰트이름 콤보박스가 나타납니다. 폰트 패밀리는 시

스템 폰트와 폰트 익스텐션에서만 가능하고, 이것은 JVM이 관리합니다(그림 8-1). 운영체제에서 설정된 것을

상속받아 이용하게 됩니다. 따라서, PDF가 아닌 보고서의 경우라면 먼저 시스템에 트루타입 폰트를 설치하

거나 폰트 익스텐션을 만들어서 사용해야 합니다. 폰트 익스텐션을 만들어 사용하기를 권장합니다.

폰트이름 속성은 자유롭게 편집됩니다. 목록에서 찾지 못하는 폰트이름을 지정했다면, 보고서는 기본폰트를

125 / 318

그림 8-1 시스템 폰트 그림 8-2 PDF 폰트 이름들

Page 126: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

대신 사용하게 됩니다(DejaVu라고 하는 오픈 소스 폰트). PDF 폰트 이름에서 사용가능한 폰트이름 목록인 내

장된 PDF 폰트 셋트와 폰트 경로에서 찾을 수 있는 트루타입 폰트의 목록입니다. 각 항목들은 폰트이름과 트

루타입 폰트의 이름이 될 것 입니다. 폰트 경로는 옵션 대화창에서 설정해 줄 수 있습니다.

일반적으로, 보고서 엔진에서는 클래스경로 내에서 폰트를 찾게 됩니다. 전체 클래스경로로 부터 모든 사용

가능한 폰트들을 스캔하기 때문에 보고서를 생성하는데 소요되는 시간이 현저히 소요되는 현상 때문에, 보

고서 디자이너에서는 폰트를 보다 빠르게 찾을 수 있도록 클래스경로의 서브셋트를 사용하고 있습니다. 폰

트 경로를 설정하기 위해서는 먼저 클래스경로를 추가(옵션 대화창에서는 클래스경로에서 찾을 수 있음)한

후, 폰트경로 탭에서 이것을 체크해줍니다.

보고서를 디자인 할때는 사용할 수 없었던 트루타입 폰트를 보고서 엔진에서 사용하고 싶을 경우라면, 콤보

박스에서 직접 TTF 파일 이름을 입력해줍니다. 보고서를 실행시키는 시점에서 이 파일을 찾지 못한다면,

PDF로 내보내는 과정에서 오류가 발생됩니다.

선택한 폰트가 외부 TTF 폰트라면, 내보내기된 PDF 문서에서 올바르게 보이는지를 확인해야 합니다. 올바르

게 보이려면, PDF에 포함 체크 박스를 선택해서 생성하는 PDF 파일내에 폰트를 메타데이터 형태로 포함하도

록 보고서 엔진에게 알려줘야 합니다. 이 경우 생성되는 파일의 크기가 커진다는 것에 주의하십시오.

8.3 폰트 익스텐션 사용하기

앞 장에서 살짝 언급되었던, 보고서에서 폰트를 정의하고 사용할 때 최적의 방법은 폰트 익스텐션을 만들어

126 / 318

그림 8-3 옵션 대화창에서의 폰트 경로

Page 127: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

서 사용하는 것입니다. 폰트 익스텐션의 목적은 특정한 폰트 패밀리를 사용한 텍스트 요소를 서로 다른 시

스템 상에서도 동일하게 보여지도록 하는 것입니다. 이것은 정교하지는 않습니다. 특히, 자바의 가상 머신이

서로 다른 물리적인 폰트에 대해 서로 다른 논리적인 폰트 패밀리 이름으로 맵핑할 수 있습니다. 특정 플랫

폼상에서 특정한 폰트로 디자인된 텍스트 요소에 포함되는 텍스트를 부분적으로 소실하는 원인이 될 수 있

습니다. 서로 다른 플랫폼(운영 체제가 달라지는 경우)상에서는 동일한 폰트도 다르게 보여지거나 사용하지

못할 수도 있습니다.

경고: 폰트 경로에 여러개의 트루타입 폰트를 추가하지 마십시오. 추가되는 폰트의 갯수가 늘어날수록 보고서 디자이너

가 시작되는 속도가 느려집니다. 특히, 윈도우의 경우라면 %WINDIR% 의 font 디렉토리를 폰트 경로에 추가하지 말아야

합니다.

폰트 익스텐션을 사용할 경우, PDF 파일로 작업한다면 추가적인 잇점을 얻을 수 있습니다: 보고서를 PDF로

내보낼 때, 폰트를 설정할 필요가 없어집니다. 폰트이름 속성에서 지정한 폰트는 PDF로 내보내는 보고서에

서 동일한 폰트를 사용하지 않습니다. 폰트 익스텐션내에 진한 폰트와 기울은 폰트까지 지정할 수 있기 때문

에 특정한 텍스트 요소에 대한 텍스트 인코딩을 설정할 필요도 없어집니다. 모든 필요한 정보가 폰트 익스텐

션내에서 정의되어 있습니다.

폰트 익스텐션의 배경이 되는 아이디어는 보고서 엔진에서 내장된 또는 시스템 폰트대신 트루타입 폰트를

사용할 수 있도록 하자는 것입니다. 보고서가 실행될때 마다 동일한 방식으로 지정한 폰트 동작을 보장하게

합니다. 폰트 익스텐션은 보고서 디자이너의 도구 → 옵션 에 있는 폰트탭(그림 8-4 )에서 만들 수 있습니다. 필

요한 것은 트루타입 폰트 파일뿐입니다. 폰트와 폰트 스타일 또는 타입페이스에 따라서는 대응되는 굵은체,

127 / 318

그림 8-4 폰트 익스텐션

Page 128: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

기울은체와 굵고-기울은체 폰트 버전을 필요로 할 수도 있습니다.

폰트설치 버튼을 눌러서 보고서 디자이너에서 내부적으로 관리되는 폰트 익스텐션을 생성시킬 수 있습니다.

이 폰트 익스텐션은 수정될 수도 있고, 다른 어플리케이션에서 사용할 수 있도록 JAR로 내보낼 수도 있습니

다.

1. 폰트설치 버튼을 클릭했다면, 폰트설치 도우미 창이 나타나게 됩니다. 첫 번째 할일은 메인 트루타입

폰트 파일을 지정해주는 것입니다(그림 8-5).

2. 다음 버튼을 클릭합니다.

128 / 318

그림 8-5 폰트 익스텐션 도우미 – 폰트 선택

Page 129: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

보고서 디자이너는 폰트를 읽고, TTF 파일에 내장된 폰트의 폰트 패밀리 이름을 선택합니다(그림 8-

6). 이 이름은 보고서 엔진에서 사용되는 논리적인 이름이며, 임의의 값이 될 수 있습니다. 보고서 엔

진에서 텍스트 요소를 렌더링할 때, 폰트이름 속성이 지정되어 있다면 폰트이름에 대응되는 폰트 익

스텐션을 찾게됩니다. 해당 익스텐션을 찾았다면, 보고서 엔진에서는 텍스트를 렌더링시킵니다. 익

스텐션을 찾지 못할 경우라면, 폰트이름을 시스템 폰트처럼 가정하여 자바 가상머신에서 올바른 폰

트를 공급하게 됩니다.

이번 단계에서는 지정한 TTF 파일에 대한 굵은체, 기울임체 및 굵고기울임체 폰트 버전까지도 지정

해줄 수 있습니다. 전문적인 용도의 폰트는 일반적으로 이 네개의 TTF 파일을 모두 제공합니다.

마지막으로, 이 폰트롤 PDF 문서에 내장시키고자 한다면, 폰트의 인코딩도 지정해 주십시오. 이것은

폰트에 포함되어 있는 문자에 따라 결정됩니다.

대부분의 사용자는 이 단계까지만 해도 충분합니다. 다음 단계에서는 고급설정에 대해 알아보겠습

니다.

3. 익스텐션에 적합한 로케일을 지정할 수도 있습니다(그림 8-7).

129 / 318

그림 8-6 폰트 익스텐션 도우미 – 폰트패밀리 세부설정

Page 130: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

예를 들자면, 라틴언어에서만 올바르게 표시되는 MyFontFamily라는 폰트 패밀리에 대한 익스텐션을

정의하고, 동일한 폰트 패밀리이름으로 다른 익스텐션을 정의하는, 이번에는 일반적으로는 TTF 파일

에서 사용할 수 없는 특별한 그림문자(glyphs)를 필요로 하는 한국어 로케일로 정의해줍니다.

로케일 목록을 그대로 비워두게 되면, 어떤 언어에서도 사용할 수 있습니다.

4. 마지막 단계(그림 8-8)에서는 HTML과 RTF 내보내기에서 사용하게되는 폰트 패밀리의 폰트 이름을

정의하기 위한 설정을 수행합니다.

보고서를 HTML 문서로 내보내는 경우를 생각해보겠습니다. 문서내에 MyFontFamily 라는 폰트를 사

용하는 텍스트 요소는 이 문서를 HTML로 보게되는 클라이언트측 브라우저에서는 시스템상에 설치

되지 않은 폰트이고, 폰트 익스텐션에 포함된 TTF 파일도 사용할 수 없기 때문에 올바르게 표시될

수 없습니다. 따라서, 이런 경우를 대체하기 위해 찾을 수 없는 폰트 대신 사용할 폰트의 이름을

“Arial” 으로 지정해줄 수 있습니다. HTML 문서에서는 텍스트 요소에 한 개 이상의 폰트이름을 지정

해 줄 수 있습니다. 여러 개의 폰트이름을 지정한 경우에는 지정한 폰트이름 순서에 따라 우선권이

있습니다. 지정된 폰트들중에 웹브라우저에서 먼저 찾은 폰트를 사용해서 렌더링하게 됩니다.

130 / 318

그림 8-7 폰트 익스텐션 도우미 – 로케일

Page 131: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

익스텐션 설정이 완료되면, 보고서 디자이너에 설치가 됩니다. 새로 추가한 익스텐션은 옵션 패널의 폰트목

록에 나타나고(그림 8-9), 텍스트 툴바의 폰트 콤보박스에 추가할 수 있습니다(그림 8-10).

그림 8-9 폰트 익스텐션 도우미 – 패밀리 세부설정

131 / 318

그림 8-8 폰트 익스텐션 도우미 – 폰트 맵핑

Page 132: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

그림 8-10 폰트 콤보 박스에 새로 추가시킨 폰트 익스텐션이 나타남

익스텐션으로 내보내기 버튼을 클릭하면, 하나 이상의 폰트 패밀리를 내보낼 수 있으며, 보고서 엔진 익스텐

션을 자동으로 만들어 줍니다(JAR 형태로 패키징되어 여러분의 웹어플리케이션의 클래스경로에 추가해 주

어야 합니다). 기존에 사용하기 위해 만든 익스텐션은 보고서 디자이너의 클래스경로 내에 JAR 파일을 추가

하여 설치할 수 있습니다.

8.4 캐릭터 인코딩

보고서 엔진에서 캐릭터 인코딩을 올바르게 설정해주는 것이 중요합니다. 특히 PDF 포맷으로 내보내는 경우

설정한 인코딩으로 PDF를 내보내기 때문에 더욱 중요합니다. 인코딩은 캐릭터들을 어떻게 해석해야 되는

지를 지정합니다. 예를들어, 이탈리아어로 액센트가 있는 문자들(è, ò 와 ù 같은 캐릭터)을 올바르게 출력하려

면, 인코딩을 CP1252(WinAnsi로 알려져 있는 서부 유럽 ANSI 인코딩)로 설정해야 합니다. 보고서 디자이너

에서는 선택한 요소의 속성 쉬트에서 폰트탭 내에 PDF 인코딩 콤보박스를 통해 미리 정의해 놓은 다양한 인

코딩 타입들의 셋트중에서 하나를 선택할 수 있습니다.

비-표준 캐릭터를 PDF 문서에 사용하는 보고서의 경우에는 모든 필드가 동일한 인코딩 타입으로 설정되어

야만 하고, 보고서 데이터를 읽어오는 데이터베이스에서 사용하는 캐릭터 셋트도 확인해야 합니다.

8.5 유니코드 캐릭터 사용하기

비 라틴어기반 캐릭터들(그리스어, 키릴어 및 아시아권 캐릭터들)은 유니코드 문법을 사용할 수 있습니다.

이 캐릭터들은 표현식내에서 유니코드 코드를 지정하여 텍스트 필드에 지정할 수 있습니다. 예를 들면, 화폐

단위에 유로 기호를 사용하려면, 유니코드 \u20ac 캐릭터 이스케이프를 사용하면 됩니다.

표현식에 사용한 \u20ac 이스케이프는 단순한 텍스트는 아닙니다. 캐릭터 €를 포함하는 문자열을 표현하는 자바 표

현식입니다. 이 텍스트를 정적 텍스트 요소에 출력하게 되면 그냥 “\u20ac”이 출력됩니다. 정적인 필드의 값은 자바(또는

다른 언어) 표현식으로 해석되지 않습니다. 텍스트 필드에서 표현식으로 사용될때만 유효하게 됩니다.

8.6 스타일 사용하기

보고서 인스펙터에서는 스타일이라는 라벨이 붙은 노드에서 사용가능한 스타일도 표시해 주고 있습니다.

새로운 스타일을 만드려면, 스타일 노드에서 마우스 오른쪽 버튼을 클릭하여 추가 → 스타일 메뉴를 선택합

니다(그림 8-11).

132 / 318

Page 133: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

그림 8-11 문서에 새로운 스타일 추가하기

스타일에 관련된 속성은 매우 많습니다(그림 8-12). 필수적으로 설정하는 속성은 이름밖에 없고, 다른 속성들

은 모두 선택적 사용입니다. 스타일 속성들 중에서 사용하지 않는 것들은 그냥 기본값으로 사용하십시오. 속

성의 기본값을 복원하려면, 속성 이름에서 마우스 오른쪽 버튼을 클릭하여 기본값 복원 메뉴를 선택하십시

오. 기본값 복원을 실행하면 기본값이 제공되는 모든 요소들의 속성에 적용됩니다.

그림 8-12 스타일의 속성쉬트

133 / 318

Page 134: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

스타일을 특정 요소에 적용하려면, 요소를 선택하고 속성 쉬트에서 스타일 속성에 지정하시면 됩니다(그림 8-13).

그림 8-13 요소의 스타일 속성

보고서에서 여러분이 만든 스타일을 기본 스타일로 지정되도록 할 수 있습니다. 기본 스타일로 설정하면, 모

든 요소들에서 지정하지 않은 속성값은 기본 스타일로부터 상속받아 설정됩니다. 부모 스타일 속성에서는

기본 속성값이 상속받을 스타일을 지정합니다. 다른 속성들은 다음과 같이 네 개의 범주로 나뉘어 집니다: • 공통 속성

• 그래픽 속성

• 경계선과 패팅 속성

• 텍스트 속성

속성에 대한 상세한 내용은 5장을 참고하십시오.

8.7 스타일 조건 생성

보고서에서 동적으로 스타일을 적용하는 것도 가능합니다. 가령, 어떤 텍스트 필드의 배경색이 양수인 경우

에는 검정색으로, 음수일 때는 적색으로 칠해지도록 할 수 있습니다. 보고서 디자이너에서는 기존 스타일로

부터 파생된 조건 스타일을 만들어서 조건에 따라 일부 속성들을 변경시킬 수 있습니다. 스타일에 조건을 적

용시키기 위해서는 스타일 노드를 선택해서 오른쪽 마우스를 클릭한 후, 조건 스타일 추가를 선택하십시오

(그림 8-14).

부모 스타일의 모든 값을 다시 잡아줄 수 있습니다. 조건이 충족될 경우, 부모 스타일에서 정의된 값들을 교

134 / 318

그림 8-14 스타일 조건 설정하기

Page 135: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

체시킬 수 있습니다. 새로 추가한 스타일 조건은 인스펙터에도 보여지게 됩니다. 이제 요소를 렌더링하면서

사용할 스타일에 조건 표현식(리턴값은 부울린 타입)을 만들어 주어야 합니다.

조건 표현식에서는 보고서 객체의 모든 속성들을 사용할 수 있습니다. 주의할 점은 조건이 일반적이어서는

않된다는 점입니다. 즉, “숫자가 양수이면” 또는 “문자열이 널이면”과 같은 조건을 설정해서는 않됩니다. 매

우 구체적으로 한정시킨 값(필드, 매개변수 혹은 이들을 포함해서 만든 표현식)에 대해서만 양수인지 널인지

를 판단하도록 하는 조건을 사용해야 합니다.

하나의 스타일에 지정할 수 있는 조건의 갯수에 제약은 없습니다. 스타일 조건을 사용하는 좋은 예로는 특정

한 필드를 다른 색으로 보여지게 하는 것입니다. 기본 스타일에서는 배경색으로 적색을 지정하고, 조건 스타

일에서 변수 $V{total_orders}가 5보다 적을 경우에는 적색을, 6부터 10까지는 노란색을 지정하게 하고, 그 이

상에서는 녹색으로 설정하도록 할 수 있습니다.

그림 8-15 행마다 배경색이 교차되도록 한 보고서

이제 라인이 바뀌게 되면서 배경색이 교차되도록 하는 효과를 갖는 보고서를 만드는 방법에 대해 살펴보겠

135 / 318

Page 136: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

습니다. 최종적으로 만들어지는 보고서의 모습은 그림 8-15와 같습니다.

위와 같은 효과를 만드는 것은 실제로는 간단합니다. 첫번째 할 일은 반복 밴드에 프레임 요소를 추가해주는

것입니다. 프레임은 밴드에 출력되는 모든 요소들을 담게 됩니다. 이 프레임을 밴드의 배경인 것 처럼 사용

할 것이기 때문입니다. 실제적으로도 프레임은 밴드의 사용가능한 모든 공간을 차지하게 해야 합니다. 이제

프레임 안쪽에 출력해줄 모든 텍스트 필드 요소들을 위치시키십시오(그림 8-16과 그림 8-17).

그림 8-16 은 실제 디자인을 반영한 것은 아닙니다. 단지 반복 밴드 전부를 덮을 수 있는 프레임 안쪽에 실제

데이터를 보여주는 텍스트 필드를 보여주는 예제를 위한 예시일 뿐입니다. 따라서, 여러분이 실제적으로 디

자인한 모습은 조금은 달라질 수도 있을 것입니다.

그림 8-17 인스펙터내에서 보여지는 요소의 계층구조

프레임 안쪽에 모든 텍스트필드 요소를 위치시키게 되면 그림 8-17처럼 보고서 인스펙터에 계층적인 모습이

될 것입니다. 이제 새로운 스타일(Style1로 이름을 설정)을 만듭니다. 처음 만드는 스타일에서는 모든 값을 기

본값으로 유지하십시오. 라인이 홀수인 경우(1,3,5, …..)에는 스타일의 변경은 없습니다. 이제 조건 스타일을

추가하고 조건 표현식을 다음과 같이 설정해줍니다: ($V{REPORT_COUNT} % 2) == 0

여기서는 보고서 언어로 그루비나 자바스크립트를 사용한다고 가정하겠습니다. 자바언어로 표현식을 사용

할 경우라면 조금 더 복잡해지게 됩니다. 즉: ($V{REPORT_COUNT}.intValue() % 2) == 0

위의 조건 표현식에서는 현재 처리하는 레코드의 번호를 2로 나눈 나머지(% 연산자의 기능)를 계산하여 0과

같아지는지를 판단하게 됩니다. 내장 변수인 REPORT_COUNT 에 담겨있는 현재 처리되는 레코드 번호가 짝

136 / 318

그림 8-16 모든 요소를 프레임 안쪽에 위치시킵니다

Page 137: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

수인 경우 나머지값을 2로 나누면 0이 되는데, 이때 배경색을 엷은 회색으로 설정하고, 불투명 속성을 true로

선택해 주십시오.

마지막으로 프레임을 선택해서 새로 만든 스타일을 스타일 속성에서 선택해 주십시오. 보고서를 실행하면

앞에서 보았던 그림 8-15에서 보여지는 모양과 같은 결과를 얻을 수 있게 됩니다.

137 / 318

Page 138: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

9 장. 템플릿

보고서 디자이너에서 제공되는 툴중에 가장 유용하게 사용되는 것이 바로 템플릿 선택기(그림 9-1) 입니다.

보고서 디자인을 위해 처음 단계에서 비슷한 유형의 템플릿을 골라 어느정도 미리 작업이 된 보고서로 부터

작업을 시작할 수 있게 합니다. 템플릿 자체만으로도 새로운 보고서 작업을 시작할 수 있으며, 보고서 도우

미를 통해 단계별로 나뉘어 있는 작업들을 절차대로 수행하면, 데이터베이스 모델에 맞추어 정적 텍스트, 텍

스트 필드 및 그룹을 만들어주게 됩니다.

그림 9-1 템플릿 선택

템플릿 선택 팝업창이 나타나기 전에 먼저 보고서 디자이너에서는 <디자이너_홈디렉터리

>/rxdesigner/templates 디렉터리에 들어있는 RXXML파일을 스캔하게 됩니다. 옵션에서 템플릿 디렉터리나 템

플릿 파일을 추가해준다면 스캐닝될 때 포함되게 됩니다. 스캐닝을 통해 발견된 RXXML 파일은 템플릿으로

써 선택될 수 있게 됩니다. 템플릿에서 미리보기 이미지를 제공한다면, 파일 선택기를 이용해서 설정할 수

있습니다.

이번 장에서는 보고서 도우미를 통해 작업할 수 있는 커스텀 템플릿을 만드는 방법과 템플릿 선택창에 나타

나도록 하여 선택할 수 있도록 하는 방법에 대해 알아보도록 하겠습니다. 이번 장은 다음과 같은 섹션들로

구성되어 있습니다:

• 템플릿 구조 살펴보기

• 그룹

• 컬럼 헤더

138 / 318

Page 139: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

• 반복 밴드

• 템플릿 타입과 다른 옵션들

• 새로운 템플릿 만들기

• 템플릿 설치와 사용하기

9.1 템플릿 구조 살펴보기

템플릿은 일반적인 RXXML 파일입니다. 보고서 도우미를 사용해서 보고서를 만들경우, 선택한 템플릿의

RXXML 파일을 불러들여 도우미에서 제시하는 단계에 따라 설정해준 옵션에 맞춰 수정되어 집니다. 보고서

도우미를 사용하지 않고 템플릿 선택만 해서 보고서를 만들 경우라면, 사용자가 지정한 위치(새로 만든 보고

서를 저장한 위치) 에 선택한 템플릿을 참조되는 이미지들까지 그대로 복사하게 됩니다.

일반적으로 템플릿은 고유하게 요구되는 포맷이나 구조는 없습니다. 템플릿을 보고서 도우미를 사용하지 않

고 사용할 경우에는 더더욱 그렇습니다. 하지만, 약간 더 신경을 써서 템플릿을 만들어 준다면 보고서 도우

미를 사용하여 템플릿을 보다 실제적인 모습으로 만들 수 있게 할 수 있습니다.

보고서 도우미는 필드 목록을 사용하여 두 개의 보고서 타입을 만들어 낼 수 있습니다. 보고서 타입은 도우

미가 진행하는 단계중에 사용자가 선택할 수 있습니다. 더 나아가서 다음과 같은 두 가지 방법을 통해 텍스

트 필드와 정적 텍스트를 추가하고 배치하여 템플릿을 생성할 수 있습니다: 컬럼형 보고서와 테이블형 보고

서.

컬럼형 보고서는 레코드들에서 각 필드마다 두 개의 요소를 추가하여 구현할 수 있습니다: 필드의 라벨역할

을 담당할 정적 텍스트 요소로 필드이름과 필드의 값을 보여줄 텍스트 필드 요소(그림 9-2)입니다. 이렇게 해

서 만들어진 보고서는 모두 반복 밴드에 들어가 있는 형태가 됩니다. 각각의 레코드마다 필드의 이름과 값을

출력하게 됩니다. 컬럼 헤더밴드를 사용하지 않는다는 것에 주의하십시오.

139 / 318

그림 9-2 컬럼형 보고서

Page 140: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

테이블형 보고서는 테이블 형태의 뷰로 모든 레코드들을 보여주게 합니다(그림 9-3).

필드값에 대한 정적 텍스트는 컬럼 헤더밴드에 위치하고, 레코드들에 대한 각 필드들을 출력하게 될 텍스트

필드 요소는 반복 밴드에 놓여집니다. 이 형식의 보고서는 컬럼 헤더에 필드 이름을 보여주고 반복 밴드에

모든 데이터를 반복해서 출력하게 됩니다.

보고서 도우미를 사용하여 그룹을 선택한 경우(그림 9-4)에는 도우미가 선택한 그룹 생성을 위해 필요한 모

든 보고서 구조를 만들어내게 됩니다. 보고서 도우미는 최대 4개 까지의 그룹을 만들 수 있습니다. 하나의 그

룹에는 항상 그룹 헤더와 풋터가 쌍으로 만들어 집니다. 템플릿에서 한 개 이상의 그룹이 정의되어 있고 사

용자가 그룹 데이터를 지정하도록 요청받았다면, 도우미에서는 새로 만들어지는 그룹에 기존 그룹에서 사용

하는 설정값을 사용하려고 합니다. 기본적으로는 템플릿에 정의된 그룹을 사용하지 않을 경우에는 지우게

됩니다. 각 그룹에 대해 도우미에서는 그룹 표현식을 설정하고 이름에 사용할 정적 텍스트를 추가하고 그룹

표현식의 값을 보여줄 텍스트 필드 요소를 추가합니다. 도우미를 사용하여 설정되는 그룹의 조건이 선택한

필드이기 때문에, 이름에는 항상 필드의 이름을 사용합니다.

140 / 318

그림 9-3 테이블형 보고서

Page 141: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

정리하면, 템플릿은 이미지들도 포함시킬 수 있는 RXXML 파일입니다. 새 보고서를 만들때 템플릿 자체를

그대로 사용할 수도 있습니다. 보고서 도우미를 사용할 경우, 도우미는 템플릿에 필드를 정의하고 정적 텍스

트와 텍스트 필드를 추가한 후, 컬럼형 혹은 테이블형 방식으로 구성되도록 수정할 수도 있습니다. 이 과정

에서 보고서 형식을 지정하지 않는다면, 테이블형이 기본값이 됩니다. 그룹의 지정도 가능합니다.

이제 도우미 기능을 사용할 수 있는 템플릿을 어떻게 만드는지 알아보기 위해 기존에 제공되고 있는

classicC.rxxml 이라는 템플릿을 분석해 보겠습니다. 이 템플릿은 더 이상 보고서 디자이너에 포함시켜 배포

하지는 않지만, 템플릿이 구성되어 있는 기초적인 방식을 이해하기에는 매우 좋은 예가 됩니다. 그림 9-5에

서 보여지는 디자인에는 네 개의 그룹이 각각 그룹 헤더와 풋터밴드로 구성되어 있습니다:

Group1, Group2, Group3, 및 Group4.

141 / 318

그림 9-4 보고서 도우미에서 그룹지정 단계

Page 142: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

이 보고서는 컬럼형 보고서이기 때문에 컬럼 헤더 밴드가 사용되지 않으므로 감추어져 있습니다. 반면 반복

밴드에는 정적 텍스트 라벨과 텍스트 필드가 위치해 있습니다. 일부 요소들(템플릿 이름을 보여주기 위한 타

이틀과 페이지 풋터에서 페이지 번호를 보여주는)은 도우미에서 수정하지 않으므로 무시하겠습니다. 이 템

플릿은 보고서 도우미를 통해 지정한 데이터를 원하는 모습으로 보여줄 수 있도록 새로운 필드나 적절한 표

현식을 생성해서 수정되어 집니다. 보고서 도우미에서 이 요소들을 사용하여 작업할 때 따라야 할 룰들은 다

음과 같습니다.

다음으로는 테이블 형보고서 포맷에 대응되는 디자인입니다:

그림 9-6 classicT.rxxml 보고서

9.2 그룹

앞에서 보고서 도우미에서는 최대 4개 까지의 그룹을 지정할 수 있다고 했습니다. 그룹은 첫번째 선언된 것

부터 마지막에 선언된 그룹의 순서로 진행되며, 이는 보고서에서 그룹 순서로 지정됩니다. 예를 들어, 오직

142 / 318

그림 9-5 classicC.rxxml 보고서

Page 143: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

국가 필드로 데이터를 그룹핑하기로 했다면, 도우미에서는 오직 Group1만 사용하게 됩니다(그림 9-5 또는 그

림 9-6에서 검은색 배경의 그룹). 이제 국가와 도시 그룹을 사용해서 보고서를 만들어 보겠습니다. 보고서 도

우미에서는 Group1에 국가를, Group2에는 도시를 지정합니다. 그룹2는 그룹1의 안쪽으로 들어가게 됩니다.

그룹 헤더와 풋터에 위치시킬 요소의 갯수 제한은 없습니다.

그룹 헤더내에 위치된 정적 텍스트 요소에 다음과 같은 문자열이 포함되어 있다면, 정적 텍스트의 값은 도우

미를 통해 선택했던 필드의 이름(그룹의 조건)으로 설정됩니다:• GroupLabel• Group Label• Label• Group name

• GnLabel ( n 은 그룹의 번호임)

그룹 헤더내에 위치된 텍스트 필드 요소에 다음과 같은 표현식 중 하나가 포함된다면, 텍스트 필드에는 도우

미에서 선택한 필드(그룹의 조건)로 설정됩니다. 즉, $F{COUNTRY}):• “GroupField”

• “Group Field”

• “Field”

• “GnField” ( n 은 그룹의 번호임)

모든 표현식은 오래된 템플릿과의 호환성을 위해 꼭지점을 갖거나 갖지 않아도 받아들여집니다. 꼭지점을

생략하면, 보고서는 컴파일할때 부적합한 자바 표현식이라는 오류를 발생시킵니다. 따라서, 표현식을 사용할

경우에는 항상 꼭지점을 사용해야만 보고서를 디자인하면서 미리보기를 할 때 오류가 나지 않습니다.

9.3 컬럼 헤더

컬럼 헤더밴드는 보고서의 형태를 테이블형으로 지정한 경우 도우미에서 분석하게 됩니다. 앞에서도 언급했

듯이 보고서 도우미에서의 기본 형태는 테이블입니다. 그림 9-6에 표시한것 처럼, 이에 해당되는 템플릿인

ClassicT (여기서 “T” 는 테이블을 의미함)가 있습니다. 이 템플릿의 컬럼 헤더 밴드는 회색으로 표시한 프레

임 요소와 DetailLabel 값을 갖는 정적 텍스트로 구성되어 있습니다. 정적 텍스트는 도우미에서 각각의 필드

에 대해 만들어줄 라벨을 위해 찾게되는 요소입니다. 특히, 도우미에서는 다음과 같은 문자열을 갖는 정적

텍스트를 찾습니다: • DetailLabel• Label• Header

위에서 나열된 정적 텍스트를 도우미에서 찾게 되면, 정적 텍스트는 반복 밴드에 보여줄 필드의 이름으로 대

체되고, 그 위치도 동일하게 됩니다.

9.4 반복 밴드

마지막으로 반복 밴드입니다. 보고서 형태가 테이블일 경우, 도우미는 다음과 같은 표현식을 갖는 텍스트 필

드 요소를 찾게됩니다:• “DetailField”

143 / 318

Page 144: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

• “Field”

위의 표현식을 도우미가 찾으면, 도우미에서 선택한 필드 순서대로 알맞은 필드로 대체됩니다(즉,

$F{ORDER_ID}). 보고서의 형태가 컬럼일 경우, 도우미는 반복 밴드에서 동일한 조건으로 컬럼 헤더를 위한

설명으로 대체하는 것을 찾게됩니다. 보고서 도우미는 그룹에서 사용하는 필드를 제외한 선택한 모든 필드

들에 대해 정적 텍스트와 텍스트 필드의 쌍을 반복 밴드에 라벨과 데이터 필드로 복사하게 됩니다. 다른 밴

드에는 여러분이 원하는 다른 요소들을 넣어줄 수 있습니다. 도우미에서는 이 요소들은 무시하게 됩니다.

9.5 반복 타입과 다른 옵션들

아직까지는 도우미에서 테이블 형태의 보고서 대신 컬럼형 레이아웃을 만들게 되는지를 알아보지 않았습니

다. 이것은 보고서의 template.type 속성을 추가해서 처리할 수 있습니다. 이 속성에 사용할 수 있는 값은

tabular와 columnar이 있습니다.

도우미에서 사용하지 않는 그룹도 지우지 않고 유지시키기 위해서는 template.keepExtraGroups 속성을 true로

설정하면 됩니다.

9.6 새로운 템플릿 만들기

이제는 빈 보고서를 사용해서 직접 사용할 템플릿을 만들고 사용하는 방법에 대해 알아보겠습니다. 여기서

는 테이블형 템플릿으로 sample_template.rxxml 이라는 이름을 갖는 템플릿을 만들어 보겠습니다. 파일의 이

름은 보고서 도우미에서 템플릿의 이름으로 사용될 것 입니다. 일단 새로운 보고서를 만들게되면, Group1,

Group2, Group3, Group4로 이름을 갖는 네 개의 그룹을 추가합니다. 이제 각각 네 개의 그룹 헤더와 풋터가

만들어질 것입니다. 그룹의 이름은 임의로 줄 수 있지만, 템플릿을 위해서는 숫자를 사용하는 것이 좋습니다.

먼저, RXXML 파일을 만듭니다. 새로 만들기 메뉴를 클릭해서 빈 보고서를 선택합니다. 그룹을 추가하려면

보고서 인스펙터에서 루트 노드를 클릭하고 보고서 그룹밴드 추가 를 선택합니다. 그룹 표현식은 비워둘 수

있지만 도우미가 필요할 경우 적절한 값으로 설정하게 됩니다. 그림 9-7에서 네 개의 그룹을 갖는 간단한 디

자인 모습을 보여주고 있습니다.

144 / 318

Page 145: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

다음 단계로, 그룹 헤더와 반복 밴드에 템플릿에서 필요한 요소들을 추가해야 합니다. 모든 그룹 헤더에는

한개의 정적 텍스트 요소를 추가합니다. 정적 텍스트 요소에는 텍스트를, 텍스트 필드 요소에는 필드에 대한

표현식을 설정합니다. 그림 9-8에서 보이는 것처럼 정적 텍스트와 텍스트 필드는 GnLabel 과 “GnField” 문법

을 사용합니다. 우리가 만들 템플릿이 테이블형 타입이므로, 컬럼 헤더 밴드에 정적 텍스트 요소를, 반복 밴

드에는 텍스트 필드를 각각 DetailLabel 이라는 텍스트와 “DetailField”라는 표현식으로 설정해 주십시오.

145 / 318

그림 9-7 네 개의 그룹을 갖는 빈 보고서

Page 146: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

이제 템플릿을 위해 꼭 필요한 부분들은 작성되었습니다. 완전한 템플릿을 만들기 위해 추가적인 작업이 필

요하다면 마무리 해주십시오.

9.7 템플릿을 설치하고 사용하기

이제 새로운 템플릿을 위한 RXXML 파일을 만들었습니다. 사용가능한 템플릿 목록에 이를 추가하도록 하겠

습니다. 우선 새로 만든 템플릿 파일을 디자이너의 템플릿 디렉터리에 복사해 놓습니다. 그런 다음, 메뉴에서

도구 → 옵션 을 클릭한 후, RX2.0 디자이너 섹션으로 이동합니다. 그리고, 서식 도우미 탭을 선택합니다. 이

제 새로운 파일을 추가합니다(그림 9-9).

146 / 318

그림 9-8 직접 제작한 템플릿

Page 147: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

이제 메뉴에서 파일 → 새로만들기를 클릭해서 템플릿 선택창을 열어봅니다. 새로 등록한 템플릿이 보이게

될 것입니다.

새로 등록한 템플릿(sample_template)을 선택하고 도우미를 실행하면, 새로운 보고서를 만들기 위한 단계를

시작하게 됩니다(2.10,“첫 번째 보고서 만들기” 참고). 주문 테이블의 필드들을 SHIPCOUNTRY로 구분해서

147 / 318

그림 9-9 새로 만든 템플릿을 목록에 추가하기

그림 9-10 템플릿 선택창에서 새로 등록한 템플릿

Page 148: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

표시하는 보고서를 만들어 보겠습니다.도우미 3단계에서 다음 질의을 입력합니다.

“select * from orders order by shipcountry”

4단계에서 표시할 필드들을 선택합니다. 5단계에서 그루핑할 필드로 SHIPCOUNTRY를 선택한 후 마칩니다.

선택한 템플릿으로부터 서식이 만들어 집니다. 필요한 부분을 수정한 후 실행합니다. 그림 9-11에 새로 추가

한 템플릿을 사용하여 만들어진 보고서를 표시하였습니다.

148 / 318

그림 9-11 새로운 템플릿을 사용하여 만든 보고서

Page 149: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

올바른 결과가 얻어졌다면, 미리보기용으로 사용할 이미지(PNG나 GIF 포맷)를 만듭니다. 이미지를 만드는

과정은 매우 쉽습니다. 보고서 미리보기를 실행한 후, 현재 페이지를 이미지로 저장합니다. 이렇게 저장한 이

미지가 그림 9-12에 사용되는 미리보기 모드에 보여질 그림입니다. 이미지는 반드시 템플릿 디렉터리에 동

일한 디렉터리이어야 합니다. 또한 이름도 템플릿과 같아야 합니다. 파일의 확장자는 .png 이거나 .gif 이어야

합니다. 이제 템플릿 선택창을 다시 열어보면, 새로 추가한 템플릿에 대한 미리보기 이미지가 보여질 것입니

다.

149 / 318

그림 9-12 새로운 템플릿으로부터 만들어진 보고서의 미리보기

Page 150: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

10 장. 서브리포트

서브리포트는 보고서 엔진의 기능중에 고급 기술에 속하는 것입니다. 보고서 내에 한 개 이상의 다른 보고서

를 삽입시켜 보다 복잡한 서식을 갖는 보고서를 디자인할 수 있도록 하기위한 기능입니다. 모든 보고서는 유

사한 논리로 만들어지게 됩니다.

지금까지 학습을 통해 여러분은 보고서를 만들때 필요로 하는 세가지 항목을 보게 되었습니다:

ReportExpress 파일, 매개변수 맵(비어있을 수도 있음)을 통해 보고서 매개변수의 값을 지정, 그리고 데이터소

스(JDBC 연결등으로 빈 데이터소스도 가능함).

이번 장에서는 부모 보고서에서 서브리포트에 이 세 객체를 어떻게 넘겨주는지를 보여주게 될 것입니다. 또

한 부모 보고서의 데이터를 서브리포트에서 사용할 레코드들로 필터링하기 위해 동적인 연결을 만드는 방

법도 살펴보겠습니다. 그런 다음, 서브리포트가 만들어지면서 얻어지게 되는 정보를 다시 부모보고서 쪽으로

리턴해 주는지에 대해서 설명하겠습니다.

이번 장은 다음과 같은 섹션들로 구성되어 있습니다:

• 서브리포트 만들기

• 단계별 예제

• 서브리포트로부터 값 리턴받기

• 서브리포트 도우미 사용하기

10.1 서브리포트 만들기

서브리포트는 RXXML 소스로 구성되고 ReportExpress 파일로 컴파일된 보고서입니다. 일반적으로 서브리포

트를 만든다는 것은 다른 일반적인 보고서를 만드는 것과 매우 유사합니다. 단, 일반 보고서와는 다른 프린

트 여백에 대한 고려를 해야 합니다. 서브리포트는 부모보고서의 페이지내에 일정 영역으로 들어가기 때문

에 일반적인 보고서가 전체 페이지를 차지하는 것과는 다르게 출력에 대한 여백들을 0으로 설정해야 합니

다. 서브리포트의 수평방향 크기는 부모보고서 내에 들어갈 서브리포트 요소의 크기 만큼으로 설정해야 합

니다. 부모보고서에 서브리포트를 넣기위해서는 팔렛트에서 서브리포트 요소를 사용합니다(그림 10-1).

그림 10-1 서브리포트 요소

150 / 318

Page 151: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

디자인할때는 서브리포트 요소는 그림 10-2에서 보는 것처럼 사각형 형태로 보여지게 됩니다.

부모보고서에 위치시키는 서브리포트 요소를 서브리포트의 실제 사용 크기와 동일하게 맞춰줄 필요는 없습

니다. 서브리포트는 필요한 공간만큼을 점유하기 때문에 서브리포트 요소의 크기가 큰 의미를 갖지는 않습

니다. 서브리포트 요소를 서브리포트가 위치하게 되는 좌측상단 모서리의 위치를 잡아주는 위치잡는 용도로

생각할 수도 있습니다. 하지만, 예상치 못한 결과를 피하기 위해서는 실제 크기와 유사하게 잡아주는 것이

좋습니다.

10.1.1 부모 보고서에 서브리포트를 연결하기

부모 보고서에 서브리포트를 연결하려면, 다음 세 가지를 지정해야 합니다:

• 서브리포트를 구현한 ReportExpress 객체가 부모 보고서에서 복원되는 방식

• 데이터와 함께 객체를 제공하는 방식

• 서브리포트 매개변수의 값을 설정해주는 방법

이 정보들은 모두 서브리포트 요소의 속성 쉬트를 통해 지정해줄 수 있습니다(그림 10-3).

151 / 318

그림 10-3 서브리포트 요소의 속성들

그림 10-2 타이틀 밴드에 놓여진 서브리포트

Page 152: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

우선, 서브리포트의 매개변수를 설정하는 방법부터 살펴보겠습니다.

10.1.2 서브리포트 지정하기

보고서에 서브리포트를 추가할 때는 사용할 서브리포트로 부터 만들어진 ReportExpress 파일의 위치를 알아

야만 합니다. 보고서에 이 파일의 위치를 지정해주거나 서브리포트 표현식을 통해 객체를 설정할 수 있습니

다. 표현식으로 다루어진 다른 많은 컨텍스트들 처럼 타입을 설정해 주어야 합니다. 즉, 표현식으로 부터 리

턴되는 객체의 종류를 지정해야만 합니다. 쉽게 생각하자면, 보고서 엔진은 표현식 타입에 따라 다른 동작을

취하게 된다는 것입니다. 리턴되는 값의 타입은 Expression Class 속성에서 지정합니다. 그림 10-3에서 볼 수

있는 콤보박스를 통해 선택해야 합니다. 표 10-1은 지정할 수 있는 객체 타입의 목록들입니다.

표 10-1 서브리포트 표현식의 리턴 타입들

타입 값 설명

com.cabsoft.rx.engine.ReportExpress ReportExpressReport 객체에 미리 로딩시킬

ReportExpress 파일

java.io.InputStream ReportExpress 파일의 오픈 스트림

java.net.URL ReportExpress 파일의 위치를 지정한 URL

java.io.File ReportExpress 파일을 가리키는 파일 객체

java.lang.String ReportExpress 파일의 이름

표현식의 결과가 문자열(java.lang.String)인 경우, 보고서 엔진에서는 서브리포트를 ReportExpress 파일에서 로

딩해야만 하고 리소스를 찾는 방법과 동일하게 ReportExpress 파일을 찾으려 합니다. 명확하게 말하자면, 문

자열은 우선적으로 URL처럼 해석됩니다. 따라서, 첫번째 시도에서 MalformedURLException이 던져지면, 문자열

을 물리적인 경로에서 파일을 찾도록 해석하게 됩니다. 이 단계에서 파일을 못찾게 되면, 클래스경로에서 리

소스를 찾는 것처럼 문자열을 해석합니다. 서브리포트 표현식의 타입을 String으로 설정했다는 것은 파일의

경로를 지정해서 사용하도록 했다는 의미가 됩니다. 서브리포트의 ReportExpress 파일을 클래스경로에 넣어

주고 리소스처럼 참조되도록 할 수도 있습니다. 즉, 표현식을 “subreport.report ”처럼 지정한다면, 이 파일은 클

래스 경로내에 포함된 디렉터리에 포함되어 있다는 것으로 간주됩니다.

여기서 여러분중에는 서브리포트 파일의 위치를 상대적인 경로로 지정하지 않는지 의문을 가질수 있습니다.

즉, 표현식에 “..\\mysubreports\\mysubreport.report ” 와 같이 설정하면 왜 안되는 것일까 하는 것이지요. 이렇게

사용하지 못하는 이유는 보고서 엔진에서 로딩한 ReportExpress 파일의 원래 위치를 메모리상에 유지하지 않

기 때문에 상대적 위치로 지정하면 찾지 못하게 되기 때문입니다. 이렇게 설계한 이유는 ReportExpress 객체

를 꼭 물리적인 파일로 부터 불러오지 않아도 되도록 해서, 다양한 입력소스를 지원하기 위해서입니다.

서브리포트 요소를 설정하는 첫번째 단계는 이제 명확해졌습니다. 부모보고서 안에 들어가는 서브리포트의

152 / 318

Page 153: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

영역을 채우는 ReportExpress 객체를 로딩하기 위해서는 표현식을 사용한다는 것입니다. 경험에 비춰보면,

99%는 ReportExpress 파일을 파일시스템에 저장해서 쓰게 된다는 것입니다. 따라서, 파일시스템에서 서브리

포트를 불러올 경우에는 디자이너와 웹개발자 모두에게 보다 사용의 용이성을 위해 두가지 옵션을 권장합

니다. 두 옵션 모두 이미지를 참조할 때 사용하던 것과 유사합니다.

• 먼저, 서브리포트 파일을 클래스경로에 속한 디렉터리에 놓습니다. 이렇게 하면, 서브리포트 표현식

이 매우 간결해집니다. 즉, 서브리포트 파일의 이름만 포함한 문자열을 사용하면 됩니다(즉,

“subreport.report ”). 보고서 디자이너는 보고서를 실행할때 보고서 디렉터리를 항상 클래스경로에 포

함시킵니다. 따라서, 부모보고서와 같은 디렉터리에 서브리포트의 ReportExpress 파일을 놓아두면 쉽

게 찾습니다.

• 두 번째 옵션은 서브리포트 ReportExpress 파일의 위치를 매개변수로 넘겨받아서 실제 파일의 절대

위치로부터 로딩할 수 있도록 하는 것입니다. 서브리포트가 있는 디렉터리를 매개변수로 부터 설정

하게 됩니다. 매개변수명을 SUBREPORT_DIRECTORY 이라고 하면 표현식은 다음과 같을 것 입니다:

$P{SUBREPORT_DIRECTORY} + “subreport.report ”

이런 방식의 장점은 SUBREPORT_DIRECTORY 매개변수의 기본 표현식 값에 ReportExpress 파일의 로

컬 디렉터리를 사용할 수 있다는 것입니다. 웹 개발자는 응용프로그램을 통해

SUBREPORT_DIRECTORY 매개변수에 다른 값을 넘겨서 보고서 엔진을 통해 서비스하게 할 수 있습니

다.

10.1.3 데이터소스 설정

보고서 엔진에서 서브리포트를 채워줄 데이터를 지정하기 위해서는 서브리포트 데이터소스를 설정해야만

합니다. 보통 이를 위해서는 세 가지 방법이 있습니다 :

• 부모 보고서에서 사용한 것과 동일한 JDBC 연결을 사용하여 SQL 질의를 실행시키는 방법(가장 쉬

움)

• 부모 보고서와는 다른 타입의 데이터소스(XML파일 등)와 서브리포트에서 필요로 하는 데이터소스

인스턴스를 만들거나 넘겨주기 위한 표현식을 만들어주는 데이터소스 요소를 사용합니다.

• 매우 특이한 경우로써, 서브리포트에 아무런 데이터도 넘겨주지 않습니다. 이 마지막 방식은 문서내

의 정적인 부분들(헤더, 풋터, 백그라운드등과 같은)까지 포함해서 시뮬레이션하는 방식을 제공하기

때문에 보다 자세하게 설명하겠습니다.

JDBC 연결은 서브리포트의 사용을 쉽게 합니다. 연결 표현식은 보고서에서 이미 사용이 가능한 열려있는 데

이터베이스 연결을 이용하는 java.sql.Connection 객체로 지정되어야만 합니다. 전형적인 서브리포트에서의

JDBC 연결 사용은 부모 리포트에서 사용하는 것과 동일한 데이터베이스 연결을 이용하여 SQL 질의를 실행

하게 하는 것입니다. 부모 리포트의 연결 객체는 내장된 매개변수인 REPORT_CONNECTION 으로 참조할 수

있습니다. 서브리포트에 JDBC 연결을 넘겨주는 경우에는 서브리포트내에 지정해준 SQL 질의를 사용하여 보

고서를 채우게 됩니다.

부모 리포트와 다른 데이터소스를 사용하는 경우는 JDBC를 연결로 사용하지 않을 때가 많습니다. 이 경우는

153 / 318

Page 154: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

JDBC 연결을 사용할 때보다 복잡하지만, 매우 유연하게 다양한 상황에서 보고서를 사용할 수 있게 합니다.

데이터소스 표현식에서 RXDataSource 인스턴스를 리턴하도록 작성을 하면, 서브리포트에서 데이터를 채우

게 됩니다. 어떤 데이터소스를 사용할 것인지에 따라서 매개변수를 사용하여 서브리포트에 제공할 데이터소

스를 넘겨주게 하거나 필요할 때마다 동적으로 데이터소스를 지정하게 할 수도 있습니다. 부모 보고서에서

데이터소스를 사용하여 보고서를 실행시키게 된다면, 데이터소스는 내장 매개변수인 REPORT_DATASOURCE

에 저장되어 있습니다. 하지만, 부모리포트의 데이터소스는 보고서에서 단 한번만 사용할 수 있는 객체이기

때문에 서브리포트에 그대로 제공해서 사용할 수 없습니다. 따라서, 부모 보고서의 각각의 레코드에 대해 서

브리포트가 만들어지게 되는 경우에서는 매개변수를 사용하는 방식은 적합하지 않습니다. 부모 보고서에 단

한개의 레코드만 있는 경우는 예외가 됩니다. 11장에서 데이터소스에 대해 보다 자세히 다루면서 이에 대한

상황 설명을 명확히 할 것이며, 커스텀 데이터소스를 사용하여 이런 난해한 상황을 풀어갈 수 있다는 것을

배우게 될 것입니다. 또한, 서브리포트에서 사용할 다른 타입의 연결과 데이터소스를 만드는 방법도 배우게

될 것입니다.

10.1.4 매개변수 넘겨주기

프로그램에서 보고서를 요청하면, 매개변수에 값을 설정하여 매개변수맵으로 넘겨주게 됩니다. 즉, fillReport

메쏘드의 매개변수로 넘겨집니다. 서브리포트 매개변수에 대해서도 유사한 방식으로 접근하게 됩니다. 서브

리포트에서는 매개변수맵 표현식을 지정할 수 있을지라도 맵을 지정하지는 않습니다. 보고서 엔진에서 매개

변수맵 처리를 대신 해주더라도 여전히 여러분은 매개변수의 이름/객체 쌍을 만들어 서브리포트 매개변수의

값을 설정하는데 사용할 수 있습니다.

매개변수맵의 가장 큰 장점은 값을 표현식으로 제공하여 동적인 설정이 가능하도록 할 수 있다는 것입니다.

서브리포트 매개변수는 그림 10-3에서 보이는 매개변수 속성을 사용하여 설정합니다. 매개변수 속성항목의

오른쪽에 위치한 … 버튼을 클릭해서 매개변수 대화창을 여십시오(그림 10-4). 대화창의 인터페이스는 매우

직관적입니다. 추가 버튼을 눌러 서브리포트에 제공해줄 매개변수 맵의 매개변수를 추가할 수 있습니다.

154 / 318

그림 10-4 서브리포트 매개변수 대화창

Page 155: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

매개변수의 이름은 서브리포트에서 선언한 것과 동일해야만 합니다. 매개변수의 이름은 대소문자를 구별하

기 때문에 주의해서 사용합니다. 이름을 잘못 입력했거나 서브리포트에서 정의하지 않은 것을 사용하더라도

오류가 나지는 않지만, 서브리포트가 정상적으로 만들어지지는 않을것입니다. 따라서, 이 경우에 따른 오류

원인을 찾아내기가 쉽지 않을수도 있습니다.

서브리포트 매개변수 대화창의 표현식 필드에는 필드, 매개변수 그리고 변수를 사용하여 보고서의 표준 표

현식을 적용할 수 있습니다. 표현식의 리턴타입은 서브리포트에서 정의한 매개변수 타입과 일치해야 합니

다. 그렇지 않을 경우에는 런타임에서 ClassCastException 예외가 던져지게 됩니다.

서브리포트 매개변수 사용의 대표적인 용도로는 부모 보고서에서 출력된 레코드의 키를 넘겨줌으로써 서브

리포트 내에서 실행시킬 질의문이 부모 보고서의 해당 레코드와 관련된 레코드들로 구성될 수 있도록 하는

것입니다. 즉, 부모 보고서에서는 고객들의 목록을 출력해준다고 했을 때 서브리포트에서 각 고객별로 부가

적인 정보를 출력하도록 하는 경우가 되겠습니다. 이를 위해서 부모보고서에서는 서브리포트에 현재 출력한

고객의 ID를 매개변수로 넘겨줌으로써 해당 고객의 부가정보만을 추출하는 SQL 질의문을 만들어서 출력되

도록 하는 것입니다.

서브리포트에서 사용할 매개변수 맵을 직접 제공하는 옵션을 설정할 수도 있습니다. 매개변수 맵 표현식 속

성을 사용하면 표현식을 지정할 수 있습니다. 표현식의 결과는 반드시 java.util.Map 객체이어야만 합니다. 어

플리케이션에서 서브리포트를 위해 따로 설계된 맵을 준비하여 부모 보고서에 매개변수로 넘겨줌으로써 매

개변수 맵 표현식을 통해(즉, $P{myMap}) 이를 다시 서브리포트로 맵 객체를 넘겨줄 수도 있습니다. 또한 부

모 보고서에 제공한 매개변수 맵을 서브리포트에서도 사용할 수 있도록 내장 매개변수인

REPORT_PARAMETERS_MAP 을 사용할 수도 있습니다. 이 경우 표현식은 다음과 같게 됩니다:

$P{REPORT_PARAMETERS_MAP}

서브리포트 매개변수가 이 맵을 결합시켜 사용할 수 있기때문에, 부모 보고서와 서브리포트 모두에서 공통

적으로 사용할 수 있는 보고서를 실행시킨 사용자 이름과 같은 값은 공통 매개변수로 넘겨서 사용할 수도

있게 됩니다.

10.2 단계별 예제

이제부터는 지금까지 학습한 내용을 바탕으로 실질적인 사용방법을 살펴보도록 하겠습니다. 다음과 같은 시

나리오를 생각해 보겠습니다. 제품의 주문이 들어온 국가들의 목록을 출력하면서 서브리포트에서는 해당 국

가별 고객의 목록을 출력하게 합니다. 이제 JDBC 연결을 사용하여 보고서 예제 데이터베이스에 연결을 하십

시오. 이 시나리오에서 사용하는 테이블은 orders와 address입니다. orders 테이블로부터 국가를 뽑아내고,

address 테이블에서는 고객정보를 뽑게 됩니다. 이 시나리오를 만족시키기 위해 만들어질 보고서에 서브리포

트를 사용하지 않아도 되지만, 서브리포트 사용의 좋은 예를 보여주기 위함이기 때문에 서브리포트를 사용

해서 보고서를 만드는 과정으로 진행하겠습니다.

1. 제일 먼저, master.rxxml 이름으로 빈 보고서를 만드십시오. 현재 활성화된 데이터베이스 연결이 보고

155 / 318

Page 156: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

서에서 제공하는 예제 데이터베이스로 되어있다고 가정하겠습니다.

2. 보고서에서 사용할 질의를 다음과 같이 정합니다: select distinct shipcountry from orders order by shipcountry

주문내역에서 우선 국가별 목록을 뽑고, 이를 국가별 이름순으로 정렬하였습니다. 보고서 디자이너

에서 자동으로 데이터를 가져오지 못했다면, 필드읽기 버튼을 클릭해서 질의로부터 필드를 가져오

게 합니다(그림 10-5).

3. 보고서 인스펙터의 필드노드에 SHIPCOUNTRY 필드가 추가됩니다. 이 필드를 끌어다 반복 밴드에

놓아주십시오. 텍스트필드 요소의 크기를 조정하고 폰트 크기도 설정합니다(그림 10-6).

156 / 318

그림 10-5 부모 보고서를 위한 레코드의 선택

그림 10-6 반복 밴드에 놓여진 SHIPCOUNTRY 필드

Page 157: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

4. 미리보기버튼을 클릭해서 보고서를 테스트하십시오. 그 결과는 그림 10-7과 유사해야 합니다.

이제 서브리포트를 사용할 수 있도록 보고서를 만드는 작업을 시작하겠습니다. 서브리포트는 반드시 다음과

같은 특성을 따라서 작성되어야만 합니다:

• 여백을 없앰(필수적인 과정은 아닙니다만, 여백이 필요하지도 않습니다)

국가이름을 담을 수 있는 매개변수를 사용하지 않음

• 부모 보고서에서 차지할 서브리포트의 너비와 일치시킵니다. 여백을 제외한 페이지 전체 너비가 부

모 보고서에서 차지하게 될 서브리포트의 너비로 설정하십시오.

• 반복 밴드에는 각 고객의 성과 이름을 보여줄 텍스트 필드를 위치시킵니다.

157 / 318

그림 10-7 국가 목록

Page 158: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

이제 서브리포트를 단계별로 만들겠습니다.

1. subreport.rxxml 이름으로 빈 보고서를 만듭니다. 이름을 다른것으로 했다면, 나중에 부모 보고서에서

서브리포트 사용을 위해 이 이름을 지정하게 되므로 기억해야 합니다.

2. 페이지에서 모든 여백을 제거하고 페이지의 너비를 조정합니다. 보고서를 A4 크기로 만들었다면, 페

이지의 너비는 595 픽셀이 되며, 좌우측 여백으로 각각 20 픽셀씩 설정되므로 실제 페이지 너비는

555 픽셀이 됩니다. 따라서, 서브리포트의 페이지는 좌우측 여백을 모두 0으로 설정하고, 그 너비를

555 픽셀로 해야 합니다.

3. 이 보고서에 COUNTRY 라는 이름의 매개변수를 추가합니다. 타입은 반드시 java.lang.String으로 설

정하고 기본값에 빈 문자열(“”)을 설정하거나 기본 국가로 선호하는 국가명을 설정합니다. 기본값으

로 권장하는 값은 부모 보고서가 국가명으로 정렬하게 되므로, 맨 처음 위치할 국가명(“Argentina”)을

설정하는 것이 좋습니다. 매개변수의 기본값은 부모 보고서에서 매개변수를 지정할 경우에는 사용

되지 않습니다. 기본값을 지정해주는 이유는 보고서 디자이너에서 사용할 질의문에서 이용하는 매

개변수가 반드시 필요하기 때문입니다.

4. 질의 대화창을 열고, 질의문을 입력하여 주문이 들어온 국가에 대한 고객의 정보를 가져올 수 있게

합니다. 질의문은 다음과 같게 됩니다: select distinct shipname, shipcity from orders where shipcountry = $P{COUNTRY}

매개변수 COUNTRY에 의해 지정된 국가에서 중복되지 않는 고객의 주소 정보만을 가져오게 합니

다.

5. 보고서 디자이너에서 다음 필드들이 검출되도록 하십시오: SHIPNAME 과 SHIPCITY (그림 10-8)

158 / 318

그림 10-8 서브리포트에서 사용하는 질의문

Page 159: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

6. 보고서의 반복 밴드에 이 두 필드를 위치시킵니다(그림 10-9).

이제 보고서를 테스트해야 합니다. 서브리포트를 테스트 해야하는 이유는 보고서 디자이너에서 report 파일

을 생성시켜 부모 보고서에서 서브리포트를 사용할 수 있도록 하기 위함입니다. 서브리포트를 실행시킬때는

보고서 디자이너의 콘솔 뷰를 주시해야 합니다(그림 10-10). 특히, 만들어지는 report 파일이 어느곳에 저장되

는지에 주의를 기울여야 합니다. 기본적으로는 RXXML 파일이 저장된 곳에 함께 만들어지게 됩니다. 예제에

서는 부모 보고서와 서브리포트를 같은 디렉터리에 저장했습니다. 따라서, master.report 와 subreport.report 파

일은 동일한 디렉터리내에 들어가 있게 됩니다.

입력한 질의문 때문에 COUNTRY의 값에 따라서는 빈 보고서가 나올 수도 있습니다. 하지만, 지금으로써는

크게 문제가 되지 않으므로 여기서는 서브리포트의 report 파일이 정상적으로 만들어졌는지만 확인하면 됩니

다.

159 / 318

그림 10-11 서브리포트 도우미

그림 10-9 서브리포트 디자인

그림 10-10 서브리포트만을 실행시켰을 경우에 출력창에 나타나는 결과

Page 160: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

이제 우리는 두 개의 보고서를 만들었습니다: 부모 보고서는 국가의 이름을 출력하고, 이제 곧 서브리포트가

될 보고서에서는 지정한 국가에 대한 고객을 보여주게 됩니다. 이제 둘을 합쳐보도록 하겠습니다. 부모 보고

서에 서브리포트를 추가할 때는 서브리포트 도우미창이 나타납니다(그림 10-11). 여러분이 서브리포트 사용

과 관련된 모든 개념들에 대해 명백하게 이해를 한 상태라면, 서브리포트 도우미는 매우 시간을 단축할 수

있는 도움이 됩니다. 하지만, 아직 여기서는 도우미에 대한 상세 설명은 넘어가도록 하겠습니다.

1. 도우미에서 서브리포트 요소만 생성을 선택하고 마침 버튼을 클릭합니다.

2. 서브리포트 요소를 밴드의 전체 넓이를 사용할 수 있도록 조정해 주십시오. 서브리포트의 수직방향

의 크기는 보고서 엔진에서 서브리포트를 생성하면서 필요한 만큼 증가시키기 때문에 디자인 시점

에서 서브리포트 요소의 높이는 큰 의미가 없습니다.(그림 10-12 참고)

3. 서브리포트 요소를 선택한 후, 속성 쉬트창에서 속성들을 살펴봅니다(그림 10-13)

160 / 318

그림 10-12 반복 밴드에 위치된 서브리포트 요소

그림 10-13 서브리포트 속성들

Page 161: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

4. 서브리포트에서 사용할 데이터베이스 연결은 부모 보고서에서 사용한 것과 동일하기 때문에, 커넥

션 타입 속성을 커넥션 표현식 사용으로 설정합니다. 표현식은 $P{REPORT_CONNECTION} 처럼 될 것

입니다. 앞에서 이미 설명하였듯이 REPORT_CONNECTION은 내장 매개변수로써 보고서에서 사용

한 연결에 대한 참조를 저장하고 있습니다.

5. 이제 서브리포트의 표현식을 지정합니다. 이것을 이용하여 보고서 엔진에서 찾은 보고서를 서브리

포트로 삽입시키게 됩니다. 서브리포트 파일은 클래스경로내에 위치했다는 가정하에서(보고서 디자

이너에서는 부모 보고서와 같은 디렉터리에 있으면 충분합니다) 표현식은 다음과 같이 지정합니다:

“subreport.report”

6. 마지막으로, 서브리포트 매개변수를 추가합니다. 매개변수 속성의 오른쪽 끝에 놓여있는 … 버튼을

클릭합니다. 추가 버튼을 클릭하여 매개변수 이름 COUNTRY(이 이름은 서브리포트를 만들때 정의

해준 매개변수의 이름과 일치해야 합니다)와 표현식에 대한 값으로 국가명을 포함하고 있는 필드를

선택해줍니다. 즉, $F{SHIPCOUNTRY}

7. 이제 보고서 미리보기를 합니다. 모든 작업에 문제가 없었다면, 그림 10-14와 같은 모습의 결과가 보

여져야만 합니다.

161 / 318

Page 162: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

그림 10-14 최종 결과

지금까지 살펴본 예제는 아주 기초적인 보고서와 서브리포트를 만든것 입니다. 실제 적용되는 상황에서는

다수의 서브리포트들을 하나의 보고서에 넣을 수 있으며, 그 갯수에 제한은 없습니다. 또한, 서브리포트들은

재귀적으로 사용할 수도 있습니다. 즉, 하나의 서브리포트가 다른 서브리포트들을 포함할 수 있다는 의미가

됩니다. 가령, 아주 작은 서브리포트(한 개의 텍스트 필드로만 되어있는)를 만들어서 값을 찾는데에 이용하기

도 하고 두 개의 서브리포트를 한 페이지에 좌우로 배치시켜 양쪽에 서로 다른 성격의 목록들을 동시에 보

여주도록 할 수 도 있습니다.

마지막으로 기억해야 할 사항입니다. 여러개의 서브리포트들을 차례대로 밑으로 배치했다면, 보고서의 요소

에 대한 위치 타입을 Float으로 설정해주어야 한다는 점입니다. 이 경우, 위쪽의 서브리포트의 높이가 늘어나

면서 아랫쪽 서브리포트와 중첩되지 않도록 해야합니다. 다른 방법으로는 반복 밴드를 나누어 각각의 서브

162 / 318

Page 163: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

리포트들을 서로 다른 밴드에 위치시키게 하는(일명, 가짜 그룹) 방법입니다. 이것은 표현식을 갖는 그룹이

며, REPORT_COUNT 매개변수를 사용해서 각각의 반복밴드에 대한 그룹 헤더와 풋터 밴드 효과를 낼 수 있

게 합니다. 이런 방식은 보고서 생성의 최적화를 이루어내게 합니다.

10.3 서브리포트로부터 리턴받는 값

보고서에서는 서브리포트에서 수행되어진 계산값에 대한 결과를 이용하는 것이 매우 효과적일 때가 존재합

니다. 예를 들자면, 서브리포트에서 처리한 레코드의 수를 부모 보고서에서 출력하게 하는 경우입니다. 보고

서 엔진에서는 서브리포트에 포함된 값을 사용할 수 있도록 하는 기능을 지원합니다. 이는 서브리포트에 매

개변수를 넘겨주는 것과 매우 유사한 방식으로 이루어집니다. 이를 구현하는 아이디어는 서브리포트에 데이

터가 채워지는 동안 계산되어진 값을 부모 보고서에서 선언한 변수에 저장하도록 하는 것입니다. 계산한 값

을 로컬 변수에 연결시키는 것은 속성 쉬트의 서브리포트 리턴값 속성을 설정함으로써 가능해집니다.

앞 섹션에서 사용했던 예제를 통해 어떻게 하는지를 설명드리겠습니다. 부모 리포트에 각 나라마다 포함된

도시의 수를 출력하는 시나리오를 생각해보겠습니다. 서브리포트에서 본다면, REPORT_COUNT 변수가 될

것입니다. 이 변수는 부모 보고서에서 직접 사용할 수 없습니다. 그래서 우선 서브리포트 처리가 완료되는

시점에서 이 값을 담아놓을 수 있는 변수를 만들겠습니다. 변수는 저장하게될 값과 일관성을 가져야만 합니

다. 이번 경우에는 정수가 됩니다.

1. 부모 보고서에서 java.lang.Integer 타입의 변수 SUBREPORT_COUNT를 만들고 계산 속성을 “시스템”

으로 설정합니다.

2. 서브리포트 요소를 선택하고 반환 값 속성 대화창(...버튼)을 클릭해서 여십시오

3. 추가 버튼을 눌러 새로운 리턴값을 만듭니다. 추가/수정 변수 대화창이 나타나게 됩니다(그림 10-15)

163 / 318

그림 10-15 서브리포트 반환값 정의 대화창

Page 164: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

4. 서브리포트의 내장변수인 REPORT_COUNT를 계산된 값으로 부모 보고서에서 사용할 수 있도록 하

기 위해 부모 보고서의 로컬 변수인 SUBREPORT_COUNT에 넣어줍니다. 그림 10-16 처럼 설정해 주

십시오.

5. 이제 계산 타입을 선택합니다. 서브리포트의 값이 그대로 리턴되게 할려면 없음 타입을 지정합니다.

계산타입으로 선택할 수 있는 것은 다양합니다. 예를 들어, 리턴되어야 할 값이 반복해서 호출된 서

브리포트에서 처리된 레코드 갯수의 평균이라면 계산타입을 평균으로 설정합니다.

부모 보고서에서는 서브리포트로 부터 리턴받은 값을 담는 용도로 사용할 새로운 변수를 만들때는 계산타입을 시

스템 으로 설정합니다.

서브리포트에서 리턴받는 값은 서브리포트를 포함하는 밴드가 출력된 경우에만 사용이 가능해집니다. 이 값

을 서브리포트가 속한 동일한 밴드내에 위치된 텍스트 필드 요소에 출력하고자 한다면, 텍스트 필드의 처리

시점을 밴드로 설정하십시오(그림 10-17).

그림 10-17 서브리포트에서 리턴된 값을 출력하는 텍스트 필드(처리시점을 밴드로 설정함)

이제 보고서 미리보기를 통해 보여지는 결과는 그림 10-18과 같아야 합니다.

164 / 318

그림 10-16 서브리포트 반환값 설정

Page 165: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

165 / 318

그림 10-18 최종 출력결과

Page 166: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

10.4 서브리포트 도우미 사용하기

서브리포트의 처리를 간단히 하기 위해 서브리포트 요소를 디자인 패널내에 드래그 하면 도우미창이 나타

나 보고서에 서브리포트 요소를 추가하도록 합니다. 여러분은 그림 10-19에서 볼 수 있는 서브리포트 도우미

를 사용할 수 있습니다.

서브리포트 도우미에서는 서브리포트로 사용할 새로운 보고서를 만들거나 기존에 만들어진 보고서를 서브

리포트로 사용하게 됩니다. 기존 보고서를 이용할 경우, 이미 그 보고서에 한 개 이상의 매개변수가 정의되

어 있다면 도우미에서는 이 매개변수에 대한 값을 매우 쉽게 지정할 수 있도록 합니다.

10.4.1 서브리포트 도우미를 사용하여 새로운 보고서 만들기

현재 보고서에 서브리포트를 추가한다면, 서브리포트 도우미는 서브리포트로 사용하게 될 보고서를 만들 수

있습니다. 새로운 보고서를 만드는 과정은 보고서 도우미를 사용하는 경우와 매우 유사합니다:

1. 연결을 선택하거나 데이터소스를 선택합니다. 데이터소스에서 질의가 필요하다면(JDBC 또는 하이

버네이트 연결처럼), 텍스트 영역에 질의문을 작성하거나 이미 만들어진 질의문이 저장된 파일을 불

러들일 수 있습니다.

2. 필드를 선택합니다.

3. 그룹을 지정합니다.

4. 레이아웃을 선택합니다.

5. 서브리포트 표현식을 지정합니다.

166 / 318

그림 10-19 서브리포트 도우미

Page 167: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

6. 연결 표현식을 지정합니다.

서브리포트 표현식은 서브리포트의 ReportExpress 파일에 대한 참조로 사용됩니다. 도우미는 다음의 두 방식

중 하나를 사용할 수 있게 합니다:

• 그림 10-20에서 보여지는 것처럼 매개변수에 서브리포트의 URL의 경로 부분을 저장하게 하여, 런타

임에서 매개변수를 통해 다른 값으로 설정이 가능하게 합니다. 서브리포트의 경로는 기본값으로 설

정됩니다.

• 표현식에 완전한 경로를 저장합니다.

두 번째 옵션을 선택한다면, 표현식은 서브리포트의 ReportExpress 파일의 절대경로 전체를 저장하게 됩니다.

보고서 디자이너에서 이 방식은 전혀 문제없지만, 웹개발자에게는 적합하지 않은 방식입니다. 이미 10.1.2 “

서브리포트 지정하기”에서 설명했던 것처럼 표현식을 수정하는 방법을 권장하고 있습니다.

서브리포트는 만들어졌을때 바로 컴파일 되지 않습니다. 보고서를 테스트하기 위해 미리보기를 할 때 컴파

일 됩니다. 서브리포트를 만들었다면, 도우미를 사용하여 매개변수를 지정할 수 없습니다. 보고서가 생성된

다음에야 매개변수를 추가하고 서브리포트 질의에서 이용할 수 있게 됩니다. 따라서, 현재 시점에서 서브리

포트의 질의를 필터링하기 위해서는 다음과 같은 절차가 필요합니다:

1. 보고서에 매개변수를 추가하여 서브리포트를 구현합니다.

2. 매개변수를 질의문에 합쳐야만 한다면, 다음과 같은 문법을 사용하여 질의에 매개변수를 사용합니

167 / 318

그림 10-20 서브리포트 표현식

Page 168: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

다: $P{MyParam}(또는 $P!{MyParam})

3. 부모 보고서에서 서브리포트 요소를 선택하고 서브리포트 매개변수 목록에 항목을 추가합니다. 새

로 추가하는 서브리포트 매개변수는 서브리포트에서 사용하는 매개변수의 이름에 대응해야만 하고,

그 값은 표현식을 사용해서 지정해야만 합니다(보다 자세한 방법은 10.1.4 “매개변수 넘기기”를 참고

하십시오).

4. 서브리포트가 SQL이나 HQL 질의방식이 아니라면, 보고서를 성공적으로 실행시킬 수 있는 서브리포

트 데이터소스 표현식을 지정해야만 합니다.

5. 앞에서 언급했던것 처럼, 서브리포트 도우미를 사용하여 서브리포트로 사용될 새로운 보고서를 만

들거나 이미 만들어진 보고서를 사용할 수 있습니다. 이미 만들어진 보고서를 이용할 경우에는 선택

한 보고서에 한 개 이상의 매개변수가 존재할 경우, 도우미에서 각각의 매개변수에 대한 값을 쉽게

지정할 수 있는 도우미가 제공됩니다.

10.4.2 서브리포트 도우미에서 기존 보고서 지정하기

서브리포트 도우미에서 이미 작성해 둔 보고서를 지정하여 서브리포트로 사용할 수 있습니다. 첫 번째 단계

는 도우미의 첫 번째 화면에서 RXXML 파일 혹은 ReportExpress 파일을 선택하는 것 입니다. 도우미의 두 번

째 단계에서는 서브리포트에 레코드를 채울때 사용하게 되는 연결이나 데이터소스를 표현식으로 관리하게

합니다(그림 10-21).

168 / 318

그림 10-21 서브리포트 연결 설정

Page 169: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

연결을 선택하기 위해서는:

• JDBC 기반의 서브리포트에서는 부모 보고서의 커넥션과 동일한 것 사용을 선택할 수 있습니다.

JDBC 연결을 부모 보고서에서 서브리포트로 전달하여 사용할 수 있게 합니다.

• 부모 보고서와 다른 JDBC 연결을 지정하려면, 다른 커넥션 사용을 선택합니다.

• 서브리포트에 RXDataSource 객체를 사용하려면, RXDataSource 표현식 사용을 선택하고

RXDataSource 객체를 리턴해주는 표현식을 작성합니다.

• 데이터소스 표현식에 new RXEmptyDataSourcde() 표현식을 설정하려면, 빈 데이터소스 사용을 선택

합니다. 이 표현식을 통해 특별한 데이터소스가 만들어지는데, 이 데이터소스에서는 모든 필드의 값

을 널로 설정한 한 개의 레코드가 제공됩니다. 서브리포트가 정적인 컨텐츠를 보여주는 용도로 사용

될 경우 유용한 방식입니다.

간혹 정적인 컨텐츠를 보여주기 위해 어떠한 연결이나 데이터소스도 사용하지 않도록 해야 할 경우

가 생깁니다. 일반적으로 데이터소스나 연결은 항상 서브리포트가 비도록 하는 것을 방지합니다. 서

브리포트가 데이터소스를 필요로 하지 않더라도 보고서의 속성 데이터가 없을때 를 ‘반복밴드를 제

외한 모든 섹션들’이나 ‘데이터없음 섹션’ 으로 설정하여 실제로 출력되는 문서의 최소 영역을 보장

하도록 한다는 의미가 내재되어 있습니다.

선택한 보고서에 매개변수가 존재한다면, 다음 단계에서 이 목록이 보여집니다(그림 10-22). 각 매개변수에

대하여 여러분은 콤보박스를 통해 선택한 객체로 값을 지정할 수 있습니다. 물론, 여러분이 직접 표현식을

작성할 수도있지만, 이 단계에서는 표현식 편집기는 제공하지 않습니다.

169 / 318

그림 10-22 서브리포트 매개변수 설정

Page 170: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

이 단계를 스킵한 후, 나중에 서브리포트의 매개변수를 10.1.4. “매개변수 넘기기”에서 설명했던 표준 메쏘드

를 사용하여 편집할 수 있습니다.

마지막으로, 서브리포트 표현식을 어떻게 만들것인가를 지정해 주어야 합니다. 새로운 서브리포트의 경우처

럼 두 가지 옵션이 있습니다: 경로를 매개변수에 저장시켜 동적으로 설정하게 하거나 하드코딩한 경로로 설

정하게 합니다(그림 10-23 참고). 다시 말씀드리지만, 모든 선택사항에 대해서는 서브리포트 도우미를 마친

후, 수정할 수 있습니다.

170 / 318

그림 10-23 서브리포트 표현식 설정

Page 171: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

11 장. 데이터소스와 질의 실행기

보고서 엔진에서 보고서에 데이터를 채우기 위해 제공하는 방법은 다양합니다. 예를 들어, 보고서 내에 SQL

질의를 직접 넣어주고 응용프로그램에서 데이터베이스에 대한 연결을 제공하여 질의를 실행시키고 그 결과

레코드셋트를 읽거나 보다 복잡한 커스텀 기술을 사용하여 테이블 형식의 셋트로 구성된 값을 제공하도록

하여 이를 이용할 수도 있습니다.

보고서 디자이너는 SQL, HQL, EJBQL 과 MDX같은 풍부한 질의 언어 셋트뿐만 아니라, XPath까지도 지원하

고 있습니다. 더 나아가서 질의 실행기라고 불리는 플러그인 엔진에 커스텀 언어를 등록해서 해석하고 보고

서 질의를 실행시킬 수 있도록 할 수도 있습니다.

질의를 사용하지 않거나 보고서내에 질의가 들어가는게 싫다면 보고서 라이브러리에서 제공하는 데이터소

스를 사용하면 됩니다. 기본적으로 RXDataSource 는 간단한 테이블처럼 편성된 레코드 셋트를 반복시키는

객체입니다. 모든 데이터소스는 RXDataSource 인터페이스를 구현하게 됩니다. 보고서 엔진에서는 자바빈, 레

코드셋트, 테이블 모델, CSV 그리고 XML 파일등과 같은 배열이나 컬렉션과 같은 범용 데이터 구조를 감싸게

하는 다양한 사용 가능한 데이터소스 구현 클래스를 제공합니다. 이번 장에서는 다양한 데이터소스들 중 일

부를 사용하여 여러분이 요구받게 되는 다양한 경우에 맞출 수 있는 커스텀 데이터 소스를 만드는 것이 얼

마나 쉬운지 보여줄 것입니다. 마지막으로, 커스텀 질의 언어와 커스텀 질의 실행기를 지정하는 방법과 이를

사용하는 방법에 대해서도 알려드리도록 하겠습니다.

보고서 디자이너에서는 다음과 같은 사항들을 지원하고 있습니다: SQL 질의를 실행할 수 있도록 JDBC 연결

설정, 스프링을 통해 하이버네이트 연결 설정, 직접 구현한 RXDataSource나 커스텀 질의 언어 테스트.

이번 장은 다음 섹션들로 구성되어 있습니다:

• 보고서 엔진에서 데이터소스를 다루는 방식

• 보고서 디자이너에서 데이터소스의 연결

• JDBC 연결을 만들고 사용하기

• 설정한 JDBC 연결 사용하기

• RXDataSource 인터페이스

• 데이터소스 타입

• 데이터소스 내보내기와 가져오기

11.1 보고서 엔진에서 데이터소스를 다루는 방식

보고서 엔진은 레코드를 기반으로 하는 엔진입니다. 보고서를 출력하려면, 레코드 셋트를 제공해야 합니다.

보고서를 실행시킬때는 보고서 엔진에서 레코드 셋트를 반복시키면서 보고서에서 정의한 구조에 따라 밴드

들을 만들고 채우게 됩니다. 밴드와 그룹, 변수와 같은 객체들은 보고서를 채우는데 사용하는 레코드 셋과

매우 밀접하게 연결됩니다. 이것은 보고서 엔진에서 하나의 보고서에 한 종류의 질의만을 정의하도록 하는

이유가 됩니다. 하지만, 서브리포트나 서브데이터셋을 정의하면 여러 개의 질의/데이터소스를 사용할 수 있

171 / 318

Page 172: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

게 됩니다. 서브리포트의 경우에는 개별적으로 자신이 속한 질의(또는 데이터소스), 필드, 매개변수, 변수등들

을 갖습니다. 서브데이터셋트는 크로스탭이나 차트를 위해서만 사용합니다.

각각의 레코드는 필드 셋트로 구성됩니다. 필드들을 보고서에서 사용하려면 6장에서 설명했던 것처럼 선언

부터 되어져야 합니다.

보고서 내에서 사용한 질의와 RXDataSource를 사용하여 제공한 데이터 사이에는 어떤 차이가 있을까요?

기본적으로는 차이점이 없습니다. 실제로 보고서 디자이너에서 RXDataSource 대신 질의를 사용하더라도 백

엔드에서 동작하는 보고서 엔진은 내장된 혹은 사용자가 정의한 질의 실행기를 사용하여 RXDataSource를

만들어내어 사용하게 됩니다. 보고서 엔진에 JDBC 연결을 제공하여 보고서 레벨에서 정의한 질의를 사용하

는 경우라도 서브리포트의 사용처럼 단순화 될 수 있습니다.

RXDataSource는 소비적인 객체, 즉 한 개 이상의 보고서나 서브리포트에 동일한 RXDataSource 인스턴스를

사용할 수 없는 성질을 갖고 있습니다. 부모 보고서에서 사용한 RXDataSource 객체(보고서에 매개변수로 제

공한)를 반복 밴드에 위치시킨 서브리포트에 제공하려고 하면 오류가 나게 됩니다. 반복 밴드가 적어도 한번

이상 반복되어 출력되기 때문에(메인 데이터소스내에 존재하는 레코드들 갯수만큼 출력됨), 서브리포트는

메인 레코드 각각에 대해 데이터를 채우는 과정이 반복적으로 발생하며 동일한 RXDataSource를 사용하여

서브리포트를 채우는 동작을 반복시키게 한다면 첫번째 실행될 경우에만 데이터소스가 사용되게 됩니다.

이번장의 후반부에서 여러분은 이러한 종류의 오류를 피하는 방법에 대해서 배우게 될 것이며, 다음과 같은

경우에서 최적으로 보고서를 채우는 방법을 판단하기 위해 필요한 모든 수단을 얻을 수 있습니다:

• 보고서에서 지원하는 질의 언어

• 내장된 데이터소스

• 커스텀 데이터소스

• 질의 실행기에 연계된 커스텀 질의 언어

11.2 보고서 디자이너에서의 데이터소스와 연결

보고서 디자이너에서는 보고서를 채우기 위해 사용할 다양한 데이터소스를 설정하고 관리할 수 있습니다.

데이터소스들은 보고서 디자이너의 설정으로 저장되고 필요할 때 활성화시킬 수 있습니다.

본 문서에서 데이터소스라고 명시적인 언급을 하는 경우에는 실제 데이터소스(혹은 RXDataSource 인터페이

스를 구현한 객체)와 연결(보고서내에 정의해 놓은 질의문과 조합되어 사용하는)사이를 구별하려는 의도가

있다고 이해하시면 됩니다. 또한, 보고서 엔진에서 “데이터소스”라는 용어가 사용되면 javax.sql.Datasource에

서 다루는 개념(일반적으로 JNDI 룩업을 통해 데이터베이스와의 물리적인 연결을 가져오는 의미만을 갖는)

과 동일하지 않다는 것도 이해하셔야 합니다. 보고서에서 언급하는 데이터소스 객체는 데이터를 포함하고

있는 영역입니다.

172 / 318

Page 173: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

보고서 디자이너에서 제공하는 데이터소스 목록과 연결타입은 다음과 같습니다:

• JDBC 연결

• JavaBean 컬렉션 데이터소스

• XML 데이터소스

• CSV 데이터소스

• 하이버네이트 연결

• 스프링에서 로딩한 하이버네이트 연결• RXDataSourceProvider

• 커스텀 데이터소스

• Mondrian OLAP 연결

• XMLA 연결

• EJBQL 연결

• 빈 데이터소스

마지막으로 질의 실행기 모드라고 불리는 보고서를 실행시키기 위한 특별한 모드도 있습니다. 이 모드는 보

고서 엔진쪽에 연결이나 데이터소스를 넘겨주지 않으면서 보고서를 만들도록 할 때 사용합니다.

보고서를 생성할 때는 모든 연결들이 “오픈된” 상태에서 보고서 엔진에 직접 넘겨집니다. 많은 연결들에 대

해 보고서 엔진은 보고서 내부에서 다양한 용도로 사용될 수 있는 하나 이상의 내장 매개변수를 제공합니다.

예를 들자면, 부모 보고서에서 사용하는 연결과 동일한 연결을 이용하여 서브리포트를 채울때 사용하는 내

장 매개변수도 있습니다.

• XML 데이터소스는 XML 문서로부터 데이터를 가져올 수 있게 합니다.

• CSV (콤마기호로 분리된 값들) 데이터소스는 CVS 파일을 열어 보고서에서 사용할 수 있게합니다.

• JavaBean 셋 데이터소스, 커스텀 데이터소스 그리고 RXDataSourceProvider 는 자바 클래스로 작성된

데이터를 출력하게 합니다.

• 하이버네이트 연결은 HQL(하이버네이트의 질의 언어) 질의(연결은 스프링으로부터 설정된 것을 사

용)를 실행시킬 수 있는 환경을 제공합니다.

• EJBQL (엔터프라이즈 자바빈 질의 언어) 질의는 EJBQL 연결을 통해 사용할 수 있습니다.

• MDX 질의는 몬드리안서버에 직접 연결해서 사용될 수 있거나 XML/A 인터페이스를 사용해서 범용

OLAP 데이터베이스에 질의할 수 있게 합니다.

빈 데이터소스는 필드가 없는 레코드를 생성하는 것과 유사합니다. 이 데이터소스는 테스트 용도로 사용하

거나 정적인 컨텐츠를 위한 보고서나 서브리포트와 같이 특별한 상황에 따라 필요로 하는 경우에 유용하게

사용됩니다.

연결과 데이터소스는 도구바의 아이콘을 클릭하면 그림 11-1에서 보여지는 연결 설정창이 나타납니다.

173 / 318

Page 174: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

서두에서도 언급하였듯이, 연결과 데이터소스는 서로 다른 객체입니다. 하지만, 이 시점에서는 두 객체

사이의 기능이 유사하기 때문에 혼용해서 사용할 것 입니다.

사용할 수 있는 여러 데이터소스를 가지고 있다 해도, 보고서 디자이너는 한 시점에서는 오직 하나의 소스를

사용할 수 있습니다. 다양한 방법으로 데이터소스를 활성화할 수 있습니다. 제일 쉬우면서 직관적인 방식은

툴바에 위치한 콤보박스에서 데이터소스를 선택해주는 것입니다(그림 11-2). 또 다른 방법은 연결/데이터소

스 대화창에서 데이터소스를 선택해서 기본으로 설정 버튼을 클릭하여 활성화시키게 됩니다.

174 / 318

그림 11-1 보고서 데이터소스 대화창

그림 11-2 활성화된 데이터소스를 보여주는 데이터소스 콤보박스

Page 175: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

데이터소스를 선택하지 않으면, 보고서를 채울 데이터가 없으므로 보고서 디자이너를 처음 실행했을 때 빈

데이터소스가 기본으로 선택됩니다. 데이터소스는 보고서 도우미와 결합되어 사용될 수 있습니다. 이러한 이

유로 보고서 디자이너를 시작하면 첫 단계로 데이터에 연결 설정을 하도록 합니다.

11.3 JDBC 연결을 만들고 사용하기

JDBC 연결은 관계형 DBMS를 사용할 수 있게 합니다. 일반적으로 JDBC 드라이버를 통해 사용가능한 데이

터베이스라면 무엇이든 사용할 수 있습니다. 새로운 JDBC 연결을 설정하려면, 연결/데이터베이스 대화창(그

림 11-1)에서 새로만들기 버튼을 클릭하여 새로운 연결(또는 데이터소스)을 생성하는 인터페이스를 보이게

합니다. 목록에서 데이터베이스 JDBC 연결을 선택하면, 그림 11-3에서 보여지는 윈도우가 나타나게 됩니다.

제일 먼저 해줄 일은 연결에 대한 이름(의미를 갖는 이름, 가령 Mysql-Test와 같이)을 지정하는 것 입니다. 보

고서 디자이너는 항상 이 연결을 참조할 때 지정한 이름을 사용합니다. JDBC 드라이버 필드에서 데이터베

이스에 연결하기 위해 사용할 JDBC 드라이버의 이름을 선택합니다. 콤보박스에서는 흔하게 사용하는 JDBC

드라이버들의 이름을 제공하고 있습니다(그림 11-4 참고).

175 / 318

그림 11-3 JDBC 연결 설정

Page 176: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

드라이버가 적색으로 표시된다면, 해당 드라이버에 대한 JDBC 드라이버 클래스가 클래스경로에 존재하지

않아 사용할 수 없음을 의미합니다. JDBC 드라이버를 설치하는 방법은 11.3.4. “서비스 뷰를 통해 JDBC 연결

만들기”에 기술하였습니다. JDBC URL 도우미를 사용하면, 서버의 이름과 데이터베이스 이름을 올바르게 텍

스트 필드에 입력했을 때 자동으로 JDBC URL 연결문자를 구성합니다. 도우미 버튼을 클릭해서 URL을 생성

할 수 있습니다.

데이터베이스에 접속하기 위해서는 계정과 암호를 입력합니다. 암호 저장 체크박스 옵션을 통해 연결에 사

용할 암호를 저장시킬 수 있습니다.

보고서 디자이너는 암호를 평문으로 저장하기 때문에 보안에 위협이 될 수 있습니다.

모든 데이터를 입력한 후에는 테스트 버튼을 클릭해서 연결을 검증할 수 있습니다. 입력한 값에 문제가 없다

면, 그림 11-5에서 보이는 것과 같은 메시지 박스가 보여지게 됩니다.

새로 데이터소스를 만들때는 설정의 편리성을 위해 보고서 디자이너에서 자동으로 활성화시켜 줍니다. 일반

적으로, 연결을 테스트할 때 실패하는 이유는 여러가지 요인이 있겠지만, 제일 흔한 원인은 다음과 같습니다: • ClassNotFoundError 예외가 던져질때.

• URL이 올바르지 않을 때.

• 연결 설정에 대한 매개변수가 올바르지 않음(데이터베이스에서 사용자 이름을 찾을 수 없거나 암호

가 틀린 경우 등).

위의 오류에 대한 해결방법에 대해 알아보도록 하겠습니다.

176 / 318

그림 11-4 JDBC 드라이버 목록

그림 11-5 테스트 완료 대화창

Page 177: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

11.3.1 ClassNotFoundError

데이터베이스 연결에 필요한 JDBC 드라이버를 클래스경로에서 찾을 수 없는 경우 ClassNotFoundError 예외가

발생합니다. 오라클 데이터베이스 연결을 만들었다고 가정해보겠습니다. 보고서 디자이너는 기본적으로 해

당 데이터베이스를 위한 드라이버를 제공하지 않지만, JDBC 드라이버 목록에는 oracle.jdbc.driver.OracleDriver

가 제공됩니다. 이 드라이버를 선택하고 연결 테스트를 하게되면, 프로그램은 그림 11-6에서 보여지는

ClassNotFoundException을 던집니다.

그림 11-6 ClassNotFoundError 예외발생

이 경우 여러분은 오라클용 JDBC 드라이버(ojdbc5.jar 또는 ojdbc14.jar 등 연결할 오라클 데이터베이스 버전

에 맞는 드라이버)를 클래스 경로(JVM에서 클래스를 검색하는 경로)에 추가해주어야만 합니다. 보고서 디자

이너는 별도의 클래스 로더를 사용하므로, 옵션창에서 보고서 디자이너 클래스경로에 오라클 JDBC 드라이

버 파일을 추가해주어도 해결할 수 있습니다(도구 → 옵션). 드라이버 파일이 존재하는 디렉터리를 추가해도

클래스와 리소스들을 찾을 수 있습니다.

11.3.2 URL이 올바르지 않은 경우

오타 때문에 URL 지정이 잘못되면, 테스트 버튼을 눌렀을 때 다수의 예외들이 발생됩니다. 직접적인 오류의

원인은 예외 대화창의 스택 트레이스에서 유추할 수 있습니다. 이 경우, 가능하다면 JDBC URL 도우미를 사

용해서 JDBC URL 을 만들어서 다시 테스트 하십시오.

177 / 318

Page 178: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

11.3.3 연결에 사용한 매개변수가 틀린 경우

덜 프로그램적인 오류인 경우로, 데이터베이스로의 연결을 시도할 때 매개변수가 잘못되어 발생됩니다. 사용

자 이름이나 암호가 잘못되거나 존재하지 않는 데이터베이스로의 연결 시도등이 이에 속합니다. 이 경우에

는 데이터베이스로부터 연결 실패에 대한 명확하거나 조금은 모호한 메시지가 반환됩니다.

11.3.4 서비스 뷰를 통해 JDBC 연결 만들기

보고서 디자이너에서는 넷빈 플랫폼에서 제공하는 JDBC 연결 설정을 사용할 수 있도록 지원하고 있습니다.

서비스 뷰상에서 새 연결을 선택합니다(그림 11-7).

그림 11-7 넷빈의 서비스 뷰

서비스 뷰에서는새로운 JDBC 드라이버를 등록할 수 있습니다(보고서 디자이너를 설치하면, MySQL,

PostgreSQL 과 JDBC-ODBC 브릿지 드라이버가 설치됩니다). 가능하면 JDBC-ODBC 브릿지는 사용하지 않는

것을 권장합니다. JDBC 연결을 설정하는 인터페이스는 보고서 디자이너에서 제공하는 것과 유사합니다(그

림 11-8).

178 / 318

Page 179: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

연결 설정이 완료되면, 서비스 뷰는 다음과 같은 모습이 됩니다(그림 11-9).

그림 11-9 서비스 뷰에 등록된 새로운 연결

이 연결을 사용하기 위한 최종 절차는 새로운 보고서 디자이너 연결/데이터소스를 만들어 주는 일입니다. 방

금 설정한 연결을 지정해주면 되겠습니다. 새로운 연결/데이터소스를 만들었다고 알려주기 위해 연결 타입

목록에서 넷빈 데이터베이스 JDBC 연결을 선택합니다(그림 11-10). 그리고 다음 버튼을 클릭합니다.

179 / 318

그림 11-8 서비스 뷰를 사용하여 데이터베이스 연결 만들기

Page 180: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

지금까지 알아본 연결 생성 방법들을 구별짓게 하는 장점은 없기 때문에 JDBC 연결의 설정에 사용되는 방

법은 여러분의 기호에 맞춰 결정하면 됩니다.

11.4 JDBC 연결 사용하기

보고서가 JDBC 연결을 이용하여 만들어지게 될때는 데이터베이스로부터 출력해줄 레코드를 추출하는 SQL

질의를 지정해야 합니다. 또한 이 연결을 서브리포트에서도 사용할 수 있습니다. 이를 위해 보고서 엔진에서

는 java.sql.Connection 타입의 REPORT_CONNECTION 이라는 이름을 갖는 내장 매개변수를 제공하고 있습

니다. 매개변수를 표현식에 사용하는 문법을 통해 사용합니다: $P{REPORT_CONNECTION}

이 매개변수는 호출하는 프로그램으로부터 보고서 엔진으로 넘겨주는 java.sql.Connection 클래스를 포함합니

다. JDBC나 SQL 연결의 사용은 보고서에 데이터를 채우는 간단하고 쉬운 방법입니다. SQL 질의를 만드는 방

법에 대해서는 6장에서 자세히 설명하고 있습니다.

11.4.1 필드 등록

SQL 질의 필드를 보고서에서 사용하기 위해서는 이 필드들을 등록해야 합니다. 질의에서 사용된 모든 필드

들을 등록할 필요는 없습니다. 보고서에서 출력에 이용할 필드들만을 등록하는 것이 효율적입니다. 각 필드

180 / 318

그림 11-10 넷빈의 “브릿지” 연결

Page 181: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

들마다 필드의 이름과 타입을 지정해야 합니다. 표 11-1. SQL과 JAVA 타입의 변환 관계에서는 SQL 타입에 대

응되는 자바 타입의 매핑을 보여주고 있습니다.

표 11-1 SQL 과 자바 타입 변환SQL Type Java Object SQL Type Java Object

CHAR String REAL Float

VARCHAR String FLOAT Double

LONGVARCHAR String DOUBLE Double

NUMERIC java.math.BigDecimal BINARY byte[]

DECIMAL java.math.BigDecimal VARBINARY byte[]

BIT Boolean LONGVARBINARY byte[]

TINYINT Integer DATE java.sql.Date

SMALLINT Integer TIME java.sql.Time

INTEGER Integer TIMESTAMP java.sql.Timestamp

BIGINT Long

이 테이블에는 BLOB과 CLOB 타입 및 기타 특수 타입들(ARRAY, STRUCT 그리고 REF)은 포함시키지 않았

습니다. 이 타입들은 보고서 엔진에서 자동으로 관리할 수 없기 때문입니다. 하지만, 이 타입들을 Object로 일

반화해서 받은 후 이를 지원할 수 있는 정적인 메쏘드를 작성하면 관리할 수 있습니다.

BINARY, VARBINARY 및 LONGBINARY 타입은 동일한 방법으로 처리해야만 합니다. 대부분의 데이터베이

스에서 BLOB과 CLOB은 java.io.InputStream 으로 선언할 수 있습니다. BLOB 데이터에서 이미지를 렌더링할

경우에는 java.awt.Image로 선언하여 사용합니다. SQL 타입을 자바 객체로 변환하는 것은 사용한 JDBC 드라

이버에 따라 달라질 수 있습니다. SQL 질의 필드가 자동으로 등록되는 경우, 보고서 디자이너는 드라이버 자

체에서 선호하는 타입으로 각각의 필드들의 타입을 지정하게 합니다.

11.4.2 레코드의 정렬과 필터링

데이터소스에서 또는 연결을 통해 실행시킨 질의로부터 가져온 레코드들은 다시 정렬시키거나 필터링될 수

있습니다. 레코드의 정렬과 필터 옵션은 보고서 질의 대화창에서 필터 표현식과 정렬 옵션을 클릭해서 설정

해줄 수 있습니다(그림 11-11).

181 / 318

Page 182: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

필터 표현식은 부울린 객체로 리턴되어야만 합니다. true 가 리턴되면, 레코드를 유지하게 되고 false가 리턴

되면 해당 레코드를 출력하지 않습니다. 정렬은 한 개 이상의 필드에서 이루어집니다. 각 필드는 오름차순이

나 내림차순으로 정렬될 수 있습니다(그림 11-12).

필드 추가 버튼을 선택했을 때 필드를 선택할 수 없다면, 보고서에 필드가 포함되어 있는지 확인하십시오.

182 / 318

그림 11-11 필터 표현식과 정렬 옵션 버튼

그림 11-12 정렬 옵션

Page 183: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

등록된 필드가 없다면, 질의 대화창을 닫고 필드를 등록시킨 후, 다시 정렬을 설정합니다.

11.5 RXDataSource 인터페이스

다른 데이터소스에 대해 알아보기 전에 보고서 디자이너에서 제공하는 RXDataSource 인터페이스가 어떻게

동작하는지에 대한 이해가 필요합니다. 모든 RXDataSource는 반드시 다음 두 메쏘드를 구현해야 합니다:

public boolean next()public Object getFieldValue(RXField rxField)

첫번째 메쏘드는 다음 레코드로 가상의 커서를 이동시킬 때 사용합니다. 다음 번 레코드로 커서를 이동시키

게 되었다면 true를 리턴하고, 더이상 이동시킬 레코드가 없다면 false를 리턴합니다. 두번째 메쏘드는 실제로

RXDataSource에서 공급된 데이터를 테이블처럼 레코드들을 이상적으로 구성합니다.

보고서 엔진에서 public boolean next() 메쏘드를 실행시킬 때마다 보고서내에 정의한 모든 필드들이 채워지게

되고 모든 표현식(필드와 관련된 변수를 사용한)이 다시 계산됩니다. 이에 따른 결과로 새로운 그룹의 헤더

를 출력할지, 새로운 페이지로 이동할지 등이 결정됩니다. next() 에서 false가 리턴된다면, 모든 최종 밴드들

(그룹 풋터, 컬럼 풋터, 최종 페이지 풋터 및 요약 밴드)을 출력하여 보고서를 완료하게 합니다. 첫번째 메쏘

드는 데이터소스 인스턴스에 존재하는 레코드 갯수만큼 호출됩니다.

getFieldValue(RXField rxField) 메쏘드는 보고서 엔진에서 next 메쏘드가 true를 리턴한 후에 호출합니다. 특히,

보고서내에 선언된 각각의 필드(보고서 필드를 선언하는 방법은 6장에서 자세히 다루었습니다)마다 실행되

어 해당 필드의 값을 얻을 수 있게 합니다. 이 메쏘드 호출에서 매개변수로 넘어가는 RXField 객체는 필드

이름, 설명 그리고 필드의 타입으로 구성되어 있습니다. 지정한 데이터소스 구현방식에 따라 이 정보들은 달

라지며 이 정보들을 조합하여 RXField 객체를 만들어 필드 값을 추출하는데 사용됩니다.

getFieldValue(RXField rxField) 메쏘드 호출을 통해 리턴받는 값의 타입은 null이 반환되는 경우를 제외하면,

RXField 매개변수에서 정의된 타입에 부합되어야만 합니다. 필드 타입이 java.lang.Object로 선언된 경우라면,

이 메쏘드를 통해 리턴되는 타입은 임의의 타입이라도 가능합니다. 이 경우, 필요하다면 표현식에서 캐스트

를 사용할 수 있습니다. 캐스트는 객체에 대한 타입을 동적으로 지정하는 방법으로 다음과 같은 문법을 사용

합니다: (type)object

사용된 예제를 보자면: (com.cabsoft.rxd.examples.beans.PersonBean)$F{my_person}

보통, 캐스트는 특정한 클래스에 속해있는 객체에 대해 메쏘드를 호출할 때 필요해집니다.

183 / 318

Page 184: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

11.6 데이터 소스의 타입

11.6.1 자바빈즈 데이터소스 사용하기

자바빈 셋 데이터소스는 보고서를 채우는 데이터로 자바빈을 사용할 수 있게 합니다. 여기서 자바빈은 일련

의 겟터 메쏘드를 사용하여 자신의 속성을 노출시킨 자바 클래스이며, 다음과 같은 문법에 따라 작성됩니다:

public <returnType> getXXX()

여기서 <returnType>은 리턴되는 값으로써 일반적인 자바 클래스 또는 원시형 타입(int, double 등의)입니다.

자바빈을 처리하기 위한 연결을 만들려면, 보고서 데이터소스 대화창에서 신규 버튼을 누른 후, 데이터소스

타입 목록에서 자바빈즈 데이터소스를 선택하여 그림 11-13과 같은 설정창을 열어야 합니다.

앞선 경우에서 처럼, 제일 먼저 해줄 일은 새로 추가하는 데이터소스의 이름을 지정하는 것 입니다. 자바빈

즈 데이터소스는 보고서에 넘겨줄 데이터를 구성하기 위한 객체(자바빈)를 생성해줄 외부 클래스(Factory라

는 이름이 붙은)를 사용합니다. 팩토리 클래스 필드에 사용할 클래스의 완전한 이름으로 구성된 자바 클래스

를 입력하고, 자바빈 클래스에 다른 인스턴스를 만들어주는 정적인 메쏘드를 지정합니다. 이 메쏘드를 호출

184 / 318

그림 11-13 자바빈즈 데이터소스

Page 185: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

해서 리턴받게 되는 종류가 컬렉션(java.util.Collection)인지 배열(Object[])인지 지정합니다. 메쏘드의 이름과

리턴 타입은 설정창의 다른 필드에 그림 11-13처럼 지정합니다.

그러면, 팩토리 클래스를 제작하는 방법에 대해서 살펴보겠습니다. 사용할 데이터가 PersonBean 타입의 객체

의 셋트로 표현된다고 가정하겠습니다. PersonBean 클래스는 firstName과 lastName, email등의 필드로 구성되

며, 코드는 다음과 같습니다:

코드 예제 11-1 PersonBean.javapublic class PersonBean{private String firstName = "";private String lastName = "";private String email= "";public PersonBean(String firstName, String lastName ,String email) {this. firstName = firstName;this. lastName = lastName;this. email= email;}public String getFirstName (){return firstName;}public String getLastName (){return lastName;}public String getEmail(){return email;}

}

SampleRXDataSourceFactory 라는 이름의 클래스는 다음과 같은 형식으로 만들어지게 됩니다:

코드 예제 11-2 SampleRXDataSourceFactory.javapublic class SampleRXDataSourceFactory{

public static java.util.Collection generateCollection(){

java.util.Vector collection = new java.util.Vector();

collection.add(new PersonBean("홍", “길동”,“[email protected]”) );

collection.add(new PersonBean("고", “길동”,“[email protected]”) );

collection.add(new PersonBean("박", “길동”,“[email protected]”) );

collection.add(new PersonBean("김",“길동”,“[email protected]”) );

return collection;

}}

SampleRXDataSourceFactory 클래스를 통해 여러분의 데이터소스에는 총 다섯개의 PersonBean 타입의 자바빈을

185 / 318

Page 186: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

얻게 됩니다. 데이터소스 설정을 위한 매개변수는 다음과 같습니다(그림 11-14):

Factory name: “SampleRXDataSourceFactory"Factory class: SampleRXDataSourceFactoryMethod to call: generateCollectionReturn type: Collection of JavaBean

11.6.2 자바빈즈 데이터소스의 필드

자바빈즈 데이터소스의 특색중 하나는 겟터 메쏘드를 통해 필드가 노출되어진다는 점입니다. 다시 말해서,

자바빈에 getXyz() 메쏘드가 있다면, 보고서 필드의 이름은 xyz 가 됩니다. 자바빈은 레코드를 의미합니다. 예

제의 경우에는 PersonBean 객체에서 두 개의 필드가 존재합니다:

name 과 age

이 필드들을 필드 목록에서 각각 String과 Integer로 등록합니다.

새로 빈 보고서를 만들고 보고서 인스펙터에서 필드 노드에서 마우스 오른쪽 클릭한 후, 필드추가를 선택합

니다. 추가해줄 필드명과 타입은 다음과 같습니다:

firstName (java.lang.String), lastName (java.lang.String), email(java.lang.String).

추가된 필드들을 인스펙터에서 다지인 팬의 반복 밴드로 끌어다 놓습니다. 그림 11-15에서 처럼 디자인을 조

186 / 318

그림 11-14 팩토리 데이터소스의 설정

Page 187: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

정합니다. 그런 후, 활성화된 연결이 SampleRXDataSourceFactory 인 것을 확인하고 미리보기를 통해 보고서를

실행시킵니다. 그러면 자바빈즈 데이터소스로 보고서가 채워져서 그림 11-16에서와 같은 결과를 출력하게

됩니다.

187 / 318

그림 11-15 자바빈 기반의 보고서 레이아웃

그림 11-16 생성된 보고서

Page 188: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

속성의 속성을 참조하려면, 속성들 사이에 마침표를 구분하는 특별한 표기법을 사용합니다. 즉, PersonBean에

포함된 가상의 address 클래스의 속성인 street 속성에 접근하기 위해서는 address.street 와 같은 문법을 사용합

니다. 실제 호출은 <SomeBean>.getAddress().getStreet() 형태가 됩니다.

자바빈즈 데이터소스의 속성을 지정하면서 필드 설명 사용 플래그를 설정했다면, 자바빈 속성과 필드 값사

이의 맵핑은 필드이름 대신 필드의 설명을 사용하게 됩니다. 데이터소스는 필드값을 찾기 위해 필드의 설명

만을 이용하고 필드의 이름은 임의로 설정할 수 있습니다.

보고서 디자이너에서는 자바빈 속성과 보고서의 필드를 비쥬얼 툴로 맵핑할 수 있도록 지원하고 있습니다.

이를 사용하려면 질의 편집기 창을 연 후, 자바빈 데이터소스탭으로 이동하여 탐색할 빈의 완전한 클래스 이

름을 입력해 주고, 속성읽기 버튼을 클릭합니다. 그러면, 탭 아랫부분에 지정한 빈즈 클래스의 속성들을 나열

합니다(그림 11-17).

• 속성이면서 자바 객체인 경우는, 객체를 더블클릭하여 해당 객체의 속성을 볼 수 있습니다.

• 필드에 맵핑하려면, 속성이름을 선택하고 선택한 필드(들) 추가 버튼을 클릭합니다.

188 / 318

그림 11-17 보고서 필드와 자바빈 속성을 맵핑하기 위한 탐색기

Page 189: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

11.6.3 XML 데이터 소스 사용하기

보고서 엔진에서는 XML 문서를 데이터소스로 사용할 수 있습니다. XML 문서는 트리구조로 구성되며 보고

서에서 요구하는 테이블 형태의 포맷으로 일치시키기에 힘든 구조(계층적 구조)를 갖고 있습니다. 따라서, 노

드 셋트를 정의하기 위해 XPath 표현식을 사용해야 합니다. XPath 언어 사양은 http://www.w3.org/TR/xpath 에

서 확인하실 수 있습니다. XPath는 XML 문서내에서 특정 값이나 노드를 지정하기 위해 사용됩니다. 실제 사

용되는 예제를 통해 노드를 지정하는 방법을 보다 쉽게 배울 수 있습니다.

코드 예제 11-3의 예제 XML을 살펴보겠습니다. 이 XML 문서는 가상의 주소록으로 category로 그룹핑된 서

로 다른 사람들에 대한 정보입니다. category 목록 밑에는 두 번째 목록으로 favorites 객체가 보입니다. 이렇게

조직된 XML의 경우에는 서로 다른 노드 셋 타입을 지정할 수 있습니다. 어떤 노드를 선택하느냐는 보고서

에서 데이터를 어떻게 출력해야 하는지에 따라 달라집니다.

코드 예제 11-3 가상의 주소록 XML 파일<addressbook><category name="home"><person id="1"><lastname>Davolio</lastname><firstname>Nancy</firstname></person><person id="2"><lastname>Fuller</lastname><firstname>Andrew</firstname></person><person id="3"><lastname>Leverling</lastname></person></category><category name="work"><person id="4"><lastname>Peacock</lastname><firstname>Margaret</firstname></person></category><favorites><person id="1"/><person id="3"/></favorites></addressbook>

category 에 속해있는 사람만을 선택하려면(주소록에서는 모든 사람이 해당됨), 다음과 같은 표현식을 사용합

니다: /addressbook/category/person

그 결과로 네 개의 노드가 리턴됩니다(코드 예제 11-4).

코드 예제 11-4 표현식 /addressbook/category/person 으로 선택된 노드<person id="1"><lastname>Davolio</lastname><firstname>Nancy</firstname></person><person id="2"><lastname>Fuller</lastname>

189 / 318

Page 190: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

<firstname>Andrew</firstname></person><person id="3"><lastname>Leverling</lastname></person><person id="4"><lastname>Peacock</lastname><firstname>Margaret</firstname></person>

favorites 노드에 해당되는 사람만 선택하려고 하면, 표현식은 다음과 같습니다: /addressbook/favorites/person

다음 두 개의 노드가 리턴됩니다: <person id="1"/><person id="3"/>

다른 표현식도 살펴보겠습니다. 앞에서 보여드렸던 표현식보다는 복잡하지만, XPath 언어의 기능을 보여주

는 좋은 사례가 될 것입니다. category가 work에 해당되는 person 노드들만 선택하는 방법은 다음과 같은 표현

식으로 가능해집니다: /addressbook/category[@name = "work"]/person

이 표현식의 결과로 리턴되는 노드는 오직 한 개입니다:

<person id="4"><lastname>Peacock</lastname><firstname>Margaret</firstname>

</person>

노드셋을 선택하기 위한 표현식을 만든 후에는 XML 데이터소스의 생성을 진행할 수 있습니다. 새로운 데이

터소스를 만들기 위해 윈도우창을 열고, 연결타입 목록에서 XML 파일 데이터소스를 선택하여 그림 11-18과

같은 설정창이 보여지도록 합니다.

190 / 318

그림 11-18 XML 데이터소스 설정

Page 191: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

설정항목 중에서 필수 입력사항은 XML 파일 이름입니다. 부가적으로 미리 만들어 놓은 정적인 XPath 표현

식을 사용하여 노드들을 설정할 수 있습니다.

보고서에서 지정한 XPath 표현식을 사용하는 방법을 권장합니다. 이 경우에는 XPath 표현식내에 매개변수를

사용할 수 있도록 합니다. 이를 통해 공급된 XML 데이터상에서 실질적인 질의를 하는 것처럼 만들 수 있습

니다. 한편, 보다 자바 객체에 적절하게 매핑하도록 평문 문자열로 부터 날짜와 숫자 변환을 하기 위한 자바

패턴(Date와 Double)을 지정해 줄 수도 있습니다. 이와 동일한 목적을 위해서 XML 스트링을 파싱할 때 사용

할 로케일과 시간대도 지정해줄 수 있습니다.

11.6.4 XML 데이터소스를 위한 필드 등록

XML 데이터소스를 사용하는 경우에는 보고서에서 필드를 정의할 때 필드의 이름과 타입뿐만 아니라 필드

의 설명으로 특별한 표현식까지 넣어주어야만 합니다. 데이터소스의 특성상 선택한 노드셋에서 하나의 노드

를 사용하도록 해야하기 때문에 현재 선택한 노드로부터 상대적인 경로로 표현식을 사용해야 합니다. 현재

노드에서 속성의 값을 선택하려면 다음과 같은 문법을 사용합니다: @<name attribute>

예를 들어, person 노드의 id 속성을 가리키는 필드를 정의하려면 새로운 필드를 만들고 필드 이름은 여러분

이 원하는 설정을 하고, 설명 속성을 @id로 설정합니다. 유사한 방식으로, 현재 노드의 자식 노드를 가져올

수도 있습니다. 가령, person 노드의 자식노드인 lastname 노드를 참조하고 싶다면, 다음과 같은 문법을 사용합

니다: lastname

현재 노드의 부모노드로 이동하고 싶다면(person이 속해있는 category가 무엇인지 알고싶을 경우), 조금은 다

른 형태의 문법을 사용합니다:

ancestor::category/@name

ancestor 는 현재 노드의 부모노드를 참조하는 키워드입니다. 첫번째 부모노드인 category에서 name 속성의

값을 알 수 있습니다.

이제, 사용하는 액션들을 모두 살펴보았습니다. 다음과 같이 등록한 필드를 사용하여 간단한 보고서를 만들

어 보도록 하겠습니다:

필드 이름 설명 타입

id @id Integer

lastname lastname String

firstname firstname String

name of category ancestor::category/@name String

보고서 디자이너는 보고서 필드와 XML 노드를 시각적으로 매핑시키는 도구를 제공합니다. 이 도구를 사용

하려면, 질의 윈도우를 열고 질의언어로 XPath 를 선택합니다. 활성화된 연결이 올바른 XML 데이터소스일

191 / 318

Page 192: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

경우라면, 연결된 XML 문서가 트리뷰로 보여지게 됩니다. 필드를 등록하려면, person 노드에서 오른쪽 클릭

후 레코드 노드 설정 메뉴를 선택하여(그림 11-19) 레코드 노드를 지정합니다. 지정된 레코드노드는 굵게 표

시됩니다.

이제 보고서 필드에 맵핑시킬 XML 노드나 속성을 하나씩 차례대로 선택해서 나타나는 필드로 노드추가 항

목을 클릭합니다. 보고서 디자이너는 선택한 노드나 속성에 해당되는 XPath 표현식을 생성하고 필드를 만들

게 됩니다. 나중에 이 단계에서 설정한 값들을 수정해 줄 수 있습니다. 질의 설정창을 닫은 후에는 자동으로

생성시킨 필드이름과 필드에 할당된 필드타입을 알맞게 수정하면 됩니다.

이제 그림 11-20에서 보여지는 것처럼 정의된 필드들을 반복 밴드에 끌어다 놓고, 위치가 크기를 조정합니

다. 보고서를 미리보기할 때 채워지는 데이터소스는 XML 파일이 사용됩니다.

192 / 318

그림 11-19 XML 노드 맵핑 도구

Page 193: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

그림 11-20 XML-기반의 보고서 레이아웃

질의 대화창에서 지정한 노드셋 선택을 위한 XPath 표현식은 다음과 같습니다: /addressbook/category/person

최종 결과는 그림 11-21에서와 같은 모습이 됩니다.

193 / 318

그림 11-21 XML-기반의 보고서 결과

Page 194: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

11.6.5 XML 데이터소스와 서브리포트

RXDataSource의 관점에서 볼 때, 노드셋은 노드들의 시리즈를 레코드들로 다시 표현할 수 있습니다. 하지만,

XML의 계층구조 트리속성 때문에 메인 노드의 하위에서 다른 노드셋을 보아야만 합니다. 예제코드 11-5에

서 제공한 XML을 대상으로 논의를 진행하도록 하겠습니다. 이번 XML은 예제코드 11-3을 수정한 버전입니

다. 각 person 노드에 한 개 이상의 email 노드와 hobbies 노드가 추가되었으며, hobbies 노드에는 hobby 자식 노

드들이 포함되도록 수정되었습니다.

코드 예제 11-5 조금 더 복잡해진 예제 XML<addressbook><category name="home"><person id="1"><lastname>Davolio</lastname><firstname>Nancy</firstname><email>[email protected]</email><email>[email protected]</email><hobbies><hobby>Music</hobby><hobby>Sport</hobby></hobbies></person><person id="2"><lastname>Fuller</lastname><firstname>Andrew</firstname><email>[email protected]</email><email>[email protected]</email><hobbies><hobby>Cinema</hobby><hobby>Sport</hobby></hobbies></person></category><category name="work"><person id="3"><lastname>Leverling</lastname><email>[email protected]</email></person><person id="4"><lastname>Peacock</lastname><firstname>Margaret</firstname><email>[email protected]</email><hobbies><hobby>Food</hobby><hobby>Books</hobby></hobbies></person></category><favorites><person id="1"/><person id="3"/></favorites></addressbook>

기대하는 시나리오는 각 person에 대해 e-mail 주소와 취미를 묶어서 출력해주는 보고서를 만들어 보도록 하

는 것입니다. 이러한 문서를 만들기 위해서 서브리포트를 사용하겠습니다. 특히, 서브리포트에서는 e-mail 주

소 목록을 처리하기위한 것과 취미목록을 위한 것을 나누어 만들것 입니다. 이제 서브리포트들을 만들기 위

194 / 318

Page 195: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

해서, 우선 각 서브리포트에 제공할 새로운 데이터소스를 만드는 방법부터 알아보도록 하겠습니다. 이번 경

우에는 RXXmlDataSource를 사용할 것입니다. 이것을 사용하면 다음 두 가지의 매우 편리한 메쏘드를 사용

할 수 있습니다:

public RXXmlDataSource dataSource(String selectExpression)

public RXXmlDataSource subDataSource(String selectExpression)

이 두 메쏘드의 차이는 첫번째 메쏘드는 전체 문서를 대상으로 표현식이 처리되고(문서의 실제 루트요소로

부터 시작), 두 번째 메쏘드는 현재 노드를 루트 노드로 가정하여 처리한다는 점입니다. 이 두 메쏘드 모두

서브리포트 요소에 대한 데이터소스 표현식으로 사용하여 동적으로 데이터소스를 요소쪽으로 넘겨주도록

생성하는 것이 가능합니다. 사용상 가장 주목해야 할 사항은 이 두 메쏘드 모두 데이터소스를 생성시키고 노

드 선택을 동적으로 하는 표현식이 가능하다는 것입니다. e-mail 주소 목록을 출력할 서브리포트의 데이터소

스를 생성하기 위한 표현식은 다음과 같습니다: ((com.cabsoft.rx.engine.data.RXXmlDataSource)$P{REPORT_DATA_SOURCE}).subDataSource("/person/email")

이 코드는 현재 노드(person)의 자식노드에 해당되는 e-mail 노드만 리턴합니다.

취미목록 출력을 위한 서브리포트용 표현식도 유사하지만, 다만 노드 선택하는 부분이 다릅니다: ((com.cabsoft.rx .engine.data.RXXmlDataSource)$P{REPORT_DATA_SOURCE}).subDataSource("/person/hobbies/hobby")

다음은 그림 11-20에서 보여지는 것처럼 부모 리포트의 필드를 선언해주는 것입니다. 자식리포트에서 현재

노드의 값을 참조해야만 하기 때문에 필드 표현식은 그림 11-22에서 보여지는 것처럼 간단히 점(.) 하나만을

사용합니다.

세 개의 보고서를 빌드시켜 다음 report 파일들로 작업을 진행하겠습니다: xml_addressbook.report, xml_addresses.report , and xml_hobbies.report.

이메일과 취미를 위한 서브리포트는 각각 포함하는 필드의 이름이 다르다는 것을 제외하고는 동일합니다

(그림 11-23). 두 서브리포트 모두 부모 보고서에서 서브리포트 요소가 차지해야 하는 너비만큼 페이지 너비

를 설정해주어야 합니다. 페이지의 여백을 없애고 보고서 너비를 이에 따라 맞추십시오.

그림 11-23 서브리포트 레이아웃

195 / 318

그림 11-22 서브리포트에서 e-mail 필드의 매핑

Page 196: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

부모 보고서(xml_addressbook)의 반복 밴드에 위에서 만들어둔 두 서브리포트를 추가합니다.

다음은 커넥션 표현식에 앞에서 설명한 값을 넣어줍니다.

나머지 값들은 기본값으로 설정합니다.

다음은 “Name of category” 이름으로 그룹을 만들고 category 필드의 표현식($F{name of category})을 그림 11-

196 / 318

그림 11-24 서브리포트 설정 단계 1

그림 11-25 서브리포트 설정 단계 2

Page 197: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

26처럼 설정해 주십시오. 헤더밴드에는 category의 이름을 위해 필드를 하나 만들고 카테고리의 이름이 보여

지게 할 것입니다. 이제 보고서는 카테고리를 그룹으로 묶어 다른 사람들의 이름을 보여주게 됩니다(XML 파

일에서 처럼).

반복 밴드에는 두 서브리포트 위에 id, lastname 그리고 firstname 필드를 놓아주십시오.

컴파일을 위해 서브리포트 모두 미리보기를 합니다. 각 서브리포트에 대한 .report 파일이 생성됩니다. 보고서

를 채우는 과정에서 오류를 얻겠지만, 괜찮습니다. 아직 XPath 질의를 설정하지 않아서 보고서 엔진이 어떠

한 데이터도 채울 수 없습니다. 이 단계에서 미리보기 오류를 없애려면, 최종 보고서에서는 사용하지 않을

XPath 질의를 설정해주거나 빈 데이터소스를 사용해서 서브리포트를 미리보기 합니다. 툴바의 콤보박스로부

터 빈 데이터소스를 선택할 수 있습니다.

서브리포트 작업이 완료되면, 부모 보고서를 실행시킵니다. 모든 것에 문제가 없다면, 그림 11-27에서 처럼

결과물을 볼 수 있습니다. home과 work 라는 카테고리로 그룹핑된 사람들이 자신들에 연계된 서브리포트들

에 이메일과 취미 항목들을 출력하게 됩니다.

197 / 318

그림 11-26 주소와 취미를 보여주는 부모 보고서와 두 개의 서브리포트

Page 198: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

이번 예제를 통해서 XML 데이터소스의 실질적인 효용성이 노드간의 세련된 선택을 가능하게 하는 Xpath의

유용성에 있다는 것을 알 수 있었습니다.

11.6.6 CSV 데이터소스 사용하기

CSV용 데이터소스의 처음 출발은 커스텀 데이터소스 구현을 어떻게 하는지 보여주는 개념설명을 위해 만들

어진 매우 간단한 데이터소스 이었습니다. CSV 데이터소스 인터페이스는 CSV 파일을 사용하여 보고서를 채

우는 네이티브 구현이 보고서 엔진에 추가되면서 기능적인 측면과 사용성 측면 모두에서 발전이 되었습니

다.

CSV 파일을 기반으로 하는 연결을 만들기 위해서는 보고서 데이터소스 대화창에서 신규 버튼을 누른 후, 데

198 / 318

그림 11-27 최종 결과의 첫 번째 페이지

Page 199: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

이터소스 타입 목록에서 CSV 파일 데이터소스를 선택합니다. 그러면 그림 11-28에서 보여지는 대화창이 나

타나게 됩니다.

연결에 대한 이름을 설정하고, 사용할 CSV 파일을 선택합니다. 그런 다음, 데이터소스에 필드들을 선언합니

다.

• 파일의 첫 줄에 컬럼명이 포함된다면, 파일의 첫 번째 행에서 컬럼 이름 가져오기 버튼을 클릭하고

첫 줄 건너뛰기 체크박스 옵션을 선택합니다. 이렇게 설정하면 보고서 엔진은 파일의 첫 번째 행이

컬럼 라벨을 포함하고 있다고 인지하고 두 번째 행부터 데이터로 간주합니다. 파일로 부터 읽어온

컬럼명은 선언된 것을 대체합니다. 따라서, 파일의 첫 번째 행에서 컬럼 이름 가져오기 버튼을 사용

하여 찾은 이름을 수정하지 말아야 합니다.

• CVS 파일의 첫 행에 컬럼이름이 포함되지 않았다면, COLUMN_0, COLUMN_1 과 같은 방식으로 각

컬럼의 이름을 지정합니다.

경고: 사용가능한 컬럼수 보다 많은 컬럼을 정의하게 되면, 보고서를 채우는 시점에서 오류가 발생됩니다.

보고서 엔진에서는 각 행에 대해 모든 컬럼이 값을 갖는 것으로 가정합니다(비어있더라도). 여러분이 사용

할 CSV 파일에서 필드와 행사이의 구분을 위해 비표준 캐릭터를 사용했다면, 구분자 탭(그림 11-29)에서 구

분자에 대한 기본 설정값을 조정할 수 있습니다.

199 / 318

그림 11-28 CSV 데이터소스

Page 200: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

11.6.7 CSV 데이터소스용 필드 등록

CSV 데이터소스를 생성할 경우, 보고서에서 필드로 사용되어질 컬럼 이름의 셋트를 정의해야만 합니다. 컬

럼 이름을 필드 목록쪽에 추가하려면, CSV 데이터소스를 활성화된 연결로 설정하고 보고서 질의 대화창을

여십시오. CSV 데이터소스 라벨이 붙은 탭으로 이동해서 그림 11-30에서 보이는 것처럼 데이터소스로부터

필드 가져오기 버튼을 누릅니다.

200 / 318

그림 11-29 컬럼과 행 구분자

Page 201: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

기본적으로 보고서 디자이너에서는 모든 필드의 클래스 타입을 java.lang.String 으로 설정합니다. 특정 컬럼

의 텍스트가 숫자, 날짜 혹은 부울린 값으로 변환되는데 문제가 없다고 판단되면 보고서에 필드가 추가된 후

에 직접 수정해주십시오.

timestamp 객체(혹은 date)로 인지할수 있는 패턴일 경우라면 사용자 정의 날짜포맷 사용 체크박스 옵션을 선

택해서 데이터소스 레벨에서 설정할 수 있습니다.

11.6.8 RXEmptyDataSource 사용하기

보고서 엔진에서는RXEmptyDataSource 라고 명명된 특수한 용도의 데이터소스를 제공합니다. 이 데이터소스

는 next 메쏘드에 대해 true를 리턴하고(기본값은 레코드 갯수가 한 개), getFieldValue 메쏘드 호출에 대해 모

두 null을 리턴합니다. 즉, 필드없이 한 개의 레코드만을 가진 빈 데이터소스로 다룰 수 있습니다. 이 클래스

의 생성자는 두 가지 종류입니다: public RXEmptyDataSource(int count)

public RXEmptyDataSource()

첫 번째 생성자는 데이터소스내의 레코드갯수를 지정하여 생성시키고 두번째 것은 레코드가 하나인 데이터

소스를 만들게 됩니다. 기본적으로 보고서 디자이너는 단 한개의 레코드를 갖는 빈 데이터소스로 설정되어

있습니다. 여러 레코드들을 갖는 새로운 빈 데이터소스를 만들려면, 사용가능한 연결타입 목록에서 빈 데이

터소스를 선택하십시오. 그림 11-31에서 보여지는 것처럼 레코드의 갯수를 지정할 수 있는 설정창이 나타납

니다.

201 / 318

그림 11-30 CSV 파일 필드 등록

Page 202: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

여기에서는 필요한 만큼의 레코드 갯수를 설정해주시면 됩니다. 빈 데이터소스를 사용할 경우에는 보고서에

어떤 필드를 추가하던지 그 값은 항상 null로 설정된다는 것입니다. 이 데이터소스를 사용할 경우에는 필드

의 이름이나 클래스 타입을 따지지 않으므로, 어떠한 보고서라도 테스트하는데 문제가 없습니다.

11.6.9 HQL 과 하이버네이트 연결 사용하기

보고서 엔진에서는 HQL을 보고서에서 직접 사용할 수 있는 방법을 제공하고 있습니다. 이를 위해서는 우선

하이버네이트 연결을 설정해야 합니다. 하이버네이트 매핑을 사용할 수 있도록 관련된 JAR파일들과 설정파

일들을 클래스 경로에 포함시켜야 합니다. 다르게 표현하자면, 여러분이 이용할 모든 *.hbm.xml 파일들과

hibernate.cfg.xml 파일 그리고 여기에 관련되어 사용되는 JAR 파일들에 보고서 디자이너가 접근할 수 있도록

해주어야 합니다. 클래스경로에 이 객체들을 추가하려면, 메뉴에서 도구 → 옵션을 선택하고 클래스경로탭을

클릭합니다.

앞서서 언급한 것처럼 클래스경로에 필요한 모든 객체들을 포함시켜 주었다면, 연결/데이터베이스 대화창을

열어 새로만들기 버튼을 누른 후, 데이터소스 타입 목록에서 하이버네이트 연결을 선택하십시오. 그러면 그

림 11-32과 같은 대화창이 나타나게 됩니다.

202 / 318

그림 11-31 빈 데이터소스

Page 203: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

테스트 버튼을 눌러 클래스 경로내에서 hibernate.cfg.xml을 찾을 수 있는지 확인합니다. 현재 버전의 보고서

디자이너에서는 한 개의 하이버네이트 설정에 대해서만 작업이 가능합니다. 즉, 클래스 경로에서 제일 먼저

찾는 hibernate.cfg.xml을 사용하게 됩니다. 스프링 프레임워크를 사용한다면, 여러분의 연결을 지정할 때 스

프링 설정을 사용할 수 있습니다. 여기서는 설정 파일의 이름과 세션 팩토리 빈 ID를 설정해야 합니다(그림 11-33).

203 / 318

그림 11-32 하이버네이트 연결

그림 11-33 스프링 기반의 하이버네이트 연결

Page 204: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

하이버네이트 연결이 가능하게 되면, 출력을 위한 데이터 선택에 사용되는 HQL 질의를 이용할 수 있게 됩니

다. SQL을 사용한것과 동일한 방식으로 HQL을 사용할 수 있습니다.

보고서의 질의 편집기창을 열고 윈도우 상단에 위치한 콤보박스 목록에서 언어로 HQL을 선택합니다(그림 11-34).

HQL 질의를 입력하게 되면, 보고서 디자이너는 필드를 가져오게 됩니다. 보고서 엔진의 문서에 따르면, 필드

맵핑은 다음과 같은 과정으로 진행됩니다:

• 질의 결과가 한 행당 하나의 객체를 갖는다면, 필드 맵핑은 다음중 하나가 됩니다:

• 객체의 타입이 하이버네이트 엔티티이거나 컴포넌트 타입이라면, 필드 맵핑은 엔티티/컴포

넌트의 속성명으로 환원됩니다. Select의 알리어스가 있다면, 전체 엔티티/컴포넌트 객체에

필드를 맵핑시키는데 사용할 수 있습니다.

• 다른 경우에는, 객체 타입을 스칼라로 간주해서 오직 한 필드만이 값에 맵핑될 수 있습니다.

• 질의 결과가 행당 튜플(객체 배열)을 리턴한다면, 필드의 맵핑은 다음중 하나를 따르게 됩니다:

• select alias. 필드는 대응되는 알리어스의 값에 맵핑됩니다.

• select alias와 “.”을 앞에 붙인 속성이름. 필드는 알리어스에 대응되는 객체의 속성 값과 맵핑

됩니다. 타입은 select alias가 엔티티이거나 컴포넌트이어야만 합니다.

204 / 318

그림 11-34 HQL 과 HQL 맵핑 도구

Page 205: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

여기서 설명한 필드 맵핑에 대한 설명이 이해되지 않는다면, 질의가 파싱되어 보고서 디자이너에서 필드를 받아온

다고 간단하게 생각하십시오.

보고서 디자이너에서는 보고서 필드에 객체와 속성들의 맵핑을 지원하는 도구가 있습니다. 각 레코드마다

사용가능한 객체 혹은 자바빈의 목록이 객체트리의 상단에 위치한 콤보박스에 제공됩니다. 트리에서 필드를

추가하려면, 해당 노드를 선택하고 선택한 필드(들) 추가 버튼을 누르십시오.

11.6.10 새로운 RXDataSource를 구현하는 방법

때로는 보고서 라이브러리에서 제공하는 RXDataSource만으로는 요구되는 처리에 충분하지 않을 수 있습니

다. 이럴 경우, 새로운 RXDataSource를 제작할 수 있습니다. 이 작업은 그다지 복잡하지 않습니다. 실제로 여

러분이 해줄 일은 RXDataSource 인터페이스를 구현하는 클래스를 만들고, 다음 두 개의 간단한 메쏘드를 노

출시키면 됩니다: next 와 getFieldValue

코드 예제 11-6 RXDataSource 인터페이스package com.cabsoft.rx.engine;public interface RXDataSource{public boolean next() throws RXException;public Object getFieldValue(RXField rxField) throws RXException;}

next 메소드는 데이터소스에서 현재 레코드를 설정할 때 사용합니다. 새로운 레코드가 존재하면 true가 리턴

되고, 더 이상 레코드가 없다면 false가 리턴됩니다. next 메쏘드의 호출이 성공하면(true), 보고서내에 정의된

필드들의 값을 가져오기 위해 정의한 필드마다 getFieldValue 메쏘드가 호출됩니다. 여기서, getFieldValue 메쏘

드에 매개변수로 넘겨지는 RXField 객체에는 요청되는 필드의 이름이 포함되어 있습니다. 물론, RXField는

보고서 필드의 이름, 설명 그리고 자바타입(11.5. “RXDataSource 인터페이스” 참조)으로 표현되는 필드에 관

련된 정보를 통해 구현된 인터페이스입니다.

이제 여러분이 직접 데이터소스를 제작하는 과정에 대해 설명하겠습니다. 작성할 데이터소스의 목적은 파일

시스템의 디렉터리를 살펴보고 찾은 객체(파일이나 디렉터리)를 리턴하는 것입니다. 여러분의 데이터소스에

서 관리할 필드는 파일이름(FILENAME) 객체가 파일인지 디렉터리인지를 표시하는 플래그

(IS_DIRECTORY)와 가능하다면 파일크기(SIZE)가 됩니다.

데이터소스 생성자는 두 개를 만들겠습니다. 첫 번재 생성자는 스캔할 디렉터리를 매개변수로 받게 하고, 두

번째 생성자는 매개변수 없이 현재 디렉터리를 스캔하도록 할 것입니다. 데이터소스가 인스턴스화 된다면,

데이터소스는 지정한 위치에서 파일과 디렉터리들을 찾고 파일 어레이를 채우게 됩니다.

next 메쏘드는 인덱스 변수를 증가시켜 파일 어레이상에서 현재 위치를 추적할 수 있도록 하고 어레이의 끝

에 도달하기전까지는 true를 리턴시킵니다.

코드 예제 11-7 직접 만든 데이터소스 예제import com.cabsoft.rx.engine.*;

205 / 318

Page 206: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

import java.io.*;

public class RXFileSystemDataSource implements RXDataSource {

File[] files = null;

int index = -1;

public RXFileSystemDataSource(String path) {

File dir = new File(path);

if (dir.exists() && dir.isDirectory()) {

files = dir.listFiles();

}

}

public RXFileSystemDataSource() {

this(".");

}

public boolean next() throws RXException {

Index++;

if (files != null && index < files.length) {

return true;

}

return false;

}

public Object getFieldValue(RXField jrField) throws RXException {

File f = files[index];

if (f == null) {

return null;

}

if (rxField.getName().equals("FILENAME")) {

return f.getName();

} else if (rxField.getName().equals("IS_DIRECTORY")) {

return new Boolean(f.isDirectory());

} else if (rxField.getName().equals("SIZE")) {

return new Long(f.length());

}

return null;

}}

getFieldValue 메쏘드는 요청된 파일의 정보를 리턴합니다. 구현된 코드에서는 메쏘드의 호출자가 요구하는

리턴타입을 고려하는 정보를 사용하지 않도록 했습니다만, 파일이름을 리턴할 경우에는 String, 디렉토리 여

206 / 318

Page 207: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

부를 알려주는 플래그 IS_DIRECTORY는 부울린 객체 그리고 파일크기는 Long 객체로 리턴합니다.

다음 섹션에서 직접 만든 데이터소스를 보고서 디자이너에서 사용하는 방법을 알아보고 테스트까지 해보겠

습니다.

11.6.11 직접 만든 RXDataSource를 디자이너에서 사용하기

보고서 디자이너는 보고서 라이브러리에서 제공하는 거의 모든 데이터소스를 지원합니다: RXXmlDataSource, RXBeanArrayDataSource, and RXBeanCollectionDataSource.

여러분이 직접 만든 데이터소스를 디자이너에서 사용하기 위해서는 특별한 연결을 제공해야 합니다. 여러분

이 사용을 원하는 어떠한 RXDataSource라도 RXDataSource 인터페이스를 구현한 클래스의 인스턴스를 제공

하는 일종의 팩토리 클래스를 이용하는 것은 매우 유용합니다. 팩토리는 여러분의 데이터소스를 테스트하고

보고서 디자이너에서 보고서를 채울때 유용한 간단한 자바 클래스입니다. 여기서 만들 팩토리 클래스는 자

바빈 셋 데이터소스에서 보았던 것과 거의 유사한 방식으로써 정적인 메쏘드를 통해 데이터소스를 만들어

주는 자바클래스를 작성하기만 하면 됩니다. 예를 들어, 앞 절에서 제작한 RXFileSystemDataSource를 테스트

하고자 한다면, 코드 예제 11-8에서 보여지는 것처럼 간단하게 클래스를 만들기만 하면 됩니다.

코드 예제 11-8 직접 만든 데이터소스를 테스트하기 위한 클래스import com.cabsoft.rx.engine.*;

public class FileSystemDataSourceFactory {

public static RXDataSource createDatasource() {

return new RXFileSystemDataSource("/");

}}

이 클래스는 정적인 메쏘드를 통해 호출되며, 데이터소스를 인스턴스 시키는데 필요한 코드만으로 구성되어

있습니다. 이 경우, 여러분은 루트 디렉터리(“/”)를 스캔하도록 지정하는 RXFileSystemDataSource 객체를 새로

만들도록 하고 있습니다.

이제 여러분이 준비한 RXDataSource를 얻어낼 수 있는 방법과 데이터소스가 사용될 수 있도록 준비시킨 후,

연결을 만들어보도록 하겠습니다.

일반적으로 새로운 연결을 만드는 방법대로 절차를 진행한 후(11.3. “JDBC 연결을 만들고 사용하기” 참고),

데이터 소스 타입 목록에서 사용자 정의 RXDataSource를 선택합니다. 새로 만드는 데이터소스의 이름을

TestFileSystemDataSource와 같이 설정하고 그림 11-35에서 보여지는 것처럼 팩토리 클래스와 정적 메쏘드를

지정합니다.

207 / 318

Page 208: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

사용할 RXFileSystemDataSource에 대한 클래스와 인스턴스를 획득할 수 있는 정적인 메쏘드를 지정했다면,

이제 TestFileSystemDataSource를 테스트 할 수 있습니다.

데이터소스에서 관리되는 필드를 사용하는 새로운 보고서를 준비합니다. 데이터소스에는 필드를 찾을 수 있

도록 하는 메쏘드가 없습니다. 우리는 이미 RXFileSystemDataSource에 세 개의 필드가 존재함을 알고 있습니

다: FILENAME (String), IS_DIRECTORY (Boolean), 그리고 SIZE (Long). 이 필드들을 만든 후에는 보고서의 반

복 밴드에 그림 11-36처럼 올려놓으십시오.

그림 11-36 파일 목록을 위한 레이아웃

컬럼을 2로 설정하여 보고서 레이아웃을 잡아주고, 컬럼 헤더 밴드에 정적 텍스트 타이틀을 만들어 줍니다.

그런 후에는 문서를 표시할 때 사용할 이미지와 폴더를 나타낼 이미지를 추가합니다. 이미지 요소를 동일한

208 / 318

그림 11-35 커스텀 데이터소스 설정

Page 209: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

위치에 겹치게 위치시키고 폴더를 나타내는 이미지 요소를 위에 올려놓은 후, Print when expression 설정에서

다음과 같은 표현식을 지정합니다: $F{IS_DIRECTORY}

또는 이미지 요소를 하나만 사용하고, 이 요소의 이미지 표현식을 다음과 같이 지정할 수도 있습니다:

($F{IS_DIRECTORY}) ? “folder.png” : “file.png”

완성된 보고서를 미리보기를 통해 확인하면 그림 11-37의 모습과 유사하게 됩니다.

209 / 318

그림 11-37 커스텀 데이터소스로부터 만들어진 보고서

Page 210: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

이번 예제에서 사용한 인스턴스화 한 클래스인 RXFileSystemDataSource는 매우 간단합니다만, 이를 기반으

로 보다 복잡한 클래스도 만들 수 있습니다. 즉, EJB를 호출하는 데이터소스를 만든다거나 웹서비스를 호출

하는 데이터소스도 만들 수있습니다.

11.7 데이터소스 내보내기와 가져오기

데이터소스 설정을 공유하는 과정을 단순화하기 위해, 디자이너는 데이터소스 정의를 가져오거나 내보낼 수

있는 기능을 제공합니다.

데이터소스를 내보내기 위해서는 보고서 데이터소스 창에서 내보내기 버튼(그림 11-38)을 클릭합니다. 내보

낼 파일이름과 위치를 지정할 수 있는 창이 나타납니다. 생성된 파일은 단순한 XML 파일로서 일반적인 텍스

트 편집에서 편집이 가능합니다. 보고서를 통해 내보낸 설정파일은 다시 불러올 수 있습니다. 내보낸 설정에

한 개 이상의 데이터소스나 연결정보가 포함되므로, 불러오는 과정에서도 설정파일에서 찾은 모든 데이터소

스를 현재 목록에 추가하게 됩니다.

가져오기 과정중에 중복된 이름의 데이터소스가 있다면, 디자이너는 그림 11-39에서 보여지것 처럼 이름끝

에 숫자를 붙여 추가시킵니다.

210 / 318

그림 11-38 연결과 데이터소스 정의 내보내기

Page 211: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

11.8 커스텀 언어와 질의 실행기 만들기

커스텀 언어와 질의 실행기 만들기는 보고서 디자이너에서 질의를 수행할 때 커스텀 언어를 이용할 수 있도

록 하는 기능입니다. 현재 버전에서는 보고서 엔진이 다음과 같은 질의 언어들을 기본으로 지원하고 있습니

다:

SQL, HQL, Xpath, EJBQL, MDX.

커스텀 언어는 보고서 엔진에서 자체적으로 지원하지 않는 질의 언어입니다. 질의 언어는 보고서에 출력할

데이터를 가져오는 보고서 질의에 사용됩니다. 커스텀 언어는 질의 실행기와 밀접하게 연결되어 있습니다.

여기서 질의 실행기란 보고서 엔진에서 커스텀 질의를 처리하여 데이터를 RXDataSource 객체로 가져올 때

사용하는 객체입니다. 새로운 질의 언어를 사용하기위해서는 등록해야 합니다. 옵션 대화창에서 질의 실행기

탭(그림 11-40)에서 등록해줄 수 있습니다.

211 / 318

그림 11-39 데이터소스 가져오기(중복된 데이터소스 있음)

Page 212: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

새로운 질의 언어는 언어의 이름과 질의 실행기의 인스턴스를 가져올 때 사용하는 팩토리 클래스를 설정함

으로써 추가될 수 있습니다. 부가적으로 커스텀 언어를 사용자가 이용할 때 질의 디자인과 보고서 내의 필드

와 맵핑에 도움을 주게 되는 FieldsProvider 클래스를 제공할 수도 있습니다.

질의 실행기에 필요한 모든 클래스들과 JAR 파일이 클래스 경로 내에 존재하도록 합니다. 지금까지의 단계

를 모두 완료하였다면 디자이너에서 새로운 질의언어를 사용하여 설정, 질의 입력을 할 수 있게 됩니다(그림 11-41).

212 / 318

그림 11-41 질의 편집기 대화창에 등록된 커스텀 언어(myLanguage)

그림 11-40 옵션 대화창의 질의 실행기탭

Page 213: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

11.8.1 커스텀 언어를 위한 질의 실행기 만들기

이 섹션에서는 매우 간단한 질의 실행기를 제작하는 방법을 보여드리고, 디자이너에서 사용하는 방법과 등

록한 새 질의언어의 사용을 쉽게 도와주는 FieldsProvider를 구현하는 방법도 살펴보도록 하겠습니다. 새로운

질의 언어는 디렉터리 경로를 지정해주게 될 것입니다. 질의 실행기에서는 이 경로를 읽어들여(실제적인 질

의에 해당) 해당 디렉터리내에 존재하는(파일과 서브디렉터리들) 객체들의 목록으로 구성된 데이터소스를

리턴할 것입니다.

질의 매개변수에 대한 관리책임은 질의 실행기 구현체가 담당합니다. 질의는 표준문법 $P{매개변수이름} 을

사용하여 매개변수를 넘겨받을 수 있다는 것을 기억하시면 됩니다. 질의 실행기는 두 객체로 구성되어 있습

니다: 질의 실행기 팩토리와 실질적인 질의 실행기.

질의가 처리되는 방식을 그림으로 표현해 보았습니다(그림 11-42). 보고서 엔진은 보고서 내의 질의에 사용

된 언어와 매칭되는 질의 실행기 팩토리를 인스턴스화 하게 됩니다. 또한 createQueryExecuter 메쏘드를 호출

합니다. 이 메쏘드를 호출할 때는 두 개의 매개변수를 넘겨줍니다:

RXDataset – 필드 관리 구조, 매개변수, 변수, 질의 및 보고서내에 정의된 질의언어

map – 각 매개변수를 위해 제공하는 값을 포함한 맵

이 메쏘드는 createDatasource 메쏘드를 갖는 RXQueryExecuter의 인스턴스를 리턴합니다. 엔진에서는 리턴받

은 RXQueryExecuter의 인스턴스로부터 createDatasource 메쏘드를 호출하여 보고서를 채우게 됩니다.

그림 11-42 질의 실행과정에 대한 플로우 차트

213 / 318

Page 214: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

이제 질의 실행기 팩토리를 살펴보겠습니다. 보고서 엔진에서는 다음과 같은 종류의 객체를 만들기 위한 인

터페이스를 제공하고 있습니다: RXQueryExecuterFactory

코드 예제 11-9 보고서 라이브러리에서 제공하는 RXQueryExecuterFactory 인터페이스package com.cabsoft.rx.engine.query;

import java.util.Map;import com.cabsoft.rx.engine.RXDataset;import com.cabsoft.rx.engine.RXException;import com.cabsoft.rx.engine.RXValueParameter;

/**

* 질의 실행기를 생성하기 위해 사용하는 팩토리 클래스.

* 각각의 질의 언어에 대해, 질의 실행기 팩토리는 반드시 생성되어야만 하고 RX 속성으로써 등록되어야 한다.

* 질의 실행기 팩토리 인스턴스는 반드시 싱글톤으로써 캐쉬되며 사용될 수 있도록 쓰레드-세이프이어야만 한다.

* /public interface RXQueryExecuterFactory {

/**

* 이 질의 타입에 연관된 내장된 매개변수를 리턴한다.

* 이 매개변수들은 이 타입의 질의를 갖는 각각의 보고서/데이터셋에 대해 시스템상에서 정의된 매개변수로써 생

성되게 된다.

* 리턴된 배열은 매개변수명과 매개변수 클래스의 일관된 쌍을 포함해야만 한다

* (e.g. <code>{"Param1", String.class, "Param2", "List.class"}</code>).

* @return 내장된 매개변수명과 이 질의 타입에 연관된 타입 배열

*/

public Object[] getBuiltinParameters();

/**

* 질의 실행기를 생성한다.

* 이 메쏘드는 이 팩토리를 통해 제공된 질의를 갖는 보고서/데이터셋을 위해 채워지는 시점에서 호출된다.

* query supported by

* this factory.

* @param dataset 질의, 필드등을 포함하는 데이터셋

* @param parameters 이름으로 색인된 매개변수 값의 맵(RXValueParameter의 인스턴스)

*

* @return 질의 실행기

* @throws RXException

*/

public RXQueryExecuter createQueryExecuter(

RXDataset dataset, Map parameters) throws RXException;

/**

* 이 팩토리를 통해 생성된 질의 실행기가 질의 매개변수 타입을 지원하는지를 확인한다.

* 이러한 점검은 질의내의 모든 $P{..} 매개변수에 대해 수행되어진다.

*

214 / 318

Page 215: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

* @param className 매개변수의 클래스 이름 값

* @return 매개변수 값 타입을 지원하는지의 여부

*/

public boolean supportsQueryParameterType(String className);}

이 인터페이스에서 구현할 메쏘드는 총 세개입니다:

getBuiltinParameters, createQueryExecuter, 그리고 supportsQueryParameterType:

• 첫번째 메쏘드는 질의 실행기가 사용가능하게 해주는 내장된 매개변수의 이름과 타입을 포함하고

있는 어레이를 리턴합니다. 이 기능은 일종의 세션 객체에 대해 질의가 실행될 경우나 데이터베이스

혹은 서버와 같은 외부적인 엔티티에 연결될 경우에 유용합니다. 즉, SQL용 질의 실행기 팩토리는

REPORT_CONNECTION 이라는 질의를 실행할 때 사용한 java.sql.Connection 인스턴스를 담고 있는

내장 매개변수를 제공합니다. 이를 서브리포트에서 사용하여 다른 SQL 질의를 실행시킬 수 있습니

다. 이와 유사하게 HQL용 질의 실행기 팩토리에서는 질의 수행에 필요한 하이버네이트 세션 매개

변수를 제공합니다.

• 두번째 메쏘드(createQueryExecuter)는 질의 실행기 인스턴스를 생성하는 역할을 담당함으로써, 세 메쏘

드중 가장 중요한 역할을 맡고 있습니다

• 마지막 세번째 메쏘드는 넘겨받는 매개변수의 타입을 필터링하게 하는 역할을 구현하게 됩니다. 인

수로 받게 된 클래스 이름의 처리가 가능한지에 따라서 true 혹은 false를 리턴해주게 됩니다.

구현 코드상에서는 어떤 내장 매개변수도 리턴하지는 않을 것이며, 모든 타입의 매개변수를 받을 수 있도록

할 것입니다. 실제로는 제작할 질의 실행기 팩토리가 $P{} 를 사용해서 질의에 넘겨준 매개변수를 무시하고

지정된 내부 루틴을 수행할 것입니다. 다음은 예제에서 사용된 코드입니다:

코드 예제 11-10 CustomQueryExecuterFactory의 소스코드import java.io.File;import java.util.Map;import com.cabsoft.rx.engine.RXDataset;import com.cabsoft.rx.engine.RXException;import com.cabsoft.rx.engine.query.RXQueryExecuter;import com.cabsoft.rx.engine.query.RXQueryExecuterFactory;

public class CustomQueryExecuterFactory implements RXQueryExecuterFactory {

public Object[] getBuiltinParameters() {

return new Object[]{};

}

public RXQueryExecuter createQueryExecuter(RXDataset rxd, Map map)

throws RXException {

File directory = null;

try {

directory = new File(rxd.getQuery().getText());

215 / 318

Page 216: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

} catch (Exception ex) {

throw new RXException(ex);

}

return new CustomQueryExecuter(directory);

}

public boolean supportsQueryParameterType(String string) {

return true;

}}

이 구현중 관련있는 부분은 오직 createQueryExecuter 메쏘드로, 여기서 질의 문자열에 대한 인수로 넘어온 데

이터셋을 확인하게 됩니다. 앞에서 질의가 디렉터리 경로라고 가정했습니다. 따라서 데이터소스는 지정된 디

렉터리 경로에 들어있는 파일들의 목록이 됩니다. 넘겨진 디렉터리 경로를 사용하여 질의(여기서는 질의 시

작에서 만들어지는 파일 객체)를 파싱하는데 사용할 클래스인 CustomQueryExecuter를 인스턴스화합니다. 질

의 문자열에서 매개변수를 지원하도록 하려면, 이 부분에서 넘어온 매개변수를 파싱하고 대체시켜줄 부분이

됩니다. 필요한 것은 모두 준비되어 있습니다: 질의 문자열, 데이터셋트 그리고 매개변수 값으로 구성된 맵.

또다른 해결방법은 질의 실행기 구현 클래스에 이 모든 정보를 넘겨주어 질의에 대한 파싱을 위임하는 것입

니다. 질의 실행기의 인터페이스는 간단합니다. 역시 세개의 메쏘드를 구현합니다:

• 보고서를 채울 RXDataSource를 만들 게 되는 createDatasource 메쏘드.

• 질의 실행이 끝나면 모든 리소스를 정리(close).

• 질의 실행을 인터럽트할 수 있는 메쏘드 (cancelQuery).

코드 예제 11-11 질의 실행기 인터페이스/**

* 질의 실행기 인터페이스.

* 이 인터페이스를 구현한 클래스는 질의로부터 보고서/데이터셋의 입력 데이터가 지정된 경우에 만들어진다.

* 구현 클래스는 질의를 실행하고 그 결과로부터 RXDataSource를 생성한다.

* 질의 실행기는 일반적으로 질의와 매개변수 값을 사용하는 RXQueryExecuterFactory에 의해 초기화되어진다.

*/public interface RXQueryExecuter {

/**

* 질의를 실행하고 결과로 부터 RXDataSource를 생성한다.

* @return 질의 실행 결과를 랩핑하는 RXDataSource

* @throws RXException

*/

public RXDataSource createDatasource() throws RXException;

/**

* 데이터소스 반복과정에서 지속적으로 오픈시켰던 리소스를 닫아준다.

* 이 메쏘드는 보고서가 채워진 후 또는 데이터셋이 반복된 이후에 호출된다.

216 / 318

Page 217: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

* 데이터소스가 생성된 다음 리소스가 필요하지 않다면, createDatasource의 끝에서 릴리즈되어야 한다.

*/

public void close();

/**

* 질의가 현재 수행중이라면 취소한다.

* 이 메쏘드는 보고서를 채우는 프로세스를 취소하도록 클라이언트에서 결정했다면

* 또 다른 쓰레드를 통해 호출되어진다.

*

* @return <code>true</code>

* @throws RXException

*/

public boolean cancelQuery() throws RXException;}

예제로 만들 질의 실행기는 매우 간단해서 close 와 cancelQuery 메쏘드에서 해주는 일이 없습니다. 메인 메쏘

드인 createDatasource는 질의를 제공하는 CustomDataSource 인스턴스를 만들게 됩니다. 실질적인 목적은 빈

즈 어레이 데이터소스에 캡슐화된 파일 이름 목록을 리턴하게 하는 것입니다.

예제에서 사용한 CustomQueryExecuter의 코드는 다음과 같습니다:

코드 예제 11-12 QueryExecuter 구현에 사용된 소스코드package samples.queryexecuter;

import java.io.File;import com.cabsoft.rx.engine.RXDataSource;import com.cabsoft.rx.engine.RXException;import com.cabsoft.rx.engine.data.RXBeanArrayDataSource;import com.cabsoft.rx.engine.query.RXQueryExecuter;

public class CustomQueryExecuter implements RXQueryExecuter {

File directory = null;

public CustomQueryExecuter(File directory) {

this.directory = directory;

}

public RXDataSource createDatasource() throws RXException {

if (directory != null && directory.exists() && directory.isDirectory()) {

File[] files = directory.listFiles();

return new CustomDataSource(files);

}

throw new RXException("Invalid directory!");

}

public void close() {

217 / 318

Page 218: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

}

public boolean cancelQuery() throws RXException {

return false;

}}

지금까지 CustomQueryExecuterFactory와 CustomDataSource를 호출하는 클래스인 CustomQueryExecuter를 만

들었습니다. 이 클래스는 RXBeanArrayDataSource를 상속합니다. 이 단계에서는 단지 RXBeanArrayDataSource

만을 사용하는 수준이지만, 다른 커스텀 데이터소스를 구현할 때는 FieldsProvider를 만들고 사용하는 다음

타스크에서 유용하게 사용됩니다. CustomDataSource 예제에 사용된 코드는 다음과 같습니다:

코드 예제 11-13 CustomDataSource 소스코드package samples.queryexecuter;

import java.io.File;import com.cabsoft.rx.engine.RXException;import com.cabsoft.rx.engine.RXField;import com.cabsoft.rx.engine.data.RXBeanArrayDataSource;

public class CustomDataSource extends RXBeanArrayDataSource {

private int currentIndex = -1;

public CustomDataSource(File[] array) {

super(array, true);

}

@Override

public Object getFieldValue(RXField field) throws RXException {

File f = (File) getData()[currentIndex];

if (field.getName().equals("size")) {

return new Long(f.length());

} else if (field.getName().equals("lastModified")) {

return new Long(f.lastModified());

}

return super.getFieldValue(field);

}

@Override

public boolean next() {

currentIndex++;

return super.next();

}

218 / 318

Page 219: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

@Override

public void moveFirst() {

currentIndex = -1;

super.moveFirst();

}}

이미 언급한 것처럼, 데이터소스는 RXBeanArrayDataSource를 상속하여 대부분의 구현은 슈퍼클래스에 있는

것입니다. 단지 getField 메쏘드를 위한 로직을 추가했을 뿐입니다. 필드 이름 “size”를 사용자가 요청하면, 데

이터소스는 파일의 크기를 리턴하고 lastModified 필드가 요청되면, 파일의 최종 변경된 날짜를 리턴합니다.

빈즈 어레이상에서 현재 인덱스에 대한 추적이 필요하므로 next 와 moveFirst 메쏘드만이 오버라이드 되어있

습니다.

데이터소스는 java.io.File 타입의 객체 셋트에 대한 빈즈 데이터소스 처럼 동작하지만, 파일을 빈즈로 사용할

때는 액세스할 수 없는 두 필드를 제공할 수 있습니다:

lastModified 와 size.

정말 간단하지 않습니까? 이제 여러분은 질의 실행기와 질의 실행기 팩토리를 만들었습니다. 디자이너에서

새로운 언어를 사용할 준비가 된 것입니다! 하지만, 사용성을 향상시키기 위해 FieldsProvider를 구현하는 방

법을 먼저 살펴본 후 이용하는 과정에 대해 살펴보겠습니다.

11.8.2 FieldsProvider 만들기

커스텀 질의 실행기는 데이터를 공급하기 위해 필요에 맞게 만들어지게 됩니다. 예제를 통해 만든 간단한 데

이터소스처럼, 질의 실행기는 디자이너에서 실제 사용할때 필드의 이름에 대한 어떠한 정보도 제공하고 있

지 않습니다. SQL의 경우처럼 디자이너는 질의 실행을 통해 자동으로 사용가능한 필드들을 검출하고 결과

셋트로 부터 노출된 필드가 무엇인지 알 수 있는 메커니즘을 제공합니다.

더 나아가서, SQL의 경우에는 질의 디자이너를 통해 질의 자체를 쉽게 만들 수 있도록 하고 있습니다. XPath

인 경우에도 이와 유사한 툴이 제공되어 XML 파일을 살펴보고 질의를 생성하며 필드들과 맵핑을 할 수 있

게 되어 있습니다. 디자이너는 커스텀 언어에 대한 FieldsProvider 플러그인을 사용할 수 있게 지원하고 있습

니다. 커스텀 언어에 대한 질의 실행기를 새로 제작했다면, 사용자에게 새 언어의 사용 편의성을 위해

FieldsProvider를 제공하는 것이 좋습니다.

이전 섹션에서는 질의 실행기에 제공하기 위한 간단한 언어를 사용했습니다. 커스텀 언어라고는 하지만 디

렉터리 경로의 이름일 뿐입니다. 질의 실행기를 만들면서 이 “질의”를 사용해서 파싱된 디렉터리 경로로 부

터 파일의 목록을 가져오도록 했습니다. 예제에서의 커스텀 언어는 디자이너 측면에서 보면 너무도 간단하

지만 시도는 해보겠습니다.

우리가 이제부터 만들어볼 질의 디자이너에는 디스크상에서 디렉터리를 선택할 수 있는 파일 선택창입니다.

그리고 데이터소스로부터 제공받은 필드들을 “자동검출”하게 하는 방법을 생각해 보겠습니다. 이 모든 기능

219 / 318

Page 220: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

들은 FieldsProvider에 구현하여 디자이너에 추가시킬 것입니다.

이제 다시 단계별로 접근해 보겠습니다. 보고서의 질의 대화창에서 질의를 작성할 경우, 간단한 SQL 문장이

나 커스텀 언어로 아주 길고 복잡한 표현식을 사용할 수도 있습니다. 질의를 분석할 수 있는 기능을 갖춘 툴

이 있다면 매우 유용하게 사용될 것이며, 필요에 따라서는 질의를 실행시켜 사용할 수 있는 필드들을 검출할

수 있게 하거나 필드를 맵핑시킬 수 있는 도우미 기능을 갖는 툴을 제공하거나 질의 자체를 쉽게 만들 수 있

도록 시각적인 질의 제작기를 제공할 수도 있습니다.

디자이너는 SQL, HQL, EJBQL 및 MDX와 같은 자체지원 언어를 위한 편리한 도구들을 제공합니다. SQL 질

의를 편집할 때는 필드 읽기 버튼을 사용해서 사용가능한 필드들의 목록을 가져올 수 있으며 HQL 질의를

편집할 때는 결과로부터 사용하고자 하는 필드를 선택할 수 있도록 합니다. 이런 기능을 확장하거나 다른것

으로 대체시키려면, FieldsProvider를 작성하면 됩니다. 이 인터페이스를 사용하여 시각적인 디자이너, 필드

맵핑을 도와주는 툴, 질의로부터 사용가능한 필드를 읽어주는 툴들을 언어별로 만들 수 있습니다.

필드 프로바이더는 질의 실행기를 옵션창(그림 11-40)에서 질의 실행기탭을 통해 플러그인 시키는 방법과 유

사하게 디자이너에 플러그인 됩니다. 표 11-2에서는 질의 실행기 팩토리의 기본값과 내장된 언어별로 필드

프로바이더 클래스를 보여주고 있습니다.

표 11-2 기본 언어의 질의 실행기 팩토리와 필드 프로바이더 클래스

언어 질의 실행기 팩토리 필드 프로바이더 클래스

sql (or SQL) com.cabsoft.rx.engine.query.RXJdbcQueryExecuterFactory

com.cabsoft.rxd.designer.data.fieldsproviders.SQLFieldsProvider

hql (or HQL) com.cabsoft.rx.engine.query.RXHibernateQueryExecuterFactory

com.cabsoft.rxd.designer.data.fieldsproviders.HQLFieldsProvider

ejbql (or EJBQL) com.cabsoft.rx.engine.query.RXJpaQueryExecuterFactory

com.cabsoft.rxd.designer.data.fieldsproviders.EJBQLFieldsProvider

mdx (or MDX) com.cabsoft.rx.olap.RXMdxQueryExecuterFactory

com.cabsoft.rxd.designer.data.fieldsproviders.MDXFieldsProvider

xmla-mdx com.cabsoft.rx.engine.query.RXXmlaQueryExecuterFactory

com.cabsoft.rxd.designer.data.fieldsproviders.CincomMDXFieldsProvider

xPath (or XPath) com.cabsoft.rx.engine.query.RXXPathQueryExecuterFactory

com.cabsoft.rxd.designer.data.fieldsproviders.XMLFieldsProvider

필드 프로바이더 인터페이스는 com.cabsoft.rxd.designer.FieldsProvider 에 정의되어 있습니다. 인터페이스 코드

는 다음과 같습니다:

코드 예제 11-14 Fields provider interface 코드package com.cabsoft.rxd.designer;

import com.cabsoft.rxd.designer.data.ReportQueryDialog;import java.util.Map;import com.cabsoft.rx.engine.RXDataset;import com.cabsoft.rx.engine.RXException;import com.cabsoft.rx.engine.RXField;

/**

220 / 318

Page 221: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

*

* @author Cabsoft

*/public interface FieldsProvider {

/**

* 만약 provider가 다음을 지원한다면 {@link #getFields(rxdConnection,RXDataset,Map) getFields} true 를 return한다.

* @return true

*/

public boolean supportsGetFieldsOperation();

/**

* @param con

* @param RXDataset

* @param parameters map

* @return fields array

*

* @throws UnsupportedOperationException

* @throws RXException

*/

public RXField[] getFields(rxdConnection con, RXDataset reportDataset, Map parameters) throws RXException, UnsupportedOperationException;

/**

* Returns true

*/

public boolean supportsAutomaticQueryExecution();

/**

* Returns true

*/

public boolean hasQueryDesigner();

/**

* Returns true

*/

public boolean hasEditorComponent();

/**

* @param con

* @param query

* @param reportQueryDialog

*/

public String designQuery(rxdConnection con, String query, ReportQueryDialog reportQueryDialog) throws RXException, UnsupportedOperationException;

221 / 318

Page 222: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

/**

*/

public FieldsProviderEditor getEditorComponent(ReportQueryDialog reportQueryDialog);}

기술적으로 본다면, 일곱개의 구현할 메쏘드가 있습니다: • supportsGetFieldsOperation• getFields• supportsAutomaticQueryExecution• hasQueryDesigner• hasEditorComponent• designQuery• getEditorComponent.

이들중에 네 개는 필드 프로바이더가 무엇을 할 수 있는가를 정의하며, 나머지 세 개가 필드 프로바이더의

주요 타스크에 관련되어 있습니다.

• supportsGetFieldsOperation은 질의로부터 필드를 가져올 수 있는지를 필드 프로바이더에서 구현하고

있는지를 알려줍니다(SQL의 경우 구현된 기능). 이 메쏘드의 결과가 true로 리턴된다면, 보고서는

getFields 메쏘드의 리턴값이 널이 아닌 필드(com.cabsoft.rx.engine.RXField)의 어레이라고 가정합니다.

• hasQueryDesigner 와 hasEditorComponent 는 시각적인 질의 디자인이 구현되어 있고, 필드를 맵핑시킬 수 있는 도

구가 있을 때만 각각 true를 리턴하게 됩니다.

이 메쏘드들은 디자이너의 질의 대화창에서 사용할 언어를 선택할 때 호출됩니다. 디자이너는 선택한 언어

에 대한 필드 프로바이더를 찾아 리턴된 값에 따라 필드 읽기와 질의 디자이너 버튼을 활성화 시킬지를 판

단하게 됩니다(그림 11-43). 에디터 컴포넌트가 사용가능 하다면, 질의 텍스트 영역의 오른쪽에 보여지게 됩

니다.

• 질의 텍스트를 변경할 때마다, supportsAutomaticQueryExecution과 supportsGetFieldsOperation 모두가

true를 리턴하고, 자동으로 필드 가져오기 체크박스 옵션이 선택되어 있다면, getFields 메쏘드가 호출

됩니다. 그 결과로 얻게되는 RXField 어레이는 필드 목록을 만들때 사용됩니다.

• 에디터 컴포넌트가 있다면, getEditorComponent 메쏘드에서 리턴된 컴포넌트에 구현된

FielsProviderEditor 인터페이스를 통해 질의 변경 이벤트를 수신받을 수 있습니다.

222 / 318

Page 223: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

(1) getFields()가 지원되면 필드 목록이 표시된다.

(2) supportsGetFieldsOperation()가 true일 경우 활성화 된다.

(3) supportsGetFieldsOperation()가 true일 경우 활성화 된다.

(4) hasQueryDesigner()가 true일 경우 활성화 된다.

(5) hasEditorComponent()가 true일 경우 getEditorComponent()가 Custom field mapping editor를 표

시함.

hasQueryDesigner 메쏘드가 true를 리턴한다면, 질의 디자이너 버튼이 활성화됩니다. 이 버튼이 클릭되면, 디

자이너는 편집할 질의 문자열(비어 있을 수 있음)을 담고있는 현재 선택되어있는 rxdConnection 인스턴스와

보고서 질의 편집기 대화창(null이 될 수도 있음)에 대한 레퍼런스를 매개변수로 하는 designQuery 메쏘드를

호출합니다. 이 메쏘드는 디자이너에서 만들어진 새로운 질의 문자열을 리턴해야만 하며, 사용자가 오퍼레이

션을 취소했을 경우에는 null을 리턴시켜야만 합니다. 필드 프로바이더 구현 예제는 디자이너 소스코드중

com.cabsoft.rxd.designer.data.fieldsproviders 패키지 내에서 찾을 수 있습니다. 질의 실행기 메커니즘과 필드 프로

바이더와의 통합은 보고서에서 어떤 언어라도 사용할 수 있게 합니다. 이 기능을 사용하여 여러분이 원하는

질의언어를 쉽게 사용할 수 있는 도구를 만들 수 있습니다.

223 / 318

그림 11-43 질의 대화창과 커스텀 필드 프로바이더

Page 224: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

12 장. 차트

보고서에서는 오픈소스 차트생성 라이브러리인 JFreeChart를 사용하여 보고서내에 차트를 출력할 수 있습니

다. 차트에서는 메인 데이터셋이나 서브데이터셋을 이용하게 됩니다. 15장에서는 서브데이터셋을 사용하는

방법에 대해서 배우게 될 것입니다. 서브데이터셋을 사용하게 되면, 서브리포트의 사용없이도 하나의 문서에

다양한 차트를 넣을 수 있습니다.

보고서에서 지원되는 차트의 종류는 다양합니다: 파이차트, 3D 파이차트, 막대형 차트, 3D 막대형 차트, YX

막대 차트, 스택바 차트, 3D 스택바 차트, 선 차트, XY선 차트, 영역 차트, YX영역 차트, 스택 영역 차트, 스캐

터 차트, 풍선 차트, 시계열 차트, 하이-로우 차트, 양초 차트, 간트, 미터, 온도계, 다축차트.

여러축을 갖는 차트는 하나의 축에 여러 차트를 집어넣을 수 있습니다. 이번 장은 다음 섹션들로 구성됩니

다:

• 간단한 차트 만들기

• 데이터셋트 사용하기

• 값에 하이퍼링크 걸기

• 차트의 속성

• 차트 테마 사용하기

12.1 간단한 차트 만들기

이번 섹션에서는 보고서에 3D 파이 차트를 포함시킬 수 있도록 차트 도구를 사용하는 방법과 차트의 세부

사항에 대해서 살펴보겠습니다. 차트 예제를 위해서는 보고서에서 제공하는 예제 데이터베이스를 사용하겠

습니다:

1. 새로 빈 보고서를 만듭니다.

2. 디자이너 툴바에서 실린더모양의 버튼을 클릭해서 질의 편집기(그림 12-1)을 엽니다.

224 / 318

그림 12-1 질의 편집기 창

Page 225: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

3. 국가별 주문수량을 표시하기 위한 질의를 이용합니다: select count(*) as orders, shipcountry from orders group by shipcountry

4. 확인 버튼을 눌러 질의창을 닫습니다. 디자이너에 질의 결과에 대한 필드들을 등록합니다.

5. 보고서 인스펙터에서 등록된 필드를 끌어다 반복 밴드에 놓습니다(그림 12-2).

6. 밴드들을 재조정하고 차트가 위치할 요약밴드의 높이를 증가시킵니다.

7. 팔렛트에서 차트도구를 선택하여 요약밴드에 놓습니다. 보고서에 차트 요소를 추가하게 되면, 그림

12-3과 같은 차트 선택창이 나타나며, 여기서 차트의 종류를 선택할 수 있습니다.

8. 3D 파이차트 아이콘을 선택한 후 확인버튼을 누릅니다. 그림 12-4와 같은 모습이 됩니다.

225 / 318

그림 12-2 초기 디자인

그림 12-3 차트 선택창

Page 226: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

이제부터는 차트의 설정을 해야 합니다.

9. 차트요소를 선택하고 오른쪽 클릭 후, 차트데이터 메뉴를 선택합니다. 그러면 차트 세부설정창이 나

타납니다(그림 12-5). 이 창에서 차트를 만들때 사용하게 되는 데이터를 선택할 수 있습니다.

226 / 318

그림 12-4 요약 밴드에 올려진 차트 요소

그림 12-5 차트 세부 설정창

Page 227: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

10. 데이터셋 타입 콤보박스에서 파이형 데이터셋을 선택합니다. 이 콤보박스를 통해 여러분이 사용할

차트에 따른 데이터셋 타입을 지정할 수 있습니다. XY 바차트를 제외한 다른 차트들을 생성할 때는

한 개의 데이터셋 타입만 가능합니다.

11. 데이터셋 탭에서 보고서 컨텍스트내에 데이터셋을 정의해줄 수 있습니다. 특히, 리셋 타입과 리셋 그

룹을 통해 데이터셋을 리셋시킬 시점을 설정해 줄 수 있습니다. 그룹별로 요약된 데이터를 사용할

때 유용합니다. 증가 타입과 증가 그룹에서는 차트에 새 값을 추가하는 시점을 결정합니다. 기본적으

로는 차트를 채우기 위해 사용되는 데이터셋의 각 레코드들에 대응하는 값이 차트에 출력됩니다. 이

러한 기본 동작을 변경시킬 수 있습니다. 즉, 차트를 위해 사용될 데이터를 수집하는 시점을 변경해

줄 수 있습니다. 가령, 그룹의 끝나는 시점에서만 차트에서 사용할 데이터를 추가할 수 있도록 이벤

트가 발생하면, 그룹의 요약정보만을 데이터에 담아서 사용하게 됩니다.

필터 표현식 영역에 차트에 제공할 레코드셋에 레코드들을 추가하기 위한 시점을 결정하는 플래그

를 추가할 수 있습니다. 이 표현식은 부울린으로 리턴되어야만 합니다. 디자이너에서 이 값을 비워두

면 “모든 레코드들 추가”로 처리합니다.

예제에 적합한 데이터 사용을 위해, 리셋 타입은 보고서로 설정해서 데이터를 리셋시키지 않으며 증

가 타입은 없음으로 설정된 것을 변경시키지 않음으로써 모든 레코드들이 차트에서 사용할 데이터

셋에 추가되도록 합니다.

12. 상세정보 탭에서 데이터소스 내의 모든 값에 관련된 표현식을 입력할 수 있습니다. 3D 파이차트 타

입에서는 세 개의 표현식을 입력합니다:

키, 값 그리고 라벨 (그림 12-6)

* 키 표현식: 파이차트의 조각들간 식별에 사용되는 유일한 값. 키값이 반복된다면, 먼저번 키값과 관

련되었던 라벨과 값의 값까지 덮어쓰게 됩니다. 키는 null일 수 없습니다.

* 값 표현식: 키와 관련된 숫자로된 값을 지정합니다.

* 라벨 표현식: 파이차트의 각 조각에 대한 라벨을 지정합니다. 이 표현식은 선택적 사용이며, 기본값

은 키값입니다.

227 / 318

Page 228: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

228 / 318

그림 12-6 파이차트의 표현식 설정

Page 229: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

13. 이제 보고서를 미리보기해 봅니다. 그림 12-7과 유사한 결과를 얻게 됩니다.

229 / 318

그림 12-7 최종 보고서

Page 230: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

12.2 데이터셋 사용하기

차트내에 표현되는 데이터는 보고서가 생성되면서 모아지고 차트에 연계되어 있는 데이터셋에 저장됩니다.

데이터셋 타입은 다음과 같습니다: • Pie• Category• Time period• Time series• XY• XYZ• High low• Value

데이터셋은 테이블로 생각할 수 있습니다. 각 데이터셋은 컬럼들(필드들)이 다릅니다. 새로운 레코드가 데이

터셋으로 삽입되면, 필드에 값이 추가됩니다. 그림 12-5. “차트 세부 설정창”에서 보고서 엔진이 차트용 데이

터셋 데이터를 언제 어떻게 추가할지를 선택할 수 있는 옵션에 대해 설명했습니다. 특히, 언제 데이터셋을

비울지(리셋 타입과 리셋 그룹 설정)에 지정할 수 있습니다. 증가 타입과 증가 그룹 설정을 통해서 데이터셋

에 새로운 레코드를 추가하는 시점도 지정할 수 있다는 것을 알게되었습니다. 이 네 필드에 대응하는 보고서

변수를 사용해도 동일한 효과를 얻을 수 있습니다( 6.3. “변수 사용하기” 참고).

세부 설정창에서 선택한 데이터셋 타입에 따라서 윈도우의 차트 데이터탭이 지정한 데이터셋에 적합한 필

드들을 보여주게 됩니다. 필드타입에 대한 세부적인 설명과 그 기능들은 보고서 가이드에 기술되어 있습니

다.

12.3 값에 하이퍼링크 걸기

데이터셋의 일부 타입들은 차트내에 표현되는 값에 하이퍼링크를 설정해줄 수 있는 방법을 제공합니다.이를

통해 웹페이지를 열거나 보고서의 다른 부분으로 이동시켜 보고서 자체의 사용성(드릴다운기능)을 증대시킬

수 있습니다.

230 / 318

Page 231: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

차트의 타입에 따라 클릭 가능한 영역을 적용할 수 있습니다. 파이차트는 파이를 구성하는 각 조각에 하이퍼

링크를 넣어줄 수 있고, 바차트는 바 자체가 클릭가능한 영역이 됩니다(그림 12-8). 요소에 하이퍼링크를 추

가하는 방법은 5.5 “커스텀 컴포넌트와 범용 요소 추가하기”에서 설명되었습니다. 하이퍼링크에 사용하는 표

현식은 차트에서 사용되는 데이터셋의 모든 필드, 변수, 매개변수를 포함시켜 사용가능합니다.

12.4 차트 속성

차트의 모습은 차트 요소의 속성 쉬트에서 설정가능합니다(그림 12-9). 현재 작업할 차트와 그래픽에 대한

속성을 편집할 수 있을 뿐만 아니라 차트와 그래픽에 대한 공통 속성들을 편집할 수도 있습니다. 차트 타입

들간에 차이가 나는 속성은 plot 속성으로 입니다.

231 / 318

그림 12-8 파이 데이터셋내의 조각에 대한 하이퍼링크

Page 232: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

그림 12-9 차트 요소의 속성 쉬트

현재로서는 보고서에서 JFreeChart 라이브러리의 기능중에 극히 일부분만을 사용할 수 있습니다. 그래프를

커스터마이징하려면, 다음 인터페이스를 구현한 클래스를 제작해야만 합니다: com.cabsoft.rx.engine.RXChartCustomizer

이 인터페이스에서 사용할 수 있는 메쏘드는 오직 다음 메쏘드 뿐입니다: public void customize(JFreeChart chart, RXChart reportexpressChart);

이 메쏘드는 JFreeChart 객체와 RXChart 객체를 인수로 사용합니다. 첫 번째 객체는 실제적인 이미지를 만드

는데 사용되고, 두 번째 객체는 차트를 커스터마이즈하는 메쏘드에 관련된 디자인 단계에서 지정한 모든 기

능들이 포함됩니다.

12.5 차트 테마 사용하기

그래프를 커스터마이징 하는 또 다른 방법은 차트의 테마를 만들어 주는 것입니다. 차트테마는 차트의 스타

232 / 318

Page 233: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

일을 통해 모든 기능을 사용할 수 있게 합니다. 차트 테마를 사용하여 차트를 커스터마이징할 수 있습니다.

차트 테마를 만드는 방법은 여러가지가 있지만, 일반 사용자가 가장 쉽게 할 수 있는 방법은 디자이너를 사

용하여 RXCTX파일(차트 테마 XML 파일)을 만드는 것입니다. 이번 섹션에서는 이 테마파일을 만드는 방법

과 사용하는 방법에 대해 살펴보겠습니다.

차트 테마 XML 파일을 만들기 위해서는 새로만들기 → 차트테마를 선택하고 저장할 위치와 파일명을 입력

합니다. 파일 확장자는 .rxctx가 됩니다.

12.5.1 차트테마 디자이너 사용하기

새로운 차트테마 파일을 만들었다면, 디자이너는 자동으로 차트테마 디자이너를 열게됩니다. 이 차트디자이

너는 세 부분으로 구성됩니다:

• 템플릿 인스펙터: 커스터마이징할 수 있는 차트를 섹션별로 나누어 트리뷰로 보여줍니다.

• 메인 뷰: 테마의 실제 적용시 모양을 보여줍니다.

• 차트테마 등록정보. 수정할 수 있는 속성 목록이 보여집니다.

보고서에서는 차트 테마를 총 7개의 서브섹션으로 구성합니다: • Chart• Title• Subtitle• Legend• Plot• Domain Axis• Range Axis

233 / 318

Page 234: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

디자이너는 차트 테마의 각 부분에 대한 속성을 디자인할 수 있게 합니다. 그림 12-11은 차트를 구성하는 섹

션들을 보여주고 있습니다.

그림 12-11 차트 섹션들

템플릿 인스펙터의 트리뷰에서 노드를 선택하여 속성쉬트에 선택한 섹션의 속성들을 편집할 수 있게 합니

다. 속성은 모든 차트타입에 대해 적용되지만, 미리보기에서는 한가지 타입만 보여줍니다. 다른 차트 타입에

대한 새로만든 테마의 적용효과를 보려면, 미리보기창의 툴바에 있는 콤보박스에서 타입을 선택하십시오. 차

트 속성 쉬트의 속성들은 그 이름 자체로 설명의 기능이 충분하기 때문에 여기서 자세히 설명하지는 않겠습

니다.

12.5.1.1 차트 테마 XML 소스 편집하기

차트 테마 디자이너는 미리보기 윈도우의 XML 탭을 통해 차트 테마의 소스코드를 직접 편집할 수 있습니

다. XML을 사용하는데 익숙한 사용자만 소스파일을 직접 수정하여 차트 테마를 편집하도록 권장합니다.

아래는 기본 영역 차트테마를 변경하여 디자이너탭 뷰에서 본 모습입니다. 이에 대한 소스코드는 부록 A에

서 확인할 수 있습니다.

234 / 318

Page 235: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

그림 12-12 차트 테마 예제 - TricolorAreaChart

12.5.2 차트테마용 보고서 익스텐션 만들기

직접 만든 RXCTX 파일은 아직은 보고서에서 사용할 수 없습니다. 여기에는 차트의 일부 속성만을 기술한

것이어서 보고서 익스텐션 JAR로 먼저 감싸줘야 합니다. 새로운 테마의 이름을 설정하고

reportexpressreport_extention.properties 파일을 만들어서 보고서 익스텐션을 기술해주고 .rxctx 파일과

.properties 파일을 JAR로 패키징해야 합니다. 이러한 작업은 템플릿 인스펙터 트리뷰에서 루트노드를 오른쪽

클릭한 후, Jar로 내보내기 ...메뉴를 선택하면 한번에 수행됩니다. 부가적으로, 미리보기창의 툴바에 위치한

패키지 아이콘(Jar 파일로 저장)을 클릭해도 동일한 패키지 작업을 수행시킬 수 있습니다.

그림 12-13 Jar 파일로 저장 버튼

내보내기창이 열리게 됩니다 (그림 12-14).

235 / 318

Page 236: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

그림 12-14 차트테마 내보내기

이 윈도우에서 새 테마의 이름을 지정할 수 있습니다. 이 이름은 보고서 엔진에서 테마들을 식별할 때 사용

됩니다. 생성시킬 JAR를 선택합니다. 여기서 만들어진 JAR는 디자이너의 클래스경로에 자동으로 추가시킬

수 있지만, 웹 어플리케이션에서 서비스하는 경우에도 이 JAR 파일을 클래스경로내에 위치시켜야 한다는 것

을 명심하십시오.

236 / 318

Page 237: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

13 장. 리스트, 테이블, 바코드

디자이너에서는 세 개의 추가적인 컴포넌트를 지원하고 있습니다: 리스트, 테이블 및 바코드. 리스트 컴포넌

트는 별도의 서브리포트를 만들지 않고 보고서 내에 특정 기능을 수행하는 경량의 서브리포트와 같은 효과

를 얻을 수 있도록 하기위해 만들어졌습니다. 바코드 컴포넌트는 보고서 내에 바코드를 출력할 때 사용합니

다. 이번 장은 다음 섹션들로 구성되어 있습니다:

• 리스트

• 테이블

• 바코드

13.1 리스트

리스트 컴포넌트의 이름 때문에 항목들의 간단한 어레이처럼 생각되어 지지만, 실제로는 이보다 훨씬 유용

한 기능들이 구현되어 있습니다. 리스트 컴포넌트는 보고서 내에서만 사용될 수 있으며, 텍스트 필드, 이미지

및 그래픽 객체들을 포함하는 요소들로 정의되는 항목들로 구성됩니다. 관련된 값들을 그룹으로 보여주거나

계산이 필요없는 간단한 테이블로 보여줄때 사용합니다. 리스트를 채울 때 사용하는 데이터는 서브데이터셋

입니다. 리스트 컴포넌트는 메인 데이터셋으로 부터 데이터를 추출할 수 없습니다.

13.1.1 리스트 컴포넌트 사용하기

리스트 컴포넌트를 사용하기 위해서는 팔레트에서 리스트 요소를 끌어다 밴드에 위치시킵니다. 밴드내에 리

스트 요소를 놓으면, 디자이너는 자동으로 서브데이터셋을 추가하여 리스트에 연결시키게 됩니다. 보고서 인

스펙터에서 새로 추가된 서브데이터셋을 볼 수 있게 됩니다. 새로 추가된 서브데이터셋은 비어있게 되므로,

데이터베이스나 다른 소스로부터 데이터를 가져오기 위해 질의가 필요하다면 작성하여 필요한 모든 필드들

을 정의해주어야 합니다. 설정방법에 대한 자세한 사항은 15장. “서브데이터셋”을 참고하십시오.

리스트 요소를 설정하기 위해서는 먼저 리스트 요소를 오른쪽 클릭한 후, 리스트 데이터소스 편집을 선택합

니다. 이제 데이터셋 실행 윈도우창이 나타나며(그림 13-1), 여기서 리스트 요소가 서브데이터셋을 어떻게 이

용할지 설정합니다.

237 / 318

Page 238: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

기본적으로 데이터소스 표현식은 디자이너에서 설정합니다: new com.cabsoft.rx.engine.RXEmptyDataSource(1)

이 표현식을 통해 단일 레코드를 갖는 모든 필드를 null로 리턴하는 빈 데이터소스가 생성됩니다. 기본 표현

식의 실질적인 용도는 처음 사용하는 사람들이 잘 모르더라도 리스트 요소를 사용할 때 오류가 발생되지 않

도록 하는 것이어서 쓸모없는 것은 아닙니다. 가장 대표적인 데이터셋 실행의 설정은 조금 다릅니다.

보고서가 SQL 질의 기반일 경우, 커넥션/데이터소스 표현식을 커넥션 표현식 사용으로 설정해야 합니다. 디

자이너는 메인 데이터셋에서 사용하는 것과 동일한 데이터베이스 연결을 갖고 있는

$P{REPORT_CONNECTION} 으로 표현식을 설정하게 됩니다. 하지만, 이것은 데이터셋을 설정하는 다양한

방법중의 하나일 뿐입니다. 다르게 설정하는 방법은 차트와 크로스탭을 다루게 되는 12장과 15장에서 언급

됩니다.

서브데이터셋 실행 설정에 대한 룰은 항상 동일합니다. 서브데이터셋은 필드, 매개변수, 변수 및 필드값을 가

져오기 위해 실행할 질의 등과 같은 데이터셋을 구성하는 모든 객체들로 정의되고 있습니다. 하지만, 질의를

실행시킬 때 사용하는 연결정보와 매개변수로 반드시 설정해야 하는 값에 대한 정보등은 포함하지 않습니

다. 서브데이터셋 실행에서 설정하는 정보는 결국 보고서 엔진에게 서브데이터셋으로 이 정보들을 어떻게

공급할지를 지시하는데 필요한 사항을 정의하는 것입니다. 즉, 데이터셋 실행 모듈에서는 SQL 질의를 실행

시킬 때 필요한 연결을 제공하기 위해 데이터셋 매개변수에 대한 값을 설정하는 표현식을 정의하게 됩니다.

메인 데이터셋과 서브데이터셋 모두에서 SQL 질의를 사용하는 경우, 데이터셋 실행 모듈을 사용하여 메인

238 / 318

그림 13-1 리스트 데이터셋 실행 설정창

Page 239: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

데이터셋의 연결을 서브데이터셋으로 넘겨줄 수 있습니다. 때로는 서브데이터셋에서 사용하는 질의 언어가

반드시 필요하지 않을 경우, 데이터소스를 지정해주거나 그냥 없이 사용하기를 원할 때도 있습니다.

데이터셋 실행 윈도우에서는 서브데이터셋 매개변수의 값을 지정할 수 있습니다. 이는 서브리포트 템플릿의

위치를 지정하는 서브리포트 표현식을 제공하는 것만 제외한다면 서브리포트에서와 매우 유사한 방식(5.4.1.

서브리포트)입니다.

일단 데이터셋이 설정되었다면, 보고서에서 보여지게될 리스트의 디자인에 집중할 수 있습니다. 시각적인 면

에서 볼때, 리스트는 요소들을 집어넣어주는 프레임 요소와 유사합니다. 리스트 요소의 크기는 어떻게 지정

하면 될까요? 요소의 크기를 지정할 때는 그 너비가 중요합니다. 실제 보고서로 그려지는 최종 모습에서는

디자인에서 지정한 너비만이 항상 동일하게 유지되기 때문입니다. 속성 쉬트에서 높이 속성은 보고서 내에

서 리스트 요소가 채우게 되는 각 항목이 차지하게 되는 높이를 지정하게 됩니다. 보고서를 실행시키면, 데

이터소스의 각 레코드들은 높이 속성을 통해 지정한 최소 높이에 맞춰 컨텐츠를 출력시키게 됩니다. 문서 전

체로 볼때 리스트 요소의 수직으로의 높이는 리스트에 포함된 총 아이템 수와 각 아이템의 높이 그리고 컨

텐츠에 따라 아이템을 늘려주는지에 따라 달라지게 됩니다. 데이터셋에 레코드가 없다면, 점유되는 공간은

리스트 요소 자체가 됩니다. 즉, 빈 공간이 남게 됩니다.

지금까지는 리스트 요소를 밴드에 위치시키고 서브데이터셋과 데이터셋 실행 모듈을 설정하였습니다. 이제

는 여기에 컨텐츠를 추가해보도록 하겠습니다. 리스트 요소내에 위치되는 모든 요소들은 아이템 높이 안쪽

으로 들어가야 합니다. 이러한 이유때문에 디자이너에서는 리스트 요소의 높이를 재조정할 때 그 안쪽의 아

이템들의 높이도 모두 동기화시키게 됩니다. 안쪽 아이템들의 높이가 자동으로 조정될 때는 자석붙이기 효

과를 통해 모든 요소들의 위치에 흐트러짐이 없이 하여 디자인의 재조정이 필요없도록 하고 있습니다.

그림 13-2 리스트 요소

그림 13-2에서 디자인된 리스트 요소의 예를 보여주고 있습니다. 이 예에서 리스트 요소는 경계선을 그리기

위해서 프레임 요소내에 위치시켰습니다. 리스트 요소내에는 두 개의 텍스트필드가 들어가 있습니다. 첫 번

째는 $F{SHIPCOUNTRY} 로써 국가명을 출력하고, 두 번째는 $F{C}로 해당 국가내에서 주문한 수량을 출력

239 / 318

Page 240: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

합니다. 요소내에 값을 출력하려면, 다음과 같은 질의를 사용하게 됩니다: select count(*) c, shipcountry from orders group by shipcountry order by shipcountry

질의를 통해 각 국가별로 주문한 수량을 질의하게 됩니다. 그림 13-3에서는 최종 결과를 보여주고 있습니다.

이제 리스트를 만들기 위한 과정을 요약해보겠습니다:

1. 밴드내에 리스트 요소를 추가하는것 부터 시작합니다. 예제의 경우에는 타이틀 밴드에 리스트 요소

를 추가했습니다. 리스트 요소가 밴드에 추가되면, 디자이너가 연결되는 서브데이터셋을 자동으로

만들어 주게 됩니다.

2. 다음 단계로 서브데이터셋을 설정합니다. 보고서 인스펙터에서 서브데이터셋 노드를 오른쪽 클릭하

여 질의편집 메뉴를 선택하여 서브데이터셋의 질의를 설정해줍니다. 질의는 위에서 보여드렸던 국

240 / 318

그림 13-3 질의 결과

Page 241: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

가별 주문수와 국가명 결과셋을 얻기위한 질의입니다. 질의를 통해 얻어지는 두 필드는 각각

SHIPCOUNTRY와 C로써, 서브데이터셋 필드 목록에 추가됩니다.

3. 다음 단계에서는 데이터셋 실행 모듈의 설정입니다. 리스트 요소를 오른쪽 클릭하여 리스트 데이터

소스 편집 메뉴를 선택합니다. 데이터셋 실행 설정창에서 커넥션/데이터소스 표현식 탭을 선택합니

다. 콤보 박스에서 데이터소스 표현식 사용을 선택합니다.

4. 마지막 단계에서는 리스트 요소의 컨텐츠 설정입니다. 두 필드를 리스트 요소 안쪽으로 끌어다 놓고

크기와 위치를 조정합니다. 앞에서도 언급했듯이, 리스트 요소내에 넣는 요소는 데이터셋의 레코드

마다 반복되어 출력됩니다. 즉, 요소내의 컨텐츠는 반복 밴드의 컨텐츠처럼 각 레코드마다 반복됩니

다(그림 13-3와 같은 결과가 얻어짐). 리스트 요소를 감싸고 있는 프레임은 리스트의 한 부분이 아닙

니다. 리스트의 경계선을 그려주기 위해 프레임 요소내에 리스트를 집어넣은 것 입니다. 프레임 경계

선은 1 픽셀로 설정했습니다.

13.1.2 리스트 요소의 매개변수와 변수

리스트 요소내에 출력된 데이터는 해당 리스트 요소에 연결된 서브데이터셋으로부터 가져온 것입니다. 서브

데이터셋은 필드 뿐만 아니라 매개변수와 변수들도 가질 수 있습니다. 매개변수는 SQL 질의에서 where절에

서 사용될 수 있으며, 다른 유용한 사용도 가능합니다. 매개변수의 값은 데이터셋 실행 설정창의 매개변수탭

에서 설정해줍니다(그림 13-1). 표현식의 값에는 메인 보고서의 객체들(메인 데이터셋으로부터 가져오는 필

드, 매개변수 및 변수)을 포함시킬 수 있습니다.

고객명단을 출력해주는 보고서를 생각해보겠습니다. 각 고객별 전자메일 주소의 목록을 리스트 요소를 사용

해서 출력하겠습니다. 이 보고서의 반복 밴드에는 고객의 이름, 고객 식별자, 전화번호 및 전자메일주소를 출

력해줄 리스트 요소를 위치시킵니다. 서브데이터셋의 질의는 다음과 같이 하여 해당 고객의 전자메일주소

목록을 얻을 수 있게 합니다:

select email from EMAIL_ADDRESSES where CUSTOMER = $P{CustomerID}

241 / 318

Page 242: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

where절에서 사용하는 매개변수를 통해 가상의 테이블 EMAIL_ADDRESSES에서 해당 고객의 전자메일주소

를 가져오게 합니다. 메인 데이터셋에는 서브데이터셋에 넘겨줄 CUSTOMER_ID 필드가 있다고 가정했고, 이

값을 데이터셋 실행 설정창을 통해 CustomerID 매개변수에 $F{CUSTOMERID}를 설정합니다(그림 13-4).

보고서를 실행하면, 엔진은 모든 고객들에 대해 각 반복 밴드를 채우게 됩니다. 반복 밴드가 반복될 때마다

리스트 요소에는 CUSTOMERID 필드의 값을 통해 ${CustomerID} 매개변수의 값이 설정되어 서브데이터셋

질의를 실행시킴으로써 채워줄 데이터를 가져오게 됩니다. 가져오는 데이터에는 반복 밴드에 출력되는 현재

의 CustomerID에 해당되는 고객의 전자메일주소가 포함됩니다.

이전에 서브리포트의 매개변수를 사용해 보았다면, 표현식을 통해 서브데이터셋의 매개변수 값을 설정해 주

는 개념에 친숙하실 것입니다. 이미 언급했듯이, 서브데이터셋과 데이터셋 실행 메커니즘은 차트와 크로스탭

에서 사용하는 것과 동일합니다. 다른 점은 리스트 요소는 서브데이터셋에만 사용할 수 있고, 차트와 크로스

탭은 메인 데이터셋도 사용할 수 있다는 것입니다.

리스트 요소에서는 그림 13-3에서 보여드린 것처럼 필드를 출력할 수 있으며, 동일한 방식으로 서브데이터

셋의 매개변수와 변수들도 출력할 수 있습니다. 텍스트필드와 표현식을 사용하여 이들 객체의 조합사용이

가능하기 때문입니다. 출력되는 값들은 리스트의 서브데이터셋에 정의되어 있어야만 합니다. 그림 13-5는 그

림 13-3에서 보여드린 리스트 요소와 동일하지만, 주문수량의 누적합계 변수가 추가로 포함되어 있습니다.

242 / 318

그림 13-4 데이터셋 실행 매개변수

Page 243: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

이 결과를 얻기위한 보고서의 레이아웃은 그림 13-6 입니다.

243 / 318

그림 13-5 누계 변수를 사용한 리스트 요소 (마지막 열)

그림 13-6 변수를 추가한 리스트 요소(그림 13-2 와 비교)

Page 244: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

리스트 요소의 variable1은 dataset1의 C필드의 합계로 정의되어 있습니다. 각 레코드마다 변수의 값은 C 필드

의 레코드가 증가함에 따라서 누적 합계가 됩니다. 텍스트필드의 변수에 대한 평가시점을 보고서로 설정함

으로써 해당 변수의 최종 누적된 값을 출력할 수 있습니다(그림 13-7).

13.1.3 리스트 컴포넌트의 이슈들

각 국가별로 주문량을 총 주문량의 비율로 출력하고 싶다면 어떻게 될까요? 백분율 계산을 위해서는 두 값

이 필요합니다. 즉, 국가별 주문량(평가시점에서의 C 값)과 총 주문량(Report 평가시점에서의 variable1).

공식은 매우 간단합니다: C/variable1

여기서 C와 variable1은 평가시점이 서로 다릅니다. 계산된 결과를 보여주는 텍스트필드의 평가시점은 Auto

244 / 318

그림 13-7 누적 합계와 소요시간 변수가 출력된 리스트 요소

Page 245: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

로 설정되어야만 합니다. 하지만, 여기서 리스트 요소의 첫 주요 제약사항에 부딪히게 됩니다. 즉, 리스트 요

소는 Auto 평가시점을 사용할 수 없다는 것입니다. 결국, 이와 같은 시나리오를 해결하기 위해서는 서브리포

트를 사용하거나 먼저 variables1에 사용할 값을 계산해서 넘겨주어야 합니다.

또 다른 리스트 컴포넌트의 제약사항은 리턴 값에 대한 지원이 빈약하다는 것입니다. 서브리포트와는 달리

리스트는 계산된 결과에 대해 부모 보고서쪽으로 값을 리턴시키는것이 간단치 않습니다. 이러한 제약사항을

극복하기 위해서는 스크립틀릿이나 자바코드를 사용하여 메인 데이터셋과 리스트 컴포넌트의 데이터셋 사

이에서 공유할 수 있는 해쉬맵으로 처리해야 합니다.

이미 말씀드렸듯이, 리스트는 평가시점이 없거나 항상 “now”라고 말할 수 있겠습니다. 일반적으로 이것은 큰

문제가 되지 않습니다. 리스트가 메인 데이터셋을 사용하여 출력할 데이터를 만들지 않기 때문입니다. 문제

가 되는 경우는 메인 데이터셋으로 부터 데이터를 가져와서 이를 리스트에 출력할 때 발생합니다. 즉, 목차

와 인덱스 혹은 보고서 실행중에 얻어지는 데이터들의 정보들을 출력할 필요가 있는 경우에는 스클립틀릿

을 사용하여 메인 데이터셋의 개별 레코드들에 대해 데이터를 모아서 사용할 수 있습니다. 보고서의 채움과

정이 끝나는 시점에 리스트 요소를 위치시켜 (즉, 요약 밴드)줌으로써 이러한 문제를 어느정도 극복할 수는

있습니다.

마지막으로, 리스트는 헤더나 풋터가 없습니다. 리스트 요소의 윗부분에 정적 텍스트를 추가해줄 때, 즉 테이

블 헤더와 같은 효과를 주려고 할 경우에는 문제가 되지 않지만 리스트의 윗쪽이나 아랫쪽에 총합계나 다른

계산된 결과를 출력하려고 할 때는 요약에 대한 지원이 없습니다. 이러한 문제점은 리스트로 부터 값을 리턴

받을때 사용했던 방식으로 접근하여 해결할 수 있습니다.

보고서 엔진에서는 REPORT_COUNT 변수를 서브데이터셋에서도 사용가능하도록 지원하고 있습니다. 이를

사용하여 리스트 항목에 대해 배경색을 교차시키는 효과를 넣어줄 수 있습니다. 이것은 밴드에서 배경색을

교차시키는 효과를 만들었던 것과 동일한 방식으로 처리합니다. 아이템들을 리스트요소 내에 직접 넣어주는

대신 프레임안에 넣어주고 이 프레임을 다시 리스트안에 위치시킵니다. 이때 리스트안에 넣어주는 프레임의

크기는 리스트와 동일하게 해야합니다. 조건부 스타일을 사용하여 프레임의 배경색을 교차시키도록 하면, 리

스트내의 각 항목의 배경색이 교차되는 효과를 얻을 수 있게 됩니다.

리스트 사용시 성능적인 측면을 살펴보겠습니다. 리스트 요소의 처리 성능은 서브리포트를 사용할 경우와

유사하여 어떻게 사용하느냐에 따라 성능차이가 나게 됩니다. 보고서내에서 리스트 요소의 사용이 많고, 각

리스트 내에는 SQL 질의가 수행되어져야 할 경우( 반복 밴드내에서 사용)라면 메인 데이터셋의 각 레코드마

다 질의가 실행되어지기 때문에 성능적인 측면에서 영향이 크게 됩니다. 물론, 메인 데이터셋의 갯수가 아주

많을 경우에만 해당되기는 합니다. 즉, 리스트 요소를 사용할 경우에는 서브리포트를 사용할 경우에 비해서

는 상대적으로 구조가 간단하고 또 다른 RXXML 파일(보통 캐쉬되어짐)을 로딩할 필요가 없기 때문에 빠릅

니다.

13.1.4 출력 순서: 수직과 수평 리스트

출력 순서는 리스트요소를 수직방향(기본값) 혹은 수평방향으로 출력시킬지를 설정하는 속성입니다. 수평방

245 / 318

Page 246: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

향의 경우, 리스트 요소는 수평방향으로 늘어나게 됩니다. 간혹, 서브리포트의 반복 밴드 내에 리스트 요소를

수평방향으로 설정하여 동적으로 행과 열의 수를 갖는 테이블과 유사하게 만들어줄 수도 있습니다.

13.1.5 리스트의 다른 사용

지금까지 살펴본 바로는 리스트 요소의 이름에도 불구하고 리스트 요소를 간단한 아이템 목록을 출력하는

용도로만 사용하지 않을수도 있다는 것을 보았습니다. 리스트 요소는 외부의 RXXML 파일을 참조하지 않으

면서도 간단하게 서브리포트의 효과를 낼 수 있습니다. 더 나아가서 메인 보고서에서 사용한 질의나 데이터

소스로부터 데이터를 추출할 수 없는 데이터를 서브리포트의 사용처럼 부가적인 RXXML 파일을 로딩시키

는 과정없이 출력하는 가장 좋은 방법입니다. 이러한 특징 때문에 리스트는 필드의 값을 디코딩해서 출력할

때 사용하면 좋습니다. 가령, 숫자를 포함하고 있는 필드가 있다고 해보겠습니다. 숫자에 따라 특정 메시지나

텍스트가 보고서내에 출력되어야만 한다면, 리스트 요소를 사용하여 숫자 값에 대한 디코딩 값을 출력할 수

있습니다. 이 경우, 리스트 요소는 질의나 데이터소스를 사용하여 주어진 값에 대한 디코딩 값을 얻습니다.

13.2 테이블

테이블 컴포넌트는 이차적인 데이터셋으로부터 데이터를 가져와 출력합니다. 이 컴포넌트는 많은 경우, 서브

리포트를 대신하여 쓸 수 있는 강력한 기능을 제공합니다. 테이블 도우미를 통해 간단한 설정작업 만으로도

복잡한 테이블을 만들수도 있습니다. 테이블내의 각 셀들은 간단한 텍스트 요소이거나 매우 복잡한 레이아

웃 작업을 통해 중첩된 테이블을 포함시킬 수도 있습니다.

13.2.1 테이블 만들기

보고서에 테이블을 만들려면, 팔렛트의 테이블 요소를 보고서의 밴드내에 끌어다 놓습니다. 위치시킬 밴드에

제약은 없습니다. 테이블 요소를 밴드에 끌어다 놓게되면, 테이블 생성을 위한 두개의 옵션을 제공하는 도우

미가 나타납니다. 데이터셋으로 부터 테이블을 만들것인가 아니면 고정된 컬럼의 갯수를 갖는 빈 테이블을

만들 것인가를 선택합니다.

• 빈 테이블 만들기를 선택할 경우에는 새로운 데이터셋을 만들고 테이블에 연결시킵니다(그림 13-8).

246 / 318

Page 247: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

• 데이터셋으로부터 만드는 옵션을 선택하면 보다 간단합니다.디자이너는 지정한 데이터셋으로부터

필드를 선택하는 단계를 거쳐 테이블을 구성하게 하며, 이 단계에서 선택한 필드들이 테이블의 각

셀에 대응되도록 만들고 컬럼 라벨도 생성합니다.

지정한 데이터셋이 사용가능하지 않은 경우에는 새로 데이터셋을 만들 수 있도록 새로 데이터셋 만

들기 버튼을 클릭하여 데이터셋 도우미를 시작시킵니다. 디자이너는 테이블에서 사용할 필드가 어

떤 것인지 선택할 수 있도록 묻습니다.

247 / 318

그림 13-8 테이블 도우미 – 새 테이블

Page 248: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

다음 단계에서는 테이블에 연결시킬 데이터를 어떻게 얻을지를 지정합니다. 데이터는 데이터셋을 통해 설정

되지만, 데이터셋을 사용하기 위해서는 데이터베이스 혹은 데이터소스로의 연결을 제공해야 합니다. 그림

13-9 에서 보여지는 패널에서 이를 위한 몇가지 설정 옵션이 제공됩니다.

데이터셋이 SQL 질의를 사용할 경우, 극히 일부의 경우를 제외하고는 기본 옵션(부모 보고서를 채우는데 사

용한 것과 동일한 연결을 사용하는) 그대로가 효과적입니다. 테이블에 다른 연결이나 데이터소스를 사용해

야 할 경우(매개변수를 통해 연결을 지정), 다른 커넥션 사용을 선택하고 올바른 표현식을 작성해줍니다.

패널의 마지막 두 옵션은 빈 데이터소스(외부 데이터에 의존하지 않는 테이블을 만들때 유용)를 사용하도록

하거나 어떠한 연결 또는 데이터소스도 지정하지 않게할 수 있습니다. 특히, 데이터를 생성하기 위해 어떠한

소스도 필요가 없는 특이한 질의 실행기를 사용하는 데이터셋을 사용할 경우 어떠한 연결이나 데이터소스

도 지정하지 않습니다.

테이블을 만드는 최종 단계에서는 테이블의 룩앤필을 지정하게 됩니다(그림 13-10). 이 단계는 테이블을 생

성하는 방법에 상관없이 제공됩니다.

248 / 318

그림 13-9 테이블 도우미 - 연결

Page 249: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

디자이너는 테이블 룩앤필에 이용할 수 있는 네 개의 스타일을 제공하며, 각 스타일의 이름앞에 “Table” 접두

어가 붙습니다:

• Table : 테이블의 외곽 경계선을 지정

• Table_TH : 테이블 헤더의 배경색과 셀의 경계선을 지정

• Table_CH : 테이블 컬럼의 배경색을 지정(다음 섹션인 테이블 구조에서 설명)

• Table_TD : 반복 셀의 스타일을 지정. 이 스타일에서는 중첩된 조건부 스타일이 가능하므로 반복되는

반복 행의 배경색을 교차시키는 효과를 만들 수 있습니다.

또한, 테이블의 컬러 스키마는 스키마 이름을 선택해서 만들거나 변화를 줄 수 있습니다. 색은 언제든지 수

정이 가능합니다. 여러분이 직접 셀의 경계선 색과 스타일도 지정해 줄 수 있습니다. 그리드를 채우거나 각

행에 대한 수평선과 테이블 외곽 경계선에 대한 개별적인 색과 스타일도 지정할 수 있습니다.

마지막으로, 사용자는 어떤 테이블 섹션을 생성할지를 결정합니다. 테이블에 연결되는 데이터셋이 그룹을 포

함하고 있는 경우라면, 그룹헤더 추가와 그룹풋터 추가 체크박스를 선택하면 편리합니다. 기본적으로는 선택

되어있지 않습니다. 이 옵션을 사용하면 테이블내에 그룹헤더와 풋터 섹션을 다른 섹션들에 추가해서 만들

게 됩니다.

도우미를 끝내면, 새로운 테이블 요소가 만들어지고 테이블 편집기가 활성화됩니다. 테이블 편집기는 크로스

탭 편집기(15장 참고)처럼 동작합니다. 메인 디자이너상에서 보면, 테이블은 테이블 아이콘과 함께 회색 사각

형 영역으로 표시됩니다(그림 13-11).

249 / 318

그림 13-10 테이블 도우미 – 테이블 스타일

Page 250: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

그림 13-11 테이블 편집기를 사용한 새 테이블

13.2.2 테이블 구조

13.2.2.1 테이블 요소

테이블은 최소 한 개의 컬럼을 가져야만 하고, 한 개 이상일 수 있습니다. 컬럼의 셋트는 컬럼 그룹으로 묶일

수 있으며, 그룹은 여러개의 컬럼으로 확장되는 헤더를 가질 수 있습니다. 테이블은 보고서 밴드와 유사하게

섹션들로 나뉘어져 구성되어 있습니다(그림 13-12):

• 테이블 헤더와 풋터 : 테이블의 시작과 마지막에 오직 한번만 출력되는 영역

• 컬럼 헤더와 풋터 : 테이블이 한 페이지 이상에 걸쳐 출력될 경우, 각 페이지에 반복적으로 출력되는

영역. 한 개이상의 컬럼 그룹이 존재할 경우, 테이블은 각 컬럼과 마찬가지로 각각의 그룹에 대한 그

룹헤더와 풋터 섹션도 출력합니다.

• 반복 섹션 : 테이블의 각 레코드마다 반복해서 출력되는 영역. 각 컬럼은 오직 한 개의 반복 섹션만

을 포함하며 섹션이 여러 컬럼에 걸쳐 출력될 수 없습니다.

그림 13-12 테이블 구조

보고서 인스펙터에서 보면, 테이블 섹션은 테이블 요소 노드의 자식노드로 표현됩니다(그림 13-13).

250 / 318

Page 251: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

그림 13-13 보고서 인스펙터에서의 테이블 노드

복잡한 테이블 구조로 작업할 경우, 테이블 섹션과 셀을 구별하기가 힘들어 질 수 있습니다. 따라서, 디자이

너의 인스펙터에서 선택된 테이블 섹션 노드는 디자이너 사이드 룰러에 보라색 바로 표시하게 됩니다(그림 13-14).

그림 13-14 보고서 인스펙터에서 섹션 하일라잇

디자이너에서 각 컬럼들은 각각의 섹션에 대한 셀을 갖습니다. 가령, 테이블 헤더 섹션에서의 하나의 셀, 테

이블 풋터에서의 또 다른 셀 등등. 셀은 지정하지 않을 수도 있습니다. 섹션의 모든 셀을 지정하지 않으면, 섹

션은 출력되지 않습니다. 섹션내의 모든 셀들의 높이를 0으로 설정하면, 섹션은 디자이너에서는 안보이지만

출력은 됩니다.

새로 테이블을 만들게 되면, 디자이너는 테이블의 각 섹션에 서로 다른 배경색을 지정합니다. 이를 통해 각

각의 섹션을 식별하는데 도움을 주게 됩니다. 셀 노드를 선택하면, 보라색으로 옆면과 윗면을 가리키게 하여

해당 노드의 위치와 크기를 식별할 수 있습니다(그림 13-15).

그림 13-15 하일라잇된 셀

251 / 318

Page 252: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

13.2.2.2 컬럼 그룹

앞에서도 언급한 것처럼, 테이블은 각 섹션에 대해 하나의 컬럼을, 그 컬럼은 셀의 셋트로 구성됩니다. 여러

컬럼에 걸치게 되는 헤더를 원한다면, 컬럼 그룹을 만들어야 합니다. 그룹에는 한 개이상의 컬럼이 포함됩니

다. 또한 또 다른 컬럼 그룹을 포함하게 할 수 있습니다. 반복 섹션을 제외한 다른 섹션들에는 추가적인 헤더

셀을 제공할 수 있습니다. 이렇게 추가된 새로운 헤더셀은 그룹의 모든 컬럼에 걸쳐지게 됩니다.

그림 13-16에는 그룹 헤더를 갖는 두 개의 컬럼을 묶은 컬럼 그룹이 컬럼에 걸쳐출력된 모습을 보여주고 있

습니다. 그림에서 보면, 좌측은 간단한 컬럼입니다. 오른쪽은 보라색으로 표시된 추가된 헤더셀을 갖는 컬럼

그룹이 그룹의 컬럼에 걸쳐져 있습니다. 이 새로운 그룹헤더셀은 테이블 헤더셀이나 개별 컬럼 헤더셀을 대

체하지 않습니다.

컬럼 그룹을 만들게 되면, 모든 컬럼 섹션은 컬럼그룹내에서 모든 컬럼에 걸쳐질 수 있는 추가적인 헤더를

갖게 됩니다(그림 13-17). 왼쪽 그림은 두 개의 컬럼만을 갖고 있는 상태입니다. 컬럼을 그룹으로 묶으면, 각

컬럼 섹션은 가운데 그림처럼 그룹헤더를 갖게 됩니다(대부분의 섹션은 하나의 레코드만을 갖고, 한 개의 섹

션에서만 두 개를 갖습니다). 하지만, 대부분의 그룹헤더는 필요가 없기 때문에 그 높이를 0으로 설정하여

감추게 되며, 최종적으로는 오른쪽 그림처럼 보여지게 됩니다.

252 / 318

그림 13-16 간단한 컬럼 대 컬럼 그룹

Page 253: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

그림 13-17 그룹 헤더

13.2.2.3 테이블 셀

셀에는 보고서 엔진에서 제공하는 어떠한 요소라도 포함시킬 수 있지만, 일반적으로 텍스트 기반의 컨텍스

트를 보여주기 때문에 셀안에 요소를 넣게되면 디자이너에서 자동으로 셀 크기에 맞춰 요소를 정렬시키게

됩니다. 또 다른 요소를 셀안쪽에 넣게되면, 수직방향으로 레이아웃을 수행합니다. 셀안의 요소는 셀을(또는

셀안의 요소를) 오른쪽 클릭한 후, 수직방향으로 요소들 정렬이나 수평방향으로 요소들 정렬 메뉴를 선택하

여 정렬방식을 변경시킬 수 있습니다. 이러한 방식이 사용자의 요구를 충족시키지 못한다면, 셀안에 프레임

요소를 넣고 그 프레임 안쪽에 필요한 요소들을 집어넣어 주는것이 최선입니다.

셀이 필요하지 않다면, 셀을 선택하여 셀 삭제 메뉴를 클릭하면 됩니다. 컬럼에 오직 한 개의 셀만이 존재할

경우 셀을 삭제하면 전체 컬럼이 제거됩니다.

유사한 방식으로 셀이 정의되지 않은 경우에는 이 셀을 오른쪽 클릭한 후, 셀 추가를 선택해서 셀을 만들어

줄 수 있습니다.정의하지 않은 셀은 사용자가 요소를 끌어다 안쪽에 넣을때 자동으로 만들어집니다. 셀의 속

성은 속성쉬트에서 편집 가능합니다. 셀 스타일에서 셀의 배경색과 경계선을 지정할 수 있습니다. 셀의 패딩

을 지정해줄 수는 있지만, 디자이너에서 정확하게 동작하지는 않습니다. 패딩효과를 주는 또 다른 방법으로

는 텍스트필드나 이미지 요소의 패딩속성을 이용하는 것 입니다. 행 스팬 속성은 디자이너에서 처리합니다.

이 속성은 중첩시킨 그룹들을 견고하게 연결시킬 때 사용하고, 일반적으로 사용자에 의해 변경되지 않도록

해야 합니다. 마지막으로, 셀의 높이는 셀의 높이 속성을 통해 지정합니다. 이 값이 변경되면, 같은 행의 모든

셀들에 영향을 미치게 됩니다.

13.2.3 테이블 레이아웃 편집하기

테이블 레이아웃을 편집하려면, 메인디자이너의 하단부에 위치한 테이블 디자이너 버튼을 클릭하여 테이블

디자이너 에디터로 전환해야 합니다(그림 13-18).

253 / 318

Page 254: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

그림 13-18 디자이너 버튼

테이블 컴포넌트의 복잡성 때문에, 디자이너에서는 테이블 레이아웃을 만들어 주는 별도의 디자이너를 제공

하며, 크로스탭 요소와 유사하게 동작합니다.

13.2.4 데이터셋 실행 편집하기

테이블용 데이터셋 실행 설정창은 테이블 요소를 오른쪽 클릭해서 테이블 데이터소스 편집을 선택하면 나

타납니다. 데이터셋 실행 설정창에서는 데이터셋이 데이터를 어떻게 얻는지를 지정합니다. 테이블을 처음 만

들때 선택한 데이터셋을 사용하여 디자이너에서 자동으로 데이터셋 실행을 설정해줍니다(13.2.1 “테이블 만

들기” 참고). 선택한 옵션들은 데이터셋 실행 설정창을 통해 언제든지 변경이 가능합니다(그림 13-19).

설정창에서는 데이터셋 매개변수의 값을 설정해줄 수 있습니다. 매개변수의 사용을 통해 테이블을 채워주는

데이터의 필터링을 동적으로 하는 것이 가능해집니다. 즉, 해당국가에 대한 주문만을 출력해주는 것이 가능

254 / 318

그림 13-19 데이터셋 실행을 위한 데이터소스 설정하기

Page 255: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

해집니다. 테이블을 사용해서 주문의 상세내역을 출력하고자 한다면, orderID를 매개변수에서 넘겨받아 SQL

질의에 사용함으로써 데이터 필터링이 가능하게 됩니다. 테이블 컴포넌트에서 데이터셋 실행을 설정하는 방

법과 데이터셋을 사용하는 방법은 차트, 크로스탭 그리고 리스트 컴포넌트에서와 별반 다른 점이 없습니다.

일반적으로, 서브데이터셋을 사용하여 컨텐츠를 만들때는 테이블 요소에서 사용하게 되는 데이터셋과 데이

터소스(데이터베이스 연결 혹은 보다 고급기술이 적용된 데이터소스나 상관없이 )에 연결시키기 위해 데이

터셋 실행의 설정이 필요합니다. 차트와 크로스탭의 경우와는 다르게, 테이블은 항상 서브데이터셋을 필요로

합니다. 테이블에서는 메인 데이터셋을 사용할 수 없습니다.

13.2.5 컬럼 사용하기

테이블에 컬럼을 추가하려면, 보고서 인스펙터에서 노드를 선택하거나 테이블 디자이너 뷰에서 어떠한 요소

도 포함하지 않은 영역내에서 간단하게 오른쪽 클릭하여 처음에 컬럼추가나 끝에 컬럼추가 메뉴를 선택합

니다.

기본적으로 디자이너에서는 컬럼이 추가될 때 다음과 같은 셀들을 포함시키게 됩니다: 반복, 테이블 헤더와

풋터, 컬럼 헤더와 풋터. 다른 셀들은 정의하지 않습니다. 마치 투명한 셀처럼 존재하게 되며 섹션내에 어떠

한 셀도 포함되어 있지 않다면 보여지지도 않을 것 입니다. 셀은 포맷팅 속성이 없지만, 스타일을 사용하여

룩앤필을 지정해줄 수는 있습니다(새로운 컬럼을 생성할 때, 각 셀에 적절한 스타일을 지정해주는 것이 좋은

연습방법 입니다). 이를 위해서는 셀 하나하나를 선택하여 속성쉬트를 통해 스타일을 지정합니다.

테이블에 새로운 컬럼 그룹을 추가할 경우에는 디자이너가 테이블 마지막에 새로운 컬럼 그룹을 만듭니다.

그룹은 두개의 컬럼과 모든 그룹 셀 헤더를 갖도록 만들어집니다. 컬럼은 룰러에서 보라색 바로 보여지는 부

분을 끌어서 움직일 수 있습니다(그림 13-20).

컬럼은 그룹의 안쪽이나 바깥쪽 어느 위치에라도 끌어다 놓을 수 있습니다. 만일 컬럼 그룹이 선택되었다면,

255 / 318

그림 13-20 컬럼 끌어놓기(드래그)

Page 256: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

끌어다 놓기는 전체 그룹을 마치 단일의 컬럼처럼 다루게 됩니다. 컬럼이 그룹내에 유일한 컬럼이라면, 부모

그룹의 바깥쪽으로 끌어다 놓을 경우, 디자이너는 그림 13-21와 같은 메시지를 보여주게 됩니다.

이 메시지는 사용자에게 현재 움직이는 컬럼이 컬럼 그룹내의 유일한 컬럼이기 때문에 컬럼을 이동한 후에

는 더이상 컬럼 그룹에 어떠한 컬럼도 없기 때문에 없어지게 된다는 것을 경고하는 것입니다. 보고서 인스펙

터내에서 컬럼을 표시하는 노드를 선택하여 동일한 섹션내의 새로운 위치로 끌어다 놓을 경우 동일한 동작

을 할 수 있습니다. 컬럼을 제거하려면, 컬럼의 셀을 선택(인스펙터에서는 컬럼 노드를 선택)하고 오른쪽 클

릭해서 보여지는 컬럼삭제 메뉴항목을 선택하면 됩니다.

13.3 바코드

보고서에서 바코드의 출력은 두 개의 오픈소스 라이브러리를 사용합니다: Barbecue 와 Barcode4J. 보고서 내

에 바코드 요소를 삽입하게 되면, 사용자에게 어떤 라이브러리를 사용할지 묻습니다. 두 라이브러리 모두 다

양한 바코드 타입들을 지원하지만, 크게 세가지 옵션 설정에 차이가 납니다. 이에 대한 사항은 나중에 살펴

보기로 하겠습니다. 어떤 라이브러리를 선택하느냐에 대한 판단 기준은 다른 요소들에 영향을 받습니다. 어

플리케이션에서 이미 특정 라이브러리를 사용하고 있다면, 디자이너는 이미 사용하는 라이브러리를 보고서

에서 이용할 것입니다. 다음 표에서는 두 라이브러리에서 구현하고 있는 바코드의 타입을 나열하였습니다.

Barbecue Barcode Component Barcode4J Barcode Component

2 of 7 Codabar

3 of 9 Code39

Bookland Code128

Codabar DataMatrix

Code128 EAN128

Code128 A EAN13

Code128 B EAN8

Code128 C Royal Mail Customer

Code39 USPS Intelligent Mail

256 / 318

그림 13-21 컬럼 그룹 삭제

Page 257: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

Code39 (Extended) Interleaves 2 of 5

EAN128 UPCA

EAN13 PostNet

Global Trade Item Number PDF417

Interleaves 2 of 5

Monarch

NW7

PDF417

PostNet

Random Weight UPCA

SCC14 Shipping Code

Shipment Identification Number

SSCC18

Std2of5

UCC128

UPCA

USD3

USD4

USPS

13.3.1 바코드 사용하기

바코드를 생성하려면, 팔렛트에서 바코드 요소를 보고서 밴드쪽에 끌어다 놓습니다(그림 13-22). 바코드를 위

치시키는 밴드의 제한은 없습니다.

바코드 요소를 끌어놓게 되면, 바코드 선택창이 나타납니다. 여기서 사용할 바코드의 타입과 구현 라이브러

리를 선택할 수 있습니다(그림 13-23).

257 / 318

그림 13-22 보고서 팔렛트내의 바코드 요소

Page 258: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

바코드 타입을 선택하려면, Barbecue 사용하기 혹은 Barcode4J 사용하기 버튼을 선택하거나 더블클릭 합니

다. 바코드 속성은 속성 쉬트에 있습니다(그림 13-24). 이 속성쉬트에는 요소의 공통 속성(위치와 크기등과

같은)과 바코드 구현 방식에 따라 고유한 특성들의 셋트를 포함하고 있습니다.

13.3.2 Barbecue 컴포넌트

바코드 컴포넌트는 다음과 같은 속성들을 갖고 있습니다:

타입 바코드 타입. 바코드 선택기에서 바코드의 타입을 선택했더라도 이 속성을 변

경하면 언제든지 바코드의 타입을 변경할 수 있습니다.

코드 표현식 바코드의 값을 지정하기 위해 사용하는 표현식. 문자열이지만, 일부 바코드 타

입에서는 UTF8 캐릭터들을 사용할 수 없거나 숫자만을 사용할 수 있거나 제공

258 / 318

그림 13-23 바코드 선택기

그림 13-24 Barbecue 바코드의 속성

Page 259: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

하는 값이 일정한 길이어야 합니다.

처리시점 표현식을 처리해야 하는 시점을 지정

Evaluation Group처리시점을 “Group”으로 설정한 경우, 처리 기준이 되는 그룹을 지정

Bar Width바코드 내의 바의 너비

Bar Height바코드 내의 바의 높이

텍스트 표시 이 옵션을 체크하면, 바코드 위에 코드 표현식 값을 문자열로 출력합니다.

App ID 표현식 어플리케이션 ID를 지정합니다. 이 값은 일부 바코드 타입에서만 사용됩니다.

13.3.3 Barcode4J 컴포넌트

Barcode4J 라이브러리는 Barbecue에 비해서 적은 수의 타입만을 제공합니다만, 보다 풍부한 옵션들을 설정할

수 있습니다. 일부 속성들은 특정 바코드 타입에서만 유효합니다(그림 13-25).

Barcode4J를 사용하게 된다면, 바코드 타입은 반드시 바코드 선택기를 통해서만 선택되어야 합니다. Barbecue

의 경우처럼 타입 속성을 지원하지 않기 때문입니다. Barcode4J 속성은 다음과 같습니다:

코드 표현식 바코드의 값을 지정하기 위해 사용하는 표현식. 문자열이지만 일부 바코드 타입은 모든 UTF-8

캐릭터를 사용할 수 없거나 숫자만을 사용해야 하거나 고정폭 문자열이 들어가야 합니다.

처리시점 표현식을 처리해야 하는 시점을 지정

Evaluation Group 처리시점을 “Group”으로 설정한 경우, 처리 기준이 되는 그룹을 지정

패턴 표현식 이 표션식은 사람이 바코드의 값을 보다 쉽게 읽을 수 있도록 포맷하는 방식을 지정합니다. 특

히 긴 숫자의 경우 유용합니다. 이 패턴은 인터리브 2 of 5, Code 39, Code 128 및 Codebar 타입에

서만 사용됩니다. 패턴은 바코드 값의 한 개의 캐릭터 위치표식을 밑줄 “_” 캐릭터로 표현하는

것입니다. 역슬래쉬는 이스케이프 캐릭터이므로 밑줄을 출력하고자 할 경우에 사용합니다. 즉 “

\_”를 사용하면 “_”가 출력됩니다. 더블역슬래쉬를 사용하면 한 개의 역슬래쉬가 출력됩니다.

다른 모든 캐릭터들은 그대로 출력됩니다. 다음은 “hello ___.___.___” 패턴을 적용한 Code 39 바

코드입니다:

259 / 318

그림 13-25 Barcode4J 바코드 속성

Page 260: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

방향 방향 속성은 바코드의 방향을 설정합니다. 가능한 값으로는 : 없음 (기본값), 왼쪽, 오른쪽 및 위

아래 바꿈이 있습니다.

텍스트 위치 텍스트를 어디에 위치시킬지 지정하는 속성. 속성에 사용가능한 값은:

Bottom (기본), None (텍스트를 안 보이게 함) 그리고 Top.

모듈 너비 바의 최소 너비를 지정

체크썸 표시 일부 바코드 타입에서는 체크썸 계산을 지원합니다. 이 속성은 체크썸을 보이게 혹은 감추게

합니다.

체크썸 모드 일부 바코드 타입은 체크썸 계산을 지원합니다. 이 경우, 바코드 생성기에 의해 수행되어져야

하는 액션을 지정할 수 있습니다. 가능한 액션은 다음과 같습니다:

• add. 체크썸은 자동으로 바코드 값에 추가됩니다.

• Check. 이미 바코드 값내에 존재해야 하는 체크썸은 바코드가 생성될 때 검증되게 됩

니다.

• ignore. 어떠한 액션도 수행하지 않습니다.

• auto. 바코드의 기본 동작을 하도록 합니다.

너비 비율 바의 너비를 보다 넓게하기 위해 지정해주는 너비 배율.

캐릭터간의 갭 너비 단일 캐릭터를 표현해주는 바들을 하나의 그룹으로 처리해서 각 그룹사이의 공간 여백 값.

표시 시작/종료 Code 39 바코드는 바코드의 시작과 끝에 특수 바를 지원합니다. 이 바는 캐릭터 * 입니다. 이 속

성을 통해 시작/종료 바를 보이게 하거나 감출 수 있습니다.

확장 CharSet 활성화 Code39 는 기본적으로 숫자만 출력할 수 있습니다. 이 속성을 true로 설정하면 US-ASCII 7-bit

캐릭터를 사용할 수 있습니다.

모양 이 속성은 데이터매트릭스 바코드에서 사용하며 렌더링하기 위해 심볼을 선택할 수 있게 합니

다. 올수있는 값은:

• force-none. 정사각형 및 사각형 심볼 사용.

• force-square. 정사각형 심볼만 사용.

• force-rectangle. 사각형 심볼만 사용.

Ascender Height 영국 체신청 CBC와 USPS 인텔리전스 메일용으로 사용. 올림바의 높이를 지정할 수 있게 함.

Track Height 영국 체신청 CBC와 USPS 인텔리전스 메일용으로 사용. 트랙바의 높이를 지정할 수 있게 함.

260 / 318

Page 261: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

Short Bar Height POSTNET 바코드의 짧은바의 높이를 설정할 수 있도록 함.

기준선 위치 POSTNET 바코드의 짧은바를 바코드의 하단 혹은 상단을 기준으로 정렬시킬 수 있도록 함.

Min and Max Columns PDF417 바코드에서 바코드를 렌더링할 때 사용하는 컬럼의 최소와 최대 갯수. 허용되는 범위

는 1부터 30까지 임.

Min and Max Rows PDF417 바코드에서 바코드를 렌더링할 때 사용하는 행의 최소와 최대 갯수를 지정. 허용되는

범위는 3부터 90까지 임.

너비 폭 비율 PDF417 바코드에서 바코드 심볼의 비율을 지정할 수 있게 함.

오류 정정 레벨 PDF417 바코드에서 오류 정정 레벨을 지정함. 가능한 값은 0부터 8 사이.

261 / 318

Page 262: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

14 장. 서브데이터셋

보고서 생성과정중 데이터 채우기는 단일 데이터소스, 즉, 질의나 자바빈 컬렉션 또는 XML 파일을 기반으로

합니다. 차트나 크로스탭을 구현해야 하는 보고서의 경우에는 종종 한 개의 데이터소스로는 부족할 경우가

발생되므로 별도의 질의문을 사용하여 데이터를 가져오거나 또 다른 데이터셋을 사용해서 하나의 보고서내

에 여러 데이터셋 객체를 사용하게 함으로써 이 문제를 해결할 수 있습니다. 같은 맥락에서 보면, 보고서내

에서 서브데이터셋을 사용하여 별도의 레코드를 제공하는 방법이 있습니다. 즉, 동일한 데이터 커넥션을 사

용하여 별개의 질의를 수행하도록 하는 방식입니다. 차트, 크로스탭 및 리스트 요소를 채울때 서브데이터셋

을 사용할 수 있으며 더 나아가 여러분이 직접 커스텀 컴포넌트를 만들어서 사용할 수 있는 방법도 제공되

고 있습니다.

여러분은 보고서내에 갯수의 제한없이 서브데이터셋을 사용할 수 있습니다. 각각의 서브데이터셋은 각각의

필드, 변수 및 매개변수와 필요하다면 실행할 질의를 가집니다. 데이터셋 레코드들은 부모 보고서에서 처럼

한 개 이상의 그룹으로 묶을 수 있습니다. 이 그룹들은 서브데이터셋 변수에서 사용됩니다.

서브데이터셋은 데이터셋 실행으로 요소에 연결되어 집니다. 데이터셋 실행 설정에서는 서브데이터셋이 데

이터를 가져오고 필터링 할 때 필요한 모든 정보들을 지정하게 되며 요소를 채우기 위해 각 행을 처리합니

다. 이번 장은 다음과 같은 섹션들로 구성됩니다:

• 서브데이터셋 만들기

• 데이터셋 실행 만들기

• 예제 서브데이터셋을 사용하기

14.1 서브데이터셋 만들기

서브데이터셋을 새로 만들려면, 인스펙터에서 루트 노드를 오른쪽 클릭한 후 데이터셋 추가 메뉴를 선택합

니다(그림 14-1).

262 / 318

그림 14-1 새로운 서브데이터셋 만들기

Page 263: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

그러면, 인스펙터내에는 새로 추가된 서브데이터셋 노드가 나타납니다(그림 14-2).

그림 14-2 보고서 인스펙터에서의 새로 추가된 서브데이터셋 노드

이 노드의 속성 쉬트에서는 모든 서브데이터셋의 상세한 설정이 가능합니다(그림 14-3). 데이터셋의 이름은

보고서 내에서 유일해야만 합니다.

그림 14-3 서브데이터셋 속성

보고서에서는 부모 보고서와 유사하게 서브데이터셋의 레코드들에 대한 특수한 계산을 수행하는 스크립틀

릿을 사용할 수 있게 지원하고 있습니다. 새로운 서브데이터셋을 만들때 여기에 사용할 스크립틀릿 클래스

의 이름도 지정해줄 수 있습니다. 또한 데이터셋에서 사용할 리소스번들의 이름도 지정할 수 있고 키를 찾을

수 없을 경우에 대한 적절한 정책도 설정할 수 있습니다.

디자이너에서는 질의를 편집할 수 있고 질의 설정창을 통해 서브데이터셋에 대한 정렬과 필터링 옵션도 편

집됩니다. 이 설정창을 열려면, 인스펙터에서 서브데이터셋 노드를 선택한 후, 질의문 편집 메뉴를 클릭합니

다(그림 14-4).

263 / 318

Page 264: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

그림 14-4 서브데이터셋 컨텍스트 메뉴 – 질의문 편집

서브데이터셋의 필드, 변수, 매개변수 및 그룹은 인스펙터에서 직접 관리할 수 있습니다(그림 14-5).

그림 14-5 서브데이터셋 컨텐츠 트리

질의 설정창에서는 부모 보고서에서 SQL 질의로부터 필드를 가져왔던 것처럼 동일한 방법으로 서브데이터

셋의 필드를 자동으로 등록할 수 있도록 합니다. 데이터셋의 컨텍스트 내에서 그룹들은 그룹핑된 레코드에

만 사용되고, 보고서에서 별도로 분리된 부분에 연결되지 않습니다. 우선적으로 데이터셋 그룹은 변수 계산

에 연결되어 사용됩니다.

14.2 데이터셋 실행 만들기

앞에서도 언급했듯이, 서브데이터셋은 차트, 크로스탭 및 리스트 요소에 사용할 수 있습니다. 서브데이터셋

에 데이터를 제공하려면, 서브데이터셋의 SQL 질의를 실행할 때 접속할 JDBC 연결이나 서브데이터셋 매개

변수의 값을 어떻게 설정하는지와 같은 추가적인 정보가 필요합니다. 이 모든 정보들은 데이터셋 실행 설정

을 사용하여 제공합니다.

264 / 318

Page 265: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

그림 14-6 에서는 차트용 데이터셋 실행 설정창을 볼 수 있습니다. 데이터셋 실행 설정은 서브리포트 요소를

설정할 때 사용한 것과 유사한 방식입니다. 매개변수에 대한 값을 설정해야 하며 데이터를 가져오기 위해 사

용하는 연결을 지정하기 때문에 서브리포트 자체를 서브데이터셋처럼 볼 수 있습니다. 여러분은 부모 보고

서의 객체(필드, 변수 및 매개변수)를 포함하는 표현식을 사용하여 서브데이터셋 매개변수의 값을 설정할 수

있으며, 런타임 시점에서 서브데이터셋 매개변수에 대한 값을 설정하기 위해 매개변수 맵을 정의하고 연결

이나 서브데이터셋에서 사용하게 될 데이터소스를 정의할 수 있습니다.

14.3 예제 서브데이터셋 살펴보기

여기서는 차트에 서브데이터셋을 사용하여 데이터를 채우는 방법을 단계별로 예제를 사용하여 보여드리게

됩니다:

1. 간단한 SQL 질의를 사용하여 기본적인 보고서를 만듭니다: (select count(*) as tot_orders from orders)

만들어진 메인 보고서는 주문 총 수량을 포함하는 한 개의 레코드만을 위치시키게 합니다(그림 14-7).

265 / 318

그림 14-6 차트를 위한 데이터셋 실행 정의

Page 266: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

그림 14-7 초기 레이아웃

2. 이번 장에서 설명했던 것 처럼 서브데이터셋을 만듭니다(14.1 서브데이터셋 만들기). 서브데이터셋

의 질의를 다음과 같이 설정합니다:select SHIPCOUNTRY, COUNT(*) country_orders from ORDERS group by SHIPCOUNTRY

서브데이터셋에는 필드들이 등록됩니다(그림 14-8).

그림 14-8 차트를 채우는 서브데이터셋

3. 이제 타이틀밴드 내에 차트 요소를 만듭니다. 차트는 3D 파이차트로 합니다(그림 14-9). 차트 요소를

선택하여 오른쪽 클릭하여 차트 데이터 메뉴항목을 선택하여 차트 설정창을 엽니다.

266 / 318

Page 267: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

4. 데이터셋 실행 섹션에서 우리가 만든 데이터셋을 선택합니다.

5. 커넥션/데이터소스 표현식 탭을 클릭하고 커넥션 표현식 사용을 선택합니다. 이 예제에서 우리는 부

모 보고서에서 사용하는 데이터베이스 연결을 사용할 것 입니다. 커넥션 표현식 사용을 선택함으로

써 표현식에는 자동으로 현재의 연결을 포함하는 $P{REPORT_CONNECTION}이 지정됩니다. 다른

타입의 연결을 사용하고자 한다면, 연결이나 데이터소스를 지정할 때 사용하는 표현식에 대해 자세

하게 다룬 10장을 참고하십시오.

6. 표현식 컨텍스트가 필드, 매개변수 및 값을 데이터셋 실행 설정 이후에 갱신되도록 하려면 설정창을

닫아서 변경 사항을 갱신시켜야만 하고 다시 엽니다. 그러면 서브데이터셋 필드를 편집할 수 있게

됩니다(그림 14-10).

267 / 318

그림 14-10 표현식 편집기에서 서브데이터셋 필드

그림 14-9 서브데이터셋을 사용하여 만들어진 차트

Page 268: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

7. 그림 14-11에서 보여지는 것 처럼 차트 데이터셋 표현식을 지정합니다(표현식은 차트를 채우는데 사

용됩니다).

차트, 크로스탭 또는 리스트 요소처럼 서브데이터셋을 사용하는 요소에서는 부모 보고서의 데이터

셋으로부터 나오는 객체들을 사용할 수 없다는 것에 유의해야 합니다. 이 경우에는 오로지 서브데이

터셋 객체만을 사용할 수 있습니다.

268 / 318

그림 14-11 파이차트의 데이터셋 설정

Page 269: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

8. 여기까지 하셨다면, 이제 보고서를 실행시킵니다. 지금까지 설명했던 사항을 그대로 따라 하셨다면,

그림 14-12와 같은 모습의 보고서를 볼 수 있게 됩니다.

269 / 318

그림 14-12 서브데이터셋을 사용한 차트

Page 270: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

15 장. 크로스탭

크로스탭은 디자인 시점에서는 결정되지 않은 열과 행(변수)의 갯수로 구성되는 테이블로써 년도(열)에 따

라 제품의 판매액(행)을 보여주는 테이블 형태가 대표적인 예라 할 수 있습니다. 이 테이블에서는 변수의 분

포된 수만큼을 보여주고 있습니다:

보고서에서 크로스탭을 구현함으로써 열과 행의 그룹 묶기, 합계 계산과 각 셀에 대한 개별적인 포맷 설정도

가능합니다. 각각의 행이나 열 그룹에 대해서는 디테일 행/열과 선택적 사용이 가능한 합계 행/열을 갖습니

다. 크로스탭을 채울 데이터는 메인 보고서 데이터셋이나 서브데이터셋 모두 가능합니다. 디자이너에서는 크

로스탭을 보다 쉽게 사용할 수 있도록 도우미를 제공하고 있습니다. 이번 장은 다음 섹션들로 구성됩니다:

• 크로스탭 도우미 사용하기

• 열, 행 그리고 측정 사용하기

• 크로스탭 요소 속성 변경

• 크로스탭 매개변수

• 크로스탭 데이터 사용하기

• 크로스탭 합계 변수 사용하기

15.1 크로스탭 도우미 사용하기

보고서에 크로스탭 요소를 추가할 경우, 디자이너는 자동으로 크로스탭 도우미를 열게됩니다. 크로스탭이 어

떻게 작동하는지에 대한 이해를 돕기 위해 여기서는 크로스탭 도우미를 사용하여 만드는 과정을 살펴볼 것

입니다.

1. 다음 질의문을 포함하는 빈 보고서를 만듭니다: select * from orders

앞으로 보고서의 마지막 부분인 요약밴드에 크로스탭을 포함시킬 것 입니다.

2. 크로스탭 툴을 요약밴드에 끌어다 놓습니다. 이제 크로스탭 도우미의 첫 번째 화면이 나타납니다.

270 / 318

Page 271: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

3. 크로스탭을 채울 데이터셋을 선택합니다. 메인 보고서의 데이터셋을 지정합니다(그림 15-1).

4. 다음 버튼을 눌러 다음 단계를 진행합니다.

5. 두 번째 화면에서 여러분은 최소한 한 개의 행 그룹을 정의해야만 합니다. 이 예제의 목적상 그림

15-2에서 보이는 것처럼 SHIPCOUNTRY에 대한 모든 레코드를 그룹으로 지정하겠습니다.

271 / 318

그림 15-1 크로스탭 도우미의 첫 번째 단계

그림 15-2 두 번째 단계 : 행 그룹 정의

Page 272: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

SHIPCOUNTRY로 그룹핑을 한 결과는 크로스탭의 각 행에 나라들을 기준으로 보여주게 합니다. 메

인 보고서의 경우와는 다르게 여러분이 직접 데이터를 정렬해서 채우는 과정을 보다 빠르게 할 수

있도록 하는 기능을 사용하지 못해도 보고서의 데이터를 정렬시킵니다.

크로스탭 도우미를 사용할 경우, 한 개나 두 개의 행과 열 그룹만을 정의할 수 있는 제약이 따릅니다. 보

고서 인스펙터에서는 여러분이 원하는 갯수만큼 행과 열 그룹을 정의해줄 수 있습니다. 이에 대한 상세한 내용

은 “행,열 그리고 측정 사용하기” 섹션에서 다루겠습니다.

6. 다음 버튼을 눌러 세 번째 단계를 진행합니다(그림 15-3).

SHIPPEDDATE 필드로 데이터를 그룹핑하여 년도별 순서로 그룹이 되게 합니다. 이를 위해

timestamp 형식의 데이터에서 년도를 가져오는 함수를 사용할 것 입니다. 그림 15-3에서 처럼 시간에

관련된 필드(timestamp, date등의 타입)를 다루게 될 때는 시간(년도, 월, 주 혹은 날짜등)과 관련된 집

합함수를 사용하거나 이 값을 평범한 값으로 처리하게 하여 동일한 값만을 갖는 그룹 레코드로 처리

할 수 있는 Unique 집합함수를 사용할 수 있습니다.

7. 다음 버튼을 눌러 다음 단계를 진행합니다.

8. 이제 디테일 데이터를 정의할 시점입니다. 일반적으로 디테일(또는 측정) 데이터는 해당 년도에 대한

국가별 주문수량이나 동일한 조합(년도별 국가)에 대한 운송료 합계와 같은 집계함수의 결과값이 됩

니다. 측정 콤보박스에서 ORDERID 필드를, 함수 콤보박스에서 Count 를 지정하여 주문의 갯수를 출

력하게 합니다(그림 15-4).

272 / 318

그림 15-3 열 그룹 정의

Page 273: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

9. 다음 버튼을 눌러 마지막 단계로 넘어갑니다.

10. 이 단계에서는 크로스탭의 레이아웃에 대한 옵션들을 설정해 주게 됩니다. 그리드선을 보여줄지, 합

계, 헤더와 디테일 셀간의 쉬운 구별을 위해서 배경색을 다르게 지정해주거나 열과 행의 총합계를

보여줄지도 설정하게 됩니다. 예제에서는 모든 체크박스 옵션들을 그림 15-5에서 보이는 것처럼 체

크하고, 마침 버튼을 클릭합니다.

273 / 318

그림 15-4 측정 정의하기

Page 274: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

보고서에 크로스탭을 추가할 때 디자이너는 디자인 윈도우에 이에 대응하는 탭을 만들게 됩니다. 이 탭이 바

로 크로스탭 요소를 위한 크로스탭 디자이너입니다.

그림 15-6 인스펙터에서의 크로스탭 트리 상세 뷰

보고서 인스펙터에서는 크로스탭 요소를 계층 구조적으로 보여주며, 매개변수와 행과 열그룹, 측정 및 셀도

모두 보여줍니다(그림 15-6).

지금까지의 과정을 통해 만들어진 보고서를 실행시키면, 그림 15-7에서 보여지는 것과 유사한 결과를 얻을

수 있게됩니다. 마지막 열에는 각 행에서 모든 열의 총합계가 출력됩니다. 마지막 행에는 각 열에 대한 모든

274 / 318

그림 15-5 크로스탭 옵션 설정

Page 275: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

행의 총 합계가 출력됩니다. 마지막으로, 최종 셀(아랫쪽 우측 모서리)에는 모든 주문에 대한 총 합계(830 값

이)가 출력됩니다.

275 / 318

그림 15-7 첫 번째 크로스탭의 결과

Page 276: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

15.2 행과 열 그리고 측정 사용하기

크로스탭에는 최소한 한개의 행그룹과 한개의 열그룹이 존재해야만 합니다. 행과 열은 이 그룹들에 의해 정

의됩니다. 각 행과 열 그룹은 집계가 가능합니다. 다음 그림은 한개의 행그룹과 한개의 열그룹을 갖고 그룹

들에 대한 집계를 갖는 기본적인 크로스탭 입니다.

여기서 행 그룹을 하나 추가하게 되면, 디자이너에서는 추가되는 행에 대한 헤더와 누계에 대한 행을 추가시

킵니다. 크로스탭은 다음과 같은 모양이 됩니다:

여기에 열그룹을 하나 더 추가하게 되면, 앞에서와 유사하게 새로운 열그룹에 대한 헤더와 누계가 추가됩니

다:

276 / 318

Page 277: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

행과 열그룹은 인스펙터창에서 나타납니다. 행그룹을 추가하려면 그림 15-8처럼 행 노드를 오른쪽 클릭하여

행 그룹 추가 메뉴를 선택합니다.

그림 15-8 행그룹 추가하기

새로 추가한 행그룹과 이에 관련된 크로스탭 디자이너에서 만든 셀들이 인스펙터창에 나타납니다. 여러분은

행을 그룹핑하는데 사용된 표현식을 설정해줄 필요가 있습니다. 가령, 나라별 도시를 보여주는 새로운 행그

룹을 추가할 수 있습니다. 이 경우, 올바른 표현식은 필드 SHIPCITY가 될 것입니다(표현식은 $F{SHIPCITY}

가 될 것입니다). 표현식은 행그룹 속성에 설정해 주어야만 합니다.

그림 15-9 새로 행을 추가한 후의 레이아웃

표현식은 각각의 새로운 그룹에 대해 설정해 주어야만 하는 유일한 정보입니다. 다른 크로스탭 설정들에는

다음과 같은 것들이 있습니다:

총합계 위치 누계를 보여줄 행의 위치를 정의

정렬 그룹내의 값들 정렬 순서(오름차순 혹은 내림차순)

비교자 표현식 값을 정렬할 때 사용해야만 하는 java.util.Comparator의 인스턴스를 리턴해줍니다.

디자이너를 사용하여 셀의 모서리를 끌어서 직접 행과 열의 크기를 조정해줄 수 있습니다. 각 셀의 컨텐츠는

셀안에 모두 들어가야만 합니다.

277 / 318

Page 278: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

크로스탭에 행이나 열을 추가할 경우, 디자이너는 이에 대한 표현식 값을 참조하는 특별한 변수를 만들게 됩

니다. 이 변수는 새로운 그룹의 이름과 동일한 이름을 갖습니다. 셀내의 요소에 대한 텍스트필드 표현식을

편집할 경우, 표현식 에디터가 나타납니다. 이 에디터에서는 크로스탭의 셀에서 표시해줄 수 있는 모든 객체

들의 목록을 보여주게 됩니다(그림 15-10).

새로운 그룹을 만들게 되면, 디자이너는 그룹에 대한 새로운 헤더 셀을 만듭니다. 디자이너는 그룹의 값(그

룹의 이름과 동일한 이름을 갖는 내장 변수를 사용하여)을 출력해주는 새 텍스트필드를 사용하며 크로스탭

내에서 사용가능한 첫 측정값을 텍스트필드에 표시하게 하여 새로운 셀을 채웁니다. 어떠한 추가적인 셀 표

시 옵션도 적용하지 않았습니다. 특히, 디자이너는 새 셀에 대한 경계선을 지정하지 않은 상태입니다. 총합계

위치를 None(일반적으로 끝쪽)에서 Start 또는 End로 설정하게 되면, 디자이너는 누계를 갖는 다른 셀을 삽입

합니다. 이 셀들은 빈 상태로 만들어지기 때문에 다시 또 여러분이 각 셀에 텍스트필드 요소를 끌어다 놓아

주어야만 하며, 보여줄 데이터에 적합한 표현식을 설정해 주어야 합니다(그림 15-11).

그림 15-11 빈 행 합계 셀

278 / 318

그림 15-10 크로스탭 텍스트필드 표현식에서 사용할 수 있는 객체들

Page 279: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

그룹의 순서는 인스펙터창에서 그룹을 끌어다 원하는 순서에 놓음으로써 변경이 가능합니다. 크로스탭 레이

아웃은 그룹의 순서 설정에 매우 밀접하게 연결되어 있다는 것에 주의하셔야 합니다.

15.2.1 셀 수정하기

크로스탭은 헤더셀, 합계 셀, 디테일 셀을 갖습니다. 행과 열사이의 교차지점은 셀로 정의합니다. 셀은 텍스트

필드, 정적 텍스트, 사각형 및 이미지와 같은 일련의 요소들을 포함할 수 있지만, 서브리포트, 차트 혹은 또

다른 크로스탭은 포함할 수 없습니다. 그림 15-11은 색들로 구별하게 칠한 셀들과 여러 텍스트필드로 구성된

크로스탭입니다.

여러분은 각각의 셀을 오른쪽 클릭하여 패딩과 경계선 메뉴를 선택함으로써 선택한 셀의 경계 설정을 수정

할 수 있습니다(그림 15-12).

그림 15-12 셀 경계선 수정하기

셀 배경색과 스타일은 인스펙터창에서 셀 노드를 선택하여 속성 쉬트에서 지정할 수 있습니다(그림 15-13).

그림 15-13 셀 배경색과 스타일

15.2.2 측정에 대한 설명

크로스탭에서 측정이란 변수와 유사한 객체입니다. 측정은 각각의 행그룹과 열그룹의 교차점에 위치하는 셀

상의 값에 대해 지정한 방식으로 계산된 결과를 출력하게 합니다. 표현식에 따라 출력 속성과 텍스트필드 표

현식 속성과 같은 크로스탭 내의 요소에 대한 표현식은 오직 측정값만을 포함할 수 있습니다. 이러한 맥락에

서 보면, 필드, 변수 혹은 매개변수를 직접 사용할 수 없게 되며 항상 여러분은 측정만을 사용해야 합니다.

측정을 만들려면, 인스펙터창에서 측정노드를 오른쪽 클릭하여 측정추가를 선택합니다(그림 15-14). 디자이

279 / 318

Page 280: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

너는 인스펙터창에 새로운 측정 노드를 만듭니다.

그림 15-14 측정 추가하기

새로운 그룹을 만드는 시점에서 여러분은 측정에 대한 표현식을 정의해줄 필요가 있습니다. 가장 쉬운 방법

은 텍스트필드를 사용하는 것입니다. 셀 안에 텍스트필드 요소를 끌어다 놓은 후, 텍스트필드 표현식

($V{Average_freight}와 같은 측정 이름을 사용하여)과 측정 타입과 일치하는 텍스트필드에 대한 표현식 클

래스를 설정합니다.

측정을 설정할 때 사용되는 옵션들에는 이름, 클래스 및 표현식 이외에도 계산 타입이 있습니다. 사용가능한

계산타입 중에서 요구조건을 충족시키는 것이 없다면, 커스텀 Incrementer 클래스의 인스턴스를 리턴해주는

팩토리 클래스를 사용하게 됩니다. 팩토리 클래스는 com.cabsoft.rx.engine.fil.RXIncrementerFactory를 구현해야

합니다.

그림 15-15 측정 속성들

총 합계에 대한 비율을 측정값으로 보여주고자 한다면, 속성 백분률 타입을 Grand Total로 설정합니다. 마지

막으로, 비율 계산을 수행하는 커스텀 계산기 클래스를 지정할 수 있습니다. 이 클래스는 반드시

com.cabsoft.rx.crosstabs.fill.JRPercentageCalculator로 구현되어야 합니다.

15.3 크로스탭 요소 속성 수정하기

속성 쉬트에서 크로스탭 속성을 보기위해서는, 인스펙터 창에서 크로스탭 노드를 선택합니다(그림 15-16).

280 / 318

Page 281: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

그림 15-16 크로스탭 속성들

다음은 속성 쉬트에서 볼 수 있는 크로스탭 동작에 관련된 옵션들입니다:

반복 컬럼 헤더 이 옵션을 선택하면, 크로스탭이 한 페이지 이상에 걸쳐서 출력될 때 매 페이지별

로 열 헤더를 출력합니다.

반복 행 헤더 이 옵션을 선택하면, 크로스탭이 한 페이지 이상에 걸쳐서 출력될 때 매 페이지별

로 행 헤더를 출력합니다.

컬럼 나눔 위치 크로스탭이 페이지의 너비를 초과할 경우, 크로스탭을 두 조각으로 나누어 만드는

사이의 여백 크기를 지정합니다(그림 15-17).

그림 15-17 컬럼 나눔 위치

15.4 크로스탭 매개변수

크로스탭 매개변수는 크로스탭내에 출력되는 요소의 표현식 내에서 사용되게 됩니다. 매개변수는 인스펙터

281 / 318

Page 282: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

창을 통해 정의되고 관리됩니다(그림 15-18).

그림 15-18 크로스탭 매개변수

매개변수를 추가하려면, 인스펙터의 크로스탭 요소내에서 매개변수 노드를 오른쪽 클릭한 후 크로스탭 매개

변수 추가를 선택합니다. 크로스탭 매개변수를 위한 매개변수 표현식은 오직 메인 보고서상의 객체만 사용

할 수 있습니다. 따라서, 크로스탭에 제공하기 위해 사용하는 서브데이터셋의 객체는 사용할 수 없습니다. 또

한, 매개변수들은 크로스탭 요소내에서 사용되도록 고려되어야 합니다. 크로스탭 매개변수는 크로스탭 컨텍

스트내에서 질의를 필터링하고 값을 계산하는 데이터셋 매개변수에서 사용하는 표현식과 동일하지 않습니

다.

여러분은 런타임시 정의한 크로스탭 매개변수의 값 설정을 위해 맵을 사용할 수 있습니다. 이 경우에는 크로

스탭 속성내에 올바른 매개변수 맵 표현식을 제공해줄 필요가 있습니다.

15.5 크로스탭 데이터 사용하기

앞 섹션에서 언급했듯이, 크로스탭에 채우게 되는 데이터는 메인 보고서나 서브데이터셋 모두 가능합니다.

서브데이터셋의 경우, 크로스탭 데이터창에서 데이터셋 실행을 지정해주어야만 합니다. 크로스탭 데이터창

은 인스펙터창의 크로스탭 노드를 오른쪽 클릭한 후(또는 디자이너 화면에서 크로스탭 요소를 선택해서 오

른쪽 클릭 후), 크로스탭 데이터 메뉴를 선택하면 나타나게 됩니다(그림 15-19).

282 / 318

Page 283: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

크로스탭 데이터창의 인터페이스는 차트를 위해 데이터 설정할 때 사용하던것과 유사합니다. 크로스탭에 데

이터를 공급하는 메커니즘 또한 매우 유사합니다.

데이터가 미리 정렬된 경우라면, 데이터 사전 정렬 체크박스를 선택하여 채우는 과정의 속도를 높일 수 있습

니다. 리셋 타입/리셋 그룹과 증가 타입/증가 그룹 옵션을 사용하여 모아진 데이터를 언제 리셋할지와 데이

터셋에 레코드를 추가할 시점을 지정할 수 있습니다.

필터 표현식은 레코드셋에 레코드를 추가할 시점을 결정하는 플래그로써 부울린 값으로 리턴되어야만 합니

다. 빈 문자열인 경우, “모든 레코드를 추가”하라는 의미로 디자이너는 받아들입니다.

데이터셋 실행 속성을 설정하는 방법은 14장에서 자세히 다루고 있습니다.

15.6 크로스탭 합계 변수 사용하기

크로스탭의 합계 변수(그림 15-20)는 내장된 객체로써 크로스탭 텍스트필드 표현식내에 사용하여 서로 다른

집계 수준(즉, 백분율 계산등)에 대한 데이터를 결합시킵니다. 보고서에서는 각각의 측정에 대해 각 행/열 그

룹 합계를 저장한 대응되는 변수를 만듭니다.

283 / 318

그림 15-19 크로스탭 데이터

Page 284: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

그림 15-20 표현식 에디터에서 제안하는 합계 변수들

다음 예제는 년도별로 각 지역으로 발송된 주문의 갯수를 보여주는 간단한 보고서 입니다. 그림 15-21에서

보이는 것처럼 간단한 크로스탭 레이아웃은 그림 15-22와 같은 출력 결과를 생성하게 됩니다.

그림 15-21 간단한 크로스탭 레이아웃

284 / 318

Page 285: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

그림 15-22 간단한 레이아웃 결과

년도당 각 지역내에서 보내온 주문에 대한 백분율을 계산하려면, 다음과 같은 자바 표현식을 갖는 텍스트필

드를 추가합니다: new Double( $V{ORDERIDMeasure}.doubleValue() / $V{ORDERIDMeasure_ORDERDATE_ALL}.doubleValue() )

그루비를 사용할 경우에는 : (double)$V{ORDERIDMeasure} / (double)$V{ORDERIDMeasure_ORDERDATE_ALL}

구현하는 기본 공식은 다음과 같습니다:

(해당 년도 해당 지역의 주문 수) / (이 지역에서의 총 주문 수)

백분율은 부동 소숫점 숫자로 다루어져야만 합니다. ORDERIDMeasure 와 ORDERIDMeasure_ORDERDATE_ALL

객체(Integer 클래스 타입일지라도)에서 배정도 값을 추출한 것도 이러한 이유 때문입니다. 실제로 백분율은

0과 1사이의 숫자에 100을 곱한 결과입니다.

표현식의 결과를 백분율로 표현하려면, 텍스트필드의 패턴 속성을 #,##0.00%로 설정합니다. 그림 15-23에서

는 디자인 윈도우상에서 수정된 크로스탭의 모습을 보여주고 있으며, 이 결과로 만들어진 출력물의 형태는

그림 15-24입니다.

285 / 318

Page 286: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

그림 15-23 측정 셀내에 두 번째 필드를 추가하여 백분율을 보여줌

그림 15-24 백분율을 포함하고 있는 최종 출력 보고서

286 / 318

Page 287: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

16 장. 현지화

현지화란 다양한 문화권에 적용이 가능한 어플리케이션을 만드는 과정입니다. 현지화를 위해 어플리케이션

에서 변경되어야 할 주요사항으로는 사용자 인터페이스(UI)와 출력에서 사용되는 언어입니다. 현지화에서

이 부분은 “지역화”로 부릅니다. 디자이너에서 보고서를 지역화하려면 디자인 시점에서 설정한 모든 정적 텍

스트(라벨과 메시지등)들을 런타임에서 지정한 로케일에 맞춰 모두 변경해야 합니다. 보고서 엔진은 가장 적

합한 번역을 사용하여 텍스트를 출력하게 됩니다. 서로 다른 언어에서 텍스트를 번역하는 것은 “리소스 번들

”이라고 불리는 리소스 파일을 이용하여 가능하게 됩니다. 더 나아가서 이번 장에서는 내장 함수 msg()에 대

해 설명하고 동적으로 만들어진 복잡한 문장을 “지역화”할 수 있게 할지에 대해서 알아보겠습니다.

이번 장은 다음 섹션들로 구성됩니다:

• 리소스 번들 베이스 이름 사용하기

• 지역화된 문자열 가져오기

• 메시지 포맷하기

• 지역화된 보고서 적용시키기

• 특정 로케일과 시간대를 사용한 보고서 생성하기

16.1 리소스 번들 베이스 이름 사용하기

보고서를 현지화하기 위해서는 커스터마이징할 필요가 있는 보고서 디자인에 포함된 보여지는 모든 텍스트

(라벨과 정적인 문자열)들을 찾아야 할 필요가 있습니다. 키(이름)는 모든 텍스트 조각에 연계되며 이 조각들

을 호출할 때 사용합니다. 이 키들과 관련 텍스트 번역들을 언어별로 특별히 만든 파일에 넣어주게 됩니다 .

다음은 지역화를 위해 만들어진 매핑 파일의 예입니다.

Title_GeneralData=일반 데이터

Title_Address=주소

Title_Name=이름

Title_Phone=전화번호

이 정보를 담는 모든 파일들은 반드시 .properties 라는 확장명으로 저장해야 합니다. 효과적인 파일이름(파일

확장자와 언어/국가 코드를 제외한)은 보고서 리소스 번들 베이스 이름으로 표현됩니다. 즉,

i18nReport.properties에서 리소스 번들 베이스 이름은 i18nReport가 됩니다. 여러분이 보고서의 인스턴스를 만

들때면 보고서 엔진에서는 리소스 번들 베이스 이름에 .properties 확장자를 붙인 파일을 클래스 경로내에서

찾게 됩니다. 보고서 엔진에서 해당 파일을 못 찾는다면, 보고서 내에서 지정한 기본 매핑 리소스를 사용하

게 됩니다. 리소스 번들 베이스 이름은 그림 16-1에서 보여지는 보고서 속성 쉬트에서 지정합니다.

287 / 318

Page 288: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

그림 16-1 리소스 번들 베이스 이름 속성

지정된 로케일을 사용하여 보고서를 생성해야 할 필요가 있다면, 보고서 엔진은 리소스 번들 베이스 이름 문

자열로 시작되어 지정한 로케일에 관련된 언어와 국가 코드가 다음에 붙는 파일을 찾습니다. 즉,

i18nReport_ko_KR.properties는 로케일을 한국어로 지정한 경우 출력시킬 문자열을 포함한 리소스 번들 파일

이 됩니다. 반면, i18nReport_en_US.properties는 로케일을 American English4로 번역한 문자열을 포함하게 됩니

다. 따라서, 가장 널리 사용되는 언어로 구성한 모든 문자열을 담는 기본 리소스 파일을 항상 만들어서 다른

언어에서 대체로 사용되도록 하는 것이 중요합니다.

기본 리소스 파일은 리소스 번들 베이스 이름 다음에 언어/국가 코드를 붙이지 않으며, 포함된 값들은 요청

된 로케일에 부합하는 리소스 파일을 찾지못할 경우나 해당 리소스 파일내에서 번역할 문자열에 해당되는

키를 포함하지 않은 경우에만 사용되어집니다.

완전한 리소스 파일이름은 다음과 같이 구성되어 집니다: <리소스 번들 베이스 이름>[_언어코드[_국가코드[_기타코드]]].properties

올바른 파일 이름 사용에 대한 예는 다음과 같습니다: i18nReport_ko_KR_UNIXi18nReport_ko_KRi18nReport_koi18nReport_en_USi18nReport_eni18nReport

“기타코드”(혹은 대체코드)는 일반적으로 보고서에서는 사용하지 않습니다만, 매우 특별한 리소스 파일을 지정하

기 위해 포함됩니다. 대체코드는 언어와 국가코드 다음에 붙여집니다(예제에서는 _UNIX가 뒤에 붙었습니다).

리소스 키를 리소스 번들내에서 못찾게 되면, 어떻게 해야 되는지를 보고서 속성 리소스가 없는 경우의 타입

을 사용하여 지정할 수 있습니다. 가능한 옵션값들은 다음과 같습니다:

널 타입 표현식에 null 값이 사용되어, 결과적으로 “null” 문자열을 출력.

Empty 타입 빈 문자열 사용.

오류 발생 자바 예외를 던져 보고서를 채우는 과정을 중지함.

4 언어코드는 두 개의 소문자로 ISO-639에서 정의되어 있습니다. 이 코드 목록은 다음 사이트에서 확인할 수 있습니다: http://www.loc.gov/standards/iso639-2/php/English_list.php

국가 코드는 두 개의 대문자로 ISO-3166에서 정의되어 있으며, 코드 목록은 다음 사이트에서 확인할 수 있습니다: http://www.iso.org/iso/english_country_names_and_code_elements

288 / 318

Page 289: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

키 타입 키의 이름을 값으로 사용함.

디자이너에서는 보고서의 지역화에 사용되는 리소스 번들 파일을 편집할 수 있는 도구가 내장되어 있습니

다. 새로운 리소스 번들을 만드려면, 그림 16-2와 같이 파일→새로만들기→리소스 번들을 선택합니다.

그림 16-2 새로 리소스번들 만들기

파일 이름과 저장될 위치를 선택합니다. 이제 디자이너에서 파일을 불러오기 합니다(그림 16-3).

그림 16-3 새로운 리소스 번들

289 / 318

Page 290: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

이것은 기본 번들입니다. 새로운 언어를 추가하려 하거나 리소스 번들용 비쥬얼 에디터로 변경하려면, 즐겨

찾기 패널을 사용하여 파일을 가리켜야 합니다. 창→즐겨찾기를 선택하여 즐겨찾기 패널을 여십시오. 그런

후, 리소스 번들 파일 디렉터리를 가리킵니다. 즐겨찾기에 파일 자체가 아닌, 파일을 포함하는 디렉터리를 추

가하는 것이 중요합니다. 그래야만 언어에 해당되는 번들을 볼 수 있습니다(그림 16-4).

그림 16-4 즐겨보기창에서의 리소스 번들

즐겨찾기 팬에서 번들 노드는 몇가지 기능을 갖는 도구를 제공하고 있습니다. 파일 노드에서 오른쪽 클릭하

여 리소스 번들에 대한 편집도구중 하나를 열 수 있습니다:

• 편집. 리소스 번들을 텍스트 파일로 엽니다(그림 16-3)

• 열기. 여러분이 지원할 모든 언어에 대한 번역들을 동시에 볼 수 있도록 하는 비쥬얼 리소스 번들 편

집기를 엽니다(그림 16-5).

290 / 318

Page 291: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

그림 16-5 비쥬얼 번들 에디터

새 언어에 대한 지원을 위해 새로운 로케일을 추가하려면, 리소스 번들 노드에서 오른쪽 클릭 후 추가→로

켈... 항목을 선택합니다. 그림 16-6에서 보여지는 팝업창이 나타납니다. 이 창에서 올바른 언어 사양(언어, 국

가 및 부가적 코드)을 설정할 수 있습니다.

그림 16-6 새 로케일

Ok를 클릭하면, 기본 리소스 파일이 존재하는 디렉터리에 새 파일이 만들어 집니다. 생성되는 파일 이름에는

적절한 지역화 문자가 덧붙여져서 즐겨찾기 패널의 번들노드에 자식노드로 보여지게 됩니다.

291 / 318

Page 292: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

16.2 지역화된 문자열 가져오기

특정 키에 대한 지역화된 문자열을 표현식을 통해 가져오는 방법에는 두 가지가 있습니다:

• 내장된 str("키 이름") 함수 사용

• 지정된 문법 사용 $R{키 이름}

지역화된 문자열을 가져오는 예제 표현식은 다음과 같게 됩니다: $R{hello.world}

보고서 엔진에서는 키이름 hello.world에 관련된 텍스트를 선택된 로케일에 부합되는 번역 문자열로 변환시

키게 됩니다.

16.3 메시지 포맷하기

보고서의 현지화 기능은 자바에서 제공되는 것을 기반으로 하고 있습니다. 가장 유용한 기능중 하나가 바로

msg 함수로써 인수를 사용하여 동적으로 메시지를 만들어 줄 수 있습니다. 실제로 msg 함수는 패턴 문자열

을 사용합니다. 인수로 지정하는 이 패턴은 msg 함수에 매개변수로 넘겨지게 됩니다. 함수의 인자 위치는 중

괄호로 감싼 숫자로 표시합니다. 사용 예는 다음과 같습니다: “보고서는 총 {0} 개의 레코드를 갖습니다.”

여기서 0으로 지정한 곳에서 msg 함수에 넘긴 첫 번째 인수의 값이 위치하게 됩니다. 다음의 표현식은

text.message라는 키에 해당되는 문자열을 패턴으로 사용하여 msg 함수를 호출하게 됩니다: msg($R{text.message}, $P{number})

두 번째 매개변수는 첫 번째 인수를 대체시킬 패턴 문자열 입니다. Text.message의 문자열이 “보고서는 총 {0}

개의 레코드를 갖습니다.” 이고, 보고서 매개변수 숫자의 값이 100이라면, 보고서 엔진은 다음과 같이 해석된 텍

스트 문자열을 출력합니다: “보고서는 총 100 개의 레코드를 갖습니다.”

메시지를 만들어내기 위해 [보고서는 총 ] {0} [개의 레코드를 갖습니다]와 같이 별도로 분리된 문자열로 나

누어 사용하지 않고 패턴을 사용하는 이유는 분리된 문자열로 나누는 방식이 사용될 수 없는 경우가 발생되

기 때문입니다. 지역화 모듈에서는 어떤 언어에서는 문장의 끝에 동사가 나타나야 하므로 모든 언어에 대해

문법적으로 올바른 번역을 만들 수 없습니다.

msg 함수는 다음 세 가지 방법으로 호출할 수 있습니다:

public String msg(String pattern, Object arg0)public String msg(String pattern, Object arg0, Object arg1)public String msg(String pattern, Object arg0, Object arg1, Object arg2)

위에서 보여진 세 가지 호출사이의 차이점은 함수로 넘겨주는 인수의 갯수 뿐입니다.

16.4 지역화된 보고서 적용하기

지역화된 보고서를 적용하려면, 번역된 문자열을 포함하는 모든 .properties 파일들을 클래스경로 내에 위치시

켜야만 합니다.

292 / 318

Page 293: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

보고서 엔진은 ResourceBundle 자바 클래스의 getBundle 메쏘드를 사용하여 리소스 파일을 찾습니다. 이 클래

스가 동작하는 방식에 대한 자세한 정보는 http://download.oracle.com/javase/tutorial/i18n/ 사이트를 방문하십시

오. 이곳에서 자바의 현지화 지원에 대한 주요 개념을 확인할 수 있습니다.

16.5 특정 로케일과 시간대를 사용하여 보고서 생성하기

특정 로케일이나 시간대를 사용하여 보고서를 생성하고 싶다면, 디자이너 옵션창(도구→옵션)을 열고, 선호

하는 로케일과 시간대를 편집과 실행 탭의 실행 옵션에서 지정하면 됩니다(그림 16-7).

그림 16-7 로케일과 시간대 옵션들

293 / 318

Page 294: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

보고서를 실행할 때마다 디자이너의 로그창을 통해 현재 설정된 로케일과 시간대 정보를 확인할 수 있습니

다(그림 16-8).

그림 16-8 실행 로그에는 사용된 로케일과 시간대를 표시됨

294 / 318

Page 295: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

17 장. 스크립틀릿

스크립틀릿이란 보고서 생성과정 중 특별한 로직을 수행할 수 있도록 하기 위해 사용하는 자바 클래스입니

다. 스크립틀릿은 보고서 엔진에서 특정 이벤트(새로운 페이지가 시작된다든지 반복 밴드의 한 행에 대한 처

리가 완료되는 시점)가 발생하면 호출할 수 있는 메쏘드 셋트를 노출합니다.

이번 장에서는 간단한 스크립틀릿을 작성하는 방법을 보여주고 이를 보고서내에서 사용하는 방법까지 다루

게 될 것입니다. 또한 디자이너에서 스크립틀릿을 어떻게 다루어야 하는지와 이 기능을 사용하여 보고서를

배치시키려고 할 때 유용한 방법에 대해서도 살펴보겠습니다.

이번 장은 다음 섹션들로 구성됩니다:

• RXAbstractScriptlet 클래스에 대하여

• 간단한 스크립틀릿 만들기

• 디자이너에서 스크립틀릿 테스트하기

• 디자이너 객체에 접근하기

• 스크립틀릿 디버깅하기

• 스크립틀릿을 사용하는 보고서 배치하기

17.1 RXAbstractScriptlet 클래스에 대하여

스크립틀릿을 구현하려면, com.cabsoft.rx.engine.RXAbstractScriptlet 자바 클래스를 상속해야만 합니다. 이 클

래스는 보고서 생성과정중에 발생하는 이벤트들을 처리할 수 있는 모든 추상 메쏘드들을 노출하며 모든 변

수와 필드 그리고 보고서에 존재하는 매개변수들로 접근할 수 있는 데이터 구조를 제공합니다.

가장 간단한 스크립틀릿 구현은 보고서 엔진에서 직접 제공합니다. 이 클래스는 RXAbstractScriptlet 클래스를

상속받아서 모든 필요한 추상 메쏘드들을 void 함수로 구현한 RXDefaultScriptlet입니다:

코드 예제 17-1 RXDefaultScriptletpackage com.cabsoft.rx.engine;

/**

* @author chaoslab ([email protected])

* @version $Id: RXDefaultScriptlet.java

*/public class RXDefaultScriptlet extends RXAbstractScriptlet {

public RXDefaultScriptlet() {

}

public void beforeReportInit() throws RXScriptletException {

}

295 / 318

Page 296: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

public void afterReportInit() throws RXScriptletException {

}

public void beforePageInit() throws RXScriptletException {

}

public void afterPageInit() throws RXScriptletException {

}

public void beforeColumnInit() throws RXScriptletException {

}

public void afterColumnInit() throws RXScriptletException {

}

public void beforeGroupInit(String groupName) throws RXScriptletException {

}

public void afterGroupInit(String groupName) throws RXScriptletException {

}

public void beforeDetailEval() throws RXScriptletException {

}

public void afterDetailEval() throws RXScriptletException {

}}

예제 코드에서 볼 수 있는것 처럼, 이 클래스는 이벤트 혹은 액션의 이름 앞에 키워드 after나 before를 붙여준

이름을 갖는 일련의 메쏘드들로 구성되어 있습니다. 이 메쏘드들은 스크립틀릿에서 처리할 수 있는 모든 이

벤트들에 맵핑됩니다. 표 17-1에 요약되어 있습니다.

표 17-1 보고서 이벤트

이벤트/메쏘드 설명

beforeReportInit보고서를 초기화하기 전에 호출. 즉, 모든 변수가 초기화 되기 이전에 호출.

afterReportInit모든 변수가 초기화 된 이후에 호출

beforePageInit새로운 페이지가 생성되고 reset 타입이 Page인 모든 변수가 초기화 되기 전에 호출

afterPageInit새로운 페이지가 생성되고 reset 타입이 Page인 모든 변수가 초기화 된 후에 호출

beforeColumnInit새로운 컬럼이 생성되고 reset 타입이 Column인 모든 변수가 초기화 되기 전에 호출. 이

이벤트는 컬럼이 수평방향으로 채워질때는 발생되지 않음.afterColumnInit

새로운 컬럼이 생성되고 reset 타입이 Column인 모든 변수가 초기화 된 후에 호출. 이

296 / 318

Page 297: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

이벤트는 컬럼이 수평방향으로 채워질때는 발생되지 않음.beforeGroupInit

새로 그룹 x가 만들어지고 reset 타입이 Group인 모든 변수와 그룹이름 x 가 초기화 되

기전에 호출

afterGroupInit새로 그룹 x가 만들어지고 reset 타입이 Group인 모든 변수와 그룹이름 x 가 초기화된

후에 호출

beforeDetailEval반복 밴드가 출력되기 전 모든 변수를 새롭게 처리하기 전에 호출

afterDetailEval반복 밴드가 출력된 후, 현재 레코드에 대한 모든 변수들이 처리된 후에 호출

스크립틀릿 내부에서 여러분은 모든 필드, 변수 및 클래스 속성으로 정의된 다음과 같은 맵

(java.util.HashMap)을 사용하는 매개변수들을 참조할 수 있습니다:• fieldsMap• variablesMap• parametersMap

보고서내에 그룹이 존재한다면, 그룹은 groups 속성을 통해 접근할 수 있습니다. 여기서 groups는

RXFillGroup 객체의 어레이가 됩니다.

17.2 간단한 스크립틀릿 만들기

모든 자바 클래스처럼 스크립틀릿을 만들려면 텍스트 편집기와 자바 컴파일러가 필요합니다. 이 문서를 보

는 여러분 IDE를 사용해서 개발한다고 가정하겠습니다. ReportExpress가 넷빌플랫폼 기반으로 개발되어 있

기 때문에 스크립틀릿 만들기의 설명을 위해 넷빈 IDE를 이용하겠습니다.

이제부터 만들게될 스크립틀릿은 각 페이지가 채워지는데 소요되는 시간을 계산하여 페이지 풋터 밴드에

출력하는 것이 목적입니다. 우리는 새 페이지가 생성될 때 시스템 시간을 afterPageInit 메쏘드를 사용하여 저

장해 놓고, 시작한 시간으로부터 지난 정도를 밀리세컨드로 가져오는 메쏘드도 만들 것입니다. 그런 다음, 처

리 시점을 Page로 설정한 텍스트필드에 이 값을 출력하여 해당 페이지를 출력하는데 소요된 시간을 볼 수

있도록 할 것입니다.

이제 새로운 자바 프로젝트를 만드는 것부터 시작하겠습니다. 자바 어플리케이션 작업을 위한 프로젝트는

다음과 같습니다. 넷빈에서 새로운 프로젝트를 만들기 위해 파일 → 새로운 프로젝트를 선택합니다. 그림 17-

1과 같은 윈도우가 나타납니다.

297 / 318

Page 298: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

우리는 예제를 위해 간단한 클래스를 작성할 것이기 때문에 프로젝트의 타입은 자바 클래스 라이브러리입

니다. 두 번째 단계에서 프로젝트의 이름(여기서는 Scriptlet으로 설정)과 위치를 지정해 줍니다(그림 17-2).

마침 버튼을 누르면 프로젝트가 만들어집니다. 다음 단계에서는 스크립틀릿을 작성할 때 필요한 JAR를 프로

298 / 318

그림 17-1 넷빈 IDE에서 새로운 프로젝트 만들기

그림 17-2 프로젝트 세부설정

Page 299: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

젝트에 추가해주어야 합니다. 기술적인 측면에서 본다면 ReportExpress.jar 한 개만 필요할 뿐이지만, 스크립

틀릿에 기능에 따라서 필요로 하는 다른 JAR가 필요하다면 역시 추가해주십시오. 넷빈에서 JAR를 추가하려

면, 프로젝트 뷰에서 라이브러리 노드를 오른쪽 클릭하여 JAR/폴더 추가를 선택합니다(그림 17-3).

그림 17-3 프로젝트에 Jar 추가하기

ReportExpress.jar 가 위치한 곳을 지정합니다. ReportExpress 배포판을 다운받지 않은 경우라면, 디자이너가 설

치된 디렉터리 밑의 다음 위치에서 JAR 파일을 찾을 수 있습니다: <디자이너 설치 디렉터리>/RXDesigner/rxdesigner/modules/ext/reportexpress-x.y.z.jar

이제 스크립틀릿을 작성하기 위해 필요한 모든 클래스가 프로젝트의 클래스경로에 포함되었습니다. 스크립

틀릿을 위한 패키지를 만들고 구현코드를 작성하겠습니다. 프로젝트의 소스 패키지 노드를 오른쪽 클릭하여

새로만들기 → 자바클래스 를 선택합니다. 새로운 클래스를 작성하기 위한 윈도우가 나타납니다(그림 17-4).

이 예제에서는 클래스 이름을 MyScriptlet 으로 설정하겠습니다. 패키지 이름은 com.mycompany 입니다.

그림 17-4 새로운 자바 클래스

299 / 318

Page 300: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

마침 버튼을 누르면, 자바 편집기로 클래스가 열립니다. 클래스는 반드시

com.cabsoft.rx.engine.RXDefraultScriptlet을 상속해야 합니다.

코드 예제 17-2와 같이 클래스 코드를 완성합니다.

코드 예제 17-2 MyScriptlet 소스 코드package com.mycompany;

import com.cabsoft.rx.engine.RXDefaultScriptlet;import com.cabsoft.rx.engine.RXScriptletException;

public class MyScriptlet extends RXDefaultScriptlet {

long pageInitTime = 0;

@Override

public void beforePageInit() throws RXScriptletException {

pageInitTime = new java.util.Date().getTime();

}

/**

* @return time

*/

public Long getLastPageTime() {

long now = new java.util.Date().getTime();

return new Long(now - pageInitTime);

}}

구현된 코드에는 beforeInitPage 메쏘드를 오버라이드시켰고 getLastPageTime 메쏘드를 추가했습니다. 추가한

메쏘드는 Long 객체를 리턴합니다. 스크립틀릿을 표현식에서 사용하므로, 리턴을 항상 Object로 하는 것이

좋습니다. 프로젝트를 빌드시킵니다. 넷빈이 자동으로 JAR를 만들게 됩니다. 바로 우리가 필요로 하는 작업

입니다. 빌드 버튼을 누르면 결과창에서 만들어진 JAR의 위치를 확인할 수 있습니다(그림 17-5).

300 / 318

Page 301: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

17.3 디자이너에서 스크립틀릿 테스트하기

디자이너의 다양한 기능들 중에서도 동적으로 JAR를 적재할 수 있는 것은 매우 유용합니다. 이를 통해 여러

분은 디자이너를 다시 시작하지 않더라도 새로 빌드시킨 JAR와 최신 버전을 사용할 수 있습니다. 스크립틀

릿을 테스트하기 위한(또는 사용하기 위한) 첫번째 단계는 방금 넷빈 IDE를 사용하여 만든 JAR를 디자이너

의 클래스 경로에 추가해주는 것 입니다. 이를 통해 JAR를 디자이너에 적재시키게 됩니다. 디자이너의 옵션

설정창을 열고(도구 → 옵션), 디자이너 섹션으로 이동하여 클래스경로 탭을 선택합니다(그림 17-6).

스크립틀릿용으로 빌드시킨 JAR를 클래스경로 항목에 추가하고 재로딩가능 체크박스에 플래그를 체크해줍

니다.

301 / 318

그림 17-5 빌드 결과창

Page 302: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

그림 17-6 디자이너의 클래스경로에 JAR 추가하기

이제 우리는 보고서에서 com.mycompany.MyScriptlet 클래스를 사용할 수 있게 되었습니다. 이미 보고서가 있

다면 열어서 수정하면 되고, 없으면 새로 보고서를 만들어야 합니다. 이미 앞에서 예제로 만들었던 보고서를

사용하면 될 것입니다. 보고서에서는 한 개 이상의 스크립틀릿을 사용하는것이 가능합니다. 하나만 사용할

경우라면, 보고서의 Scriptlet 속성에 여러분의 스크립틀릿 클래스의 이름을 지정합니다. 여기서는

com.mycompany.MyScriptlet이 될 것입니다(그림 17-7).

그림 17-7 스크립틀릿 속성 설정

한 개이상의 스크립틀릿을 추가하려면, 보고서 인스펙터에서 스크립틀릿 노드를 사용합니다. 자식노드

REPORT는 제거할 수 없습니다. 이 노드는 항상 보고서의 첫번째 스크립틀릿을 가리킵니다. 첫번째 스클립

302 / 318

Page 303: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

틀릿은 보고서의 Scriptlet 속성에서 지정합니다. 다른 스크립틀릿을 추가하려면, 스크립틀릿 노드를 오른쪽

클릭하고 스크립틀릿 추가 메뉴를 선택하여 올바른 클래스 이름을 지정해 주어야 합니다. 기본값으로

com.cabsoft.rx.engine.RXDefaultScriptlet이 설정됩니다.

이제 우리가 만든 스크립틀릿을 사용할 차례입니다. 페이지 풋터밴드에 텍스트 필드를 끌어놓고, 표현식을

다음과 같이 설정합니다: $P{REPORT_SCRIPTLET}.getLastPageTime()

여기서 REPORT_SCRIPTLET은 보고서의 스크립틀릿을 참조하는 내장 매개변수입니다. 다른 스크립틀릿은

<스크립틀릿이름>_SCRIPTLET 이 됩니다. 예제 보고서에서는 REPORT_SCRIPTLET이 MyScriptlet 타입을 갖

습니다. 따라서, getLastPageTime() 메쏘드를 호출하여 페이지가 초기화된 이후부터 흐른 밀리세컨드 값을 리

턴하게 할 수 있습니다. 이 메쏘드는 Long 객체가 반환되기 때문에 텍스트필드 클래스 타입을 java.lang.Long

으로 조정해줄 필요가 있습니다. 마지막으로, 페이지가 완료된 경우에 대해서만 흐른 시간을 얻기 위해 처리

시점을 페이지로 설정합니다(그림 17-8).

그림 17-8 텍스트 필드 세부사항

보고서를 미리보기 하여 결과를 확인합니다. 각 페이지마다 해당 페이지를 채우는데 소요된 밀리세컨드 수

치를 확인할 수 있습니다. 여기서 우리는 첫번째 페이지가 통상적으로 다른 페이지들에 비해 소요되는 시간

이 길다는 것을 알게됩니다. 마지막 페이지는 다른 페이지보다 빠르게 생성되는 것도 확인 할 수 있습니다.

스크립틀릿을 수정해야 한다면, IDE로 다시 돌아가 코드를 수정한 후 다시 빌드합니다. 그런 후, 보고서를 미

리보기 해보십시오. 미리보기 탭상에서 새로고침 버튼을 눌러도 됩니다.

17.4 디자이너 객체에 접근하기

스크립틀릿 클래스는 자신이 속해있는 데이터셋의 모든 객체에 접근 가능합니다. 또한 서브데이터셋은 자신

303 / 318

Page 304: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

만의 스크립틀릿을 가질수 있습니다. 모든 스크립틀릿은 RXAbstractScriptlet 클래스를 상속하기 때문에 맵과

groups를 참조할 수 있습니다. 여기서 맵은 java.util.Maps(parameterMap, fieldsMap 그리고 variablesMap)이고,

groups는 RXFillGroup의 배열입니다. 맵에는 객체의 이름을 키로하는 특수 객체들(RXFillParameter,

RXFillField 그리고 RXFillVariable)을 값으로 사용합니다. 객체의 값을 얻고 변수의 값을 설정하기가 편하도

록 하기위해 편리한 함수들도 제공됩니다:

Object getParameterValue(String parameterName)Object getParameterValue(String parameterName)Object getParameterValue(String parameterName, boolean mustBeDeclared)Object getFieldValue(String fieldName)Object getVariableValue(String variableName)void setVariableValue(String variableName, Object value)

모든 메쏘드들은 오류가 나면 RXScriptletException을 발생시킵니다.

변수는 스크립틀릿에서 변경할 수 있는 유일한 값입니다. 스크립틀릿에서 변수의 값을 설정하게 되면, 보고

서 엔진과 동시에 적용된다는 것에 주의해야 합니다. 일반적으로 계산 타입은 변수에 대해 설정됩니다. 이런

이유 때문에 스크립틀릿에서 사용된다는 가정하에서 변수는 계산 타입을 시스템으로 해줘야 합니다.

보고서 객체의 값뿐만 아니라 객체에 대해서도 접근이 가능하므로 큰 장점이 됩니다. 특히 스크립틀릿이 재

사용 가능하기 때문에 더욱 유용성이 커집니다. RXFillParameter와 RXFillField는 디자인 시점에서 그 속성들

을 설정할 수 있고 RXFillField와 RXFillVariable 모두 이전 값을 노출하기 때문에 각기 다른 계산에서 사용할

수 있습니다.

17.5 스크립틀릿 디버깅하기

스크립틀릿 코드상에서 브레이크 포인트를 설정하여 단계별 디버깅을 하는 방법이 존재하지 않습니다. 하지

만, 스크립틀릿 실행을 모니터링 하는것은 기술적으로 가능합니다. 한가지 방법으로는

System.out.println(<msg>) 처럼 간단한 메쏘드를 통해 디자이너 출력창에 메시지를 보이게 하는 것입니다.

Println 호출 다음에 flush를 해주는 것은 출력되는 메시지가 출력창에 곧바로 보이도록 하는 좋은 방법입니

다:

public void beforePageInit() throws RXScriptletException {

pageInitTime = new java.util.Date().getTime();

System.out.println("I have set the pageInitTime to: " + pageInitTime);

System.out.flush();}

출력창에는 그림 17-9 와 같이 출력됩니다:

304 / 318

Page 305: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

보다 고급기술을 적용하면 스크립틀릿 구현을 통해 필드의 현재 상태정보와 실행 중지 옵션을 가능하게 하

는 대화창을 열 수도 있습니다(그림 17-10). 이 방법은 디자인 시점에서만 유용합니다.

그림 17-10 간단한 필드 디버깅 윈도우

305 / 318

그림 17-9 스크립틀릿에서 출력된 디버그 메시지

Page 306: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

이를 구현하는 코드는 다음과 같습니다:

코드 예제 17-3 디버깅 스크립틀릿 예제 코드public void beforePageInit() throws RXScriptletException {

pageInitTime = new java.util.Date().getTime();

String fieldValuesMsg = "";

Iterator i = fieldsMap.keySet().iterator();

while (i.hasNext()) {

String fieldName = (String) i.next();

fieldValuesMsg += fieldName + " = " + getFieldValue(fieldName) + "\n";

}

fieldValuesMsg += "\n실행을 멈추시겠습니까?";

if (JOptionPane.showConfirmDialog(null, fieldValuesMsg, "",

JOptionPane.YES_NO_OPTION) == JOptionPane.OK_OPTION) {

// Stop the execution

throw new RXScriptletException("사용자에 의해 실행이 멈췄습니다");

}

}

이 대화창은 beforePageInit 메쏘드에 구현하였기 때문에 새로운 페이지가 초기화 되자마자 매번 보여지게 되

고 보고서 실행을 잠시 멈추게 됩니다. Yes를 선택하게 되면 스크립틀릿에서는 RXScriptletException을 던져

서 “사용자에 의해 실행이 멈췄습니다”라는 메시지와 함께 보고서 실행을 종료시키게 됩니다. 이 방법은 페

이지가 많이 만들어지는 보고서의 경우 시간이 많이 걸리게 되므로 중간에 보고자 하는 페이지까지만 확인

하고 보고서 실행을 멈추게 할 때도 유용하게 사용할 수 있습니다.

17.6 스크립틀릿을 사용하는 보고서 배치시키기

종종 디자이너에서는 잘 실행되던 보고서가 웹 어플리케이션 서버로 배치시키면 동작하지 않을때가 있습니

다. 이런 경우, 우리는 먼저 보고서가 스크립틀릿을 사용했는가를 점검해야 합니다. 해당 보고서가 스크립틀

릿을 사용했다면, 스크립틀릿 클래스가 웹어플리케이션 서버의 클래스경로에 포함되어 있는지 확인합니다.

마지막으로, 스크립틀릿은 하나 이상의 보고서에서 사용될 수 있기 때문에 여러분이 제작하여 사용하는 스

크립틀릿들을 하나의 JAR에 패키징해 두는 것이 관리상 편리합니다.

306 / 318

Page 307: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

18 장. 기타 도구들

이번 장에서는 디자이너 팔렛트의 도구 섹션에서 사용가능한 도구들(그림 18-1)과 디자이너에서 제공하는

유용한 기능들을 살펴보도록 하겠습니다.

그림 18-1 툴 팔레트

이번 장은 다음과 같은 섹션들로 구성됩니다:

• 포스트잇 도구

• 현재 날짜 도구

• 페이지 번호, 총 페이지와 Page X of Y 도구

• 백분율 도구

• 디자인 밑그림으로 배경이미지 사용하기

• 예제 실행 방법

18.1 포스트잇 도구

포스트잇 도구는 보고서 내에 주석을 달 때 사용합니다. 포스트잇은 보고서의 요소가 아니며 보고서를 채우

거나 내보내기 할 때 출력되지 않고 또 보여지지 않습니다. 크로스탭과 테이블 디자이너상에서는 포스트잇

을 사용하지 못합니다. 메인 디자인에서만 포스트잇을 사용할 수 있습니다. 포스트잇을 만들려면, 팔렛트에

서 포스트잇 도구를 보고서 페이지에 끌어다 놓으면 됩니다(그림 18-2).

그림 18-2 콜아웃 도구

307 / 318

Page 308: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

기본적으로, 새로 추가시킨 포스트잇의 텍스트는 사용자의 이름과 현재 날짜가 됩니다. 포스트잇을 더블클릭

하여 내용을 수정할 수 있습니다. 입력하는 텍스트가 매우 길다면, 콜아웃의 크기를 조정하여 모든 컨텐츠를

보이게 할 수 있습니다. 포스트잇을 오른쪽 클릭한 후, 모든 텍스트 보여주기 메뉴를 선택합니다(그림 18-2).

포스트잇을 삭제하려면, 오른쪽 클릭 후, 삭제를 선택합니다.

포스트잇에 핀을 추가할 수도 있습니다. 핀을 달아 화면상에 포스트잇을 표시합니다. 핀은 선으로 포스트잇

과 연결됩니다. 포스트잇은 화면상에서 끌고 다니더라도 핀의 위치에 영향을 주지 않습니다. 연결된 선만이

자동으로 업데이트됩니다. 핀을 추가하려면, 포스트잇을 오른쪽 클릭하여 핀 추가 메뉴를 선택합니다. 그런

후, 핀을 스크린상의 적당한 위치에 끌어다 놓습니다. 이제 핀을 움직이지 않고도 포스트잇을 옮길 수 있습

니다.

포스트잇 데이터(텍스트, 위치, 핀등)는 rx.callouts라고 명명된 보고서 속성에 일반 텍스트로 저장되어 집니

다.

18.1.1 현재 날짜 도구

현재 날짜 도구는 현재 날짜나 시간을 텍스트필드로 쉽게 보여줄 수 있도록 합니다. 이 툴을 보고서내에 놓

게되면, 날짜 포맷 설정창이 나타나서 날짜나 시간에 대한 형식을 지정할 수 있도록 합니다(그림 18-3).

설정을 마치게 되면, 그 결과로 java.util.Date 타입을 갖는 새로운 텍스트필드 요소가 만들어 집니다. 텍스트필

드의 표현식에는 new java.util.Date()가 설정되어 있습니다(현재 날짜로 새로운 Date 객체를 초기화시키는 표

현식). 텍스트필드의 Pattern 속성은 설정창에서 지정해준 포맷으로 설정되어 있습니다.

308 / 318

그림 18-3 날짜와 시간 포맷 설정창

Page 309: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

18.2 페이지 번호, 총 페이지수와 Page X of Y 도구

18.2.1 페이지 번호 도구

이번 절에서 다루게 되는 도구들은 모두 페이지상에 페이지 번호를 출력하는 용도로 사용됩니다.

페이지 번호 처리시점 지금을 갖는 변수 $V{PAGE_NUMBER}를 보여주는 텍스트필드를 만듭니

다. 결과로 현재 페이지의 번호를 찍습니다.

총 페이지 페이지 번호와 유사합니다만, 처리시점이 보고서 입니다. 결과로 보고서의 총 페이

지수가 찍히게 됩니다. 즉, 내장 변수 PAGE_NUMBER가 처리시점 보고서 일때의 값

이 됩니다.

Page X of Y 두 텍스트필드를 만들게 됩니다.

• 첫 번째 텍스트필드는 페이지 번호 도구와 매우 유사하며, 다른 점은 표현

식이 “Page “+V${PAGE_NUMBER}+ “of “ 가 되어 출력되는 문자열이 Page

100 of 처럼 됩니다. 여기서 100은 현재 페이지 번호가 됩니다.

• 두 번째 텍스트필드는 총 페이지수와 같은 처리시점을 보고서로 설정한 변

수 $V{PAGE_NUMBER}를 보여줍니다. Page X of Y를 한 개의 텍스트필드

로 출력하게 할 수 있지만, 이를 위해서는 새로운 변수가 필요하며 다음 절

에서 그 방법을 살펴보도록 하겠습니다.

PAGE_NUMBER와 처리시점은 6.3. “변수 사용하기”와 6.4. “보고서 생성과정에서의 처리시점” 을 참조하십

시오.

18.2.2 단일 텍스트필드에 Page X of Y 출력하기

이해를 돕기위해 우선, Page X of Y 도구가 두 개의 텍스트필드를 생성하여 현재 페이지 번호와 보고서의 마

지막 페이지 번호(이 두 값 모두 변수 PAGE_NUMBER에 담기게 되며 처리시점만 각각 지금과 보고서로 다

릅니다)를 출력한다고 앞에서 설명했습니다.

조금만 작업을 해주게 되면 한 개의 텍스트필드에서 이와 동일한 텍스트를 만들어 낼 수 있습니다. 한 개의

텍스트필드만을 사용했을 때의 장점은 언어와 로케일에 따른 텍스트의 포맷팅 제어가 쉽다는 것입니다. 한

개의 텍스트필드를 사용하는 경우, 텍스트는 별도의 포맷팅을 갖는 두 부분으로 나뉘지 않습니다.

이를 위해서는 텍스트필드 요소의 처리시점을 자동으로 설정합니다. 처리 시점은 텍스트필드의 표현식내에

포함되어 있는 모든 변수들의 리셋 타입(리셋 타입은 각 변수마다 갖는 속성으로 언제 변수가 리셋되어야

하는지를 지정하고 있습니다)을 고려하게 됩니다. 즉, PAGE_NUMBER 내장변수의 리셋타입은 보고서입니

다. 따라서 PAGE_NUMBER 변수를 출력할 텍스트필드는 처리시점이 자동이 되어 페이지의 총 수가 출력됩

니다. 변수 PAGE_NUMBER의 값은 다음 번 리셋되기 전까지의 값이 들어갑니다. 이 경우에는 보고서의 마지

막입니다. 따라서, 마지막 보고서의 페이지 번호가 들어가며 이것이 총 페이지수가 되는 것입니다.

309 / 318

Page 310: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

하나의 표현식내에서 서로 다른 처리시점을 갖는 PAGE_NUMBER 처리는 현재 페이지 번호의 값을 저장하

고 리셋 타입을 페이지로 설정한 새로운 변수를 만들어서 가능하게 합니다. 이런 변수를 만드는 것은 매우

쉽습니다. 그저 새로운 변수를 추가하고 그 속성을 다음과 같이 지정해주면 됩니다:

속성 값

변수 이름 currentPage

변수 클래스java.lang.Integer

계산 없음

리셋 타입 페이지

변수 표현식$V{PAGE_NUMBER}

다른 속성들 기본값 사용

새로운 페이지가 만들어질 때마다 이 새로만든 변수는 현재 페이지 번호를 담고있는 PAGE_NUMBER 변수

의 값으로 할당됩니다. 다음 페이지로 가기 전까지 이 변수는 현재 페이지의 번호를 갖게 됩니다. 이 변수의

리셋 타입이 페이지이므로, 처리시점을 자동으로 설정한 텍스트필드에서 사용하게 되면 현재 페이지 번호가

출력되게 됩니다.

지금까지 설명드린 사항을 단계별로 설명하면 다음과 같습니다:

1. 텍스트필드를 하나 만들고, 처리시점은 자동으로 설정하고 클래스는 java.lang.String으로 설정하며

표현식은 다음으로 설정해줍니다:"Page "+$V{currentPage}+" of " + $V{PAGE_NUMBER}

2. 기대했던 것처럼 이 표현식의 결과로 다음과 같은 출력을 얻게 됩니다:

Page 4 of 30 (여기서 4 는 현재 페이지 번호이고, 30은 총 페이지수가 됩니다).

이 표현식은 변경할 수 있지만, 여전히 $V{currentPage}는 현재 페이지 번호를, $V{PAGE_NUMBER}는 총 페

이지 수를 출력하도록 합니다. 이 표현식을 다음과 같이 사용할 수도 있습니다: MyUtils.formatPageXofY($V{currentPage}, $V{PAGE_NUMBER})

여기서 MyUtils.formatPageXofY 메쏘드는 사용자가 정의한 것으로써 요구에 맞추어 Page X of Y 라벨 문자를

변경하도록 하는 기능을 구현한 것이라고 가정하겠습니다.

PAGE_NUMBER 변수를 만드는 방법과 처리시점에 대한 상세한 내용은 6장. “필드, 매개변수 그리고 변수”를

참고하십시오.

18.3 백분율 도구

백분율 도구는 백분율을 나타내주는 텍스트필드를 쉽게 만들 수 있도록 합니다. 밴드내에 백분율 도구를 끌

어다 놓으면, 그림 19-4와 같은 설정창이 나타나게 됩니다. 여기서 백분율로 계산할 필드를 지정하고 계산을

310 / 318

Page 311: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

수행할 집계 수준을 지정합니다.

그림 18-4 백분율 도구

디자이너는 선택된 필드의 합계를 저장할 변수를 새로 만들게 됩니다. 이 변수의 리셋타입은 선택한 집계수

준에 따라 달라집니다(report, page 혹은 특정 그룹). 텍스트필드의 표현식은 다음과 같이 생성됩니다: new Double( $F{FREIGHT}.doubleValue() / $V{FREIGHT_SUM}.doubleValue() )

처리시점은 자동으로 설정하여 $F{FREIGHT}와 $V{FREIGHT_SUM}이 서로 다른 집계시간이 되도록 합니

다.마지막으로, 텍스트필드의 패턴은 #,##0.00% 로 설정됩니다.

18.4 디자인 밑그림으로 배경 이미지 사용하기

디자인할 보고서가 이미 인쇄된 종이로 된 경우나 밑본으로 사용하기 위해 이미지로 만들었다면 그림 18-5

에서 보이는 것처럼 디자이너에서 이를 배경 이미지로 불러들여 디자인의 시안으로 사용할 수 있습니다.

보기 > Report Designer > 배경 이미지 가져오기... 메뉴를 선택하여 준비된 밑그림을 불러오면 됩니다. 이미

지의 경로와 속성은 RXXML내에 저장되므로, 해당 보고서를 닫았다가 다시 열게되더라도 다시 이같은 과정

을 반복할 필요는 없습니다.

311 / 318

Page 312: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

밑그림으로 사용할 이미지의 크기, 위치 그리고 투명도를 조정하려면, 보기 > Report Designer > 배경 이미지

수정을 선택합니다. 이미지의 위치는 끌어서 조정합니다. 검은 조정표시를 끌어주면 이미지를 늘릴 수 있습

니다. 옵션을 보려면 이미지를 선택하고 오른쪽 마우스를 클릭하면 됩니다. 옵션 설정을 통해 이미지의 크기

비율을 유지하게 하거나 투명도를 설정할 수 있습니다. 페이지 너비에 맞추기 메뉴는 문서의 여백을 포함한

너비 만큼 이미지를 늘려주게 하며, 이미지의 위치를 문서의 좌측 상단 모서리에 맞춥니다. 이미지의 위치를

제대로 설정했다면, 이미지 오른쪽 클릭하여 변환 완료를 선택하거나, 보기 > Report Designer > 배경 이미지

수정을 다시 클릭해서 선택을 해제합니다.

밑그림 이미지는 보기 > Report Designer > 배경 이미지 보이기를 선택하여 언제든지 원할 때 감추거나 다시

보이게 할 수 있습니다. RXXML에서 밑그림을 완전히 제거하려면, 보기 > Report Designer > 배경 이미지 삭

제를 선택합니다.

312 / 318

그림 18-5 밑그림으로 배경이미지

Page 313: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

18.5 예제 실행 방법

디자이너를 설치할 때 여러분이 보고서를 보다 쉽게 시작할 수 있도록 돕기위해 예제들도 함께 설치됩니다.

이 예제 보고서 내에는 포스트잇들을 집어넣어 여러분이 보고서가 어떻게 동작하는지에 대한 이해를 돕고

있습니다. 예제는 도움말 > 보고서 예제 메뉴를 통해 열 수 있습니다.

모든 예제들은 디자이너 설치와 함께 배포되는 HSQL DB 예제 데이터베이스를 사용합니다. 이 데이터베이스

로의 연결은 이미 설정된 상태입니다. 예제 데이터베이스(HSQLDB test) 라는 이름으로 디자이너의 툴바에

있는 연결 드롭다운 목록에 보입니다. 데이터베이스는 필요한 경우 자동으로 시작됩니다. 즉, 보고서를 실행

하거나 질의로부터 필드를 읽으려 할 경우에는 데이터베이스가 자동으로 시작됩니다.

수동으로 데이터베이스를 시작하려면, 도움말 > 보고서 예제 > 예제 데이터베이스 실행 메뉴를 선택하면 됩

니다.

313 / 318

Page 314: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

부록 A 차트 테마 예제

이 코드 예제는 그림 12-12에 보여진 커스텀 차트 테마 “TricolorAreaChart”의 XML 소스입니다.

코드 예제 A-1 TricolorAreaChart의 XML 소스<?xml version="1.0" encoding="UTF-8"?><chart-theme> <chart-settings background-image-alignment="Align.BOTTOM" border-visible="true"> <background-paint xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" color1="#CCFFFF" color2="#FFFFFF" xsi:type="gradient-paint"/> <font/> </chart-settings> <title-settings> <font font-size="18"/> </title-settings> <subtitle-settings> <font font-size="12" italic="true"/> </subtitle-settings> <legend-settings> <font/> </legend-settings> <plot-settings background-image-alignment="Align.BOTTOM" outline-visible="false" domain-gridline-visible="true" range-gridline-visible="true"> <background-paint xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" color1="#FFFFFF" color2="#CCFFFF" xsi:type="gradient-paint"/> <outline-paint xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" color="#000000" xsi:type="color"/> <stroke xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" width="1.0" xsi:type="stroke"/> <series-color-sequence xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" color="#00CC00" xsi:type="color"/> <series-color-sequence xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" color="#FF0000" xsi:type="color"/> <series-color-sequence xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" color="#FFFFFF" xsi:type="color"/> </plot-settings> <domain-axis-settings line-visible="true"> <label-font xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="font"/> <tick-label-font xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="font"/> </domain-axis-settings> <range-axis-settings line-visible="false"> <label-font xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="font"/> <tick-label-font xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="font"/> </range-axis-settings></chart-theme>

314 / 318

Page 315: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

색인CCLOB............................................33

ㄷ디자이너사용......................................

CSV............................................

구분자................................199XML............................................

레코드 노드 설정...................191

필드로 노드추가....................191

JDBC 연결을 설정...........................

데이터소스창.........................19

새로운 드라이버를 등록............18

서비스 뷰상에서 새 연결.........178

설정한 데이터소스...................19

Z축순서........................................

아래로 보내기........................66

위로 보내기...........................66JDBC URL Wizard......................17

JDBC 연결을 설정........................17

BLOB 데이터에서 이미지........180

BLOB과 CLOB.....................180

ClassNotFound 오류...............18ClassNotFoundError............176ClassNotFoundException......176

JAR를 보고서 클래스경로에 추가.18java.sql.Connection.............180

JDBC URL 도우미.................176

JDBC URL 연결문자..............176

JDBC 드라이버를 지원.............18

JDBC-ODBC 브릿지 드라이버. .178MySQL..............................178PostgreSQL........................178

넷빈 데이터베이스 JDBC 연결. .179PAGE_NUMBER........................315

ReportExpress 클래스.................28

ReportExpressDesign 객체...........28reportexpressreport.xsd.............27

ReportExpress에서 사용되는 단위...42

ReportExpress클래스......................RXEmptyDataSource.............35

RXDataSource..............................public boolean next()..........182public Object getFieldValue(RXField rxField)........................................182RXBeanArrayDataSource......208RXBeanCollectionDataSource208RXDataSource....................206RXField......................182, 206RXXmlDataSource...............208

RXEmptyDataSource.....................

public RXEmptyDataSource()........................................201public RXEmptyDataSource(int count)...............................201

RXXML...................................139w................................................

컬렉션(java.util.Collection). . .184XML............................................

public RXXmlDataSource dataSource(String selectExpression)................194public RXXmlDataSource subDataSource(String selectExpression)................194RXXmlDataSource...............194XPath................................188

가이드라인.................................60

가이드라인을 제거.......................60

가져오기 속성.............................54

그래픽요소....................................

대각선 종류...........................70

사각형 요소...........................71

선.......................................70

이미지.................................71

캔바스 객체...........................71

타원....................................71

펜.......................................70

그룹.........................111, 113, 143

그룹............................................

그룹 아래로 이동...................113

그룹 위로 이동.....................113

그룹추가(Add Report Group). 117

다른 그룹 옵션.....................122

데이터 없이 출력.........................54

데이터소스....................................CSV...........................171, 199

CSV 파일 데이터소스.............199EJBQL...............................173FieldsProvider.....................221fillManager..........................29HQL...........................173, 202JavaBean...........................173javax.sql.Datasource...........172

JDBC 드라이버...............97, 175

JDBC 연결......97, 153, 171, 175

JNDI 룩업...........................172MDX..................................173OLAP.................................173REPORT_DATASOURCE........154RXBeanArrayDataSource......220RXDataSource......29, 153, 168, 171, 182, 208, 212, 217RXDataSourceProvider.........173

RXEmptyDataSource....104, 201

SQL 과 자바 타입 변환...........180

SQL 질의..............................95XML...........................171, 188

XML 파일 데이터소스.............190

데이터소스..........................150

데이터소스 구현 클래스..........171

데이터소스 목록....................173

데이터소스를 선택.................174

레코드................................171

레코드 셋트.........................171

많이 사용하는 질의 언어...........97

매개변수.............................100

빈 데이터소스...............173, 201

서브데이터셋................171, 267

서브데이터셋 변수.................267

연결타입.............................173

자바 클래스의 객체를 사용하기 위한

시나리오...............................99

자바빈...................99, 171, 183

자바빈 셋 데이터소스.............183

질의 대화창...........................96

질의 디자이너........................98

질의 실행기..................212, 214

질의 실행기 모드...................173

캐스트................................182

쿼리 디자이너버튼...................98

필드 프로바이더....................221

하이버네이트................171, 202

등록정보쉬트.................................

매개변수...............................62

밴드의 옵션...........................62

변수....................................62

선택된 개체의 옵션..................62

페이지 포맷...........................62

필드 옵션..............................62

디자인 영역................................41

디자인서식....................................RXXML.......................150, 168

RXXML확장자........................26

확장자가 rxxml......................16

로케일..........................................getBundle..........................298ResourceBundle..................298

리소스 번들.........................292

리소스가 없는 경우의 타입.......293

315 / 318

Page 316: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

즐겨찾기 패널......................295

리소스 번들.........................47, 292

리소스가 없는 경우의 타입 속성.......48

리스트..........................................

SQL 질의............................241

리스트 데이터소스 편집..........240

리스트 사용시 성능................249

리스트를 만들기 위한 과정.......243

마그네틱 효과......................242

매개변수.............................244

변수..................................244

서브데이터셋.......................241

스클립틀릿..........................249

제약사항.............................248

출력 순서............................250

커넥션 표현식 사용................241

평가시점.............................248

리스트 컴포넌트........................240

많이 사용하는 페이지 포맷의 크기....42

매개변수.......................................$P!{<parameter name>}....102caller................................104ClassCastException.............106REPORT_CONNECTION........180REPORT_PARAMETERS_MAP.155REPORT_SCRIPTLET............308

SQL질의내에서 매개변수........101

내장 매개변수......................103

클래스 타입과 동일한(또는 최소한

슈퍼 클래스를) 매개변수.........106

프롬프트로 사용....................101

몇가지 설정작업..........................14

모눈 표시...................................60

미리 정의된 밴드.........................39

바코드..........................................Barbecue....................260, 263Barcode4J..................260, 264

바코드 선택창......................262

바코드 요소..............................260

반복 밴드.................................144

백그라운드...............................111

백분율 도구..............................317

밴드..................................38, 111

나뉨 타입(Split Type)..............56

데이터없음 섹션....................112

밴드 높이......................55, 111

밴드 삭제..............................55

밴드 추가..............................55

밴드삭제.............................112

밴드추가.............................112

분리허용.............................112

표현식에 따른 출력(Print When Expression).........................56

변수.......................................106

계산 타입............................107

내장된 변수.........................108

리셋 타입............................108

변수에 대한 속성...................106

변수 노드.................................106

보고서 구조의 유효성 검증.............29

보고서 도우미...........................139columnar...........................145tabular..............................145template.keepExtraGroups...145

template.type 속성..............144

템플릿을 선택한 후..................21

보고서 문제창 부분에서 문제사항들을

확인.........................................25

보고서 생성과정........................109

보고서 속성................................48

보고서 요소(ELEMENTS)...............58

보고서 이벤트...........................301

보고서 인스펙터..........................65

보고서 출력...................................fillReport....................104, 154ReportExpressPrint...............29RXExporter..........................30RXViewer............................30

이미 정의된 익스포터...............30

보고서인스펙터...............................

루트 노드..............................65

뷰의 z-축 순서.......................65

새 페이지에 제목 옵션...................50

서브데이터셋.................................

데이터셋 추가......................267

예제 서브데이터셋.................270

질의문 편집.........................268

차트용 데이터셋 실행 설정창....270

서브리포트.................................87ClassCastException.............155MalformedURLException......152REPORT_CONNECTION.153, 160REPORT_COUNT.................162

객체 타입의 목록...................152

디렉터리를 매개변수로...........153

매개변수.............................150

매개변수맵..........................154

서브리포트..........................150

서브리포트 데이터소스...........153

서브리포트 도우미..........166, 168

서브리포트 파일의 위치..........152

서브리포트를 연결.................151

서브리포트의 특성...................88

실질적인 사용방법.................155

여백들을 0..........................150

커넥션 표현식 사용................160

클래스경로에 속한 디렉터리.....153

속성 뷰.....................................41

스크립틀릿...............................300afterPageInit......................302

Classpath 탭.......................307RXAbstractScriptlet......300, 309RXDefaultScriptlet...............300RXDefraultScriptlet.............305RXScriptletException...........309

스크립틀릿 추가....................308

스클립틀릿.................................47

스타일.....................................125

스타일........................134, 137

스타일 노드.........................133

조건 스타일.........................136

조건 스타일 추가...................135

앵커.........................................90

예제 데이터베이스...........................ant runServer......................20

HSQLDB를 사용.....................20

도우미를 사용하는 경우, 최대 4개

까지의 그룹...........................23

예제 데이터베이스를 사용.........20

외부 뷰어 어플리케이션 설정...........15

요소.............................................

격자대로 이동........................60

그래픽 요소.....................58, 70

기본 요소 속성.......................66

등록정보 쉬트........................62

요소들을 정렬........................60

요소의 경계선을 붉은 색으로 표시..........................................58

커스텀 속성 셋트를 정의...........69

텍스트 요소...........................58

팔레트 영역...........................59

프레임 요소...........................58

요약 밴드...................................52

이미지..........................................BLOB..................................76

classpath를 사용...................73generateImage()..................77java.awt.Image.............76, 180MyImageGenerator...............77RXAbstractSVGRenderable.....77

RXRenderable 인터페이스........77

경계선.................................76

316 / 318

Page 317: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

스윙 컴포넌트인 JTable............78

이미지 표현식........................72

이미지 표현식 클래스 옵션........74

이미지를 동적으로 생성하는 방법 77

패딩....................................76

표현식에 매개변수화................73

하이퍼링크 기능.....................76

익스텐션...................................36

인코딩..........................................

유니코드.............................133

캐릭터 인코딩......................133

자바빈..........................................

겟터 메쏘드.........................186

배열(Object[])....................184

컬렉션(java.util.Collection). . .184

팩토리 클래스......................184

질의 속성...................................48

질의디자이너.................................

$X{} 구문..........................102

CSV 데이터소스...................200Group By.............................98

IN 과 NOT IN......................102Order By.............................98ORDER BY.........................115SELECT...............................98

Where 노드..........................98

레코드 노드 설정...................191

자바빈 데이터소스 탭...............99

자바빈 데이터소스탭..............187

정렬 옵션.....................114, 181

정렬 타입............................115

조인....................................98

질의언어로 XPath.................191

필드읽기.............................156

필터 표현식.........................181

질의실행기....................................createDatasource........214, 217createQueryExecuter...........214RXDataset.........................214RXQueryExecuter................214RXQueryExecuterFactory.....215

차트.......................................172Chart Data.........................228JFreeChart.........................226RXChartCustomizer.............234

값 표현식............................230

데이터셋.............................229

데이터셋 타입...............229, 232

라벨 표현식.........................230

리셋 그룹............................229

리셋 타입............................229

예제 서브데이터셋.................270

증가 그룹............................229

증가 타입............................229

차트 선택창.........................227

차트 세부설정창....................228

차트 예제............................226

차트용 데이터셋 실행 설정창....270

커스터마이징.......................234

키 표현식............................230

파이형 데이터셋....................229

필터 표현식.........................229

하이퍼링크..........................233

차트의종류....................................

3D 막대형 차트....................226

3D 스택바 차트....................226

3D 파이차트........................226

XY선 차트...........................226

YX 막대 차트.......................226

YX영역 차트........................226

간트..................................226

다축차트.............................226

막대형 차트.........................226

미터..................................226

선 차트...............................226

스캐터 차트.........................226

스택 영역 차트.....................226

스택바 차트.........................226

시계열 차트.........................226

양초 차트............................226

영역 차트............................226

온도계................................226

파이차트.............................226

풍선 차트............................226

하이-로우 차트.....................226

차트커스터마이징............................reportexpressreport_extention.properties............................238RXCTX...............................235

메인 뷰...............................235

속성 쉬트............................235

익스텐션 JAR.......................238

차트테마.............................235

템플릿 인스펙터....................235

파일 확장자는 .rxctx.............235

출력 순서 옵션............................53

출력창을 통해 진행상황을 추적........25

커스텀질의실행기............................createDatasource................218createQueryExecuter...........216

CustomDataSource.............218CustomQueryExecuter.........219CustomQueryExecuterFactory........................................219FieldsProvider.....................220getBuiltinParameters...........216hasQueryDesigner..............225supportsQueryParameterType........................................216

컬럼.........................................44

컬럼 헤더밴드...........................144

컬럼형 보고서....................140, 143

컴파일된디자인서식.........................

ReportExpress 포맷...............26

RXXML을 컴파일....................26

확장자가 report.....................16

크로스탭...........................172, 275

데이터 사전 정렬...................288

동작에 관련된 옵션................286

열그룹................................281

집합함수.............................277

총합계 위치.........................283

측정..................................277

측정노드.............................285

측정에 대한 표현식................285

측정을 설정할 때 사용되는 옵션들........................................285

크로스탭 데이터 메뉴.............288

크로스탭 도우미....................275

크로스탭 디자이너.................278

크로스탭 매개변수 추가..........287

크로스탭 설정......................282

크로스탭에서 측정.................285

함수..................................277

합계 변수............................289

행 그룹 추가........................282

행그룹................................281

타이틀 밴드................................50

테이블..........................................

데이터의 필터링....................258

룩앤필........................253, 259

사이드 룰러에 보라색 바.........255

셀 삭제...............................257

셀 추가...............................257

컬럼..................................254

컬럼 그룹............................256

컬럼삭제.............................260

컬럼추가.............................259

테이블 데이터소스 편집..........258

테이블 도우미......................250

317 / 318

Page 318: ReportExpress Enterprise V. 2.0.1 보고서 디자인 가이드 · 2014-09-17 · 11.6.2 자바빈즈 데이터소스의 필드 ... • jdbc에서 접근할 수 있는 모든 데이터베이스

보고서 디자인 가이드

테이블 섹션.........................255

테이블을 만들려면.................251

행 스팬...............................257

테이블 컴포넌트........................250

테이블 형보고서........................143

테이블스타일.................................Table.................................253Table_CH...........................253Table_TD...........................253Table_TH...........................253

테이블형 보고서........................141

텍스트..........................................

날짜와 시간 포맷....................86

리턴되는 값의 타입..................84

숫자의 포맷팅 예....................87

심볼로 파싱되는 특수한 문자들의 예..........................................86

옵션....................................81

정적 텍스트.....................81, 84

텍스트 필드.....................81, 84

텍스트 필드에 지정할 수 있는 속성..........................................85

템플릿....................................139

서식 도우미.........................146

테이블형 템플릿....................145

템플릿................................145

템플릿 디렉터리....................146

특정한 처리시점........................110

페이지 여백 크기.........................42

페이지번호....................................$V{currentPage}................316$V{PAGE_NUMBER}............316

포맷 팩토리 클래스......................54

포맷팅 툴뷰................................64

포스트잇.......................................

포스트잇 데이터....................314

핀 추가...............................314

포스트잇 도구...........................313

폰트............................................

PDF 인코딩 콤보박스.............133

PDF로 보고서를 내보낼때........125

PDF에 포함 체크 박스............127

기본 특성............................125

익스텐션으로 내보내기...........133

트루타입 폰트......................126

폰트 경로는 옵션 대화창에서....127

폰트 익스텐션...............126, 128

폰트 익스텐션의 목적.............128

표현식의타입.................................

널값의 검증...........................95

표현식의타입.................................RXEmptyDataSourcde().......169

프레임......................................89

장점....................................89

필드 노드...................................94

필드, 이미지등의 요소를 첫번째 컬럼 영

역내에 위치................................47

필터 표현식................................48

하이퍼링크.................................91LocalAnchor.........................91LocalPage............................91Reference............................91RemoteAnchor.....................91RemotePage........................91ReportExecution...................91

링크 타입의 목록....................91

툴팁 표현식...........................92

디자이너설치......................................

배포판 압축파일을 풉니다..............14

보고서 디자이너를 직접 다운로드.....13

플랫폼 요구사항..........................13

디자이너의 기능.................................9

ㄹ라이센스........................................10

디자이너 라이센스.......................26

라이센스 관리자..........................10

라이센스 파일.............................11

서버용 라이센스..........................26

시험용 라이센스..........................26

평가판 라이센스..........................11

표현식...............................................JavaScript....................................

표현식으로 자바스크립트..........35JavaScript....................................

Rhino 자바스크립트 구현 라이브러

리.......................................35snippet....................................32

메쏘드..........................................

자바독.................................33

메쏘드를 포함할 수 있습니다...........32

메쏘드를 호출하는 방법.................32

물음표 연산자.............................33

보고서 객체를 참조하기 위한 문법....32

비원형(non-primitive) 값.............34

수식은 표현식을 통해 정의.............30

언어 속성...................................30

언어를 표현식에서 지원.................12

연산자......................................31

자바.............................................

표현식의 결과는 반드시 객체......34

자바 표현식................................34

표현식 연산자.............................31

표현식의 타입.............................30

표현식의타입.................................java.lang.Boolean.................31java.lang.Byte......................31java.lang.Double..................31java.lang.Float.....................31java.lang.Integer..................31java.lang.Long.....................31java.lang.Object...................31java.lang.Short....................31java.lang.String....................31java.util.Date.......................31

그루비.................................34

그루비와 자바 코드 예제...........34

암묵적인 캐스트.....................31

자바스크립트.........................34

표현식이란.................................30

흐름 처리 키워드.........................32

ㅎ해쉬맵....................................33, 249

318 / 318