코드 구조
다음은 WebSquare5로 생성되는 XML 코드와 일반적인 HTML 코드 구조를 비교한 것입니다.
WebSquare5 코드 vs. HTML 코드
요소 | 설명 | ||
---|---|---|---|
<head> | <xf:model> | <w2:dataCollection> |
|
<xf:workflow> | submit, submitDone의 실행 순서
| ||
<xf:submission> | 서비스 호출에 필요한 submit을 정의 각 submit은 고유 ID를 포함
| ||
<script> | 글로벌 스크립트 정의 컴포넌트의 이벤트 함수 정의
| ||
<style> | 스타일 지정 | ||
<body> | 컴포넌트, 컴포넌트 속성, 화면 UI 정보 포함
|
스크립트
scwin.onpageload
onpageload
는 WebSquare Page 파일 생성 시 자동 생성되는 이벤트입니다. Script 탭에서 onpageload
onpageunload
이벤트를 정의할 수 있으며, onpageload
이벤트는 페이지 로딩 후 실행됩니다.
페이지 컴포넌트 생성
페이지 컴포넌트 생성 후
YouTube 동영상 (https://youtu.be/Sw4DU7GlCK4)
scwin.onbeforepageunload
onbeforepageunload
이벤트는 WebSquare 페이지를 닫을 경우, 페이지가 닫히기 전 해당 페이지의 body 부분에서 발생합니다. onbeforepageunload
이벤트는 Outline 뷰의 Design 탭에서 Body를 우클릭하여 추가할 수 있습니다.
Body에 이벤트 추가
YouTube 동영상 (https://youtu.be/igtLcV9vBbY)
<initScript>
아래와 같이 client.config.xml 파일을 설정하여 initScript
를 등록할 수 있습니다. 페이지 로딩 직후 실행되며 scwin.onpageload
스크립트 이전에 실행됩니다.
client.config.xml 설정 예 (initScript
)
<postScript>
아래와 같이 client.config.xml 파일을 설정하여 postScript
를 등록할 수 있습니다. postScript
는 페이지 로딩 시 scwin.onpageload
스크립트가 실행된 후에 실행됩니다.
client.config.xml 설정 예 (postScript
)
스크립트 실행 순서
Scope 기능 사용 시 스크립트는 아래의 순서로 동작합니다.
외부 JS 파일
로컬 스크립트
<initScript>
onpageload
<postScript>
메인 페이지가 WFrame을 포함하는 경우, 실행 순서는 아래와 같습니다.
순서 | 대 항목 | 세부 순서 | 세부 항목 |
---|---|---|---|
1 | 외부 JS 파일 | 1-1 | 메인 페이지 |
1-2 | WFrame | ||
2 | 로컬 영역의 스크립트 | 2-1 | 메인 페이지 |
2-2 | WFrame | ||
3 | <initScript> (config.xml 파일에 정의) | 3-1 | 메인 페이지 |
3-2 | WFrame | ||
4 | onpageload | 4-1 | 메인 페이지 |
4-2 | WFrame | ||
5 | <postScript> (config.xml 파일에 정의) | 5-1 | WFrame |
5-2 | 메인 페이지 |
WFrame이 중첩된 경우
메인 화면이 WFrame을 중첩 포함하고 있는 경우, 스크립트 수행 순서는 아래와 같습니다.
스크립트 실행 순서 (initScript, onpageload, postScript)
위의 그림의 순서를 표로 나타내면 아래와 같습니다.
화면 | initScript | onpageload | postScript | ||||
---|---|---|---|---|---|---|---|
메인 | 1 | 7 | 18 | ||||
WFrame1 | 2 | 8 | 15 | ||||
WFrame1-1 | 3 | 9 | 13 | ||||
WFrame1-2 | 4 | 10 | 14 | ||||
WFrame2 | 5 | 11 | 17 | ||||
WFrame2-1 | 6 | 12 | 16 |
onpageload
발생 순서
예제 파일
인터넷에서 다운로드 혹은
WEBSQUARE_DEV_PACK의 GUIDE 프로젝트에서 보기
(/WFrame/onpageload_execution_sequence_WFrame/)
YouTube 동영상 (https://youtu.be/dhRGB_CQnAw)
onpageload
, initScript
, postScript
발생 순서
YouTube 동영상 (https://youtu.be/r7WapwWZoZw)
Scope 기능 미적용 시
참고로 Scope 기능을 사용하지 않는 경우, 스크립트 수행 순서는 아래와 같습니다.
외부 JS 파일:
PageInherit 컴포넌트의 외부 JS 파일 로딩.
메인 페이지의 외부 JS 파일 로딩.
WFrame 컴포넌트의 외부 JS 파일 로딩.
메인 페이지:
메인 페이지의 initScript (config.xml 파일에 정의된 JS 파일.)
메인 페이지의 <script> 영역에 정의된 스크립트.
메인 페이지의 onpageload 이벤트 (화면의 <script> 영역에 정의.)
WFrame 컴포넌트:
WFrame 컴포넌트의 initScript (config.xml 파일에 정의된 JS 파일.)
WFrame 컴포넌트의 <script> 영역에 정의된 스크립트.
WFrame 컴포넌트의 onpageload 이벤트 (화면의 <script> 영역에 정의.)
postScript:
WFrame 컴포넌트의 postScript (config.xml 파일에 정의된 JS 파일.)
메인 페이지의 postScript (config.xml 파일에 정의된 JS 파일.)
W-Pack (JS 변환)
웹스퀘어5는 화면 소스를 JavaScript로 빌드할 수 있는 W-Pack을 제공합니다. 스튜디오에서 개발한 화면 파일은 XML 형식으로 생성되며, W-Pack은 이를 JavaScript 파일로 변환합니다.
W-Pack
- 파일 크기 감소
압축 및 최소화(Minify) 기능을 제공하여, 기존 XML 형식과 비교하여 파일 크기가 감소되었습니다.
- 보안성 개선
난독화(Obfuscation)를 통해 소스 코드의 보안성을 높였습니다.
- 속도 개선
웹 환경에 최적화된 JS 파일은 XML과 비교하여 로딩 시간이 짧고 메모리 사용량이 적어, 웹스퀘어 엔진은 JS 파일을 이용하여 더욱 빨리 화면을 브라우저에 그릴 수 있습니다.
XML 화면 파일은 JS 파일로 변환되어 /WebContent/_wpack_/ 폴더 아래에 저장됩니다. 화면 파일 개발에 사용한 공통 리소스도 JS 파일로 변환되어 /WebContent/_wpack_/cm/ 폴더 아래에 저장됩니다.
W-Pack 폴더
브라우저 호출
WebSquare Studio에서 작성한 화면은 XML 파일로 생성되며, W-Pack에 의해 JS 파일로 변환되며, 브라우저는 XML 파일을 표시하나 화면을 표시할 때 실제로 사용하는 파일은 JS 파일입니다.
WebSquare5로 개발한 화면의 브라우저 호출 순서는 아래와 같습니다.
브라우저에서 화면을 호출합니다.
서버 쪽 WebSquare5 엔진의 websquare.html 파일이 호출됩니다.
WebSquare5 엔진이 구동됩니다.
화면에 해당하는 XML 파일을 URL로 호출합니다.
W-Pack에 의해 변환된 JS 파일이 로딩됩니다.
해당 화면이 브라우저에 표시됩니다.
화면 호출 순서
브라우저에는 호출한 화면의 XML 파일 명이 표시됩니다.
브라우저 표시 주소 (test.xml)
실제 브라우저에 구동되는 파일은 아래와 같이 JS 파일입니다.
실제 로딩 파일 (test.js)
웹표준 호환성
비표준 태그 처리
컴포넌트 별로 사용자 정의 attribute를 사용하는 경우, w3c validator에서 오류가 검출됩니다. client.config.xml 설정 파일에 <dataPrefix>
항목을 아래와 같이 설정하면 "data-"
prefix가 추가되어 오류가 발생하지 않습니다.
$r_title(설정 예)
<WebSquare>
<dataPrefix value="true" />
</WebSquare>
$r_title(적용 전) <th removeborderstyle="false" or_wd="70" inputtype="select" style="text-align: center; position: static;" id="grid1_column1" value="" blockselect="false" displaymode="label" datatype="" customformatter="aaaa" alloption="" chooseoption="" ref="" onchangefunction="doTest" colindex="0" role="gridcell" class="gridHeaderTDDefault gridHeaderTDDefault_data grid1_header__column0" col_id="column1" header_id="column1"> ... </th>
$r_title(적용 후) <th data-or_wd="70" data-inputtype="select" style="text-align: center; position: static;" id="grid1_column1" data-value="" data-datatype="" data-onchangefunction="doTest" data-colindex="0" class="gridHeaderTDDefault gridHeaderTDDefault_data grid1_header__column0" data-col_id="column1" data-header_id="column1"> ... </th>
GridView의 <nobr>
태그
GridView에서 텍스트 데이터를 출력할 경우 <nobr>
태그로 출력됩니다. <nobr>
태그는 비권장 태그입니다. client.config.xml 설정 파일에 <gridView>
– <dataTag>
항목을 아래와 같이 설정하여, <nobr>
태그 대신 <span>
태그로 출력하십시오.
$r_title(설정 예)
<WebSquare>
<gridView>
<dataTag value="span" />
</gridView>
</WebSquare>
XML의 namespace 제거
client.config.xml 설정 파일에 <removeXmlNameSpace
>
항목을 아래와 같이 설정하면, XML 관련 namespace를 제거할 수 있습니다.
$r_title(설정 예)
<WebSquare>
<removeXmlNameSpace value="true" />
</WebSquare>
Scope
Scope 기능을 사용할 경우 개발자는 웹페이지 전체를 하나의 Single Page로 쉽게 구현할 수 있습니다. 보통의 경우 IFrame을 프레임 단위로 사용하지만, IFrame은 매번 사용할 때마다 브라우저가 다시 로딩되기 때문에 메모리 부하가 증가하는 단점이 있었습니다. 독립된 단위로 동작하는 WFrame은 기존의 IFrame을 대체할 수 있으며, 개발자는 IFrame 사용을 최소화하여 웹 어플리케이션의 전반적인 성능을 개선할 수 있습니다.
WFrame 권장
외부 솔루션과의 연계 등 브라우저를 다시 로딩하여 메모리를 비워야 하는 것과 같이 특수한 경우에만 IFrame을 사용하십시오. 대부분의 경우, WFrame 사용을 권장합니다.
YouTube 동영상 (https://youtu.be/rdDGRo2gF8I)
YouTube 동영상 (https://youtu.be/958L9UKfYiY)
주요 API
항목 | API | 설명 |
---|---|---|
$p | main |
|
$ |
| |
$p.debug | getScope |
|
getFrame |
| |
WFrame | getWindow |
|
TabControl | getWindow |
|
WindowContainer | getFrame |
|
API | 설명 |
---|---|
getWindow | WFrame의 Scope객체를 반환. wframe 화면 안의 객체를 접근하려면 이 함수를 호출해야 함. |
getSrc | 현재 WFrame이 포함하고 있는 페이지의 주소를 반환. |
setSrc | WFrame 화면을 url에 해당하는 화면으로 동적으로 변경. |
remove | wframe을 완전히 제거. |
$w.top vs. $p.top
$w.top | $p.top |
---|---|
기존에는 최상위 window의 window객체 반환. | 웹스퀘어 최상위 window의 scope 객체를 반환하도록 변경됨. |
$w.parent vs. $p.parent
$w.parent | $p.parent |
---|---|
부모의 frame window를 반환. | 최상위 window에서 $p.parent를 호출한 경우, scope 객체를 반환하도록 변경됨. |
windowContainer.getWindow
windowContainer.getWindow | windowContainer.getWindow |
---|---|
|
|
dataObject를 통한 파라미터 전달
컴포넌트 | API | 설명 |
---|---|---|
|
|
|
TabControl |
|
|
WindowConainer |
|
|
WFrame |
|
|
IFrame |
|
|
$p.openPopup()
openPopup
()
함수를 이용하여 WFrame 팝업을 생성할 때 dataObjec
t를 통해 파라미터를 전달할 수 있습니다. 생성된 팝업의 src
페이지는 $p.getParameter(
) 함수를를 통해 전달받은 파라미터 확인 가능합니다.
$r_title(openPopup() 함수로 팝업을 생성할 때 파라미터 전달 (예시)) requires("uiplugin.popup"); var rowJSON = { "Product Info": { "Origin": "Korea", "Manufacturer": "Inswave", "Type": "Software" }, "Region": "Seoul", "Carrier": true }; var dataObject = { "type": "json", "name": "param", "data": rowJSON }; var options = { id: "popup1", type: "wframePopup", height: "300px", width: "300px", dataObject: dataObject }; $p.openPopup("src.xml", options);
또한 팝업에 설정된 페이지 정보는 아래 방법으로 확인할 수 있습니다.
$r_title(팝업에서 전달받은 파라미터 확인 (예시 1))
var paramData = $p.getParameter("param");
var data = JSON.stringify(paramData);
alert(data);
$r_title(팝업에서 전달받은 파라미터 확인 (예시 2)) var paramData = $p.getParameter("param"); alert("param : " + paramData.Region);
YouTube 동영상 (https://youtu.be/WF4TOcHZCxI)
TabControl
addTab()
함수로 추가하는 탭에 dataObject
를 통해 파라미터를 전달할 수 있습니다. 생성된 탭에서는 $p.getParameter()
함수를 통해 전달받은 파라미터 확인 가능합니다.
$r_title(addTab() 함수로 탭을 생성할 때 파라미터 전달 (예시)) var rowJSON = { "Product Info": { "Origin": "Korea", "Manufacturer": "Inswave", "Type": "Software" }, "Region": "Seoul", "Carrier": true }; var dataObject = { "type": "json", "name": "param", "data": rowJSON }; tabControl1.addTab("tab_01", { "label": "New", "title": "dataObject", "openAction": "exist", "closable": "true" }, { "src": "src.xml", "frameMode": "wframePreload", "scope": "true", "dataObject": dataObject });
$r_title(탭에서 전달받은 파라미터 확인 (예시)) var paramData = $p.getParameter("param"); var data = JSON.stringify(paramData); alert(data);
예제 파일
인터넷에서 다운로드 혹은
WEBSQUARE_DEV_PACK의 GUIDE 프로젝트에서 보기
(/TabControl/getParameter_$p_addTab_TabControl/)
YouTube 동영상 (https://youtu.be/Z2Mrdxt2uws)
WindowContainer
createWindow()
함수를 통해 추가하는 윈도우에 dataObject
를 통해 파라미터를 전달할 수 있습니다. 생성된 윈도우에서는 $p.getParameter()
함수를 통해 전달받은 파라미터 확인 가능합니다.
$r_title(createWindow() 함수로 윈도우를 생성할 때 파라미터 전달 (예시)) var rowJSON = { "Product Info": { "Origin": "Korea", "Manufacturer": "Inswave", "Type": "Software" }, "Region": "Seoul", "Carrier": true }; var dataObject = { "type": "json", "name": "param", "data": rowJSON }; var obj = { "title": "Test", "windowID": "001", "frameMode": "wframe", "src": "src.xml", "dataObject": dataObject }; windowContainer1.createWindow(obj);
$r_title(윈도우에서 전달받은 파라미터 확인 (예시)) var paramData = $p.getParameter("param"); var data = JSON.stringify(paramData); alert(data);
예제 파일
인터넷에서 다운로드 혹은
WEBSQUARE_DEV_PACK의 GUIDE 프로젝트에서 보기
(/WindowContainer/getParameter_$p_createWindow_WindowContainer/)
YouTube 동영상 (https://youtu.be/XYuqgVugfEo)
WFrame
WFrame에 setSrc()
함수를 이용하여 페이지를 설정할 때 dataObjec
t를 통해 파라미터를 전달할 수 있습니다. 생성된 WFrame의 src
페이지는 $p.getParameter(
) 함수를를 통해 전달받은 파라미터 확인 가능합니다.
$r_title(setSrc() 함수로 페이지를 설정할 때 파라미터 전달 (예시)) var rowJSON = { "Product Info": { "Origin": "Korea", "Manufacturer": "Inswave", "Type": "Software" }, "Region": "Seoul", "Carrier": true }; var dataObject = { "type": "json", "name": "param", "data": rowJSON }; var obj = { "dataObject": dataObject }; wframe1.setSrc("src.xml", obj);
또한 WFrame에 설정된 페이지 정보는 아래 방법으로 확인할 수 있습니다.
$r_title(WFrame에서 전달받은 파라미터 확인 (예시 1)) var paramData = $p.getParameter("param"); var data = JSON.stringify(paramData); alert(data);
$r_title(WFrame에서 전달받은 파라미터 확인 (예시 2))
var param = $p.getParameter("param");
alert("param : " + param.userId);
YouTube 동영상 (https://youtu.be/FFOc-jYbgEw)