속도개선 방법

웹브라우저 고려사항

웹브라우저의 경우 인터넷익스플로러(IE) 점유일이 많아 많은 고객사에서 기본브라우저로 사용합니다,
HTML5는 현재 IE10이상을 사용해야만 제대로된 javascript를 지원받아 범용성 및 활용 가치가 있습니다.

따라서 윈도우7 사용자라면 초기에 IE11로 맞춰서 사용하는 것을 권장합니다.
윈도우 XP를 사용하는 경우라면 최소 IE8브라우저에 ServicePack3을 설치하여 사용할 것을 권장합니다.

현재 윈도우XP의 경우 보안업데이트가 중단된 상태이므로 PC업그레이드를 권장합니다.

동기 통신 보다 비동기 통신 권장

중요도 : 상

서비스 요청 건수 최소화

중요도 : 상

조회 후 후처리 작업 최소화

중요도 : 중

Dataset Enableevent 지정

중요도 : 상

그리드에서 expr 최소화

중요도 : 중

대용량 데이터 조회시

중요도 : 상

Themes 파일 사이즈 최소화

중요도 : 중

CSS, GlobalVariables, TypeDefinition 최적화

중요도 : 중

웹이미지 경로 지정시 prefixed 사용

스크립트에서 객체에 웹이미지를 지정시 전체 경로를 바로 지정하는 것보다 Services항목에 prefixid를 설정하여 호출하는 것이 서버 환경변경시 대응이 용이합니다.
(변경전 ) 
ImageViewer.image = "URL('http://www.tobesoft.com/logo.gif')"
 
(변경후)
Services항목에 prefixed = "ImageHost"를 등록,
url=''http://www.tobesoft.com/' 지정후
ImageViewer.image = "URL('ImageHost::logo.gif')"

Tab 화면에서 preload 설정

중요도 : 상

Include 파일 최소화

중요도 : 중

소스 Compress

중요도 : 상

Application 운영시 초기 로딩속도 성능개선 가이드

서버환경설정(예:Apach Tomcat)

keep-alive 설정

특정 한 프로세스가 특정 사용자의 지속적인 요청 작업을 계속해서 처리하도록 함.
keepAliveTimeout값이 채워지기 전에 다시 요청이 온다면 다시 keepAliveTimeout은 다시 0부터 cont를 수행

Keep-alive관련된 설정은 각 서버(WAS)의 설정을 참고하세요.

업무특성상 정해진 인력이 계속 연결해서 쓰는것이면 keep-alive가 더 좋은 성능을 보일것입니다

gZip압축

gZip이란?

gzip은 파일 압축에 쓰이는 응용 소프트웨어이다. 
gzip은 GNU zip의 준말이며, 초기 유닉스 시스템에 쓰이던 압축 프로그램을 대체하기 위한 자유 소프트웨어이다. gzip은 Jean-loup Gailly와 마크 애들러가 만들었다. 
버전 0.1은 1992년 10월 31일에 처음 공개되었으며, 버전 1.0이 1993년 2월에 뒤따라 나왔다. 
오픈BSD의 gzip 버전은 더 오래된 압축 프로그램을 기반으로 하고 있으며, 오픈BSD 3.4에 추가되었다
<Tomcat 기준 : Server.xml]
Connector compressableMimeType="application/javascript,text/xml,text/javascript,application/xml,text/css,application/x-javascript,text/json,application/json,text/plain"
      compression="off"
      URIEncoding="UTF-8"
      useSendfile="false"
      compressionMinSize="2048"
      connectionTimeout="20000"
      port="8080"
      ...중략 ... 
compression="off" 를 on으로 설정시 압축되어서 속도 향상이 가능합니다.

각 서버(WAS)별 설정방법은 해당 밴더사에 문의하시기 바랍니다.

WAS에서 compression기능을 사용하게 되면 WAS의 리소스를 이용하기 때문에 다소 서버 부하가

발생할 수 있으나, 네트웍 구간의 사이즈는 줄일 수 있는 장점을 가지고 있습니다.

적용확인

크롬브라우저 단축키(f12) / network

network

참고사항 (일부엔진모듈 gzip처리방법)

<script type="text/javascript" src="./nexacro14lib/component/ComComp/Button.js.gz"></script><-- gz
<script type="text/javascript" src="./nexacro14lib/component/ComComp/Static.js"></script>
<script type="text/javascript" src="./nexacro14lib/component/ComComp/Edit.js"></script>
<script type="text/javascript" src="./nexacro14lib/component/ComComp/MaskEdit.js"></script>
<script type="text/javascript" src="./nexacro14lib/component/ComComp/TextArea.js"></script>
<script type="text/javascript" src="./nexacro14lib/component/ComComp/ImageViewer.js"></script>
<script type="text/javascript" src="./nexacro14lib/component/ComComp/CheckBox.js.gz"></script>  <-- gz
<script type="text/javascript" src="./nexacro14lib/component/ComComp/Radio.js"></script>

