The Pursuit of Happyness

반응형

OpenUI5 관련해서 마지막으로 Data Binding 에 대해서 알아보도록 하겠습니다.


최근 웹 개발 트렌드는 클라이언트에서 기본 페이지 레이아웃을 로딩하고, 웹브라우져에서 렌더링해서 보여줄 데이터를 비동기 방식으로 받아와서 화면에 보여주는 형태를 선호합니다. 데이터 바인딩은 특정 컨트롤에 표시되는 정보를 데이터 모델과 연결하여 컨트롤 상에서 데이터를 변경해도 그 결과가 모델에 반영이 되고, 반대로 모델의 데이터를 변경해도 컨트롤에 바로 표시되게 하는 것 입니다.


쉽게 이야기해서 Textfield 와 특정 모델을 연결시켜 놓으면, 사용자가 Textfield 에 입력한 값이 모델에 바로 연동되며, 반대로 javascript 상에서 모델의 값을 변경하면 연결된 Textfield 값이 변경됩니다.


이번 예제에서는 지난번에 만든 페이지를 데이터 바인딩을 사용해서 변경해 보겠습니다.


따라서 실제로 화면에서 보여지는 부분은 차이가 없습니다.


지난번에 작성한 Main.view.js 파일에서 List에 나타나는 데이터와 화면 오른쪽에 보여지는 사이트 정보를 데이터 모델로 옮기고 해당 부분을 바인딩해 보도록 하겠습니다.


기존에 List 컨트롤에 addItem으로 추가했던 ListItem 데이터 대신 바인딩할 Template을 준비합니다.


new sap.m.List({ showNoData: true , columns: [ new sap.m.Column() ] , items: { path: "/d/listItems" , template: new sap.m.StandardListItem({ title: "{title}" , icon: "{icon}" , info: { parts: ["rating"] , formatter: oController.infoFormatter } , description: "{description}" }) } })


List의 경우 여러 개의 아이템이 들어갈 수 있으므로 모델은 배열 형태로 표시됩니다. 따라서 해당 배열의 경로를 path로 지정하고 각각 표시될 정보를 배열 데이터의 키로 지정합니다.  예제에서 title: "{title}" 로 표시된 부분에서 {title} 이 바인딩 될 모델 데이터 상대 경로 입니다. 실제 경로는 [path] + /[배열 index]/ + title 이 됩니다.


그리고 info 항목을 보면 formatter를 사용했습니다. parts에 해당 모델에서 읽을 키들이 정의 됩니다. 여기서는 rating 값을 읽어서 controller에 있는 infoFormatter 함수가 화면에 출력될 값을 생성해서 return 해 줍니다.


비슷한 방법으로 TextArea에 들어가는 값도 바인딩을 해 보았습니다.


, new sap.m.TextArea({ cols:50 , rows:10 , value: "{/d/siteDescription}" }).addStyleClass("textArea")


TextArea에 들어가는 값은 경로를 {} 로 묶어 주면 됩니다. (value: "{/d/siteDescription}" 부분)



그리고 각 컨트롤에 모델을 지정해 주어야 하는데, List 나 TextArea는 View 안에 들어가는 컨트롤이기 때문에 View 에 모델을 설정해 주면 됩니다. 지금까지 사용하지 않았던 Main.Controller.js 파일에서 해당 부분을 다루어 보겠습니다.


먼저 컨트롤러에서 사용할 모델을 준비합니다.


oModel: new sap.ui.model.json.JSONModel()



컨트롤러 객체가 생성될 때 제일 먼저 실행되는 onInit 함수에 모델을 View에 바인딩하는 코드 (빨간색 표시 부분) 과 모델에 데이터를 설정하는 코드 (파란색 표시 부분) 을 추가합니다.


