본문으로 건너뛰기

command

command는 XML 계약을 기준으로 서버 측 CLI 프로세스와 Web URL 호출을 실행하는 모듈입니다. transact 계약에서 CommandTypeC로 지정하면 RoutingCommandUri 규칙에 따라 /command/api/execution으로 라우팅됩니다.

책임 범위

  • 계약에 등록된 실행 파일, 인자, 작업 디렉터리를 해석해 shell 없이 프로세스를 실행합니다.
  • HTTP 요청 계약을 읽어 URL, query string, header, authorization, body를 구성합니다.
  • { @Parameter }, { #Parameter } 치환 규칙으로 요청 값을 실행 명령이나 Web 요청에 주입합니다.
  • 실행 결과를 HandStack의 표준 응답 형식으로 반환하고, 필요 시 logger 모듈로 거래 로그를 전송합니다.

주요 API

메서드경로용도
GET/command/api/execution/has계약 캐시에 실행 ID가 있는지 확인합니다.
GET/command/api/execution/refresh계약 파일을 다시 읽어 캐시를 갱신합니다.
GET/command/api/execution/retrieve실행 계약 원문 또는 메타 정보를 조회합니다.
GET/command/api/execution/meta실행 계약의 입력/출력 메타 정보를 반환합니다.
POST/command/api/executionCLI 또는 Web 요청 계약을 실행합니다.

핵심 구현

  • Areas/command/Controllers/ExecutionController.cs: 외부 API 진입점입니다.
  • DataClient/CommandClient.cs: 계약 검색, 파라미터 바인딩, CLI/Web 실행을 담당합니다.
  • Extensions/CommandMapper.cs: XML 계약을 메모리 매핑으로 로드하고 refresh를 처리합니다.
  • Entity/ModuleConfigJson.cs: module.json의 설정 스키마입니다.

계약과 식별자

계약은 기본적으로 다음 위치에 둡니다.

contracts/command/{ApplicationID}/{ProjectID}/{TransactionID}.xml

실행 ID는 다음 형식으로 조회됩니다.

ApplicationID|ProjectID|TransactionID|CommandID

계약의 <commands>는 CLI 실행을, <requests>는 Web URL 호출을 정의합니다. CommandID는 계약의 idseq 조합으로 관리되므로, 같은 거래 파일 안에서 중복되지 않아야 합니다.

주요 설정

설정설명
ContractBasePathcommand XML 계약 루트 목록입니다.
IsContractFileWatching계약 파일 변경 감시 여부입니다. 개발 환경에서는 편리하지만 운영에서는 변경 통제와 함께 사용합니다.
DefaultCommandTimeout계약에 timeout이 없을 때 적용되는 기본 실행 제한 시간입니다.
DefaultMaxOutputBytesCLI 실행 결과로 수집할 최대 출력 크기입니다.
Security.AllowedExecutableBasePathsCLI 실행 파일을 허용할 기준 경로 목록입니다. 비어 있으면 운영 정책상 허용 범위를 별도로 검토해야 합니다.
Security.BlockedForwardHeadersWeb 요청으로 전달하지 않을 HTTP 헤더 목록입니다.
LogServerUrl거래 로그를 전송할 logger API입니다.

transact 연동

transact 거래 계약에서는 CommandTypeC로 둡니다.

{
"ServiceID": "CMD010",
"CommandType": "C",
"ReturnType": "Json"
}

transact/module.json의 라우팅은 환경별로 다음 형태를 사용합니다.

{
"HDS|*|C|D": "http://localhost:8421/command/api/execution",
"HDS|*|C|P": "http://localhost:8421/command/api/execution",
"HDS|*|C|T": "http://localhost:8421/command/api/execution"
}

운영 주의사항

  • command는 서버 권한으로 외부 프로세스를 실행할 수 있으므로 계약 리뷰와 실행 파일 allowlist가 필수입니다.
  • shell 문자열을 조립하는 방식이 아니라 실행 파일과 인자를 분리해 선언해야 합니다.
  • Web 요청 계약에서 인증 헤더와 API Key를 사용할 때는 값 자체를 계약에 고정하지 말고 환경별 설정이나 요청 파라미터로 주입합니다.
  • 운영 환경에서는 DefaultCommandTimeout, DefaultMaxOutputBytes, 로그 저장 정책을 서비스별로 검토합니다.