Share via


Mobile Apps Node.js SDK를 사용하는 방법

이 문서에서는 Azure App Service의 Mobile Apps 기능에서 Node.js 백 엔드로 작업하는 방법을 보여 주는 자세한 정보와 예를 제공합니다.

소개

Mobile Apps는 모바일에 최적화된 데이터 액세스 Web API를 웹 애플리케이션에 추가하는 기능을 제공합니다. Mobile Apps SDK는 ASP.NET 및 Node.js 웹 애플리케이션에 대해 제공됩니다. SDK는 다음 작업을 제공합니다.

  • 데이터 액세스를 위한 테이블 작업(읽기, 삽입, 업데이트, 삭제)
  • API 작업 사용자 지정

두 작업 모두 Azure App Service에서 허용하는 모든 ID 공급자에서 인증에 대해 제공합니다. 이러한 공급자는 Facebook, Twitter, Google 및 Microsoft와 같은 소셜 ID 공급자와 엔터티 ID에 대한 Azure Active Directory를 제공합니다.

GitHub의 샘플 디렉터리에서 각 사용 사례에 대한 샘플을 찾을 수 있습니다.

지원 플랫폼

Mobile Apps Node.js SDK는 노드의 최신 LTS 릴리스 이상을 지원합니다. 현재 최신 LTS 버전은 노드 v4.5.0입니다. 다른 버전의 노드는 작동할 수는 있지만 지원되지 않습니다.

Mobile Apps Node.js SDK는 두 개의 데이터베이스 드라이버를 지원합니다.

  • node-mssql 드라이버는 Azure SQL Database 및 로컬 SQL Server 인스턴스를 지원합니다.
  • sqlite3 드라이버는 단일 인스턴스에서만 SQLite 데이터베이스를 지원합니다.

명령줄을 사용하여 기본 Node.js 백 엔드 만들기

모든 Mobile Apps Node.js 백 엔드는 ExpressJS 애플리케이션으로 시작합니다. ExpressJS는 Node.js에 사용할 수 있는 가장 인기 있는 웹 서비스 프레임워크입니다. 다음과 같이 기본 Express 애플리케이션을 만들 수 있습니다.

  1. 명령 창 또는 PowerShell 창에서 프로젝트의 디렉터리를 만듭니다.

     mkdir basicapp
    
  2. npm init를 실행하여 패키지 구조를 초기화합니다.

     cd basicapp
     npm init
    

    npm init 명령은 프로젝트를 초기화하기 위해 몇 가지 질문을 합니다. 예제 출력을 참조하세요.

    The npm init output

  3. npm 리포지토리에서 expressazure-mobile-apps 라이브러리를 설치합니다.

     npm install --save express azure-mobile-apps
    
  4. app.js 파일을 만들어서 기본 모바일 서버를 구현합니다.

    var express = require('express'),
        azureMobileApps = require('azure-mobile-apps');
    
    var app = express(),
        mobile = azureMobileApps();
    
    // Define a TodoItem table.
    mobile.tables.add('TodoItem');
    
    // Add the Mobile API so it is accessible as a Web API.
    app.use(mobile);
    
    // Start listening on HTTP.
    app.listen(process.env.PORT || 3000);
    

이 애플리케이션은 동적 스키마를 사용하여 기본 SQL 데이터 저장소에 대한 인증되지 않은 액세스를 제공하는 단일 엔드포인트(/tables/TodoItem)로 모바일에 최적화된 Web API를 만듭니다. 다음의 클라이언트 라이브러리 빠른 시작에 적합합니다.

GitHub의 기본 앱 샘플에서 이 기본 애플리케이션에 대한 코드를 찾을 수 있습니다.

Visual Studio 2015를 사용하여 Node.js 백 엔드 만들기

Visual Studio 2015는 IDE 내에서 Node.js 애플리케이션 개발하도록 확장이 필요합니다. 시작하려면 Visual Studio용 Node.js Tools 1.1을 설치합니다. 설치를 완료하면 Express 4.x 애플리케이션을 만듭니다.

  1. 새 프로젝트 대화를 엽니다(파일>새로 만들기>프로젝트에서).

  2. 템플릿 JavaScript>Node.js확장합니다>.

  3. 기본 Azure Node.js Express 4 애플리케이션을 선택합니다.

  4. 프로젝트 이름을 입력합니다. 확인을 선택합니다.

    Visual Studio 2015 new project

  5. npm 노드를 마우스 오른쪽 단추로 클릭하고 새 npm 패키지 설치를 선택합니다.

  6. 첫 번째 Node.js 애플리케이션을 만든 후 npm 카탈로그를 새로 고쳐야 할 수 있습니다. 필요한 경우 새로 고침 을 선택합니다.

  7. 검색 상자에 azure-mobile-apps 를 입력합니다. azure-mobile-apps 2.0.0 패키지를 선택한 다음, 패키지 설치를 선택합니다.

    Install new npm packages

  8. 닫기를 선택합니다.

  9. app.js 파일을 열고 Mobile Apps SDK에 대한 지원을 추가합니다. 라이브러리 require 문의 맨 아래 6줄에 다음 코드를 추가합니다.

    var bodyParser = require('body-parser');
    var azureMobileApps = require('azure-mobile-apps');
    

    다른 app.use 문 뒤 약 27줄에 다음 코드를 추가합니다.

    app.use('/users', users);
    
    // Mobile Apps initialization
    var mobile = azureMobileApps();
    mobile.tables.add('TodoItem');
    app.use(mobile);
    

    파일을 저장합니다.

  10. 애플리케이션을 로컬로 실행하거나(API가 제공됨) Azure에 https://localhost:3000게시합니다.

Azure Portal을 사용하여 Node.js 백 엔드 만들기