, onInit: function() { this.getView().setModel(this.oModel); this.oModel.setData({ d: { listItems: [ { title: "MoonBucks", icon: "sap-icon://e-care", rating: 2, description: "Description" } , { title: "StartBucks", icon: "sap-icon://e-care", rating: 4, description: "Description" } , { title: "CoffeeVince", icon: "sap-icon://e-care", rating: 3, description: "Description" } , { title: "StarBugs", icon: "sap-icon://e-care", rating: 1, description: "Description" } ] , siteDescription: "In the long history of the world, only a few generations have been granted the role of defending freedom in its hour of maximum danger. I do not shrink from this responsibility - I welcome it." } }); }



View에 모델이 바인딩되어 있기 때문에 데이터를 먼저 세팅하고 모델을 지정하든, 모델을 먼저 지정하고 모델에 데이터를 넣어 주던 순서는 상관이 없습니다.


마지막으로 rating 부분을 숫자에서 별표시로 바꿔주는 formatter 코드 입니다.


특별한 것이 없어서 설명은 생략합니다.


, infoFormatter: function(pInfo) { var stars = "★★★★★☆☆☆☆☆"; return stars.substr(5-pInfo, 5); }



이상으로 UI5에 대한 간단한 설명을 마치도록 하겠습니다.


바인딩이 적용된 소스 코드는 아래 git 링크에서 받아 보실 수 있습니다.


https://github.com/shineum/openui5/tree/Ch03_Data_Binding





반응형

반응형

이번에는 UI5 콤포넌트들을 이용해서 화면 구성을 해 보겠습니다.


결과물은 대략 다음 화면처럼 나오게 됩니다.


먼저 새로운 화면 구성을 위해서 Main.view 를 준비하였습니다.


지난번 app.js 파일에서 view 를 추가해주는 부분도 새로운 view에 맞게 코드를 변경해 줍니다.


Main.view 에서 보여지는 내용을 간단하게 리뷰해 보면, 화면 상단에 헤더 영역과 Section Title 이라고 표시되는 페이지 타이틀, 그리고 메인 컨텐츠로 리스트 아이템과 텍스트가 나오게 됩니다.


화면에서 색상, 폰트 등은 CSS 를 이용해서 처리한 부분이기 때문에 UI5 컴포넌트들 만으로는 위의 화면과 같이 출력되지는 않습니다.


참고로 CSS 가 적용되지 않았을 때의 화면 모습은 다음과 같습니다.

여기서 사용된 컴포넌트들을 헤더 영역부터 살펴보겠습니다.


헤더 영역에서는 영역을 좌측, 가운데, 우측으로 나눠서 다른 컴포넌트를 넣을 수 있도록 sap..m.Bar를 커스텀 헤더로 지정하였습니다. 그리고 왼쪽 영역에는 Label을 그리고 오른쪽 영역에는 Link를 넣어 주었습니다. 마지막으로 CSS에서 해당 element 를 쉽게 지정할 수 있게 addStyleClass를 이용해서 클래스 이름을 지정해 주었습니다.


var oPage = new sap.m.Page({ customHeader: new sap.m.Bar({ contentLeft:[new sap.m.Label({text:"OpenUI5 Logo"})] , contentRight: [new sap.m.Link({text:"Login"})] }).addStyleClass("headerBar") });


Section Title 부분은 Label 을 추가해 주었는데, HBox를 이용해서 Label만 한 줄에 나오게 처리하였습니다. 역시 CSS를 위해서 클래스 이름을 지정해 주었습니다.


oPage.addContent( new sap.m.HBox({items:[ new sap.m.Label({text:"Section Title"}) ]}).addStyleClass("sectionTitle") );


메인 컨텐츠 부분은 좌측에는 리스트를 스크롤 컨테이너에 담아서 보여주고, 우측에는 TextArea를 사용해서 페이지에 대한 설명을 보여줍니다.


