카테고리 없음

배치

anythingsay 2026. 5. 12. 11:13

SAP BusinessObjects 4.3 SP4 환경에서 BO API로 만든 프로그램을 배치 파일로 실행하는 샘플을 보여드리겠습니다.

## 전제 조건

- Java 기반 BO SDK (RESTful SDK 또는 Java SDK)
- BOE 서버 연결 정보

---

## 1. Java 프로그램 예시 (BO SDK)

```java
// BOReportRunner.java
import com.crystaldecisions.sdk.framework.*;
import com.crystaldecisions.sdk.occa.infostore.*;
import com.crystaldecisions.sdk.plugin.desktop.report.*;

public class BOReportRunner {

    public static void main(String[] args) throws Exception {
        if (args.length < 4) {
            System.out.println("Usage: BOReportRunner <server> <username> <password> <reportName>");
            System.exit(1);
        }

        String server   = args[0];
        String username = args[1];
        String password = args[2];
        String reportName = args[3];

        IEnterpriseSession session = null;

        try {
            // 1. 세션 연결
            ISessionMgr mgr = CrystalEnterprise.getSessionMgr();
            session = mgr.logon(username, password, server, "secEnterprise");
            System.out.println("[INFO] BO 로그인 성공: " + server);

            // 2. InfoStore 쿼리
            IInfoStore infoStore = (IInfoStore) session.getService("", "InfoStore");
            String query = "SELECT SI_ID, SI_NAME FROM CI_INFOOBJECTS "
                         + "WHERE SI_NAME='" + reportName + "' "
                         + "AND SI_PROGID='CrystalEnterprise.Report'";
            IInfoObjects results = infoStore.query(query);

            if (results.size() == 0) {
                System.out.println("[ERROR] 리포트를 찾을 수 없습니다: " + reportName);
                System.exit(2);
            }

            // 3. 리포트 스케줄 실행
            IInfoObject report = (IInfoObject) results.get(0);
            ISchedulingInfo schedInfo = report.getSchedulingInfo();
            schedInfo.setType(CeScheduleType.ONCE);
            infoStore.schedule(results);

            System.out.println("[INFO] 리포트 스케줄 완료: " + reportName
                             + " (ID: " + report.getID() + ")");

        } finally {
            if (session != null) session.logoff();
            System.out.println("[INFO] 세션 종료");
        }
    }
}
```

---

## 2. 배치 파일 (`run_bo_report.bat`)

```bat
@echo off
setlocal EnableDelayedExpansion

:: ================================================
:: BO Report Runner - Batch Launcher
:: 용도: BO API Java 프로그램 실행 래퍼
:: ================================================

:: --- 환경 설정 ---
set BO_HOME=C:\Program Files (x86)\SAP BusinessObjects\SAP BusinessObjects Enterprise XI 4.0
set JAVA_HOME=C:\Program Files\Java\jdk1.8.0_351
set APP_HOME=C:\BOApp

:: --- BO SDK Classpath ---
set CP=%APP_HOME%\BOReportRunner.jar
set CP=%CP%;%BO_HOME%\java\lib\cecore.jar
set CP=%CP%;%BO_HOME%\java\lib\celib.jar
set CP=%CP%;%BO_HOME%\java\lib\ceplugins.jar
set CP=%CP%;%BO_HOME%\java\lib\cesession.jar
set CP=%CP%;%BO_HOME%\java\lib\corbaidl.jar
set CP=%CP%;%BO_HOME%\java\lib\ebus420.jar
set CP=%CP%;%BO_HOME%\java\lib\logging.jar

:: --- 실행 파라미터 ---
set BO_SERVER=your-bo-server:6400
set BO_USER=Administrator
set BO_PASS=your_password
set REPORT_NAME=Monthly_Sales_Report

:: --- 로그 설정 ---
set LOG_DIR=%APP_HOME%\logs
set LOG_FILE=%LOG_DIR%\bo_report_%DATE:~0,4%%DATE:~5,2%%DATE:~8,2%_%TIME:~0,2%%TIME:~3,2%%TIME:~6,2%.log
set LOG_FILE=%LOG_FILE: =0%

if not exist "%LOG_DIR%" mkdir "%LOG_DIR%"

:: --- 실행 ---
echo [%DATE% %TIME%] BO Report Runner 시작 >> "%LOG_FILE%"
echo [%DATE% %TIME%] Server: %BO_SERVER%, Report: %REPORT_NAME% >> "%LOG_FILE%"

"%JAVA_HOME%\bin\java.exe" ^
    -cp "%CP%" ^
    -Xms256m -Xmx512m ^
    BOReportRunner ^
    "%BO_SERVER%" "%BO_USER%" "%BO_PASS%" "%REPORT_NAME%" ^
    >> "%LOG_FILE%" 2>&1

set EXIT_CODE=%ERRORLEVEL%

if %EXIT_CODE% EQU 0 (
    echo [%DATE% %TIME%] 실행 성공 (Exit: %EXIT_CODE%) >> "%LOG_FILE%"
    echo 성공적으로 완료되었습니다.
) else (
    echo [%DATE% %TIME%] 실행 실패 (Exit: %EXIT_CODE%) >> "%LOG_FILE%"
    echo [오류] 실행 실패. 로그 확인: %LOG_FILE%
)

endlocal
exit /b %EXIT_CODE%
```