Azure Portal에서 바로 Mobile Apps 백 엔드를 만들 수 있습니다. 다음 단계를 완료하거나 모바일 앱 만들기 자습서에 따라 클라이언트 및 서버를 함께 만들 수 있습니다. 자습서는 이러한 지침의 단순화된 버전을 포함하고 있으며 개념 증명 프로젝트에 가장 적합합니다.

  1. Azure Portal에 로그인합니다.

  2. +NEW>웹 + 모바일 모바일>앱을 선택한 다음 Mobile Apps 백 엔드의 이름을 제공합니다.

  3. 리소스 그룹의 경우 기존 리소스 그룹을 선택하거나 새 리소스 그룹을 만듭니다(앱과 같은 이름을 사용하여).

  4. App Service 계획의 경우 기본 계획(표준 계층에)이 선택되어 있습니다. 다른 계획을 선택하거나 새 계획을 만들 수도 있습니다.

    App Service 계획의 설정은 앱과 연결된 위치, 기능, 비용 및 컴퓨팅 리소스를 결정합니다. App Service 계획에 대한 자세한 내용과 다른 가격 책정 계층 및 원하는 위치에서 새 계획을 만드는 방법은 Azure App Service 계획의 포괄 개요를 참조하세요.

  5. 만들기를 선택합니다. 이 단계에서는 Mobile Apps 백 엔드를 만듭니다.

  6. 새 Mobile Apps 백 엔드에 대한 설정 창에서 데이터베이스를 커넥트 클라이언트 앱 플랫폼 >빠른 시작을> 선택합니다.

    Selections for connecting a database

  7. 데이터 연결 추가 창에서 SQL Database>새 데이터베이스 만들기를 선택합니다. 데이터베이스 이름을 입력하고, 가격 책정 계층을 선택한 다음, 서버를 선택합니다. 이 새 데이터베이스를 다시 사용할 수 있습니다. 같은 위치에 이미 데이터베이스가 있는 경우 기존 데이터베이스 사용을 대신 선택할 수 있습니다. 다른 위치에 있는 데이터베이스는 대역폭 비용 및 더 많은 대기 시간 때문에 사용을 권장하지 않습니다.

    Selecting a database

  8. 새 서버 창에서 서버 이름 상자에 고유한 서버 이름을 입력하고, 로그인 및 암호를 제공하고, Azure 서비스의 서버 액세스 허용을 선택하고, 확인을 선택합니다. 이 단계에서는 새 데이터베이스를 만듭니다.

  9. 데이터 연결 추가 창으로 돌아와 연결 문자열을 선택하고, 사용자 데이터베이스의 로그인 및 암호 값을 입력하고, 확인을 선택합니다.

    계속 진행하기 전에 데이터베이스가 성공적으로 배포되도록 몇 분 동안 기다립니다.

시작 창으로 돌아가서 테이블 API 만들기 아래에서 백 엔드 언어로 Node.js를 선택합니다. 이렇게 하면 모든 사이트 콘텐츠를 덮어쓴다는 것을 인정합니다.라는 상자를 선택한 다음, TodoItem 테이블 만들기를 선택합니다.

Git를 사용하여 Node.js 백 엔드 빠른 시작 코드 프로젝트 다운로드

포털의 빠른 시작 창을 사용하여 Node.js Mobile Apps 백 엔드를 만들 때 Node.js 프로젝트가 생성되어 사이트에 배포됩니다. 포털에서 테이블 및 API를 추가하고 Node.js 백 엔드에 대한 코드 파일을 편집할 수 있습니다. 또한 다양한 배포 도구를 사용하여 백 엔드 프로젝트를 다운로드할 수 있으므로 테이블 및 API를 추가하거나 수정한 다음, 프로젝트를 다시 게시할 수 있습니다. 자세한 내용은 Azure App Service 배포 가이드를 참조하세요.

다음 절차에서는 Git 리포지토리를 사용하여 빠른 시작 프로젝트 코드를 다운로드합니다.

  1. 아직 수행하지 않았다면 Git을 설치합니다. Git를 설치하는 데 필요한 단계는 운영 체제마다 다릅니다. 운영 체제별 배포 및 설치 지침은 Git 설치를 참조하세요.

  2. 리포지토리 준비를 참조하여 백 엔드 사이트에 Git 리포지토리를 사용할 수 있습니다. 배포 사용자 이름 및 암호를 기록해 둡니다.

  3. Mobile Apps 백 엔드에 대한 창에서 Git 복제 URL 설정을 적어 둡니다.

  4. Git 복제 URL을 사용하여 git clone 명령을 실행합니다. 다음 예제와 같이 필요한 경우 암호를 입력합니다.

     $ git clone https://username@todolist.scm.azurewebsites.net:443/todolist.git
    
  5. 로컬 디렉터리를 찾고(앞의 예제에서는 /todolist), 프로젝트 파일이 다운로드되었는지 확인합니다. /tables 디렉터리에서 todoitem.json 파일을 찾습니다. 이 파일은 테이블의 사용 권한을 정의합니다. 또한 동일한 디렉터리에서 todoitem.js 파일을 찾습니다. 테이블에 대한 CRUD 작업 스크립트를 정의합니다.

  6. 프로젝트 파일을 변경한 후에 다음 명령을 실행하여 다음 사이트에 변경 내용을 추가, 커밋한 다음, 업로드합니다.

     $ git commit -m "updated the table script"
     $ git push origin master
    

    프로젝트에 새 파일을 추가할 때 먼저 git add . 명령을 실행해야 합니다.

사이트는 사이트에 새로운 커밋 집합이 푸시될 때마다 다시 게시됩니다.

Azure에 Node.js 백 엔드 게시