oPage.addContent( new sap.m.FlexBox({ items:[ new sap.m.ScrollContainer({content: [ new sap.m.List({ showNoData: true , columns: [ new sap.m.Column() ] })


// ITEM 추가해주는 부분은 생락

]}).addStyleClass("scrollContainer") , new sap.m.TextArea({ cols:50 , rows:10 , value: "텍스트 내용 생략" }).addStyleClass("textArea") ] }).addStyleClass("mainContent") );


이 페이지에서 사용하기 위해서 몇가지 구글 폰트들을 index.html 파일에 추가하였습니다.


<link href='http://fonts.googleapis.com/css?family=Oleo+Script' rel='stylesheet' type='text/css'> <link href='http://fonts.googleapis.com/css?family=Leckerli+One' rel='stylesheet' type='text/css'>


마지막으로 CSS 파일에서 각 컴포넌트들의 모양을 잡아주면 됩니다. (CSS 파일에 대한 설명은 생략합니다..)




소스 코드는 아래 git 링크에서 받아 보실 수 있습니다.


https://github.com/shineum/openui5/tree/Ch02_Basic_UI




반응형

반응형

이번에는 OpenUI5 를 이용해서 간단한 웹 애플리케이션을 만들어 보겠습니다.


프로그래밍 언어를 처음 배울때 늘 보게되는 Hello World 를 화면상에 나타내는 코드 입니다.


HTML에서 간단하게 Hello World 라고만 써줘도 되지만, 추후에 기능이 많고 복잡한 웹 애플리케이션을 제작하기 위해서 기본 프레임을 만들어 보는 연습을 한다고 생각하시면 되겠습니다.


이 예제에서는 Javascript View를 이용하였으며, View와 Controller를 분리하여 작성하였습니다.


웹 애플리케이션을 실행할 때 진입점이 되는 경로는 index.html 입니다.


그리고 웹 애플리케이션의 기본이 되는 코드가 담겨져 있는 app.js 파일을 js 폴더에 두었고,


View 파일과 Controller 파일을 z_fiori 라는 폴더에 생성해 두었습니다.



먼저 index.html 파일을 살펴보면, 다음과 같습니다.


<!DOCTYPE html> <html> <head> <meta http-equiv='X-UA-Compatible' content='IE=edge' /> <title>OpenUI5</title> <script id='sap-ui-bootstrap' src='https://openui5.hana.ondemand.com/resources/sap-ui-core.js' data-sap-ui-theme='sap_bluecrystal' data-sap-ui-libs='sap.m'> </script> <script type="text/javascript" src="js/app.js"></script> </head> <body class="sapUiBody"> <div id="content"></div> </body> </html>


UI5 라이브러리는 제공해주는 CDN URL을 링크해서 최신버전에 맞춰두었습니다.


그리고 애플리케이션 기본 코드인 app.js 를 포함시킵니다.



다음으로 app.js 파일을 살펴봅니다.


sap.ui.localResources("z_fiori"); var sapApp = new sap.m.App(); sapApp.placeAt("content"); sapApp.addPage( sap.ui.view("view.HelloWorld", { viewName: "z_fiori.HelloWorld" , type: sap.ui.core.mvc.ViewType.JS }) );


먼저 sap.ui.localResources 를 이용해서 z_fiori 폴더를 리소스 경로로 지정합니다.


리소스 경로로 지정하고 나면, require 기능을 이용해서 해당 폴더에 있는 파일들을 로딩할 수 있습니다.


다음으로 App 객체를 생성해서 index.html 에 있는 "content" 라는 영역에 위치시킵니다.


마지막으로 App 객체에 뷰에 해당하는 페이지를 추가하여 줍니다.


viewName으로 z_fiori.HelloWorld 를 지정해 주었으므로, 앞에서 지정한 z_fiori 리소스 폴더에 HelloWorld.view.js 파일과 HelloWorld.controller.js 파일을 생성해 줍니다.



HelloWorld.view.js 파일은 다음과 같습니다.