초기로딩 index.html 파일을 보게 되면 확장자가 .js.gz으로 만들어진 파일을 볼 수 있습니다.

이 확장자는 서버에서 처리하던 gzip을 개발자가 직접 gzip으로 압축하여 서버에 파일을 올려놓는 방법으로 서버(WAS)의 compression 기능을 사용하지 않는 방법에서 compression효과를 내는 방법입니다.

WebToB 예)
이때 서버(WAS)에서 확장자가 gz인 경우 Filter처리를 할 수 있는 옵션기능을 적용시켜 주어야 합니다.
(해당 Filter 기능 설정에 대한 부분은 WAS업체에 문의해 주시기 바랍니다.)
참고 : WebToB 환경설정파일
*HEADERS
gzip action="AddResponse", 
FieldName="Content-Encoding", FieldValue = "gzip", RegExp="W.(js.gz)$"
 <--------- 정규식을 이용하여 처리
Tomcat 예)
web.xml
아래 Fitler 내용 추가 

    <filter-mapping>
        <filter-name>gzipFilter</filter-name>
        <url-pattern>*.gz</url-pattern>
    </filter-mapping>
     <filter>
        <filter-name>gzipFilter</filter-name>
        <filter-class>gzip_nc.Gz_nc</filter-class>
    </filter>
사전 준비사항 ) java class 이용하므로 아래 소스를 컴파일해야 합니다.
package gzip_nc;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class Gz_nc implements Filter{
 @Override
 public void destroy() {
  // TODO Auto-generated method stub
  
 }
 @Override 
 public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2)
   throws IOException, ServletException {
   HttpServletRequest  httpRequest  = (HttpServletRequest)  arg0;
   HttpServletResponse httpResponse = (HttpServletResponse) arg1;
   httpResponse.addHeader("Content-Encoding", "gzip");
   arg2.doFilter(httpRequest, httpResponse); 
      
 }
 @Override
 public void init(FilterConfig arg0) throws ServletException {
  // TODO Auto-generated method stub
  
 }
}

nexacro platform14 Deploy 기능 수행방법

Deploy기능은  json모듈을 하나에 js(자바스크립트)로  머지시켜 압축을 시켜주기 때문에
용량을 최소화 시켜줘 성능을 최적화 시켜줍니다.

별도 Deploy 해줄 폴더는 만들어 사용하셔야합니다.

Build-Deploy-Deploy Application

deploy

소스 비교

before

after

NexacroLoad.json을 이용하여서 nexacro 성능개선

넥사크로를 이용하여 개발된 Application은 실행시 nexacro 공통
라이브러리인 
nexacro14lib파일을 호출하게 됩니다.
이때 호출하게되는 파일수를 줄여서 성능개선을 할수 있습니다.

nexacro 초기 구동 패킷(호출url)

수정전

url1

index.html 호출 후 main.xfdl호출까지 58번의 호출이 됩니다.

수정후

url2

index.html 호출 후 main.xfdl호출까지 6번의 호출이 됩니다.

즉 NexacroLoad.js 파일 하나로 묶어서 호출 url수를 줄일 수 있습니다.

적용방법

NexacroLoad.json을 생성하기

nexacro14lib의 사용중인 CompBase.json, ComComp.json, DeviceAPI.json, Grid.json 파일을
합쳐서 1개의 NexacroLoad.json을 생성합니다.

NexacroLoad.json파일을 nexacro14lib\component\ 폴더에 복사합니다.

json내용

기존 CompBase.json 내용
 {
 "name": "ComComp",
 "version": "14.0.0.730",
 "description": "nexacro platform 14 Unified Framework Library",
 "license": "",
 "scripts": [
   "ComComp/Dataset.js", 
   "ComComp/DomObject.js",
   "ComComp/Button.js", 
   "ComComp/Static.js", 
   "ComComp/Edit.js", 
   "ComComp/MaskEdit.js", 
   "ComComp/TextArea.js", 
   "ComComp/ImageViewer.js", 
   "ComComp/CheckBox.js", 
   "ComComp/Radio.js", 
   "ComComp/ListBox.js", 
   "ComComp/Combo.js", 
   "ComComp/Div.js", 
   "ComComp/ProgressBar.js", 
   "ComComp/PopupDiv.js", 
   "ComComp/Menu.js", 
   "ComComp/PopupMenu.js", 
   "ComComp/Spin.js", 
   "ComComp/DatePicker.js", 
   "ComComp/Calendar.js", 
   "ComComp/GroupBox.js", 
   "ComComp/Tab.js", 
   "ComComp/FileDownload.js", 
   "ComComp/FileUpload.js", 
   "ComComp/FlashPlayer.js", 
   "ComComp/MediaPlayer.js",
   "ComComp/WebBrowser.js",
   "ComComp/Map.js",
   "ComComp/Sketch.js",
   "ComComp/ExportObject.js",
   "ComComp/ImportObject.js",
   "ComComp/Tray.js"
 ],
  
 "objInfo": [
 "ComComp/Sketch.info", 
 "ComComp/editmodeType.info", 
 "ComComp/imemodeType.info", 
 "ComComp/readonlymodeType.info", 
 "ComComp/updatebindingvaluemodeType.info"
 ]
}
//@ sourceURL=ComComp.json

