소개

macchina.io 자바스크립트 프로그래밍 환경은 macchina.io의 기능에 대한 접근 권한을 부여해주는 스크립트를 통해 다양한 전역 객체와 함수에 접근을 제공한다.

이것들은 예제 코드와 함께 다음에서 설명된다.

게다가, macchina.io는 일반적으로 재사용가능한 코드를 포함하는 "모듈"을 import하기위해 스크린트를 허락하는 자바스크립트를 위한 간단한 모듈 시스템을 지원한다. 모듈 시스템은 CommonJS로 부터의 모듈 스펙에 기반한다.

이 문서는 독자가 자바스크립트 자체와 개념에 익숙하다고 가정한다.

자바스크립트 번들

중요한 질문은 어떻게 실제로 macchina.io로 자바스크립트 코드를 획득하는 것이냐이다. 일반적으로, macchina.io에서 실행되는 모든 자바스크립트 코드는 번들과 결합되어야 한다. macchina.io 서버로 번들을 만들고 배포하는 다양한 방법이 있다. 가장 쉬운 방법은 웹 사용자 인터페이스에서 Playground 앱을 사용하는 것이다. macchina.io에서 그것들을 실행하는 것 만큼, 자바스크립트 스크립트를 생성하고 수정하는 것을 허락하는 웹 기반 에디터를 제공한다. 이것은 매우 빠르게 결과물을 만들기에 좋다. Playground는 스크립트를 포함하는 완벽한 번들을 생성하고 다운로그 하기 위해서도 사용될 수 있다. 이 번들은 파일 시스템상에 그것을 위치시키거나 웹 기반 번들 유틸리티를 사용하여 그것들을 설치하거나 macchina.io 기반 디바이스에 배포되어질 수 있다.

번들에 관한 것을 더 배우기 위해서는 OSP(Open Service Platform) 문서, 특히, OSP 개요와 OSP 번들 문서를 참조하라.

macchina.io에서 자바스크립트 코드가 실행될 수 있는 2가지 방법이 있다. 첫번째는 번들에서 하나 이상의 스크립트를 위치시키고 번들에서 하나 이상의 자바스크립트 확장(extension)을 생성하는 것이다. 확장은 기본적으로 번들이 시작될 때 자동적으로 구동하기위한 스크립트를 macchina.io에게 알려준다. 자바스크립트 확장에서 참조하는 모든 스크립트는 자기 자신의 쓰레드내에서 구동된다. 다른 스크립트는 모듈에 코드를 위치시키고 require() 함수를 통해 그것들을 import하여 또한 코드를 공유할 수 있다. 좀더 많은 정보는 모듈의 다음장을 보도록 해라.

자바스크립트를 실행하기 위한 다른 방법은 웹 서버를 통하는 것이다. ".jss" 또는 ".jssp"의 확장자는 웹 서버에 의해 제공되는 모든 파일들은 자바스크립트 서블렛 또는 서버 페이지 그리고 클라이언트에 의해 요청될 때 실행되는것으로 다루어질 것이다.

자바스크립트 확장 포인트

macchina.io에서 자바스크립트 확장 포인트는 번들이 시작될 때 자동으로 실행되되록하는 (번들에 포함된)스크립트를 macchina.io 서버에 말해준다. 각 스크립트는 자신만의 쓰레드에서 실행된다. 선택적으로, 확장 포인트는 자바스크립트 힙에 제한을 또한 명시할 수 있다. 따라서, 너무 많은 메모리를 사용하는 것으로 부터 스크립트를 보호할 수 있다. 서치 경로들의 리스트는 또한 주어질 수 있다.

관습에 따라, 확장자는 번들의 루트 디렉토리에 위치한 "extensions.xml"이라 명명된 XML 파일을 사용한다.

다음은 번들의 루트 디렉토리에 있는 "main.js" 파일에서 스크립트를 실행하기 위해 "extenstion.xml"이 어떻게 생겼는지를 보여주는 예제이다.