---

## 3. Windows 스케줄러 등록 배치 (`register_task.bat`)

```bat
@echo off
:: ================================================
:: Windows Task Scheduler 등록 스크립트
:: 관리자 권한으로 실행 필요
:: ================================================

set TASK_NAME=BO_Monthly_Report
set BAT_FILE=C:\BOApp\run_bo_report.bat
set RUN_USER=DOMAIN\svc_bo_account
set RUN_TIME=06:00
set SCHEDULE=MONTHLY
set RUN_DAY=1

echo [작업 스케줄러 등록 시작]

:: 기존 작업 삭제 (있을 경우)
schtasks /delete /tn "%TASK_NAME%" /f >nul 2>&1

:: 신규 등록
schtasks /create ^
    /tn "%TASK_NAME%" ^
    /tr "\"%BAT_FILE%\"" ^
    /sc %SCHEDULE% ^
    /d %RUN_DAY% ^
    /st %RUN_TIME% ^
    /ru "%RUN_USER%" ^
    /rp ^
    /rl HIGHEST ^
    /f

if %ERRORLEVEL% EQU 0 (
    echo [성공] 작업 등록 완료: %TASK_NAME%
    echo        실행 시간: 매월 %RUN_DAY%일 %RUN_TIME%
) else (
    echo [오류] 작업 등록 실패. 관리자 권한으로 실행하세요.
)

:: 등록 확인
echo.
echo [등록된 작업 정보]
schtasks /query /tn "%TASK_NAME%" /fo LIST

pause
```

---

## 4. 폴더 구조 및 실행 방법

```
C:\BOApp\
├── BOReportRunner.jar       ← 컴파일된 Java 프로그램
├── run_bo_report.bat        ← 실행 배치
├── register_task.bat        ← 스케줄러 등록
└── logs\
    └── bo_report_YYYYMMDD_HHMMSS.log
```

**명령라인 직접 실행:**
```bat
C:\BOApp\run_bo_report.bat
```

**스케줄러 등록 (관리자 CMD):**
```bat
C:\BOApp\register_task.bat
```

---

## 주요 포인트

| 항목 | 내용 |
|------|------|
| **비밀번호 보안** | 배치 파일 대신 암호화된 설정 파일 또는 Windows Credential Manager 사용 권장 |
| **로그 관리** | 날짜/시간 기반 로그 파일로 이력 추적 |
| **Exit Code** | Java 프로그램의 `System.exit()` 코드를 배치에서 그대로 전달 |
| **서비스 계정** | 스케줄러는 전용 서비스 계정(`svc_bo_account`)으로 실행 권장 |

추가로 필요한 부분(REST API 방식, 리포트 파라미터 전달, 이메일 알림 등)이 있으면 말씀해 주세요!