Microsoft Azure는 Mobile Apps Node.js 백 엔드를 Azure 서비스에 게시하기 위한 여러 메커니즘을 제공합니다. 이러한 메커니즘은 원본 제어에 따라 Visual Studio, 명령줄 도구 및 연속 배포 옵션에 통합된 배포 도구를 포함합니다. 자세한 내용은 Azure App Service 배포 가이드를 참조하세요.

Azure App Service에는 백 엔드를 게시하기 전에 검토해야 하는 Node.js 애플리케이션에 대한 구체적인 조언이 있습니다.

애플리케이션에 대한 홈페이지 사용

대부분의 애플리케이션은 웹 및 모바일 앱의 조합입니다. ExpressJS 프레임워크를 사용하여 두 가지 측면을 결합할 수 있습니다. 그러나 때로는 모바일 인터페이스를 구현하려고 할 수 있습니다. 앱 서비스를 실행하도록 하기 위해 홈페이지를 제공하는 것이 유용합니다. 고유한 홈 페이지에 제공하거나 임시 홈 페이지를 사용할 수 있습니다. 임시 홈페이지를 사용하려면 다음 코드를 사용하여 Mobile Apps를 인스턴스화합니다.

var mobile = azureMobileApps({ homePage: true });

로컬로 개발할 때에만 이 옵션을 사용하려면 이 설정을 azureMobile.js 파일에 추가합니다.

테이블 작업

azure-mobile-apps Node.js 서버 SDK는 Azure SQL Database에 저장된 데이터 테이블을 Web API로 노출하는 메커니즘을 제공합니다. 다섯 가지 작업을 제공합니다.

작업(Operation) Description
GET /tables/tablename 테이블의 모든 레코드를 가져옵니다.
GET /tables/tablename/:id 테이블의 특정 레코드를 가져옵니다.
POST /tables/tablename 테이블에 레코드를 만듭니다.
PATCH /tables/tablename/:id 테이블의 레코드를 업데이트합니다.
DELETE /tables/tablename/:id 테이블의 레코드를 삭제합니다.

이 Web API는 OData를 지원하고 테이블 스키마를 확장하여 오프라인 데이터 동기화를 지원합니다.

동적 스키마를 사용하여 테이블 정의

테이블을 사용하려면 먼저 정의해야 합니다. 정적 스키마(스키마 내에서 열을 정의하는 위치)를 사용하거나 동적으로(SDK가 들어오는 요청에 따라 스키마를 제어하는 위치) 테이블을 정의할 수 있습니다. 또한 정의에 JavaScript 코드를 추가하여 Web API의 특정 측면을 제어할 수 있습니다.

모범 사례로 tables 디렉터리의 JavaScript 파일에 각 테이블을 정의한 다음, tables.import() 메서드를 사용하여 테이블을 가져와야 합니다. basic-app 샘플을 확장하면 app.js 파일은 조정됩니다.

var express = require('express'),
    azureMobileApps = require('azure-mobile-apps');

var app = express(),
    mobile = azureMobileApps();

// Define the database schema that is exposed.
mobile.tables.import('./tables');

// Provide initialization of any tables that are statically defined.
mobile.tables.initialize().then(function () {
    // Add the Mobile API so it is accessible as a Web API.
    app.use(mobile);

    // Start listening on HTTP.
    app.listen(process.env.PORT || 3000);
});

./tables/TodoItem.js에서 테이블을 정의합니다.

var azureMobileApps = require('azure-mobile-apps');

var table = azureMobileApps.table();

// Additional configuration for the table goes here.

module.exports = table;

테이블은 기본적으로 동적 스키마를 사용합니다. 동적 스키마를 전역적으로 해제하려면 MS_DynamicSchema 앱 설정을 Azure Portal 내에서 false로 설정합니다.

GitHub의 할 일 샘플에서 전체 예제를 찾을 수 있습니다.

정적 스키마를 사용하여 테이블 정의

열을 명시적으로 정의하여 Web API를 통해 노출할 수 있습니다. azure-mobile-apps Node.js SDK는 오프라인 데이터 동기화에 필요한 모든 열을 사용자가 제공하는 목록에 자동으로 추가합니다. 예를 들어 빠른 시작 클라이언트 애플리케이션은 text(문자열) 및 complete(부울)라는 두 열이 있는 테이블이 필요합니다.
이 테이블은 다음과 같이 테이블 정의 JavaScript 파일(tables 디렉터리에 위치)에서 정의할 수 있습니다.

var azureMobileApps = require('azure-mobile-apps');

var table = azureMobileApps.table();

// Define the columns within the table.
table.columns = {
    "text": "string",
    "complete": "boolean"
};

// Turn off the dynamic schema.
table.dynamicSchema = false;

module.exports = table;

또한 정적으로 테이블을 정의하는 경우 tables.initialize() 메서드를 호출하여 시작 시 데이터베이스 스키마를 만들어야 합니다. 데이터베이스가 초기화되기 전에 웹 서비스가 요청을 처리하지 않도록 하기 위해 tables.initialize() 메서드는 promise를 반환합니다.

로컬 컴퓨터에서 개발 데이터 저장소로 SQL Server Express 사용

Mobile Apps Node.js SDK는 즉시 데이터를 처리하기 위한 세 가지 옵션을 제공합니다.

  • 메모리 드라이버를 사용하여 비 영구적 예제 저장소를 제공합니다.
  • mssql 드라이버를 사용하여 개발을 위한 SQL Server Express 데이터 저장소를 제공합니다.
  • mssql 드라이버를 사용하여 프로덕션을 위한 Azure SQL Database 데이터 저장소를 제공합니다.

