handstack-patterns
Handstack 아키텍처 및 개발 패턴
Handstack 프레임워크는 프론트엔드(View)와 백엔드(Contract/XML)가 명확히 분리된 구조를 가집니다.
아키텍처 개요
1. View (프론트엔드)
- 위치:
src/view/{Project}/{Module}/{ID}.js및.html - 기술: HTML, JavaScript (ES6+),
syn라이브러리 - 구조:
HTML:syn_auigrid,syn_data등 커스텀 태그를 사용하여 UI 구성JS: 전역 객체$CDM010(ID와 동일) 내에 설정 및 로직 정의
2. Contract (백엔드)
- 위치:
src/Contracts/dbclient/HDS/{Module}/{ID}.xml - 기술: XML, SQL (MSSQL/T-SQL 기반)
- 구조:
<statement>태그 내에 SQL 쿼리 정의 및<param>으로 입력 매개변수 매핑
상세 구조
View (JS) 객체 구조
src/view/.../CDM010.js 예시:
let $CDM010 = {
// 1. 설정 및 데이터 소스
config: {
dataSource: { ... },
actionButtons: [ ... ]
},
// 2. 상태 관리 (React의 state와 유사)
prop: {
groupCode: null,
activeRow: null
},
// 3. 트랜잭션 매핑 (중요)
transaction: {
LD01: { inputs: [...], outputs: [...] }, // 조회
MD01: { inputs: [...], outputs: [] } // 저장/수정
},
// 4. 생명주기 및 훅
hook: {
pageLoad() { ... },
afterTransaction(error, functionID, response) { ... }
},
// 5. UI 이벤트 핸들러
event: {
btnSearch_click() { ... }
},
// 6. 비즈니스 로직
method: {
search() { syn.$w.transactionAction('LD01'); }
}
}
Contract (XML) 구조
src/Contracts/.../CDM010.xml 예시:
<mapper>
<header>
<application>HDS</application>
<transaction>CDM010</transaction>
</header>
<commands>
<!-- 조회 쿼리 -->
<statement id="LD01">
<![CDATA[ SELECT * FROM BaseCode WHERE ... ]]>
</statement>
<!-- 동적 쿼리 (MyBatis와 유사) -->
<statement id="MD01">
<if test="(Flag == 'C')">
<![CDATA[ INSERT INTO ... ]]>
</if>
<param id="@GroupCode" type="String" />
</statement>
</commands>
</mapper>
데이터 흐름
- View:
syn.$w.transactionAction('LD01')호출 - Framework:
transaction설정에 따라LD01ID를 가진 요청 전송 - Contract: XML 파일에서
id="LD01"인 statement 실행 - View:
hook.afterTransaction에서 결과 처리 및 그리드 바인딩
개발 시 주의사 항
- ID 일치: JS 파일명, 객체명(
$ID), XML 파일명, XML 내transaction태그가 모두 일치해야 함. - Statement ID: JS의
transaction객체 키와 XML의statement id가 정확히 일치해야 함. - SQL 문법: T-SQL 문법을 따르며, 동적 쿼리 처리를 위해
<if>태그 활용 가능.