sap.ui.jsview("z_fiori.HelloWorld", {
    getControllerName: function() {
        return "z_fiori.HelloWorld";
    }
    , createContent: function(oController) {
        var oPage = new sap.m.Page();

        oPage.addContent(
                new sap.m.Text({text: "HelloWorld"})
        );
        
        return oPage;
    }
});


뷰에서는 컨트롤러 이름을 설정하고, 화면에 표시될 UI 컨트롤들을 배치합니다. 웹 애플리케이션의 특성상 대부분 CSS에서 보여주는 부분을 수정하겠지만, 간단한 배치는 속성값을 지정해서 처리할 수도 있습니다.



마지막으로 HelloWorld.controller.js 파일 입니다.


sap.ui.controller("z_fiori.HelloWorld", {
    onInit: function() {
    }
});


아직은 컨트롤러에서 하는 일이 없으므로 그냥 위와 같은 형태만 만들어 줍니다.


이렇게 구성하고 나서 웹브라우저로 열어보면 대략 다음과 같은 화면이 나옵니다.


처음 index.html 파일에서 SAP 의 Blue Crystal theme을 기본 theme으로 사용하겠다고 지정했기 때문에 위와 같은 바탕화면이 나오게 됩니다.


또한 sap.m.Page 는 기본 설정에서 위쪽에 흰색 바탕으로된 헤더 영역이 생기게 되며, 필요하지 않은 경우 제거할 수도 있습니다.


추후에 기본 UI 컨트롤들에 대해서 더 알아보도록 하겠습니다.




소스 코드는 아래 git 링크에서 받아 보실 수 있습니다.


https://github.com/shineum/openui5/tree/Ch01_Hello_World




반응형

반응형

오늘은 SAP 쪽에서 웹 클라이언트 개발에 많이 사용되는 OpenUI5 프레임워크에 대해서 설명해 보겠습니다.


OpenUI5 는 http://openui5.org/ 홈페이지에서 Apache 2.0 라이센스로 무료로 배포하고 있습니다.


기업용 소프트웨어를 오랜동안 서비스해서 인지, 프레임워크가 상당히 깔끔하고 안정된 느낌입니다.



웹사이트에서 소개된 Key Features의 제목은 다음과 같습니다.


1. 엔터프라이즈  웹 툴킷


2. 파워풀한 개발 컨셉


3. 풍부한 UI 컨트롤을 제공


4. 일관성 있는 사용자 경험


5. 무료로 배포되는 오픈소스


6. 웹 브라우저 및 휴대용 기기에서 같이 사용가능한 반응형




Get Started 섹션에서는 OpenUI5를 사용하는 기본적인 방법이 소개되어 있습니다. OpenUI5를 사용법은 다음과 같습니다.


1. 웹페이지가 로딩될 때 UI5 라이브러리가 로딩될 수 있게 스크립트를 추가합니다. 


먼저 소스코드는 다음과 같은데, OpenUI5 라이브러리를 resources 폴더에 미리 준비해 두거나 (다운로드 받아서 압축 해재) sap cdn 링크로 걸어 주면 됩니다.


<!DOCTYPE html>
<html>
<head>
<meta http-equiv='X-UA-Compatible' content='IE=edge' />
<title>Hello World</title>

<script id='sap-ui-bootstrap'
    src='resources/sap-ui-core.js'
    data-sap-ui-theme='sap_bluecrystal'
    data-sap-ui-libs='sap.m'
    data-sap-ui-compatVersion='edge'
    data-sap-ui-preload='async'>
</script>

<script>
     sap.ui.getCore().attachInit(function () {
         jQuery("#content").html("Hello World - UI5 is ready");
     });
</script>

</head>
<body class='sapUiBody'>
    <div id='content'></div>
</body>
</html>