Mobile Apps Node.js SDK는 mssql Node.js 패키지를 사용하여 SQL Server Express 및 SQL Database에 대한 연결을 설정하고 사용합니다. 이 패키지는 SQL Server Express 인스턴스에서 TCP 연결을 사용해야 합니다.

메모리 드라이버는 테스트하기 위한 완전한 기능 집합을 제공하지 않습니다. 백 엔드 로컬로 테스트하려는 경우 SQL Server Express 데이터 저장소 및 mssql 드라이버를 사용하는 것이 좋습니다.

  1. Microsoft SQL Server 2014 Express를 다운로드하고 설치합니다. Tools Edition을 사용하여 SQL Server 2014 Express를 설치하도록 합니다. 64비트를 지원하도록 명시적으로 요구하지 않는 한 32비트 버전이 실행할 때 메모리를 적게 사용합니다.

  2. SQL Server 2014 구성 관리자를 실행합니다.

    a. 트리 메뉴에서 SQL Server 네트워크 구성 노드를 확장합니다.

    b. SQLEXPRESS에 대한 프로토콜을 선택합니다.

    c. 마우스 오른쪽 단추로 TCP/IP를 클릭하고 사용을 선택합니다. 팝업 대화 상자에서 확인을 선택합니다.

    d. 마우스 오른쪽 단추로 TCP/IP를 클릭하고 속성을 선택합니다.

    e. IP 주소 탭을 선택합니다.

    f. IPAll 노드를 찾습니다. TCP 포트 필드에 1433을 입력합니다.

    Configure SQL Server Express for TCP/IP

    g. 확인을 선택합니다. 팝업 대화 상자에서 확인을 선택합니다.

    h. 트리 메뉴에서 SQL Server 서비스를 선택합니다.

    i. 마우스 오른쪽 단추로 SQL Server (SQLEXPRESS)를 클릭하고 다시 시작을 선택합니다.

    j. SQL Server 2014 구성 관리자를 닫습니다.

  3. SQL Server 2014 Management Studio를 실행하고 로컬 SQL Server Express 인스턴스에 연결합니다.

    1. 개체 탐색기에서 마우스 오른쪽 단추로 인스턴스를 클릭하고 속성을 선택합니다.

    2. 보안 페이지를 선택합니다.

    3. SQL Server 및 Windows 인증 모드를 선택하도록 합니다.

    4. 확인을 선택합니다.

      Configure SQL Server Express authentication

    5. 개체 탐색기 보안>로그인을 확장합니다.

    6. 마우스 오른쪽 단추로 로그인을 클릭하고 새 로그인을 선택합니다.

    7. 로그인 이름을 입력합니다. SQL Server 인증을 선택합니다. 암호를 입력한 다음, 동일한 암호를 암호 확인에 입력합니다. 암호는 Windows 복잡성 요구 사항을 충족해야 합니다.

    8. 확인을 선택합니다.

      Add a new user to SQL Server Express

    9. 새 로그인을 마우스 오른쪽 단추로 클릭하고 속성을 선택합니다.

    10. 서버 역할 페이지를 선택합니다.

    11. dbcreator 서버 역할에 대한 확인란을 선택합니다.

    12. 확인을 선택합니다.

    13. SQL Server 2015 Management Studio를 닫습니다.

사용자 이름 및 선택한 암호를 기록하도록 합니다. 데이터베이스 요구 사항에 따라 추가 서버 역할 또는 권한을 할당해야 할 수 있습니다.

Node.js 애플리케이션은 이 데이터베이스의 연결 문자열을 읽기 위해 SQLCONNSTR_MS_TableConnectionString 환경 변수를 읽습니다. 환경에서 이 변수를 설정할 수 있습니다. 예를 들어 이 환경 변수를 설정하려면 PowerShell을 사용할 수 있습니다.

$env:SQLCONNSTR_MS_TableConnectionString = "Server=127.0.0.1; Database=mytestdatabase; User Id=azuremobile; Password=T3stPa55word;"

TCP/IP 연결을 통해 데이터베이스에 액세스합니다. 연결에 대한 사용자 이름 및 암호를 제공합니다.

로컬 개발에 대한 프로젝트 구성

Mobile Apps는 로컬 파일 시스템에서 azureMobile.js라는 JavaScript 파일을 읽습니다. 이 파일을 사용하여 프로덕션에서 Mobile Apps SDK를 구성하지 마십시오. 대신 Azure Portal앱 설정을 사용합니다.

azureMobile.js 파일은 구성 개체를 내보내야 합니다. 가장 일반적인 설정은 다음과 같습니다.

  • 데이터베이스 설정
  • 진단 로깅 설정
  • 대체 CORS 설정

이 예제 azureMobile.js 파일은 앞의 데이터베이스 설정을 구현합니다.

module.exports = {
    cors: {
        origins: [ 'localhost' ]
    },
    data: {
        provider: 'mssql',
        server: '127.0.0.1',
        database: 'mytestdatabase',
        user: 'azuremobile',
        password: 'T3stPa55word'
    },
    logging: {
        level: 'verbose'
    }
};

암호가 클라우드에 저장 되지 않도록 .gitignore 파일(또는 다른 소스 코드 제어 무시 파일)에azureMobile.js추가하는 것이 좋습니다. Azure Portal 내의 앱 설정에서 프로덕션 설정을 항상 구성합니다.

모바일 앱에 대한 앱 설정 구성

azureMobile.js 파일에서 대부분의 설정은 Azure Portal에서 동일한 앱 설정을 포함합니다. 다음 목록을 사용하여 앱 설정에서 앱을 구성합니다.