<extensions>
    <extension point="com.appinf.osp.js" script="main.js"/>
</extensions>

스크립트는 번들이 시작될 때 실행될 것이고, 번들이 멈출 때 멀출 것이다.

스크립트를 위한 메모리 제한을 설정하기 위해서, 바이트 단위의 메모리 양을 명시하기 위해서 memoryLimit 속성을 사용한다. 예를 들어:

<extensions>
    <extension point="com.appinf.osp.js" script="main.js" memoryLimit="500000"/>
</extensions>

import된 모듈의 경우 검색 경로/URI의 콤마와 세미콜론으로 구분된 리스트가 searchPaths 속성을 사용해서 명시 될 수 있다.

사실 번들을 생성하기 위한 특별한 도구가 있지는 않다. 간단한 형태에서, 단지 번들은 번들 리파지토리로써 특별한 디렉토리중의 하나로 위치한 특정 컨텐츠를 갖는 디렉토리이다. 디렉토리는 배포하기 어렵기 때문에, 번들 디렉토리는 일반적으로 '.bndl" 확장자를 사용하여 ZIP으로 압축된다. 이것은 번들 파일이라 불린다.

스크래치로부터 자바스크립트 번들 생성하기

이제 스크래치로부터 번들을 생성해 보자. 모든 번들은 macchina.io (또는 좀더 특별하게, OSP밑에 있는)가 번들(예를 들어, 이름, 만든 사람, 의존성 등)에 관한 무언가를 말해주는 몇몇 메타 정보를 포함하기 위해 필요하다. 이 정보는 번들 디렉토리의 루트에 위치한 "META-INF"라는 이름을 갖는 특별한 디렉토리에 위치해야만 하는 "manifest.mf"라는 이름을 갖는 텍스트 파일에 포함되어 있다.

스크립트를 포함하는 번들의 디렉토리 계층은 기본적으로 다음과 같다:

/ (번들 루트 디렉토리)
    META-INF/
        manifest.mf
    extensions.xml
    main.js

간단한 번들의 "manifest.mf" 파일은 다음과 같다:

Manifest-Version: 1.0
Bundle-Name: My First Bundle
Bundle-SymbolicName: com.my-company.my-first-bundle
Bundle-Version: 1.0.0
Bundle-Vendor: My Company
Bundle-Copyright: (c) 2015, My Company
Bundle-RunLevel: 900
Bundle-LazyStart: false

자신만의 번들을 만들 때, Manifest-Version, Bundle-RunLevel, Bundle-LazyStart(당신이 무엇을 하는지 알기위해서 OSP에 이미 충분히 익숙하더라도)를 위한 값은 변경하지 않도록 한다.

전통적으로, 번들(내무적으로 사용하는 이름)의 심볼릭 명은 번들이 다른 벤더로 부터 오더라도 번들 명은 유일함을 확실히 하기 위해서, 예약된 도메인명 표기로 작성된다.

번들 매니페스트와 관련된 보다 상세한 정보는 OSP 번들 메뉴얼을 참고하라.

우리는 이미 번들을 위한 "extensions.xml" 파일의 content를 보여주었다. 여기 참조를 위해 다시 제시한다:

<extensions>
    <extension point="com.appinf.osp.js" script="main.js"/>
</extensions>

마지막으로, "main.js"를 위한 간단한 "Hello, world!" 스크립트가 있다.

logger.information("Hello, world!");

번들 파일을 얻기 가장 쉬운 방법은 Playground의 "Export Bundle" 버튼을 사용하는 것이다. 이것은 ".bndl" 파일을 다운로드 한다. 번들에 포함된 파일을 extract하기 위해서 리눅스 또는 OS X에서 unzip과 같은 압축해제 도구를 사용할 수 있다. 본인의 번들을 만드는 시작 점으로 이것을 사용해라.