NexacroLoad.json 통합하기

각각의 json파일을 하나로 통합합니다.
{
 "name": "NexacroLoadJson",
 "version": "14.0.0.703",
 "description": "nexacro platform 14 Unified Framework Library",
 "license": "",
 "scripts": [
  "CompBase/Element_HTML5.js",
  "CompBase/Element_Runtime.js",
  "CompBase/CompBase.js", 
  "CompBase/CompEventBase.js", 
  "CompBase/Data.js", 
  "CompBase/EditBase.js", 
  "CompBase/FormBase.js", 
  "CompBase/TitleBar.js", 
  "CompBase/StatusBar.js", 
  "CompBase/FrameBase.js",  
  "CompBase/ScrollBar.js", 
  "CompBase/Step.js",
  "ComComp/Dataset.js", 
  "ComComp/DomObject.js",
  "ComComp/Button.js", 
  "ComComp/Static.js", 
  "ComComp/Edit.js", 
  "ComComp/MaskEdit.js", 
  "ComComp/TextArea.js", 
  "ComComp/ImageViewer.js", 
  "ComComp/CheckBox.js", 
  "ComComp/Radio.js", 
  "ComComp/ListBox.js", 
  "ComComp/Combo.js", 
  "ComComp/Div.js", 
  "ComComp/ProgressBar.js", 
  "ComComp/PopupDiv.js", 
  "ComComp/Menu.js", 
  "ComComp/PopupMenu.js", 
  "ComComp/Spin.js", 
  "ComComp/DatePicker.js", 
  "ComComp/Calendar.js", 
  "ComComp/GroupBox.js", 
  "ComComp/Tab.js", 
  "ComComp/FileDownload.js", 
  "ComComp/FileUpload.js", 
  "ComComp/FlashPlayer.js", 
  "ComComp/MediaPlayer.js",
  "ComComp/WebBrowser.js",
  "ComComp/Map.js",
  "ComComp/Sketch.js",
  "ComComp/ExportObject.js",
  "ComComp/ImportObject.js",
  "ComComp/Tray.js",
  "Grid/GridInfo.js", 
  "Grid/Grid.js",
  "DeviceAPI/SQLite.js",
  "DeviceAPI/SQLite_Runtime.js",
  "DeviceAPI/Plugin.js",
  "DeviceAPI/DeviceObjs.js",
  "DeviceAPI/DeviceObjs_Runtime.js",
  "DeviceAPI/XPush.js",
  "DeviceAPI/Mobile.js",
  "Chart/ChartInfo.js", 
  "Chart/Chart.js",
 
 ],
  
 "objInfo": [
 "ComComp/Sketch.info", 
 "ComComp/editmodeType.info", 
 "ComComp/imemodeType.info", 
 "ComComp/readonlymodeType.info", 
 "ComComp/updatebindingvaluemodeType.info"
 ]
}
//@ sourceURL=ComComp.json

넥사크로스튜디로를 통해 적용방법

TypeDefinition변경하기

TypeDefinition1

Deploy

Build->deploy->Deploy Application에서 deploy합니다.

TypeDefinition1

TypeDefinition1

TypeDefinition1

주의사항

Framework.json의 js는 포함할 수 없습니다.

CompBase.json, ComComp.json, Grid.json, DeviceAPI.json 순서는 변경 불가능합니다.

Runtime구동시에는 동일하게 start.json을 자동으로 적용됩니다.

start.json 예제)
{
    "version" : "14.0.0.1",
    "runtime" :
    {
        "target" :
        {
            "os" : "windows"
        },
        "framework" :
        [
         "./nexacro14lib/framework/Framework.js"
        ],
        "component" :
        [
         "./nexacro14lib/component/NexacroLoad.js"
        ],
        "form" :
        [
         "./Base/main.xfdl.js"
        ],
        "xadl" :
        {
          "launch" : "./nexacro.xadl.js",
     "quickview" : "./nexacro.xadl.quickview.js"
        },
        "protocol":
        {
            "adaptors":
            [
          
            ]
        },
        "resource" :
        {
        }
    }
}

디자인/CSS 작업시 주의사항 (성능향상)

가능한 이미지를 많이 사용하지 않토록 합니다.

통 이미지는 가능한 사용하지 않습니다.

CSS코드로 gradation처리가 가능한 경우에는 이미지를 사용하지 않습니다.

특별한 사유가 없는 경우 gradation사용은 자제하거, 단일 색상 사용을 권장합니다.