앱 설정 azureMobile.js 설정 설명 유효한 값
MS_MobileAppName name 앱의 이름 문자열
MS_MobileLoggingLevel logging.level 로깅할 메시지의 최소 로그 수준 error, warning, info, verbose, debug, silly
MS_DebugMode debug 디버그 모드의 사용 여부 설정 true, false
MS_TableSchema data.schema SQL 테이블에 대한 기본 스키마 이름 string(기본값: dbo)
MS_DynamicSchema data.dynamicSchema 디버그 모드의 사용 여부 설정 true, false
MS_DisableVersionHeader version(undefined로 설정) X-ZUMO-Server-Version 헤더를 사용하지 않도록 설정 true, false
MS_SkipVersionCheck skipversioncheck 클라이언트 API 버전 검사를 사용하지 않도록 설정 true, false

앱 설정을 지정하려면:

  1. Azure Portal에 로그인합니다.
  2. 모든 리소스 또는 App Services를 선택한 다음, 모바일 앱의 이름을 선택합니다.
  3. 설정 창이 기본적으로 열립니다. 열리지 않으면 설정을 선택합니다.
  4. 일반 메뉴에서 애플리케이션 설정을 선택합니다.
  5. 앱 설정 섹션으로 스크롤합니다.
  6. 앱 설정이 이미 있는 경우 앱 설정 값을 선택하여 값을 편집합니다. 앱 설정이 없으면 상자에 앱 설정을 입력하고 상자에 값을 입력합니다.
  7. 저장을 선택합니다.

대부분의 앱은 설정 변경 후 서비스를 다시 시작해야 합니다.

프로덕션 데이터 저장소로 SQL Database 사용

Azure SQL Database를 데이터 저장소로 사용하면 모든 Azure App Service 애플리케이션 형식에 걸쳐 동일합니다. 아직 수행하지 않은 경우 다음 단계에 따라 Mobile Apps 백 엔드를 만듭니다.

  1. Azure Portal에 로그인합니다.

  2. 창의 왼쪽 위에서 +NEW 단추 >웹 + 모바일 모바일>앱을 선택한 다음 Mobile Apps 백 엔드의 이름을 제공합니다.

  3. 리소스 그룹 상자에 앱과 동일한 이름을 입력합니다.

  4. 기본 App Service 계획이 선택됩니다. App Service 계획을 변경하려면:

    a. App Service 계획>+새로 만들기를 선택합니다.

    b. 새 App Service 계획의 이름을 입력하고 적절한 위치를 선택합니다.

    c. 서비스에 대한 적절한 가격 책정 계층을 선택합니다. 무료공유 등의 더 많은 가격 책정 옵션을 보려면 모두 보기를 선택합니다.

    d. 선택 단추를 클릭합니다.

    e. App Service 계획 창으로 돌아가서 확인을 선택합니다.

  5. 만들기를 선택합니다.

Mobile Apps 백 엔드를 프로비저닝하는 데 몇 분 정도 걸릴 수 있습니다. Mobile Apps 백 엔드가 프로비전되면 포털에서 Mobile Apps 백 엔드에 대한 설정 창이 열립니다.

Mobile Apps 백 엔드에 기존 SQL 데이터베이스를 연결하거나 새 SQL 데이터베이스를 만들도록 선택할 수 있습니다. 이 섹션에서 SQL 데이터베이스를 만듭니다.

참고

Mobile Apps 백 엔드와 동일한 위치에 데이터베이스가 이미 있다면 대신 기존 데이터베이스 사용을 선택한 다음, 해당 데이터베이스를 선택할 수 있습니다. 다른 위치에 있는 데이터베이스는 대기 시간이 높기 때문에 권장하지 않습니다.

  1. 새 Mobile Apps 백 엔드에서 설정>모빌 앱>데이터>+추가를 선택합니다.

  2. 데이터 연결 추가 창에서 SQL Database - 필요한 설정 구성>새 데이터베이스를 만들기를 선택합니다. 이름 상자에 새 데이터베이스 이름을 입력합니다.

  3. 서버를 선택합니다. 새 서버 창에서 서버 이름 상자에 고유한 서버 이름을 입력하고 적절한 서버 관리자 로그인 및 암호를 입력합니다. Azure 서비스의 서버 액세스 허용이 선택되어 있는지 확인합니다. 확인을 선택합니다.

    Create an Azure SQL database

  4. 새 데이터베이스 창에서 확인을 선택합니다.

  5. 데이터 연결 추가 창으로 돌아가서 연결 문자열을 선택하고, 데이터베이스를 만들 때 입력한 로그인 및 암호를 입력합니다. 기존 데이터베이스를 사용하는 경우 해당 데이터베이스에 대한 로그인 자격 증명을 입력합니다. 확인을 선택합니다.

  6. 데이터 연결 추가 창으로 다시 돌아가서 확인을 선택하여 데이터베이스를 만듭니다.

데이터베이스를 만드는 데 몇 분 정도 걸릴 수 있습니다. 알림 영역을 사용하여 배포의 진행률을 모니터링합니다. 데이터베이스가 성공적으로 배포될 때까지 진행하지 마세요. 데이터베이스가 배포되면 Mobile Apps 백 엔드 앱 설정에서 SQL Database 인스턴스에 대한 연결 문자열이 생성됩니다. 이 앱 설정은 설정>적용 설정>연결 문자열에서 확인할 수 있습니다.

테이블에 대한 액세스 인증 요구

엔드포인트에서 App Service 인증 tables 을 사용하려면 먼저 Azure Portal App Service 인증을 구성해야 합니다. 자세한 내용은 사용하려고 하는 ID 공급자에 대한 구성 가이드를 참조하세요.

각 테이블에는 테이블에 대한 액세스를 제어하는 데 사용할 수 있는 액세스 속성이 있습니다. 다음 샘플에서는 필요한 인증을 사용하여 정적으로 정의된 테이블을 보여줍니다.