zip 도구를 사용해서 수동으로 번들을 만들때 Zip 파일에 최상위 디렉토리가 없음을 확인하도록 하자. "META-INF" 디렉토리와 "extensions.xml" 파일은 Zip archive의 최상위에 위치해야 한다. 게다가, 번들 파일명은 "<symbolic-name>_<version>.bndl", 예를 들어 "com.my-company.my-first-bundle_1.0.0.bndl" 표기로 기재되어야 한다.

이것을 확실하게 하기 위한 한가지 방법은 cd로 번들 디렉토리로 이동한 다음, 다음과 같이 zip을 실행하는 것이다:

$ zip -r ../com.my-company.my-first-bundle_1.0.0.bndl *

번들을 만들기 위해, macchina.io는 OSP로 부터 번들 생성기(Bundle Creator) 도구를 제공한다. zip을 사용해서 수동으로 번들을 만드는 동안, bundle 도구를 사용하면 다른 번들에 의존성을 갖고 다른 소스 디렉토리로부터 파일들을 모을 필요가 있는 좀더 복잡한 번들을 만들기 쉽도록 도와 준다.

자바스크립트 서블릿과 서버 페이지들

스크립트는 또한 웹 리퀘스트를 서브하기 위해서 실행될 수 있다. macchina.io는 번들에서 제공하는 모든 콘텐츠를 가져오는 OSP 웹 서버(Open Service Platform Web Server)를 사용한다. 웹 서버가 서버 사이드 자바스크립트를 실행하도록 만들기 위해서, 스크립트는 확장자 ".jss" 또는 ".jssp"를 가져야 하고, 파일은 웹 서버를 통해 접근가능해야 한다. ".jss"와 ".jssp"사에에는 중요한 차이가 있다. 앞에것은 "자바스크립트 서블릿"이라 불리는 것을 포함하며, 뒤에 것은 "자바스크립트 서버 페이지"를 포함한다.

서블릿(Servlets)

자바스크립트 서블릿은 클라이언트가 웹 서버로부터 각가의 파일을 요청할 때 실행되어질 수 있는 스크립트이다. 스크립트는 HTTP 리퀘스트를 처리하고 적절한 HTTP 응답을 보내기 위해 사용되는 전역 request와 response 객체에 대한 접근을 갖는다. 사용자 인증과 같은 HTMP 폼 처리를 위해 사용되는 이용가능한 form과 session 객체가 있다. 이러한 객체들은 이 문서의 후반에 상세하게 설명한다.

여기 "Hellp, world!" JSON 문서를 생성하는 작은 샘플 서블릿이 있다:

var hello = {
    message: "Hello, world!"
};

response.contentType = 'application/json';
response.write(JSON.stringify(hello));
response.send();

서버 페이지들

자바스크립트 서버 페이지는 특별한 지시문을 사용하는 내장된 자바스크립트 코드를 갖는다는 점을 제외하고는 보통의 HTML 문서와 같아 보인다. 이러한 서버 페이지는 첫번째 요청이 왔을때 서블릿 스크립트로 컴파일될 것이고 정확하게 서블릿처럼 동작한다.

여기 서버 페이지를 위한 간단한 예제가 있다:

<%
    var now = new DateTime();
%>
<html>
  <head>
    <title>DateTime Sample</title>
  </head>
  <body>
    <h1>DateTime Sample</h1>
    <p><%= now.toString() %></p>
  </body>
</html>

특별한 지시문을 볼 수 있다:

<% <script> %>

이것은 자바스크립트 코드를 넣기 위해서 사용한다.

특별한 지시문:

<%= <expression> %>

는 자바스크립트 표현(expression)을 내장하기 위해서 사용한다. expression을 평가(evaluating)하는 결과는 결과 문서로 직접 삽입된다.

자바스크립트 서버 페이지 Syntax

다음의 특별한 태그들이 자바스크립트 서버 페이지 (JSSP) 파일에서 지원된다.

숨겨진 커멘트

숨겨진 커멘트는 JSSP 파일에 문서화하지만, 클라이언트로 전송되지는 않는다.

<%-- <comment> --%>

표현(Expression)

