{"id":1140,"date":"2017-08-15T07:00:49","date_gmt":"2017-08-15T14:00:49","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/bringing-user-profile-store-mobile-nativescript-angular\/"},"modified":"2017-08-15T07:00:49","modified_gmt":"2017-08-15T14:00:49","slug":"bringing-user-profile-store-mobile-nativescript-angular","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/ko\/bringing-user-profile-store-mobile-nativescript-angular\/","title":{"rendered":"\ub124\uc774\ud2f0\ube0c\uc2a4\ud06c\ub9bd\ud2b8\uc640 \uc575\uade4\ub7ec\ub97c \uc0ac\uc6a9\ud558\uc5ec \ubaa8\ubc14\uc77c\uc5d0 \uc0ac\uc6a9\uc790 \ud504\ub85c\ud544 \uc2a4\ud1a0\uc5b4 \ub3c4\uc785\ud558\uae30"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Continuing down the path of user profile stores, we had previously seen <a href=\"https:\/\/www.couchbase.com\/blog\/creating-user-profile-store-with-node-js-nosql-database\/\" target=\"_blank\" rel=\"noopener\">how to create one with Node.js and Couchbase NoSQL<\/a> as well as a <a href=\"https:\/\/www.couchbase.com\/blog\/creating-front-end-user-profile-store-angular-typescript\/\" target=\"_blank\" rel=\"noopener\">web client front-end for it using Angular<\/a>. What if we wanted to take this into a mobile application, which is the norm for all applications as of now.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">There are many different mobile frameworks out there and we&#8217;re lucky that some even support Angular, which is what we had used in the previous example. We&#8217;re going to see how to convert our client front-end to mobile using <a href=\"https:\/\/www.nativescript.org\" target=\"_blank\" rel=\"noopener\">NativeScript<\/a> and Angular.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><!--more--><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Before going forward, the assumption is that you&#8217;ve completely both of the two previous tutorials, one on <a href=\"https:\/\/www.couchbase.com\/blog\/creating-user-profile-store-with-node-js-nosql-database\/\" target=\"_blank\" rel=\"noopener\">creating the profile store backend<\/a> and the other on <a href=\"https:\/\/www.couchbase.com\/blog\/creating-front-end-user-profile-store-angular-typescript\/\" target=\"_blank\" rel=\"noopener\">creating the profile store web front-end<\/a>. We&#8217;re also going to assume that your development environment is property configured for mobile development, whether that be Android, iOS, or both.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-3887 size-full\" src=\"https:\/\/www.couchbase.com\/wp-content\/uploads\/sites\/5\/2026\/05\/ns-angular-profile-store.gif\" alt=\"NativeScript with Couchbase Profile Store\" width=\"1100\" height=\"709\"><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The flow of events in this application will match what we saw in the web version.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Create a New NativeScript with Angular Project<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Assuming that you&#8217;ve gotten the NativeScript CLI installed and configured, execute the following to create a new project:<\/p>\n\n\n<p>[crayon lang=&#8221;default&#8221; decode=&#8221;true&#8221;]tns create profile-project-ns &#8211;ng[\/crayon]<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The <code>--ng<\/code> flag in the above command is important because it means we are creating an Angular project rather than a NativeScript Core project.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">As of right now, the NativeScript CLI doesn&#8217;t share the Angular CLI capabilities of generating components. For this reason, we&#8217;re going to have to create each of the HTML and TypeScript files manually.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">If you&#8217;re on Mac or Linux, execute the following from within the NativeScript project:<\/p>\n\n\n<p>[crayon lang=&#8221;default&#8221; decode=&#8221;true&#8221;]mkdir -p app\/login<br \/>\nmkdir -p app\/register<br \/>\nmkdir -p app\/blogs<br \/>\nmkdir -p app\/blog<br \/>\ntouch app\/login\/login.component.html<br \/>\ntouch app\/login\/login.component.ts<br \/>\ntouch app\/register\/register.component.html<br \/>\ntouch app\/register\/register.component.ts<br \/>\ntouch app\/blogs\/blogs.component.html<br \/>\ntouch app\/blogs\/blogs.component.ts<br \/>\ntouch app\/blog\/blog.component.html<br \/>\ntouch app\/blog\/blog.component.ts[\/crayon]<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">If you&#8217;re on Windows, just create those directories and files manually. If you really wanted to, you could copy these directories and files from your web project from the <a href=\"https:\/\/www.couchbase.com\/blog\/creating-front-end-user-profile-store-angular-typescript\/\" target=\"_blank\" rel=\"noopener\">previous tutorial<\/a>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Defining the Components to Represent Each Screen<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Starting in the same direction as the web version, we&#8217;re going to focus on user login. Open the project&#8217;s\u00a0<strong>app\/login\/login.component.ts<\/strong> file and include the following code:<\/p>\n\n\n<p>[crayon lang=&#8221;default&#8221; decode=&#8221;true&#8221;]import { Component } from &#8216;@angular\/core&#8217;;<br \/>\nimport { Http, Headers, RequestOptions } from &#8220;@angular\/http&#8221;;<br \/>\nimport { Router } from &#8220;@angular\/router&#8221;;<br \/>\nimport &#8220;rxjs\/Rx&#8221;;<\/p>\n<p>@Component({<br \/>\n    moduleId: module.id,<br \/>\n    selector: &#8216;app-login&#8217;,<br \/>\n    templateUrl: &#8216;.\/login.component.html&#8217;<br \/>\n})<br \/>\nexport class LoginComponent {<\/p>\n<p>    public input: any;<\/p>\n<p>    constructor(private http: Http, private router: Router) {<br \/>\n        this.input = {<br \/>\n            &#8220;email&#8221;: &#8220;&#8221;,<br \/>\n            &#8220;password&#8221;: &#8220;&#8221;<br \/>\n        };<br \/>\n    }<\/p>\n<p>    public login() {<br \/>\n        if(this.input.email &amp;&amp; this.input.password) {<br \/>\n            let headers = new Headers({ &#8220;content-type&#8221;: &#8220;application\/json&#8221; });<br \/>\n            let options = new RequestOptions({ headers: headers });<br \/>\n            this.http.post(&#8220;https:\/\/localhost:3000\/login&#8221;, JSON.stringify(this.input), options)<br \/>\n                .map(result =&gt; result.json())<br \/>\n                .subscribe(result =&gt; {<br \/>\n                    this.router.navigate([&#8220;\/blogs&#8221;], { &#8220;queryParams&#8221;: result });<br \/>\n                });<br \/>\n        }<br \/>\n    }<\/p>\n<p>}[\/crayon]<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The above code is exactly what we saw in the web version with two exceptions. I&#8217;ve removed the CSS reference since we did not create a CSS file on a component basis. I&#8217;ve also added a <code>moduleId<\/code> so relative paths could work with our component. These are both Angular related items with nothing to do with NativeScript.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The HTML is where things are different. Open the project&#8217;s\u00a0<strong>app\/login\/login.component.html<\/strong> file and include the following XML markup:<\/p>\n\n\n<p>[crayon lang=&#8221;default&#8221; decode=&#8221;true&#8221;]&lt;ActionBar title=&#8221;{N} Profile Store&#8221;&gt;&lt;\/ActionBar&gt;<br \/>\n&lt;StackLayout class=&#8221;form&#8221;&gt;<br \/>\n    &lt;StackLayout class=&#8221;input-field&#8221;&gt;<br \/>\n        &lt;Label text=&#8221;Email&#8221; class=&#8221;label font-weight-bold m-b-5&#8243;&gt;&lt;\/Label&gt;<br \/>\n        &lt;TextField class=&#8221;input&#8221; [(ngModel)]=&#8221;input.email&#8221; autocapitalizationType=&#8221;none&#8221;&gt;&lt;\/TextField&gt;<br \/>\n        &lt;StackLayout class=&#8221;hr-light&#8221;&gt;&lt;\/StackLayout&gt;<br \/>\n    &lt;\/StackLayout&gt;<br \/>\n    &lt;StackLayout class=&#8221;input-field&#8221;&gt;<br \/>\n        &lt;Label text=&#8221;Password&#8221; class=&#8221;label font-weight-bold m-b-5&#8243;&gt;&lt;\/Label&gt;<br \/>\n        &lt;TextField class=&#8221;input&#8221; secure=&#8221;true&#8221; [(ngModel)]=&#8221;input.password&#8221; autocapitalizationType=&#8221;none&#8221;&gt;&lt;\/TextField&gt;<br \/>\n        &lt;StackLayout class=&#8221;hr-light&#8221;&gt;&lt;\/StackLayout&gt;<br \/>\n    &lt;\/StackLayout&gt;<br \/>\n    &lt;StackLayout class=&#8221;input-field&#8221;&gt;<br \/>\n        &lt;Button class=&#8221;btn btn-primary&#8221; text=&#8221;Login&#8221; (tap)=&#8221;login()&#8221;&gt;&lt;\/Button&gt;<br \/>\n    &lt;\/StackLayout&gt;<br \/>\n    &lt;StackLayout class=&#8221;input-field&#8221;&gt;<br \/>\n        &lt;Label text=&#8221;Register here.&#8221; [nsRouterLink]=&#8221;[&#8216;\/register&#8217;]&#8221; class=&#8221;text-center&#8221;&gt;&lt;\/Label&gt;<br \/>\n    &lt;\/StackLayout&gt;<br \/>\n&lt;\/StackLayout&gt;[\/crayon]<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">NativeScript has its own markup for the UI. The same rules apply in terms of Angular, but creating UI components is just a bit different.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">For example, we are still using the <code>[(ngModel)]<\/code> attributes, but instead of <code>div<\/code> tags, we have <code>StackLayout<\/code> tags.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Now let&#8217;s take a look at the registration component. Open the project&#8217;s\u00a0<strong>app\/register\/register.component.ts<\/strong> file and include the following TypeScript:<\/p>\n\n\n<p>[crayon lang=&#8221;default&#8221; decode=&#8221;true&#8221;]import { Component } from &#8216;@angular\/core&#8217;;<br \/>\nimport { Http, Headers, RequestOptions } from &#8220;@angular\/http&#8221;;<br \/>\nimport { Router } from &#8220;@angular\/router&#8221;;<br \/>\nimport &#8220;rxjs\/Rx&#8221;;<\/p>\n<p>@Component({<br \/>\n    moduleId: module.id,<br \/>\n    selector: &#8216;app-register&#8217;,<br \/>\n    templateUrl: &#8216;.\/register.component.html&#8217;<br \/>\n})<br \/>\nexport class RegisterComponent {<\/p>\n<p>    public input: any;<\/p>\n<p>    public constructor(private http: Http, private router: Router) {<br \/>\n        this.input = {<br \/>\n            &#8220;firstname&#8221;: &#8220;&#8221;,<br \/>\n            &#8220;lastname&#8221;: &#8220;&#8221;,<br \/>\n            &#8220;email&#8221;: &#8220;&#8221;,<br \/>\n            &#8220;password&#8221;: &#8220;&#8221;<br \/>\n        };<br \/>\n    }<\/p>\n<p>    public register() {<br \/>\n        if(this.input.email &amp;&amp; this.input.password) {<br \/>\n            let headers = new Headers({ &#8220;content-type&#8221;: &#8220;application\/json&#8221; });<br \/>\n            let options = new RequestOptions({ headers: headers });<br \/>\n            this.http.post(&#8220;https:\/\/localhost:3000\/account&#8221;, JSON.stringify(this.input), options)<br \/>\n                .map(result =&gt; result.json())<br \/>\n                .subscribe(result =&gt; {<br \/>\n                    this.router.navigate([&#8220;\/login&#8221;]);<br \/>\n                });<br \/>\n        }<br \/>\n    }<\/p>\n<p>}[\/crayon]<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Again, the only changes we made in the above code, compared to the previous example, is in the CSS removal and <code>moduleId<\/code> addition.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Not bad when it comes to creating cross platform web and mobile applications right?<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The HTML for the UI that powers the TypeScript logic is found in the\u00a0<strong>app\/register\/register.component.html<\/strong> file and it looks like this:<\/p>\n\n\n<p>[crayon lang=&#8221;default&#8221; decode=&#8221;true&#8221;]&lt;ActionBar title=&#8221;{N} Profile Store&#8221;&gt;&lt;\/ActionBar&gt;<br \/>\n&lt;StackLayout class=&#8221;form&#8221;&gt;<br \/>\n    &lt;StackLayout class=&#8221;input-field&#8221;&gt;<br \/>\n        &lt;Label text=&#8221;First Name&#8221; class=&#8221;label font-weight-bold m-b-5&#8243;&gt;&lt;\/Label&gt;<br \/>\n        &lt;TextField class=&#8221;input&#8221; [(ngModel)]=&#8221;input.firstname&#8221; autocapitalizationType=&#8221;none&#8221;&gt;&lt;\/TextField&gt;<br \/>\n        &lt;StackLayout class=&#8221;hr-light&#8221;&gt;&lt;\/StackLayout&gt;<br \/>\n    &lt;\/StackLayout&gt;<br \/>\n    &lt;StackLayout class=&#8221;input-field&#8221;&gt;<br \/>\n        &lt;Label text=&#8221;Last Name&#8221; class=&#8221;label font-weight-bold m-b-5&#8243;&gt;&lt;\/Label&gt;<br \/>\n        &lt;TextField class=&#8221;input&#8221; [(ngModel)]=&#8221;input.lastname&#8221; autocapitalizationType=&#8221;none&#8221;&gt;&lt;\/TextField&gt;<br \/>\n        &lt;StackLayout class=&#8221;hr-light&#8221;&gt;&lt;\/StackLayout&gt;<br \/>\n    &lt;\/StackLayout&gt;<br \/>\n    &lt;StackLayout class=&#8221;input-field&#8221;&gt;<br \/>\n        &lt;Label text=&#8221;Email&#8221; class=&#8221;label font-weight-bold m-b-5&#8243;&gt;&lt;\/Label&gt;<br \/>\n        &lt;TextField class=&#8221;input&#8221; [(ngModel)]=&#8221;input.email&#8221; autocapitalizationType=&#8221;none&#8221;&gt;&lt;\/TextField&gt;<br \/>\n        &lt;StackLayout class=&#8221;hr-light&#8221;&gt;&lt;\/StackLayout&gt;<br \/>\n    &lt;\/StackLayout&gt;<br \/>\n    &lt;StackLayout class=&#8221;input-field&#8221;&gt;<br \/>\n        &lt;Label text=&#8221;Password&#8221; class=&#8221;label font-weight-bold m-b-5&#8243;&gt;&lt;\/Label&gt;<br \/>\n        &lt;TextField class=&#8221;input&#8221; secure=&#8221;true&#8221; [(ngModel)]=&#8221;input.password&#8221; autocapitalizationType=&#8221;none&#8221;&gt;&lt;\/TextField&gt;<br \/>\n        &lt;StackLayout class=&#8221;hr-light&#8221;&gt;&lt;\/StackLayout&gt;<br \/>\n    &lt;\/StackLayout&gt;<br \/>\n    &lt;StackLayout class=&#8221;input-field&#8221;&gt;<br \/>\n        &lt;Button class=&#8221;btn btn-primary&#8221; text=&#8221;Register&#8221; (tap)=&#8221;register()&#8221;&gt;&lt;\/Button&gt;<br \/>\n    &lt;\/StackLayout&gt;<br \/>\n    &lt;StackLayout class=&#8221;input-field&#8221;&gt;<br \/>\n        &lt;Label text=&#8221;Login here.&#8221; [nsRouterLink]=&#8221;[&#8216;\/login&#8217;]&#8221; class=&#8221;text-center&#8221;&gt;&lt;\/Label&gt;<br \/>\n    &lt;\/StackLayout&gt;<br \/>\n&lt;\/StackLayout&gt;[\/crayon]<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The final two components are going to be no different from what we&#8217;re already experiencing.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Open the project&#8217;s\u00a0<strong>app\/blogs\/blogs.component.ts<\/strong> file and include the following TypeScript code:<\/p>\n\n\n<p>[crayon lang=&#8221;default&#8221; decode=&#8221;true&#8221;]import { Component, OnInit } from &#8216;@angular\/core&#8217;;<br \/>\nimport { Http, Headers, RequestOptions } from &#8220;@angular\/http&#8221;;<br \/>\nimport { Router, ActivatedRoute } from &#8220;@angular\/router&#8221;;<br \/>\nimport { Location } from &#8220;@angular\/common&#8221;;<br \/>\nimport &#8220;rxjs\/Rx&#8221;;<\/p>\n<p>@Component({<br \/>\n    moduleId: module.id,<br \/>\n    selector: &#8216;app-blogs&#8217;,<br \/>\n    templateUrl: &#8216;.\/blogs.component.html&#8217;<br \/>\n})<br \/>\nexport class BlogsComponent implements OnInit {<\/p>\n<p>    private sid: string;<br \/>\n    public entries: Array&lt;any&gt;;<\/p>\n<p>    public constructor(private http: Http, private router: Router, private route: ActivatedRoute, private location: Location) {<br \/>\n        this.entries = [];<br \/>\n    }<\/p>\n<p>    public ngOnInit() {<br \/>\n        this.location.subscribe(() =&gt; {<br \/>\n            let headers = new Headers({ &#8220;authorization&#8221;: &#8220;Bearer &#8221; + this.sid });<br \/>\n            let options = new RequestOptions({ headers: headers });<br \/>\n            this.http.get(&#8220;https:\/\/localhost:3000\/blogs&#8221;, options)<br \/>\n                .map(result =&gt; result.json())<br \/>\n                .subscribe(result =&gt; {<br \/>\n                    this.entries = result;<br \/>\n                });<br \/>\n        });<br \/>\n        this.route.queryParams.subscribe(params =&gt; {<br \/>\n            this.sid = params[&#8220;sid&#8221;];<br \/>\n            let headers = new Headers({ &#8220;authorization&#8221;: &#8220;Bearer &#8221; + params[&#8220;sid&#8221;] });<br \/>\n            let options = new RequestOptions({ headers: headers });<br \/>\n            this.http.get(&#8220;https:\/\/localhost:3000\/blogs&#8221;, options)<br \/>\n                .map(result =&gt; result.json())<br \/>\n                .subscribe(result =&gt; {<br \/>\n                    this.entries = result;<br \/>\n                });<br \/>\n        });<br \/>\n    }<\/p>\n<p>    public create() {<br \/>\n        this.router.navigate([&#8220;\/blog&#8221;], { &#8220;queryParams&#8221;: { &#8220;sid&#8221;: this.sid } });<br \/>\n    }<\/p>\n<p>}[\/crayon]<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">No changes to see in the above other than the two previously mentioned, so we can move into our HTML for the page.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Open the project&#8217;s\u00a0<strong>app\/blogs\/blogs.component.html<\/strong> file and include the following HTML markup:<\/p>\n\n\n<p>[crayon lang=&#8221;default&#8221; decode=&#8221;true&#8221;]&lt;ActionBar title=&#8221;{N} Profile Store&#8221;&gt;<br \/>\n    &lt;ActionItem text=&#8221;New&#8221; ios.position=&#8221;right&#8221; (tap)=&#8221;create()&#8221;&gt;&lt;\/ActionItem&gt;<br \/>\n    &lt;NavigationButton text=&#8221;Back&#8221;&gt;&lt;\/NavigationButton&gt;<br \/>\n&lt;\/ActionBar&gt;<br \/>\n&lt;GridLayout rows=&#8221;*, auto&#8221; columns=&#8221;*&#8221;&gt;<br \/>\n    &lt;ListView [items]=&#8221;entries&#8221; class=&#8221;list-group&#8221; row=&#8221;0&#8243; col=&#8221;0&#8243;&gt;<br \/>\n        &lt;ng-template let-entry=&#8221;item&#8221;&gt;<br \/>\n            &lt;StackLayout class=&#8221;list-group-item&#8221;&gt;<br \/>\n                &lt;Label text=&#8221;{{ entry.title }}&#8221; class=&#8221;h2&#8243;&gt;&lt;\/Label&gt;<br \/>\n                &lt;Label text=&#8221;{{ entry.content }}&#8221;&gt;&lt;\/Label&gt;<br \/>\n            &lt;\/StackLayout&gt;<br \/>\n        &lt;\/ng-template&gt;<br \/>\n    &lt;\/ListView&gt;<br \/>\n    &lt;StackLayout row=&#8221;1&#8243; col=&#8221;0&#8243; padding=&#8221;10&#8243; backgroundColor=&#8221;#F0F0F0&#8243;&gt;<br \/>\n        &lt;Label text=&#8221;Logout&#8221; [nsRouterLink]=&#8221;[&#8216;\/login&#8217;]&#8221;&gt;&lt;\/Label&gt;<br \/>\n    &lt;\/StackLayout&gt;<br \/>\n&lt;\/GridLayout&gt;[\/crayon]<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Let&#8217;s wrap this application up with the final component that our profile store API and web front-end has to offer.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Open the project&#8217;s\u00a0<strong>app\/blog\/blog.component.ts<\/strong> file and include this:<\/p>\n\n\n<p>[crayon lang=&#8221;default&#8221; decode=&#8221;true&#8221;]import { Component, OnInit } from &#8216;@angular\/core&#8217;;<br \/>\nimport { Http, Headers, RequestOptions } from &#8220;@angular\/http&#8221;;<br \/>\nimport { ActivatedRoute } from &#8220;@angular\/router&#8221;;<br \/>\nimport { Location } from &#8220;@angular\/common&#8221;;<br \/>\nimport &#8220;rxjs\/Rx&#8221;;<\/p>\n<p>@Component({<br \/>\n    moduleId: module.id,<br \/>\n    selector: &#8216;app-blog&#8217;,<br \/>\n    templateUrl: &#8216;.\/blog.component.html&#8217;<br \/>\n})<br \/>\nexport class BlogComponent implements OnInit {<\/p>\n<p>    private sid: string;<br \/>\n    public input: any;<\/p>\n<p>    public constructor(private http: Http, private route: ActivatedRoute, private location: Location) {<br \/>\n        this.input = {<br \/>\n            &#8220;title&#8221;: &#8220;&#8221;,<br \/>\n            &#8220;content&#8221;: &#8220;&#8221;<br \/>\n        };<br \/>\n    }<\/p>\n<p>    public ngOnInit() {<br \/>\n        this.route.queryParams.subscribe(params =&gt; {<br \/>\n            this.sid = params[&#8220;sid&#8221;];<br \/>\n        });<br \/>\n    }<\/p>\n<p>    public save() {<br \/>\n        if(this.input.title &amp;&amp; this.input.content) {<br \/>\n            let headers = new Headers({<br \/>\n                &#8220;content-type&#8221;: &#8220;application\/json&#8221;,<br \/>\n                &#8220;authorization&#8221;: &#8220;Bearer &#8221; + this.sid<br \/>\n            });<br \/>\n            let options = new RequestOptions({ headers: headers });<br \/>\n            this.http.post(&#8220;https:\/\/localhost:3000\/blog&#8221;, JSON.stringify(this.input), options)<br \/>\n                .map(result =&gt; result.json())<br \/>\n                .subscribe(result =&gt; {<br \/>\n                    this.location.back();<br \/>\n                });<br \/>\n        }<br \/>\n    }<\/p>\n<p>}[\/crayon]<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">If you didn&#8217;t copy over your CSS file, don&#8217;t forget to remove it from the <code>@Component<\/code> block as seen in the previous components.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The HTML UI to go with this TypeScript is found in the project&#8217;s\u00a0<strong>app\/blog\/blog.component.html<\/strong> file and it looks like the following:<\/p>\n\n\n<p>[crayon lang=&#8221;default&#8221; decode=&#8221;true&#8221;]&lt;ActionBar title=&#8221;{N} Profile Store&#8221;&gt;<br \/>\n    &lt;NavigationButton text=&#8221;Back&#8221;&gt;&lt;\/NavigationButton&gt;<br \/>\n&lt;\/ActionBar&gt;<br \/>\n&lt;StackLayout class=&#8221;form&#8221;&gt;<br \/>\n    &lt;StackLayout class=&#8221;input-field&#8221;&gt;<br \/>\n        &lt;Label text=&#8221;Title&#8221; class=&#8221;label font-weight-bold m-b-5&#8243;&gt;&lt;\/Label&gt;<br \/>\n        &lt;TextField class=&#8221;input&#8221; [(ngModel)]=&#8221;input.title&#8221; autocapitalizationType=&#8221;none&#8221;&gt;&lt;\/TextField&gt;<br \/>\n        &lt;StackLayout class=&#8221;hr-light&#8221;&gt;&lt;\/StackLayout&gt;<br \/>\n    &lt;\/StackLayout&gt;<br \/>\n    &lt;StackLayout class=&#8221;input-field&#8221;&gt;<br \/>\n        &lt;Label text=&#8221;Content&#8221; class=&#8221;label font-weight-bold m-b-5&#8243;&gt;&lt;\/Label&gt;<br \/>\n        &lt;TextView class=&#8221;input&#8221; [(ngModel)]=&#8221;input.content&#8221; autocapitalizationType=&#8221;none&#8221;&gt;&lt;\/TextView&gt;<br \/>\n        &lt;StackLayout class=&#8221;hr-light&#8221;&gt;&lt;\/StackLayout&gt;<br \/>\n    &lt;\/StackLayout&gt;<br \/>\n    &lt;StackLayout class=&#8221;input-field&#8221;&gt;<br \/>\n        &lt;Button class=&#8221;btn btn-primary&#8221; text=&#8221;Save&#8221; (tap)=&#8221;save()&#8221;&gt;&lt;\/Button&gt;<br \/>\n    &lt;\/StackLayout&gt;<br \/>\n&lt;\/StackLayout&gt;[\/crayon]<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">As of right now you may be scratching your head on all this NativeScript XML markup. How Angular works with the UI hasn&#8217;t changed, but if you&#8217;re interested in learning about the NativeScript markup, check out their <a href=\"https:\/\/docs.nativescript.org\/angular\/start\/introduction.html\" target=\"_blank\" rel=\"noopener\">official documentation<\/a>. Get familiar with the <code>StackLayout<\/code>, <code>GridLayout<\/code> and individual UI component tags.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Bringing it Together<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">We&#8217;ve created all these Angular components for NativeScript, but we haven&#8217;t brought them together via the Angular Router.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">In the web version of this guide, the route information was in the\u00a0<strong>app.module.ts<\/strong> file. While we could do that, NativeScript broke it out into a separate file.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Open the project&#8217;s\u00a0<strong>app\/app.routing.ts<\/strong> file and include the following:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><p>[crayon lang=&#8221;default&#8221; decode=&#8221;true&#8221;]mkdir -p app\/login<br \/>\nmkdir -p app\/register<br \/>\nmkdir -p app\/blogs<br \/>\nmkdir -p app\/blog<br \/>\ntouch app\/login\/login.component.html<br \/>\ntouch app\/login\/login.component.ts<br \/>\ntouch app\/register\/register.component.html<br \/>\ntouch app\/register\/register.component.ts<br \/>\ntouch app\/blogs\/blogs.component.html<br \/>\ntouch app\/blogs\/blogs.component.ts<br \/>\ntouch app\/blog\/blog.component.html<br \/>\ntouch app\/blog\/blog.component.ts[\/crayon]<\/p>\n0<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A lot of the above code came with our new project template. We imported each of our components, and created a route for them.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Likewise, the components need to be imported in the project&#8217;s\u00a0<strong>app\/app.module.ts<\/strong> file. Open this file and include the following:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><p>[crayon lang=&#8221;default&#8221; decode=&#8221;true&#8221;]mkdir -p app\/login<br \/>\nmkdir -p app\/register<br \/>\nmkdir -p app\/blogs<br \/>\nmkdir -p app\/blog<br \/>\ntouch app\/login\/login.component.html<br \/>\ntouch app\/login\/login.component.ts<br \/>\ntouch app\/register\/register.component.html<br \/>\ntouch app\/register\/register.component.ts<br \/>\ntouch app\/blogs\/blogs.component.html<br \/>\ntouch app\/blogs\/blogs.component.ts<br \/>\ntouch app\/blog\/blog.component.html<br \/>\ntouch app\/blog\/blog.component.ts[\/crayon]<\/p>\n1<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">In addition to importing each component and adding them to the <code>declarations<\/code> array, we also imported a few modules such as the <code>NativeScriptHttpModule<\/code> and <code>NativeScriptFormsModule<\/code>. In pure Angular, these are called the <code>HttpModule<\/code> and <code>FormsModule<\/code>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">In theory, the application is ready to go.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Resolving App Transport Security Issues (ATS) for iOS<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Because the Node.js and Couchbase API is running locally, we are using HTTP rather than HTTPS. iOS will throw errors if we try to access HTTP resources.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This is easily fixable by adding an ATS policy.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Open the project&#8217;s\u00a0<strong>app\/App_Resources\/iOS\/Info.plist<\/strong> and add the following alongside the other XML:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><p>[crayon lang=&#8221;default&#8221; decode=&#8221;true&#8221;]mkdir -p app\/login<br \/>\nmkdir -p app\/register<br \/>\nmkdir -p app\/blogs<br \/>\nmkdir -p app\/blog<br \/>\ntouch app\/login\/login.component.html<br \/>\ntouch app\/login\/login.component.ts<br \/>\ntouch app\/register\/register.component.html<br \/>\ntouch app\/register\/register.component.ts<br \/>\ntouch app\/blogs\/blogs.component.html<br \/>\ntouch app\/blogs\/blogs.component.ts<br \/>\ntouch app\/blog\/blog.component.html<br \/>\ntouch app\/blog\/blog.component.ts[\/crayon]<\/p>\n2<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The above essentially whitelists all HTTP endpoints. It is not safe for production, but safe for testing.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">More information on ATS in NativeScript applications can be read about in a previous article I wrote titled,\u00a0<a href=\"https:\/\/www.thepolyglotdeveloper.com\/2015\/12\/fix-ios-9-app-transport-security-issues-in-nativescript\/\" target=\"_blank\" rel=\"noopener\">Fix iOS 9 App Transport Security Issues in NativeScript<\/a>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Conclusion<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">You just saw how easy it was to take your web client front-end and convert it to mobile using NativeScript and Angular. The user profile store example quickly became a full stack example using the JavaScript stack. We had a Node.js with <a href=\"https:\/\/www.couchbase.com\" target=\"_blank\" rel=\"noopener\">Couchbase Server<\/a> backend, Angular web front-end, and NativeScript mobile front-end.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The next step, or option, would be to use the Couchbase Mobile components rather than HTTP calls against the API.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Continuing down the path of user profile stores, we had previously seen how to create one with Node.js and Couchbase NoSQL as well as a web client front-end for it using Angular. What if we wanted to take this into a mobile application, which is the norm for all applications as of now. There are [&hellip;]<\/p>\n","protected":false},"author":63,"featured_media":18,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"_acf":"","footnotes":"","_ppma_block_editor_authors":""},"categories":[127,136,54,163],"tags":[213,272,165,223,273,274],"ppma_author":[148],"class_list":["post-1140","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-application-design","category-best-practices-and-tutorials","category-couchbase-server","category-javascript","tag-angular","tag-front-end","tag-javascript","tag-nativescript","tag-profile-store","tag-typescript"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v28.6 (Yoast SEO v28.8) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Bringing Your User Profile Store to Mobile with NativeScript and Angular<\/title>\n<meta name=\"description\" content=\"Learn how to take the user profile store example as seen in the previous tutorials and create a mobile front-end for it using NativeScript and Angular.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.couchbase.com\/blog\/ko\/bringing-user-profile-store-mobile-nativescript-angular\/\" \/>\n<meta property=\"og:locale\" content=\"ko_KR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Bringing Your User Profile Store to Mobile with NativeScript and Angular\" \/>\n<meta property=\"og:description\" content=\"Learn how to take the user profile store example as seen in the previous tutorials and create a mobile front-end for it using NativeScript and Angular.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/ko\/bringing-user-profile-store-mobile-nativescript-angular\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/thepolyglotdeveloper\" \/>\n<meta property=\"article:published_time\" content=\"2017-08-15T14:00:49+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/5\/2026\/05\/couchbase-nosql-dbaas.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1800\" \/>\n\t<meta property=\"og:image:height\" content=\"630\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Nic Raboy, Developer Advocate, Couchbase\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@nraboy\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Nic Raboy, Developer Advocate, Couchbase\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"13\ubd84\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/pt\\\/bringing-user-profile-store-mobile-nativescript-angular\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/pt\\\/bringing-user-profile-store-mobile-nativescript-angular\\\/\"},\"author\":{\"name\":\"Nic Raboy, Developer Advocate, Couchbase\",\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/#\\\/schema\\\/person\\\/bb545ebe83bb2d12f91095811d0a72e1\"},\"headline\":\"Bringing Your User Profile Store to Mobile with NativeScript and Angular\",\"datePublished\":\"2017-08-15T14:00:49+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/pt\\\/bringing-user-profile-store-mobile-nativescript-angular\\\/\"},\"wordCount\":2518,\"commentCount\":1,\"publisher\":{\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/pt\\\/bringing-user-profile-store-mobile-nativescript-angular\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/wp-content\\\/uploads\\\/sites\\\/5\\\/2026\\\/05\\\/couchbase-nosql-dbaas.png\",\"keywords\":[\"Angular\",\"front-end\",\"javascript\",\"nativescript\",\"profile store\",\"TypeScript\"],\"articleSection\":[\"Application Design\",\"Best Practices and Tutorials\",\"Couchbase Server\",\"JavaScript\"],\"inLanguage\":\"ko-KR\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/pt\\\/bringing-user-profile-store-mobile-nativescript-angular\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/pt\\\/bringing-user-profile-store-mobile-nativescript-angular\\\/\",\"url\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/pt\\\/bringing-user-profile-store-mobile-nativescript-angular\\\/\",\"name\":\"Bringing Your User Profile Store to Mobile with NativeScript and Angular\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/pt\\\/bringing-user-profile-store-mobile-nativescript-angular\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/pt\\\/bringing-user-profile-store-mobile-nativescript-angular\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/wp-content\\\/uploads\\\/sites\\\/5\\\/2026\\\/05\\\/couchbase-nosql-dbaas.png\",\"datePublished\":\"2017-08-15T14:00:49+00:00\",\"description\":\"Learn how to take the user profile store example as seen in the previous tutorials and create a mobile front-end for it using NativeScript and Angular.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/pt\\\/bringing-user-profile-store-mobile-nativescript-angular\\\/#breadcrumb\"},\"inLanguage\":\"ko-KR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/pt\\\/bringing-user-profile-store-mobile-nativescript-angular\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"ko-KR\",\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/pt\\\/bringing-user-profile-store-mobile-nativescript-angular\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/wp-content\\\/uploads\\\/sites\\\/5\\\/2026\\\/05\\\/couchbase-nosql-dbaas.png\",\"contentUrl\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/wp-content\\\/uploads\\\/sites\\\/5\\\/2026\\\/05\\\/couchbase-nosql-dbaas.png\",\"width\":1800,\"height\":630},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/pt\\\/bringing-user-profile-store-mobile-nativescript-angular\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Bringing Your User Profile Store to Mobile with NativeScript and Angular\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/\",\"name\":\"The Couchbase Blog\",\"description\":\"Couchbase, the NoSQL Database\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"ko-KR\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/#organization\",\"name\":\"The Couchbase Blog\",\"url\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"ko-KR\",\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/wp-content\\\/uploads\\\/sites\\\/5\\\/2026\\\/06\\\/logo.svg\",\"contentUrl\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/wp-content\\\/uploads\\\/sites\\\/5\\\/2026\\\/06\\\/logo.svg\",\"width\":\"1024\",\"height\":\"1024\",\"caption\":\"The Couchbase Blog\"},\"image\":{\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/#\\\/schema\\\/logo\\\/image\\\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/#\\\/schema\\\/person\\\/bb545ebe83bb2d12f91095811d0a72e1\",\"name\":\"Nic Raboy, Developer Advocate, Couchbase\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"ko-KR\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/bedeb68368d4681aca4c74fe5f697f0c423b80d498ec50fd915ba018b72c101f?s=96&d=mm&r=g8863514d8bed0cf6080f23db40e00354\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/bedeb68368d4681aca4c74fe5f697f0c423b80d498ec50fd915ba018b72c101f?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/bedeb68368d4681aca4c74fe5f697f0c423b80d498ec50fd915ba018b72c101f?s=96&d=mm&r=g\",\"caption\":\"Nic Raboy, Developer Advocate, Couchbase\"},\"description\":\"Nic Raboy is an advocate of modern web and mobile development technologies. He has experience in Java, JavaScript, Golang and a variety of frameworks such as Angular, NativeScript, and Apache Cordova. Nic writes about his development experiences related to making web and mobile development easier to understand.\",\"sameAs\":[\"https:\\\/\\\/www.thepolyglotdeveloper.com\",\"https:\\\/\\\/www.facebook.com\\\/thepolyglotdeveloper\",\"https:\\\/\\\/x.com\\\/nraboy\"],\"url\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/ko\\\/author\\\/nic-raboy-2\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"\ub124\uc774\ud2f0\ube0c\uc2a4\ud06c\ub9bd\ud2b8\uc640 \uc575\uade4\ub7ec\ub97c \uc0ac\uc6a9\ud558\uc5ec \ubaa8\ubc14\uc77c\uc5d0 \uc0ac\uc6a9\uc790 \ud504\ub85c\ud544 \uc2a4\ud1a0\uc5b4 \ub3c4\uc785\ud558\uae30","description":"Learn how to take the user profile store example as seen in the previous tutorials and create a mobile front-end for it using NativeScript and Angular.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.couchbase.com\/blog\/ko\/bringing-user-profile-store-mobile-nativescript-angular\/","og_locale":"ko_KR","og_type":"article","og_title":"Bringing Your User Profile Store to Mobile with NativeScript and Angular","og_description":"Learn how to take the user profile store example as seen in the previous tutorials and create a mobile front-end for it using NativeScript and Angular.","og_url":"https:\/\/www.couchbase.com\/blog\/ko\/bringing-user-profile-store-mobile-nativescript-angular\/","og_site_name":"The Couchbase Blog","article_author":"https:\/\/www.facebook.com\/thepolyglotdeveloper","article_published_time":"2017-08-15T14:00:49+00:00","og_image":[{"width":1800,"height":630,"url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/5\/2026\/05\/couchbase-nosql-dbaas.png","type":"image\/png"}],"author":"Nic Raboy, Developer Advocate, Couchbase","twitter_card":"summary_large_image","twitter_creator":"@nraboy","twitter_misc":{"Written by":"Nic Raboy, Developer Advocate, Couchbase","Est. reading time":"13\ubd84"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.couchbase.com\/blog\/pt\/bringing-user-profile-store-mobile-nativescript-angular\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/pt\/bringing-user-profile-store-mobile-nativescript-angular\/"},"author":{"name":"Nic Raboy, Developer Advocate, Couchbase","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/bb545ebe83bb2d12f91095811d0a72e1"},"headline":"Bringing Your User Profile Store to Mobile with NativeScript and Angular","datePublished":"2017-08-15T14:00:49+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/pt\/bringing-user-profile-store-mobile-nativescript-angular\/"},"wordCount":2518,"commentCount":1,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/pt\/bringing-user-profile-store-mobile-nativescript-angular\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/5\/2026\/05\/couchbase-nosql-dbaas.png","keywords":["Angular","front-end","javascript","nativescript","profile store","TypeScript"],"articleSection":["Application Design","Best Practices and Tutorials","Couchbase Server","JavaScript"],"inLanguage":"ko-KR","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.couchbase.com\/blog\/pt\/bringing-user-profile-store-mobile-nativescript-angular\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/pt\/bringing-user-profile-store-mobile-nativescript-angular\/","url":"https:\/\/www.couchbase.com\/blog\/pt\/bringing-user-profile-store-mobile-nativescript-angular\/","name":"\ub124\uc774\ud2f0\ube0c\uc2a4\ud06c\ub9bd\ud2b8\uc640 \uc575\uade4\ub7ec\ub97c \uc0ac\uc6a9\ud558\uc5ec \ubaa8\ubc14\uc77c\uc5d0 \uc0ac\uc6a9\uc790 \ud504\ub85c\ud544 \uc2a4\ud1a0\uc5b4 \ub3c4\uc785\ud558\uae30","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/pt\/bringing-user-profile-store-mobile-nativescript-angular\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/pt\/bringing-user-profile-store-mobile-nativescript-angular\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/5\/2026\/05\/couchbase-nosql-dbaas.png","datePublished":"2017-08-15T14:00:49+00:00","description":"Learn how to take the user profile store example as seen in the previous tutorials and create a mobile front-end for it using NativeScript and Angular.","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/pt\/bringing-user-profile-store-mobile-nativescript-angular\/#breadcrumb"},"inLanguage":"ko-KR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/pt\/bringing-user-profile-store-mobile-nativescript-angular\/"]}]},{"@type":"ImageObject","inLanguage":"ko-KR","@id":"https:\/\/www.couchbase.com\/blog\/pt\/bringing-user-profile-store-mobile-nativescript-angular\/#primaryimage","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/5\/2026\/05\/couchbase-nosql-dbaas.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/5\/2026\/05\/couchbase-nosql-dbaas.png","width":1800,"height":630},{"@type":"BreadcrumbList","@id":"https:\/\/www.couchbase.com\/blog\/pt\/bringing-user-profile-store-mobile-nativescript-angular\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Bringing Your User Profile Store to Mobile with NativeScript and Angular"}]},{"@type":"WebSite","@id":"https:\/\/www.couchbase.com\/blog\/#website","url":"https:\/\/www.couchbase.com\/blog\/","name":"\uce74\uc6b0\uce58\ubca0\uc774\uc2a4 \ube14\ub85c\uadf8","description":"\uce74\uc6b0\uce58\ubca0\uc774\uc2a4, NoSQL \ub370\uc774\ud130\ubca0\uc774\uc2a4","publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.couchbase.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"ko-KR"},{"@type":"Organization","@id":"https:\/\/www.couchbase.com\/blog\/#organization","name":"\uce74\uc6b0\uce58\ubca0\uc774\uc2a4 \ube14\ub85c\uadf8","url":"https:\/\/www.couchbase.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"ko-KR","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/5\/2026\/06\/logo.svg","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/5\/2026\/06\/logo.svg","width":"1024","height":"1024","caption":"The Couchbase Blog"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/bb545ebe83bb2d12f91095811d0a72e1","name":"\ub2c9 \ub77c\ubcf4\uc774, \uac1c\ubc1c\uc790 \uc560\ub4dc\ubcf4\ucf00\uc774\ud2b8, \uce74\uc6b0\uce58\ubca0\uc774\uc2a4","image":{"@type":"ImageObject","inLanguage":"ko-KR","@id":"https:\/\/secure.gravatar.com\/avatar\/bedeb68368d4681aca4c74fe5f697f0c423b80d498ec50fd915ba018b72c101f?s=96&d=mm&r=g8863514d8bed0cf6080f23db40e00354","url":"https:\/\/secure.gravatar.com\/avatar\/bedeb68368d4681aca4c74fe5f697f0c423b80d498ec50fd915ba018b72c101f?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/bedeb68368d4681aca4c74fe5f697f0c423b80d498ec50fd915ba018b72c101f?s=96&d=mm&r=g","caption":"Nic Raboy, Developer Advocate, Couchbase"},"description":"\ub2c9 \ub77c\ubcf4\uc774(Nic Raboy)\ub294 \ubaa8\ub358 \uc6f9 \ubc0f \ubaa8\ubc14\uc77c \uac1c\ubc1c \uae30\uc220\uc758 \uc639\ud638\uc790\uc785\ub2c8\ub2e4. \uadf8\ub294 \uc790\ubc14, \uc790\ubc14\uc2a4\ud06c\ub9bd\ud2b8, \uace8\ub791(Golang)\uc744 \ube44\ub86f\ud574 \uc575\uade4\ub7ec, \ub124\uc774\ud2f0\ube0c\uc2a4\ud06c\ub9bd\ud2b8, \uc544\ud30c\uce58 \ucf54\ub974\ub3c4\ubc14 \uac19\uc740 \ub2e4\uc591\ud55c \ud504\ub808\uc784\uc6cc\ud06c \uacbd\ud5d8\uc744 \uac00\uc9c0\uace0 \uc788\uc2b5\ub2c8\ub2e4. \ub2c9\uc740 \uc6f9 \ubc0f \ubaa8\ubc14\uc77c \uac1c\ubc1c\uc744 \ub354 \uc27d\uac8c \uc774\ud574\ud560 \uc218 \uc788\ub3c4\ub85d \ub3d5\ub294 \uc790\uc2e0\uc758 \uac1c\ubc1c \uacbd\ud5d8\uc5d0 \ub300\ud574 \uae00\uc744 \uc501\ub2c8\ub2e4.","sameAs":["https:\/\/www.thepolyglotdeveloper.com","https:\/\/www.facebook.com\/thepolyglotdeveloper","https:\/\/x.com\/nraboy"],"url":"https:\/\/www.couchbase.com\/blog\/ko\/author\/nic-raboy-2\/"}]}},"acf":[],"authors":[{"term_id":148,"user_id":63,"is_guest":0,"slug":"nic-raboy-2","display_name":"Nic Raboy, Developer Advocate, Couchbase","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/?s=96&d=mm&r=g","avatar_alt":"","avatar_decorative":"","author_category":"","first_name":"Nic","last_name":"Raboy","user_url":"","job_title":"","description":"\ub2c9 \ub77c\ubcf4\uc774(Nic Raboy)\ub294 \ubaa8\ub358 \uc6f9 \ubc0f \ubaa8\ubc14\uc77c \uac1c\ubc1c \uae30\uc220\uc758 \uc639\ud638\uc790\uc785\ub2c8\ub2e4. \uadf8\ub294 \uc790\ubc14, \uc790\ubc14\uc2a4\ud06c\ub9bd\ud2b8, \uace8\ub791(Golang)\uc744 \ube44\ub86f\ud574 \uc575\uade4\ub7ec, \ub124\uc774\ud2f0\ube0c\uc2a4\ud06c\ub9bd\ud2b8, \uc544\ud30c\uce58 \ucf54\ub974\ub3c4\ubc14 \uac19\uc740 \ub2e4\uc591\ud55c \ud504\ub808\uc784\uc6cc\ud06c \uacbd\ud5d8\uc744 \uac00\uc9c0\uace0 \uc788\uc2b5\ub2c8\ub2e4. \ub2c9\uc740 \uc6f9 \ubc0f \ubaa8\ubc14\uc77c \uac1c\ubc1c\uc744 \ub354 \uc27d\uac8c \uc774\ud574\ud560 \uc218 \uc788\ub3c4\ub85d \ub3d5\ub294 \uc790\uc2e0\uc758 \uac1c\ubc1c \uacbd\ud5d8\uc5d0 \ub300\ud574 \uae00\uc744 \uc501\ub2c8\ub2e4."}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/posts\/1140","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/users\/63"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/comments?post=1140"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/posts\/1140\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/media\/18"}],"wp:attachment":[{"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/media?parent=1140"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/categories?post=1140"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/tags?post=1140"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/ppma_author?post=1140"}],"curies":[{"name":"\uc798\ud588\uc5b4","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}