var azureMobileApps = require('azure-mobile-apps');

var table = azureMobileApps.table();

// Define the columns within the table.
table.columns = {
    "text": "string",
    "complete": "boolean"
};

// Turn off the dynamic schema.
table.dynamicSchema = false;

// Require authentication to access the table.
table.access = 'authenticated';

module.exports = table;

액세스 속성은 세 가지 값 중 하나를 사용할 수 있습니다.

  • 익명은 클라이언트 애플리케이션이 인증 없이 데이터를 읽을 수 있다는 것을 나타냅니다.
  • 인증됨은 클라이언트 애플리케이션이 요청을 사용하여 유효한 인증 토큰을 송신해야 함을 나타냅니다.
  • 사용 안 함은 이 테이블이 현재 사용되지 않음을 나타냅니다.

액세스 속성을 정의하지 않으면 인증되지 않은 액세스가 허용됩니다.

테이블을 사용하여 인증 클레임 사용

인증이 설정될 때 요청되는 다양한 클레임을 설정할 수 있습니다. 이러한 클레임은 context.user 개체를 통해 정상적으로 사용할 수 없습니다. 그러나 context.user.getIdentity() 메서드를 사용하여 검색할 수 있습니다. getIdentity() 메서드는 개체로 확인되는 promise를 반환합니다. 개체는 인증 방법(facebook, google, twitter, microsoftaccount 또는 aad)을 키로 사용합니다.

예를 들어 Microsoft 계정 인증을 설정하고 메일 주소 클레임을 요청하는 경우 다음 테이블 컨트롤러를 사용하여 레코드에 이메일 주소를 추가할 수 있습니다.

var azureMobileApps = require('azure-mobile-apps');

// Create a new table definition.
var table = azureMobileApps.table();

table.columns = {
    "emailAddress": "string",
    "text": "string",
    "complete": "boolean"
};
table.dynamicSchema = false;
table.access = 'authenticated';

/**
* Limit the context query to those records with the authenticated user email address
* @param {Context} context the operation context
* @returns {Promise} context execution Promise
*/
function queryContextForEmail(context) {
    return context.user.getIdentity().then((data) => {
        context.query.where({ emailAddress: data.microsoftaccount.claims.emailaddress });
        return context.execute();
    });
}

/**
* Adds the email address from the claims to the context item - used for
* insert operations
* @param {Context} context the operation context
* @returns {Promise} context execution Promise
*/
function addEmailToContext(context) {
    return context.user.getIdentity().then((data) => {
        context.item.emailAddress = data.microsoftaccount.claims.emailaddress;
        return context.execute();
    });
}

// Configure specific code when the client does a request.
// READ: only return records that belong to the authenticated user.
table.read(queryContextForEmail);

// CREATE: add or overwrite the userId based on the authenticated user.
table.insert(addEmailToContext);

// UPDATE: only allow updating of records that belong to the authenticated user.
table.update(queryContextForEmail);

// DELETE: only allow deletion of records that belong to the authenticated user.
table.delete(queryContextForEmail);

module.exports = table;

사용할 수 있는 클레임을 보려면 웹 브라우저를 사용하여 사이트의 /.auth/me 엔드포인트를 봅니다.

특정 테이블 작업에 대한 액세스 사용 안 함

테이블에 나타나는 것 외에도 액세스 속성은 개별 작업을 제어하는 데 사용될 수 있습니다. 네 가지 작업이 있습니다.

  • read는 테이블의 RESTful GET 작업입니다.
  • insert는 테이블의 RESTful POST 작업입니다.
  • update는 테이블의 RESTful PATCH 작업입니다.
  • delete는 테이블의 RESTful DELETE 작업입니다.

예를 들어 읽기 전용 인증되지 않은 테이블을 제공하려 할 수도 있습니다.

var azureMobileApps = require('azure-mobile-apps');

var table = azureMobileApps.table();

// Read-only table. Only allow READ operations.
table.read.access = 'anonymous';
table.insert.access = 'disabled';
table.update.access = 'disabled';
table.delete.access = 'disabled';

module.exports = table;

테이블 작업에 사용되는 쿼리 조정

테이블 작업에 대한 일반적인 요구 사항은 데이터의 제한된 보기를 제공하는 것입니다. 예를 들어 사용자가 본인의 레코드를 읽거나 업데이트하는 것만 가능하도록 인증된 사용자 ID로 태그가 지정된 테이블을 제공할 수 있습니다. 다음 테이블 정의는 이 기능을 제공합니다.

var azureMobileApps = require('azure-mobile-apps');

var table = azureMobileApps.table();

// Define a static schema for the table.
table.columns = {
    "userId": "string",
    "text": "string",
    "complete": "boolean"
};
table.dynamicSchema = false;

// Require authentication for this table.
table.access = 'authenticated';

// Ensure that only records for the authenticated user are retrieved.
table.read(function (context) {
    context.query.where({ userId: context.user.id });
    return context.execute();
});

// When adding records, add or overwrite the userId with the authenticated user.
table.insert(function (context) {
    context.item.userId = context.user.id;
    return context.execute();
});

module.exports = table;

일반적으로 쿼리를 실행하는 작업에는 where 절을 사용하여 조정할 수 있는 쿼리 속성이 있습니다. 쿼리 속성은 데이터 백 엔드가 처리할 수 있는 무언가에 OData 쿼리를 변환하는 데 사용되는 QueryJS 개체입니다. 앞의 예처럼 간단한 같은 쿼리의 경우 맵을 사용할 수 있습니다. 또한 특정 SQL 절을 추가할 수 있습니다.

context.query.where('myfield eq ?', 'value');

테이블에 일시 삭제 구성