어떠한 유효한 자바스크립트 표현의 결과는 페이지로 직접 삽입되어질 수 있고, 제공된 결과는 출력 스트림으로 쓰여질 수 있다(?). 표현은 세미콜론으로 끝나면 안된다는 점을 알아두자.

<%= <expression> %>

스크립틀릿(Scriptlet)

임의의 자바스크립트 코드 조각은 스크립틀릿 지시문을 사용해서 포함될 수 있다.

<%
    <statement>
    ...
%>

include 지시문

다른 JSSP 파일 또는 리소스는 include 지시문을 사용해서 현재의 파일에 포함되어질 수 있다.

<%@ include page="<uri>" %>

page 지시문

page 지시문은 자바스크립트 서블릿 코드 생성의 다양한 측면을 제어하는 속성의 정의를 허용한다.

<%@ page <attr>="<value>" ... %>

현재, Contect-Type HTTP 응답 헤더의 값을 설정하는 것을 허락하는 contentType 속성이 지원된다.

<%@ page contentType="application/json" %>

모듈들

macchina.io는 자바스크립트 모듈을 지원한다. 이것은 "모듈"내에 캡슐화된 import된 스크립트와 함께 다른 스크립트를 import하기위한 스크립트는 허용하고 따라서 전역 네임 스페이스를 오염시키지는 않는다.

스크립트는 스크립트(예를 들어, 같은 버튼에서 또는 검색 경로/URI의 리스트로)로의 상댕 경로 또는 완전한 URI를 명시하는 require() 함수를 사용하여 다른 모듈을 import할 수 있다. 이것은 HTTP URI를 사용하여 웹 서버로부터 스크립트를 다운로드 하기위해서도 사용할 수 있다.

require()가 동작하려면, 모듈은 다음과 같은 규칙을 따라야 한다:

  • 모듈은 전역 변수를 정의할 수 있다. 그러나, 이것은 모듈의 밖에서는 사용할 수 없고, 따라서 전역 범위를 오염시키지 않는다.
  • 만약 모듈이 객체 또는 함수를 export하길 바라면, exports 또는 module.exports 객체로 객체 또는 함수를 할당하여 이것을 수행할 수 있다(?). module.exports 객체는 모듈의 importers로 이용가능한 객체만 해당된다.
  • 모듈을 포함하는 자원의 이름은 ".js" 확장자를 가져야 한다.

여기에 간단한 예제가 있다. 온도 센서를 찾는 함수를 작성하고, 센서 객체가 발견되면 그것을 리턴한다:

function findTemperatureSensor()
{
    var temperatureRefs = serviceRegistry.find('io.macchina.physicalQuantity == "temperature"');
    if (temperatureRefs.length > 0)
        return temperatureRefs[0].instance();
    else
        return null;
}

당신이 이것이 유용한 함수라고 생각되고 다른 스크립트에서 이것을 사용하길 원한다. 지금 당신이 필요한 곳에 모든 스크립트로 함수를 복사하고 붙여넣기 할 수 있다. 분명한 이유로, copy & paste에 의해 코드를 공유하는 것은 나쁜 생각이고, 당신은 모듈의 형태로 재사용가능한 함수를 만들기를 결심한다.

findTemperature() 함수를 export하는 재사용 가능한 모듈을 만들기 위해서, 코드는 다음과 같이 변경되어질 필요가 있다:

exports.findTemperatureSensor = function() 
    {
        var temperatureRefs = serviceRegistry.find('io.macchina.physicalQuantity == "temperature"');
        if (temperatureRefs.length > 0)
            return temperatureRefs[0].instance();
        else
            return null;
    };

우리가 본질적으로 한일은 모듈의 export 객체에 함수를 추가하였다. 우리가 "sensor.js"라는 이름 위의 함수를 넣었다고 가정하는 것은, 스크립트에 이 함수가 필요한 어디서든, 우리는 작성할 수 있다(?) :

var sensors = require("sensors");
var temperatureSensor = sensors.findTemperatureSensor();

results matching ""

    No results matching ""