OpenUI5 에 jquery.sap 라이브러리가 포함되어 있어서 별도로 jQuery 라이브러리를 추가하지 않아도 jQuery 기능을 사용할 수 있습니다. (물론 포함되어 있는 라이브러리 버전에 따라 지원되는 내용이 다를 수 있습니다.)


AngularJS 등의 프레임워크를 사용해 보신 분들은 쉽게 이해하실 수 있는 코드라 생각됩니다. body에 div 엘리먼트를 준비해 두고, 자바스크립트를 이용하여 페이지가 로딩될 때, div 에 "Hello World - UI5 is ready" 라는 텍스트를 넣어주게 됩니다.


2. OpenUI5 컨트롤을 이용합니다.


<!DOCTYPE html>
<html>
<head>
<meta http-equiv='X-UA-Compatible' content='IE=edge' />
<title>Hello World</title>

<script id='sap-ui-bootstrap'
    src='resources/sap-ui-core.js'
    data-sap-ui-theme='sap_bluecrystal'
    data-sap-ui-libs='sap.m'
    data-sap-ui-compatVersion='edge'
    data-sap-ui-preload='async'>
</script>

<script>
    sap.ui.getCore().attachInit(function () {
        new sap.m.Text({
            text: "Hello World"
        }).placeAt("content");
    });
</script>

</head>
<body class='sapUiBody'>
    <div id='content'></div>
</body>
</html>


위에서는 jQuery를 이용하여 div 엘리먼트에 값을 넣어 주었다면, 이번에는 OpenUI5에 있는 UI 컨트롤 객체(여기서는 sap.m.Text)를 생성해서 컨트롤 객체의 메쏘드 placeAt을 이용하여 해당 div 엘리먼트에 컨트롤 객체를 설정해 주었습니다.


3. XML 뷰 (코드는 http://openui5.org/getstarted.html#step3 에서 확인하세요)

웹 애플리케이션의 View를 XML 로 만들어서 별도의 파일로 생성합니다. 나중에 나오지만 OpenUI5는 XML 이외에도 Javascript 나 HTML 형태의 View도 지원하기 때문에 필요한 형태의 View를 사용하시면 됩니다. 뷰 파일명은 *.view.xml 형식의 컨벤션을 사용합니다. 웹페이지의 설명에서는 App.view.xml 이라는 이름을 사용했습니다.


4. 컨트롤러 (코드는 http://openui5.org/getstarted.html#step4 에서 확인하세요)

뷰와 마찬가지로 컨트롤러도 별도의 파일로 생성을 합니다. 

컨트롤러에 대한 컨벤션입니다.

- 컨트롤러 이름의 첫글자는 대문자를 사용한다.

- 연관된 뷰와 1:1 로 매칭시키며, 같은 이름을 사용한다.

- 이벤트 핸들러는 "on"으로 시작한다.

- 컨트롤러 파일명은 *.controller.js 로 끝난다.


5. 데이터 바인딩 (코드는 http://openui5.org/getstarted.html#step5 에서 확인하세요)

UI 컨트롤 객체에 데이터 모델을 연결합니다.

예제에서는 컨트롤러에서 JSON 모델을 생성하고, 뷰를 가지고 와서 생성한 JSON 모델을 세팅합니다.

뷰에서는 Input (sap.m.Input) 객체를 생성하면서 value 를 모델의 /recipient/name 값에 연결시킵니다.

또한 description 도 모델의 /recipient/name 과 연결합니다.

이렇게 연결을 해 두면 사용자가 Input 의 값을 변경하면, 연결된 모델의 /recipient/name 값이 같이 변경되며, 반대로 컨트롤러에서 모델의 /recipient/name 값을 변경하면, Input 값도 같이 변경이 됩니다. (value 와 description)

XML 뷰에서의 데이터 바인딩 문법은 다음과 같습니다.

- 중괄호"{ ... }" 는 데이터 바인딩이 사용되었음을 나타냄

- "/recipient/name" 은 해당 모델에서의 경로를 선언함




반응형