일시 삭제는 레코드를 실제로 삭제하지 않습니다. 대신 삭제된 열을 true로 설정하여 데이터베이스 내에서 삭제된 것으로 표시합니다. 모바일 클라이언트 SDK가 IncludeDeleted()를 사용하지 않는 경우 Mobile Apps SDK는 일시 삭제된 레코드를 결과에서 자동으로 삭제합니다. 일시 삭제에 대한 테이블을 구성하려면 테이블 정의 파일에서 softDelete 속성을 설정합니다.

var azureMobileApps = require('azure-mobile-apps');

var table = azureMobileApps.table();

// Define the columns within the table.
table.columns = {
    "text": "string",
    "complete": "boolean"
};

// Turn off the dynamic schema.
table.dynamicSchema = false;

// Turn on soft delete.
table.softDelete = true;

// Require authentication to access the table.
table.access = 'authenticated';

module.exports = table;

레코드: 클라이언트 애플리케이션, WebJob, Azure 함수 또는 사용자 지정 API를 삭제하는 메커니즘을 설정해야 합니다.

데이터를 사용하여 데이터베이스 시드

새 애플리케이션을 만들 때 데이터가 있는 테이블을 시드할 수 있습니다. 다음과 같이 테이블 정의 JavaScript 파일 내에서 수행할 수 있습니다.

var azureMobileApps = require('azure-mobile-apps');

var table = azureMobileApps.table();

// Define the columns within the table.
table.columns = {
    "text": "string",
    "complete": "boolean"
};
table.seed = [
    { text: 'Example 1', complete: false },
    { text: 'Example 2', complete: true }
];

// Turn off the dynamic schema.
table.dynamicSchema = false;

// Require authentication to access the table.
table.access = 'authenticated';

module.exports = table;

데이터 시드는 테이블을 만드는 데 Mobile Apps SDK를 사용한 경우에만 발생합니다. 테이블이 데이터베이스에 이미 있으면 데이터는 테이블에 삽입되지 않습니다. 동적 스키마를 설정한 경우 스키마는 시드된 데이터에서 유추됩니다.

서비스가 실행되기 시작하면 tables.initialize() 메서드를 명시적으로 호출하여 테이블을 만드는 것이 좋습니다.

Swagger 지원 사용

Mobile Apps는 기본 제공 Swagger를 지원합니다. Swagger 지원을 사용하려면 먼저 Swagger UI를 종속성으로 설치합니다.

npm install --save swagger-ui

그런 다음, Mobile Apps 생성자에서 Swagger 지원을 사용할 수 있습니다.

var mobile = azureMobileApps({ swagger: true });

개발 버전에서 Swagger 지원을 사용하려 합니다. NODE_ENV 앱 설정을 활용하여 수행할 수 있습니다.

var mobile = azureMobileApps({ swagger: process.env.NODE_ENV !== 'production' });

swagger 엔드포인트는 http://yoursite.azurewebsites.net/swagger에 위치합니다. ph x="1" /> 엔드포인트를 통해 Swagger UI에 액세스할 수 있습니다. 전체 애플리케이션에서 인증을 요구하도록 선택하면 Swagger가 오류를 생성합니다. 최상의 결과를 위해 table.access 속성을 사용하여 Azure App Service 인증/권한 부여 설정 및 제어 인증에서 인증되지 않은 요청을 허용하도록 선택합니다.

또한 로컬로 개발을 위해 Swagger 지원을 원하는 경우 azureMobile.js 파일에 Swagger 옵션을 추가할 수도 있습니다.

푸시 알림

Mobile Apps는 수많은 모든 주요 플랫폼의 디바이스에 대상 푸시 알림을 보낼 수 있도록 Azure Notification Hubs와 통합됩니다. Notification Hubs를 사용하여 iOS, Android 및 Windows 디바이스에 푸시 알림을 보낼 수 있습니다. Notification Hubs를 통해 수행할 수 있는 모든 것에 대한 자세한 내용은 Notification Hubs 개요를 참조하세요.

푸시 알림 보내기

다음 코드는 등록된 iOS 디바이스에 브로드캐스트 푸시 알림을 보내기 위해 push 개체를 사용하는 방법을 보여줍니다.

// Create an APNS payload.
var payload = '{"aps": {"alert": "This is an APNS payload."}}';

// Only do the push if configured.
if (context.push) {
    // Send a push notification by using APNS.
    context.push.apns.send(null, payload, function (error) {
        if (error) {
            // Do something or log the error.
        }
    });
}

클라이언트에서 템플릿 푸시 등록을 만들면 지원되는 모든 플랫폼의 디바이스에 템플릿 푸시 메시지를 대신 보낼 수 있습니다. 다음 코드는 템플릿 알림을 보내는 방법을 보여 줍니다.

// Define the template payload.
var payload = '{"messageParam": "This is a template payload."}';

// Only do the push if configured.
if (context.push) {
    // Send a template notification.
    context.push.send(null, payload, function (error) {
        if (error) {
            // Do something or log the error.
        }
    });
}

태그를 사용하여 인증된 사용자에게 푸시 알림 보내기

인증된 사용자가 푸시 알림에 등록하면 사용자 ID 태그가 등록에 자동으로 추가됩니다. 이 태그를 사용하여 특정 사용자가 등록된 모든 디바이스에 푸시 알림을 보낼 수 있습니다. 다음 코드는 요청을 만드는 사용자의 SID를 가져오고 해당 사용자에 대한 모든 디바이스 등록에 템플릿 푸시 알림을 보냅니다.

// Only do the push if configured.
if (context.push) {
    // Send a notification to the current user.
    context.push.send(context.user.id, payload, function (error) {
        if (error) {
            // Do something or log the error.
        }
    });
}

