본문으로 건너뛰기

거래 계약 개념

주제 목차 · 다음: 데이터 맵과 전문

이 문서의 결과: transact 계약이 화면과 SQL 사이에 존재하는 이유와 필드 구조를 설명한다.

왜 한 단계를 더 두는가

화면이 SQL을 직접 호출한다면 화면마다 서버 구조를 알아야 하고, 인증·로그·트랜잭션 관리를 화면 코드가 떠안게 됩니다. transact 모듈이 이를 대신 처리하도록 화면은 "이 기능을 실행해 줘"라고만 요청합니다.

[화면] syn.$w.transactionAction('LD01')
v
[transact] BOD010.json 계약 확인 → 인증 → GlobalID 부여 → 로그 기록
v
[dbclient] BOD010.xml 의 LD01 SQL 실행
v
[transact] 결과를 Outputs 정의대로 변환해 응답

transact 계약 예시

{
"ApplicationID": "HDS",
"ProjectID": "BOD",
"TransactionID": "BOD010",
"Services": [
{
"ServiceID": "LD01",
"Authorize": false,
"ReturnType": "Json",
"CommandType": "D",
"TransactionScope": false,
"Inputs": [
{ "ModelID": "Dynamic", "Fields": [], "Type": "Row" }
],
"Outputs": [
{ "ModelID": "Dynamic", "Fields": [], "Type": "Grid" }
]
}
]
}
필드역할
Authorize인증 필요 여부. 운영에서는 공개 거래 정책으로 명시적으로 관리 (자세한 내용은 11. 환경설정과 보안)
CommandTypeD(dbclient), F(function) 등 실행 대상 모듈 구분
TransactionScope데이터베이스 트랜잭션 범위. 조회는 false, 여러 테이블을 함께 바꾸는 저장은 true
Inputs/Outputs데이터 맵 정의. 종류는 데이터 맵과 전문에서 다룹니다

계약과 전문 전체 구조는 계약 중심 거래에서 필드 단위로 확인할 수 있습니다.

자주 하는 오해

"CommandType이 거래 종류를 뜻하나요?" 아닙니다. CommandType은 이 기능이 어느 모듈로 라우팅될지를 정합니다. D는 dbclient(SQL), F는 function(서버 함수)입니다. 거래 자체의 성격이 아니라 실행 대상을 고르는 스위치라고 이해하는 것이 정확합니다.

"TransactionScope를 항상 true로 두면 더 안전하지 않나요?" 아닙니다. 불필요하게 트랜잭션 범위를 열면 잠금 시간이 늘어나 성능이 떨어집니다. 조회처럼 데이터를 바꾸지 않는 기능은 false로 두고, 여러 테이블을 함께 바꾸는 저장에만 true를 사용합니다.

이것만 기억하세요

  1. 화면은 기능 ID만 부르고, 나머지는 계약이 정한다.
  2. CommandType은 실행 대상 모듈을, TransactionScope는 DB 트랜잭션 범위를 정한다.