개요
FineReport(FR)를 활용한 리포트 개발 시, 사용자 편의를 위해 시작 날짜와 종료 날짜 컨트롤에 적절한 기본값을 설정하는 것은 매우 중요합니다. 단순히 현재 날짜를 보여주는 것을 넘어, 실제 데이터가 적재된 최신 시점이나 특정 영업일 기준의 계산이 필요한 경우가 많습니다. 본 가이드에서는 거래일(Trading Day)과 자연일(Calendar Day)을 구분하여 기본값을 동적으로 할당하는 기술적 방법론을 다룹니다.
1. 최근 20거래일 기준의 시작일 설정
비즈니스 데이터가 존재하는 최신 날짜로부터 역산하여 20번째 거래일을 기본값으로 산출하는 로직입니다. 단순 날짜 차감이 아닌, 휴일을 제외한 영업일 기준의 데이터 추출에 적합합니다.
SQL 기반의 컨트롤 기본값 설정
SELECT COALESCE(
-- 1순위: 실제 영업 데이터가 존재하는 최대 날짜 기준 역산
(SELECT prev_dt
FROM (
SELECT cal_date,
LAG(cal_date, 19) OVER (ORDER BY cal_date) AS prev_dt
FROM DIM_DATE_TABLE
WHERE holiday_yn = 'N'
)
WHERE cal_date = (SELECT MAX(sales_date) FROM FACT_SALES_DATA)
),
-- 2순위: 데이터가 없을 경우 현재 시스템 날짜 이전의 최신 거래일 기준 역산
(SELECT prev_dt
FROM (
SELECT cal_date,
LAG(cal_date, 19) OVER (ORDER BY cal_date) AS prev_dt
FROM DIM_DATE_TABLE
WHERE holiday_yn = 'N'
)
WHERE cal_date = (
SELECT MAX(cal_date)
FROM DIM_DATE_TABLE
WHERE holiday_yn = 'N'
AND cal_date < TO_CHAR(SYSDATE, 'YYYYMMDD')
)
)
) AS default_start_date FROM DUAL
2. 최근 30자연일 기준 설정
자연일 기준의 경우 FineReport의 내장 함수인 DATEDELTA를 활용하거나 SQL의 날짜 연산을 통해 간결하게 구현할 수 있습니다.
DATEDELTA 함수 활용 방식
DATEDELTA(
TODATE(
SQL("JDBC_CONN_NAME",
"SELECT COALESCE(MAX(sales_date), TO_CHAR(SYSDATE, 'YYYYMMDD')) FROM FACT_SALES_DATA",
1, 1),
"YYYYMMDD"
),
-30
)
3. 월간 및 주간 특정 시점 설정
리포트의 집계 단위에 따라 매달 1일이나 매주 월요일을 기본값으로 설정해야 하는 경우, 다음의 수식을 활용합니다.
| 비즈니스 요건 | FineReport 수식 예시 |
|---|---|
| 당월 1일 | TODATE(FORMAT(NOW(), "yyyy-MM-01")) |
| 전월 1일 | TODATE(FORMAT(MONTHDELTA(NOW(), -1), "yyyy-MM-01")) |
| 이번 주 월요일 | DATEDELTA(TODATE(FORMAT(NOW(), "yyyy-MM-dd")), 1 - WEEKDAY(NOW())) |
주요 기술 포인트 분석
윈도우 함수(LAG)의 활용
영업일 계산 시 LAG 함수를 사용하면 복잡한 Join 연산 없이도 행 간 이동을 통해 이전 영업일을 효율적으로 조회할 수 있습니다. OFFSET 인자값은 'N일 전'을 기준으로 N-1을 적용하는 것이 핵심입니다.
예외 처리 로직 (Exception Handling)
비즈니스 테이블에 데이터가 적재되지 않은 초기 상태이거나, 시스템 점검 등으로 데이터가 누락된 경우를 대비해야 합니다. COALESCE 또는 NVL 함수를 사용하여 1순위(실제 데이터 기준)가 Null일 경우 2순위(시스템 날짜 기준)를 반환하도록 설계하는 것이 안정적입니다.
성능 최적화 제언
- 인덱스 활용: 날짜 차원 테이블(DIM_DATE)의 날짜 컬럼과 팩트 테이블의 날짜 컬럼에는 반드시 B-Tree 인덱스가 생성되어 있어야 합니다.
- 데이터 형식 통일: 데이터베이스 내부적으로 날짜를
YYYYMMDD형식의 문자열로 관리할지, Date 타입으로 관리할지 통일하여 불필요한 형 변환(Casting) 비용을 최소화합니다. - 서버 사이드 계산: 복잡한 날짜 연산은 가급적 SQL 단에서 처리하여 리포트 엔진의 연산 부하를 줄이는 것이 대용량 데이터 처리 시 유리합니다.