인증된 클라이언트의 푸시 알림을 등록할 때 등록을 시도하기 전에 인증이 완료되었는지 확인합니다.

사용자 지정 API

사용자 지정 API 정의

/tables 엔드포인트를 통한 데이터 액세스 API 외에도 Mobile Apps는 사용자 지정 API 범위를 제공할 수 있습니다. 사용자 지정 API는 유사한 방식으로 테이블 정의에 정의되고 인증을 비롯한 동일한 시설에 액세스할 수 있습니다.

사용자 지정 API를 사용하여 App Service 인증을 사용하려는 경우 Azure Portal에서 우선 App Service 인증을 구성해야 합니다. 자세한 내용은 사용하려고 하는 ID 공급자에 대한 구성 가이드를 참조하세요.

사용자 지정 API는 거의 동일한 방식으로 테이블 API로 정의됩니다.

  1. api 디렉터리를 만듭니다.
  2. api 디렉터리에서 API 정의 JavaScript 파일을 만듭니다.
  3. 가져오기 메서드를 사용하여 api 디렉터리를 가져옵니다.

다음은 이전에 사용된 기본 앱 샘플에 따른 프로토타입 API 정의입니다.

var express = require('express'),
    azureMobileApps = require('azure-mobile-apps');

var app = express(),
    mobile = azureMobileApps();

// Import the custom API.
mobile.api.import('./api');

// Add the Mobile API so it is accessible as a Web API.
app.use(mobile);

// Start listening on HTTP
app.listen(process.env.PORT || 3000);

Date.now() 메서드를 사용하여 서버 날짜를 반환하는 API 예제를 살펴보겠습니다. 다음은 api/date.js 파일입니다.

var api = {
    get: function (req, res, next) {
        var date = { currentTime: Date.now() };
        res.status(200).type('application/json').send(date);
    });
};

module.exports = api;

각 매개 변수는 GET, POST, PATCH 또는 DELETE와 같은 RESTful 표준 동사의 하나입니다. 메서드는 필요한 출력을 전송하는 표준 ExpressJS 미들웨어 함수입니다.

사용자 지정 API에 대한 액세스 인증 요구

Mobile Apps SDK는 tables 엔드포인트 및 사용자 지정 API에 대해 동일한 방식으로 인증을 구현합니다. 이전 섹션에서 개발된 API에 인증을 추가하려면 access 속성을 추가합니다.

var api = {
    get: function (req, res, next) {
        var date = { currentTime: Date.now() };
        res.status(200).type('application/json').send(date);
    });
};
// All methods must be authenticated.
api.access = 'authenticated';

module.exports = api;

또한 특정 작업에 인증을 지정할 수 있습니다.

var api = {
    get: function (req, res, next) {
        var date = { currentTime: Date.now() };
        res.status(200).type('application/json').send(date);
    }
};
// The GET methods must be authenticated.
api.get.access = 'authenticated';

module.exports = api;

tables 엔드포인트에 사용되는 동일한 토큰은 인증을 요구하는 사용자 지정 API에 사용되어야 합니다.

대용량 파일 업로드 처리

Mobile Apps SDK는 body-parser middleware를 사용하여 제출하는 본문 내용을 허용 및 디코딩합니다. 더 큰 파일 업로드를 허용하도록 body-parser를 미리 구성할 수 있습니다.

var express = require('express'),
    bodyParser = require('body-parser'),
    azureMobileApps = require('azure-mobile-apps');

var app = express(),
    mobile = azureMobileApps();

// Set up large body content handling.
app.use(bodyParser.json({ limit: '50mb' }));
app.use(bodyParser.urlencoded({ limit: '50mb', extended: true }));

// Import the custom API.
mobile.api.import('./api');

// Add the Mobile API so it is accessible as a Web API.
app.use(mobile);

// Start listening on HTTP.
app.listen(process.env.PORT || 3000);

이 파일은 Base-64로 인코딩된 후 전송됩니다. 이 인코딩은 실제 업로드의 크기를 증가시킵니다(고려해야 할 크기도 증가).

사용자 지정 SQL 문 실행

Mobile Apps SDK는 요청 개체를 통해 전체 컨텍스트에 대한 액세스를 허용합니다. 정의된 데이터 공급자에 대한 매개 변수가 있는 SQL 문을 쉽게 실행할 수 있습니다.

var api = {
    get: function (request, response, next) {
        // Check for parameters. If not there, pass on to a later API call.
        if (typeof request.params.completed === 'undefined')
            return next();

        // Define the query. Anything that the mssql
        // driver can handle is allowed.
        var query = {
            sql: 'UPDATE TodoItem SET complete=@completed',
            parameters: [{
                completed: request.params.completed
            }]
        };

        // Execute the query. The context for Mobile Apps is available through
        // request.azureMobile. The data object contains the configured data provider.
        request.azureMobile.data.execute(query)
        .then(function (results) {
            response.json(results);
        });
    }
};

api.get.access = 'authenticated';
module.exports = api;

디버깅

Mobile Apps의 디버깅, 진단 및 문제 해결

Azure App Service는 Node.js 애플리케이션에 대한 여러 디버깅 및 문제 해결 기술을 제공합니다. Node.js Mobile Apps 백 엔드 문제 해결에서 시작하려면 다음 문서를 참조하세요.

Node.js 애플리케이션은 넓은 범위의 진단 로그 도구에 액세스합니다. 내부적으로 Mobile Apps Node.js SDK는 진단 로깅에 윈스턴을 사용합니다. 디버그 모드를 사용하도록 설정하거나 Azure Portal 앱 설정을 true로 설정 MS_DebugMode 하면 로깅이 자동으로 활성화됩니다. 생성된 로그는 Azure Portal 진단 로그에 표시됩니다.