CHAPTER 4. From zero to something
Developing and building a TypeScript app
์ด์ ์ฐ๋ฆฌ์ ์ฒซ๋ฒ์งธ Angular 2 ์ฑ๊ณผ ์ปดํฌ๋ํธ๋ฅผ ๋ง๋ค์ด ๋ณด๋๋ก ํ์. ๋น์ ์ ์ด๋ฏธ Node.js์ NPM์ ์ค์นํ์์ ๊ฒ์ด๋ค. ๋น์ ์ Node.js ๋ฒ์ ผ์ด ์ถฉ๋ถํ ์ต์ ์ธ์ง ํ์ธํ๋๋กํด๋ผ.(node --version) ์ฐ๋ฆฌ๋ typescript ๊ธฐ๋ฐ์ผ๋ก ์ฑ์ ๊ฐ๋ฐํ ๊ฒ์ด๋ค. ๊ทธ๋ฌ๋ฏ๋ก typescript๋ฅผ ์ค์นํด๋ณด๋๋ก ํ์.
npm install -g typescript typings
๊ทธ๋ฆฌ๊ณ ๋์ ์ฐ์ต์ ์ํด์ ๋น ํด๋๋ฅผ ์๋ก ๋ง๋ค์, ๊ทธ๋ฆฌ๊ณ tsc๋ฅผ ์ฌ์ฉํ์ฌ ๋น ํด๋์ ํ๋ก์ ํธ๋ฅผ ์ด๊ธฐํ ํ๋๋ก ํ๋ค. tsc ๋ typescript ์ปดํ์ผ๋ฌ์ ์ฝ์์ด๋ค.
tsc --init --target es5 --sourceMap --experimentalDecorators --emitDecoratorMetadata
์ด์ typescript ์ปดํ์ผ ์ต์ ์ ์ ์ํ tsconfig.jsonํ์ผ์ ๋ง๋ค๊ฒ์ด๋ค. ์ฐ๋ฆฌ๊ฐ ์ด์ ์ ์ฑํฐ์์ ๋ณด์๋ฏ์ด ์ฐ๋ฆฌ๋ decorator๋ฅผ ๊ฐ์ง typescript๋ฅผ ์ฌ์ฉํ๊ณ ์๊ณ ์ฐ๋ฆฌ๋ ์ฐ๋ฆฌ์ ์ฝ๋๊ฐ ๋ชจ๋ ๋ธ๋ผ์ฐ์ ธ์์ ๋์ํ๋๋ก ECMASCRIPT 5๋ก ๋ณํ๋๊ธฐ๋ฅผ ์ํ๋ค. sourceMap ์ต์ ์ ๊ธฐ์กด ์ฌ์ฉ์๊ฐ ์์ฑํ Typescript code์ ์์ฑ๋ ES5 ์ฝ๋๋ฅผ ์ฐ๊ฒฐ์์ผ์ฃผ๋ ์์ค์ ๋งต์ ์์ฑํด์ค๋ค. sourceMap์ ๋๋ฒ๊ทธ๋ฅผ ํ๊ธฐ ์ํ ๊ฒ์ผ๋ก ๋ธ๋ผ์ฐ์ ธ์ ์ํด ์ฌ์ฉ๋์ด ์ง๋ค.
์ฐ๋ฆฌ๋ ์ ํธํ๋ ํตํฉ ๊ฐ๋ฐํ๊ฒฝ์ ์ฌ์ฉํ๊ธฐ๋ฅผ ์ํ๋ค. ๋น์ ์ ๋น์ ์ด ์ํ๋ ๊ฒ์ ๋งค์ฐ ์ ์๊ณ ์์๊ฒ์ด๋ค. ๊ทธ๋ฌ๋ ๋น์ ์ ํตํฉ ๊ฐ๋ฐํ๊ฒฝ์์ TypeScript ์ง์์ ํ์ฑํํด์ผ ํ๋ค. ( typescript 1.5 ์ด์์ ์ฌ์ฉํ๊ณ ์๋์ง ํ์ธํด์ผ ํ๋ค. )
{
"compilerOptions": {
"target": "es5",
"experimentalDecorators": true,
"emitDecoratorMetadata": true,
"sourceMap": true,
"module": "commonjs",
"noImplicitAny": false,
},
"exclude": [
"node_modules"
]
}
๊ธฐ๋ณธ์ผ๋ก ์ค์ ๋์ด ์๋ ๋ช ๊ฐ์ง ์ต์ ๋ค์ ํ์ธํ ์ ์์ ๊ฒ์ด๋ค. ํฅ๋ฏธ๋ก์ด ์ ์ module ์ต์ ์ด๋ค. module option์ ์ฐ๋ฆฌ๊ฐ ์์ฑํ ์ฝ๋๊ฐ commonjs ์์ผ๋ก ํจํค์ง๋ ๊ฒ์ด๋ผ๋ ๊ฒ์ ์ค๋ช ํ๋ค.
์ด์ ์ฐ๋ฆฌ๋ typesciprt ์ปดํ์ผ๋ฌ๋ฅผ ์คํํ ์ค๋น๊ฐ ๋์๋ค. ๊ฐ๋์ ๋น์ ์ ํตํฉ ๊ฐ๋ฐ ํ๊ฒฝ์ ๋น์ ์ ์ํด ์ํ๋ ๊ฒ์ด๋ค.
tsc --watch
๋น์ ์ ์ด๋ ๊ฒ ๋์ค๋ ๊ฒ์ ์ดํด๋ณด์์ผ ํ๋ค.
Compilation complete. Watching for file changes.
์ด ๊ธฐ๋ฅ์ ๋ฐฑ๊ทธ๋ผ์ด๋์์ ์คํํ๊ณ ๋ค์์ ์ ๊ณต ํ ์๋ก์ด ํฐ๋ฏธ๋์ ์ด์ด๋ ๋๋ค.
์ฐ๋ฆฌ๋ ์ด์ Angular 2 ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ฝ๋๋ฅผ ์ถ๊ฐํด์ผ ํ๋ค. Angular 2 ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ํด ์ฐ๋ฆฌ๋ NPM ์ ์ฌ์ฉํ์ฌ ๋ค์ด๋ฐ์ ๊ฒ์ด๋ค. ๋ช๊ฐ์ง ๋ฌธ์ ๋ค์ ํํผํ๊ธฐ ์ํด ์ฐ๋ฆฌ๋ npm version 3์ ์ฌ์ฉํ ๊ฒ์ด๋ค. ๋น์ ์ npm version์ ํ์ธํ๋๋ก ํด๋ผ(npm -v)
npm install --save @angular/core @angular/compiler @angular/common @angular/platformbrowser @angular/platform-browser-dynamic rxjs reflect-metadata zone.js
์ด์ packjage.json ํ์ผ์ ์ดํด๋ณด๋๋ก ํด๋ผ. ๋ค์์ ์์กด์ฑ์ด ํฌํจ๋์ด ์์ ๊ฒ์ด๋ค. โข the different @angular packages. โข reflect-metadata, as we are using decorators. โข rxjs, a really cool library called RxJSfor reactive programming. We have a dedicated chapter on this topic. โข and finally, the zone.jsmodule, doing the heavy lifting of running our code in isolated zones for detecting the changes (weโll dive into this later also).
๋ง์ง๋ง์ผ๋ก ์ปดํ์ผ์ ๊ฐ์ ํ๊ธฐ ์ํด ES6์ ์ฐ๊ด๋ typings๋ฅผ ์ค์นํด์ผ ํ๋ค. ๊ฐ์ฅ ์ฌ์ด ๋ฐฉ๋ฒ์ core-js๋ฅผ ์ค์นํ๋ ๊ฒ์ด๋ค.
typings init
typings install --save --global dt~core-js
๊ทธ๋ฆฌ๊ณ tsconfig.json ํ์ผ์ exculde ์์ญ์ ์ถ๊ฐํด๋ผ.
"exclude": [
"node_modules",
"typings/main.d.ts",
"typings/main"
]
Our first component
app.component.ts๋ก ๋ถ๋ฆฌ์ฐ๋ ํ์ผ์ ์์ฑํ๋ผ.
ํ์ผ์ ์ ์ฅํ ๊ฒฝ์ฐ์, ๋๋ ํ ๋ฆฌ์ app.component.ts๋ผ๋ ์ ํ์ผ์ด ๋ํ๋ ๊ฒ์ด๋ค. ์ด๊ฒ์ typeScript compoiler๊ฐ ์ํํ๋ ๊ฒ์ด๋ค. ๋น์ ์ ์์ค ๋งต ํ์ผ์ ํ์ธํด์ผ ํ ๊ฒ์ด๋ค. ๋ง์ฝ์ ๊ทธ๋ ์ง ์๋๋ค๋ฉด ์ปดํ์ผ๋ฌ๊ฐ ์ค๋จ์ํฌ ์ ์์ ๊ฒ์ด๋ค.
์ฐ๋ฆฌ๊ฐ ์ด์ ์ ์ดํด๋ณธ ์น์ ์์ ์ปดํฌ๋ํธ๋ template์ ์กฐํฉ์ด๋ผ๊ณ ํ์๊ณ ์ด๋ค ๋ก์ง์ด๋ผ๊ณ ํ์๋ค. ํด๋์ค๋ฅผ ์์ฑํด๋ณด์.
export class PonyRacerAppComponent {
}
Angular๋ฅผ ์ค๋ช ํ๊ธฐ ์ํด ์ฐ๋ฆฌ๋ @Component decorator๋ฅผ ์ฌ์ฉํ ๊ฒ์ด๋ค. ์ด๊ฒ์ ์ฌ์ฉํ๊ธฐ ์ํด์๋ import ํด์ผํ๋ค.
import { Component } from '@angular/core';
@Component()
export class PonyRacerAppComponent {
}
IDE์์ ์ง์ํ๋ ๊ฒฝ์ฐ Angular 2 ์ข ์์ฑ์ node_modules ๋๋ ํ ๋ฆฌ์ ์์ฒด d.ts ํ์ผ์ด ์์ผ๋ฏ๋ก ์ฝ๋ ์์ฑ์ด ๋์ํด์ผ ํ๋ฉฐ typeScript ๊ฐ ์ด๋ฅผ ๊ฐ์ง ํ ์ ์์ต๋๋ค. ์ํ๋ ๊ฒฝ์ฐ์๋ ์ ์ํ ํ์ผ์ ๊ฒฝ๋ก๋ก ์ด๋ํ ์ ์์ต๋๋ค.
typeScript๋ ์ ํ ์ฒดํฌ ํ ์ด๋ธ์ ์ฌ์ฉํ์ฌ ๋น์ ์ด ์ด๋ ํ ์ ํ์ ์ค์ํ์๋์ง ํ์ธํ ์ ์๋ค. ๊ทธ๋ฌ๋ ์ค๋ฅ๊ฐ ๋ฐ๋์ ์ฐจ๋จ๋๋ ๊ฒ์ ์๋๋ค. ๋ง์ฝ ๋น์ ์ด ๋ณ์์ ์ ํ์ ์ถ๊ฐํ๋๊ฒ์ ์์๋ค๋ฉด ์ฝ๋๋ ์ ์ ํ ์๋ฐ์คํฌ๋ฆฝํธ๋ก ๋์ํ ๊ฒ์ด๋ค.
๋๋ typescript ์๋ฌ๋ฅผ 0์ผ๋ก ๋์ค๋๋ก ์๋ํ ๊ฒ์ด๋ค. ๊ทธ๋ฌ๋ ๋น์ ์ ํ๊ณ ์ถ์ ๋๋ก ํด๋ ๋๋ค. ์ฐ๋ฆฌ๊ฐ ์์ค๋งต์ ์ฌ์ฉํ์ฌ ๋น์ ์ ts code๋ฅผ ๋ธ๋ผ์ฐ์ ธ์์ ๋ฐ๋ก ํ์ธํ ์ ์์ผ๋ฉฐ ๋น์ ์ ์ฑ์ ์ค๋จ์ ์ ์ค์ ํ์ฌ ๋๋ฒ๊น ์ ํ ์๋ ์๋ค.
@Component decorator๋ ๊ฐ์ฒด์ ๊ตฌ์ฑ ์ค์ ์ด๋ค. ์ฐ๋ฆฌ๋ ๋น์ ์ด ์ค์ ํ ์ ๋ณด๋ฅผ @Component ๋ด๋ถ์์ ํ์ธํ ์ ์๋ค. "selector" ์ด๊ฒ์ HTML ํ์ด์ง์์ ์ด๋ค ํ๊ทธ๋ก ์ฐ์ผ์ง๋ฅผ ์๋ ค์ค๋ค.
import { Component } from '@angular/core';
@Component({
selector: 'ponyracer-app'
})
export class PonyRacerAppComponent {
}
ํ๊ฐ์ง ์ฃผ์ํ ์ ์ selector์ ๋ช ํํ ๋ค์ด๋ฐ ๊ท์น์ ์กด์ฌํ์ง ์๋๋ค๋ ๊ฒ์ด๋ค. ๊ทธ๋ฌ๋ ๋ง์ฝ ๋ค๋ฅธ ํ๋ก๊ทธ๋๋จธ์๊ฒ ๋น์ ์ component๋ฅผ ์ค๋ช ํ๋ค๊ณ ํ๋ค๋ฉด namespace-component๋ฅผ ์ฌ์ฉํ๊ธฐ๋ฅผ ๊ถ์ฅํ๋ค. ์๋ํ๋ฉด selecotr๋ ์ ์ผํด์ผํ๊ณ ํ๊ทธ๋ฅผ ์ข ๋ ๋ช ํํ๊ฒ ์ฌ์ฉํ๊ธฐ ์ํ ๊ฐ๋จํ ํ์ด๋ผ๊ณ ํ ์ ์๋ค.
import { Component } from '@angular/core';
@Component({
selector: 'ponyracer-app',
template: '<h1>PonyRacer</h1>'
})
export class PonyRacerAppComponent {
}
๋น์ ์ @angular/code ๋ชจ๋์ ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉํ ๊ฒ์ด๋ค. ๊ทธ๋ฌ๋ ์ด๊ฒ์ ํญ์ ํ์ํ ๊ฒ์ ์๋๋ค. ์๋ฅผ๋ค์ด http ๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด์๋ @angular/http ๊ฐ ํ์ํ๊ณ router๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด์๋ @angular/router๊ฐ ํ์ํ๋ค.
Our first Angular module
Angular ๋ชจ๋์ ์ด์ ์ ๊ต์ฐจ ํ ES6 ๋ชจ๋๊ณผ๋ ๋ค๋ฅด๋ค.
๋น์ ์ ์ดํ๋ ์ด์ ์ root module ์ ๊ฐ์ง๊ณ ์์ผ๋ฏ๋ก ์ต์ ํ๋์ ๋ชจ๋์ ๊ฐ์ง๊ณ ์์๊ฒ์ด๋ค. ํ์๋ ๋ค์ํ ๋ชจ๋์ ์ถ๊ฐํ ๊ฒ์ด๋ค. ์๋ฅผ ๋ค์ด, ๋ชจ๋ ๊ตฌ์ฑ ์์์ ๋ก์ง์ ํฌํจํ๋ ์์ฉ ํ๋ก๊ทธ๋จ์ Admin ๋ถ๋ถ ์ ์ฉ ๋ชจ๋์ ์ถ๊ฐ ํ ์๋ ์๋ค. ์ฐ๋ฆฌ๋ ๋ํ ์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ ์ฐ๋ฆฌ์ ์ฑ์ ์ธ๋ถ ๋ชจ๋์ ์ถ๊ฐํ ์ ๋ ์๋ค.
Angular app์ ๋ชจ๋์ ์ถ๊ฐํ๊ธฐ ์ํด์๋ Class๋ฅผ ์์ฑํด์ผ ํ๋ค. ์ฃผ๋ก ํด๋น ์์ ์ ๋ฃจํธ ์ค๋์ app.module.ts๋ผ๋ ๋ณ๊ฐ์ ํ์ผ์์ ์ํ๋๋ค. ํด๋น ํด๋์ค๋ @Ngmodule๋ก ์ฅ์๋๋ค.
import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
@NgModule({
imports: [BrowserModule],
})
export class AppModule {
}
์ฐ๋ฆฌ๊ฐ ๋ธ๋ผ์ฐ์ ธ์ ์ฑ์ ๋น๋ํ ๊ฒฝ์ฐ์ root module์ BrowserModule์ ์ถ๊ฐํ ๊ฒ์ด๋ค. ์ด๊ฒ์ Angular2์๋ง ๊ฐ๋ฅํ ๊ฒ์ ์๋๋ค. ๋น์ ์ ์์ ๋ฅผ ์ํด ์๋ฒ์ ์ฑ์ ๋ ๋๋ง ํ ์ ์๋ ์ ํ์ ํ ์ ์๋ค. BrowserModule์ component, directive, pipe๋ก ์ฌ์ฉ๋์ด ์ง ์ ์๋ค. ๋น์ ์ด ํด๋น ๋ชจ๋์ ์ถ๊ฐํ์์ ๊ฒฝ์ฐ์ ๋น์ ์ ๊ฐ์ ธ์จ ๋ชจ๋์์ ๋ด ๋ณด๋ธ ๋ชจ๋ ์ง์๋ฌธ, ๊ตฌ์ฑ ์์ ๋ฐ ํ์ดํ๋ฅผ ๋ชจ๋์์ ์ฌ์ฉํ ์ ์๋ค. root ๋ชจ๋์ import ๋์ด์ง ์ ์๊ธฐ ๋๋ฌธ์ exports๋ฅผ ๊ฐ์ง๊ณ ์์ง ์์ง๋ง ์ฌ๋ฌ๊ฐ๋ฅผ ์ถ๊ฐํ ์๋ ์๋ค.
ํด๋น ๊ธฐ์ ์ ์ด๋ณด์์๊ฒ๋ ์น์ํ์ง ์๋๋ค. ์ฐ๋ฆฌ๋ ์ฒซ ๋ฒ์งธ ์ฅ์์ ES6 ๋ฐ TS ๋ชจ๋์ ๋ํด ์ด์ผ๊ธฐ๋ฅผ ํ์๋ค. ์ด ๋ชจ๋์ import, export๋ฅผ ์ ์ํ๋ค. ๊ทธ๋ฆฌ๊ณ ์ฐ๋ฆฌ๋ Angular ๋ชจ๋์ ๋ํด์ ์ด์ผ๊ธฐ ํ๊ณ ์๋ค.
ES6 ๋๋ TS import ๊ธฐ๋ฅ์ Java์ import ๋ฌธ๊ณผ ๊ฐ์ ๋ฌธ์์ ๊ฐ์ด ์ฌ์ฉํ์ฌ ๊ฐ์ ธ์ฌ ์ ์๋ค. ์ด๊ฒ์ ๋น์ ์ ์์ค์ฝ๋์ classes/function๋ฑ์ import ํ ์ ์๋ค. ์ด๊ฒ์ ๋ํ bundler ๋๋ ๋ชจ๋ ๋ก๋(Webpack or SystemJS)๋ฅผ ์ํ ์์กด์ฑ์ ์ ์ํ ์ ์๋ค. ๋ง์ฝ a.ts๊ฐ ๋ก๋๋์ด์ก๋ค๋ฉด b.ts๋ a.ts์์ ์ฌ์ฉ๋์ด ์ง๋ฏ๋ก ์ฐ์ ์ ์ผ๋ก ๋ก๋๋์ด์ผ ํ๋ค. Angular ๋๋ ๊ธฐํ ํ๋ ์ ์ํฌ๋ฅผ ์ฌ์ฉํ๋์ง ์ฌ๋ถ์ ๊ด๊ณ์์ด ES6 ๋ฐ TypeScript๋ก ๊ฐ์ ธ์ค๊ธฐ ๋ฐ ๋ด๋ณด๋ด๊ธฐ๋ฅผ ์ฌ์ฉํด์ผํ๋ค.
๊ทธ๋ฌ๋ ์์ ์ Angular ๋ชจ๋ (AppModule)์์ Angular ๋ชจ๋ (์ : BrowserModule)์ ๊ฐ์ ธ ์ค๋ ๊ฒ์ ๊ธฐ๋ฅ์ ์๋ฏธ๊ฐ ์๋ค. BrowserModules์์ ๋ด๋ณด๋ด๋ ๋ชจ๋ ๊ตฌ์ฑ ์์, ์ง์๋ฌธ ๋ฐ ํ์ดํ๋ Angular ๊ตฌ์ฑ ์์ / ํ ํ๋ฆฟ์์ ์ฌ์ฉํ ์ ์์ด์ผํฉ๋๋ค. ์ด๊ฒ์ TypeScript ์ปดํ์ผ๋ฌ์์๋ ํน๋ณํ ์๋ฏธ๊ฐ ์๋ค๋ ๊ฒ์ ์๋ฏธํ๋ค.
import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { PonyRacerAppComponent } from './app.component';
@NgModule({
imports: [BrowserModule],
declarations: [PonyRacerAppComponent],
})
export class AppModule {
}
์ด๊ฒ์ด ๋ฃจํธ ๋ชจ๋์ด๋ฏ๋ก Angular์ ์ด๋ค ๊ตฌ์ฑ ์์๊ฐ ๋ฃจํธ ๊ตฌ์ฑ ์์ (์ฆ, ์ฑ์ ๋ถํธ ์คํธ๋ฉ ํ ๋ ์์๋ ๊ตฌ์ฑ ์์)์ธ์ง ์๋ ค์ค ํ์๊ฐ ์์ต๋๋ค. ์ด๊ฒ์ด ์ค์ ๊ฐ์ฒด์ ๋ถํธ ์คํธ๋ฉ ํ๋๊ฐ ํ์ํ ๊ฒ์ ๋๋ค.
import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { PonyRacerAppComponent } from './app.component';
@NgModule({
imports: [BrowserModule],
declarations: [PonyRacerAppComponent],
bootstrap: [PonyRacerAppComponent]
})
export class AppModule {
}
Bootstrapping the app
๋ง์ง๋ง์ผ๋ก ์ฐ๋ฆฌ๋ bootstrapModule ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ์ฑ์ ์คํํด์ผ ํ๋ค. ํด๋น ๋ฉ์๋๋ platformBrowserDynamic ๋ฉ์๋์ ์ํด ๋ฐํ ๋ ์ค๋ธ์ ํธ๋ก ํ์๋๋ค. bootStrap ๋ ผ๋ฆฌ๋ฅผ ๋ถ๋ฆฌํ๊ธฐ ์ํด main.ts์ ๊ฐ์ ๋ค๋ฅธ ํ์ผ์ ์์ฑํด๋ณด์.
import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';
import { AppModule } from './app.module';
platformBrowserDynamic().bootstrapModule(AppModule);
์ฐ๋ฆฌ๋ ์์ง HTML ํ์ผ์ด ์๋ค. index.html ์ด๋ฆ์ ํ์ผ์ ์์ฑํด๋ณด์.
<html>
<head></head>
<body>
<ponyracer-app>
You will see me while Angular starts the app!
</ponyracer-app>
</body>
</html>
์ด์ HTML ํ์ผ์ ์คํฌ๋ฆฝํธ๋ฅผ ์ถ๊ฐํด์ผํ๋ค. AngularJS 1.x์์๋ ๊ฐ๋จํ๋ค. angular.js ์ฉ ์คํฌ๋ฆฝํธ์ ์์ฑํ ๋ชจ๋ JS ํ์ผ ์ฉ ์คํฌ๋ฆฝํธ๋ฅผ ์ถ๊ฐํ๊ธฐ ๋งํ๋ฉด ๋ฐ๋ก ์ฌ์ฉํ ์ ์๋ค. ํ์ง๋ง ๋จ์ ์๋ค. ์์์์ ๋ชจ๋ ๊ฒ์ด ์ ์ ์ผ๋ก ๋ก๋ ๋์ด์ผ ํ๊ธฐ ๋๋ฌธ์ ๋๊ท๋ชจ ์์ฉ ํ๋ก๊ทธ๋จ์ ์์ ์๊ฐ์ด ๊ธธ์ด์ง ์ ์๋ค.
Angular 2์์๋ ์ํฉ์ด ๋์ฑ ๋ณต์กํด ์ง์ง๋ง ๋ณต์ก์ฑ์๋ ์ถ๊ฐ์ ์ธ ํ์ด ๋ฐ๋ฅธ๋ค. Angular๋ ์ด์ ๋ชจ๋ (ES6 ๋ชจ๋)์ ๋ฒ๋ค๋ก ์ ๊ณต๋๋ฉฐ ์ด๋ฌํ ๋ชจ๋์ ๋์ ์ผ๋ก๋ก๋ ํ ์ ์์ต๋๋ค. ์ด์ ์ ๋ณด์ ๋ฏ์ด ์ฐ๋ฆฌ์ ์ฑ์ ๋ชจ๋๋ก ๋ฌถ์ฌ ์์ต๋๋ค.
๋ช ๊ฐ์ง ๋ฌธ์ ๊ฐ ์๋ค.
ES5์์๋ ๋ชจ๋์ด ์กด์ฌํ์ง ์๊ณ ๋ธ๋ผ์ฐ์ ธ์์๋ ์ค์ง ES5๋ฅผ ์ง์ํ๋ค.
ES6 ์ค๊ณ์๋ ๋ชจ๋์ ์ ์ํ๊ณ ๊ฐ์ ธ ์ค๋ ๋ฑ์ ๋ฐฉ๋ฒ์ ์ง์ ํ์๋ค. ๋ธ๋ผ์ฐ์ ๊ฐ ํจํค์งํ ํ๊ณ ๋ก๋ ํ๋ ๋ฐฉ๋ฒ์ ์์ง ์ง์ ๋์ง ์์๋ค.
๋ชจ๋์ ๋ก๋ ํ๋ ค๋ฉด ๋๊ตฌ์ ์์กด ํด์ผํ๋ค. SystemJS๋ ์ํ ๋ชจ๋ ๋ก๋๋ก์จ HTML ํ์ด์ง์ (์ ์ ์ผ๋ก) ์ถ๊ฐํ๊ณ ๋ชจ๋์ด ์๋ฒ์์๋ ์์น๋ฅผ ์๋ ค์ฃผ๊ณ ๊ทธ ์ค ํ๋๋ฅผ ๋ก๋ํ๋ค. ๋ชจ๋ ์ฌ์ด์ ์์กด์ฑ์ ์๋์ผ๋ก ํ์ ํ๊ณ , ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ฌ์ฉํ๋ ๋ชจ๋์ ๋ค์ด๋ก๋ํ๋ค.
์ด๊ฒ์ JS ํ์ผ ๋ค์ด๋ก๋์ bazillion์ผ๋ก ์ด์ด์ง ๊ฒ์ด๋ค. ๊ฐ๋ฐํ๋ ๋์ ๊ด์ฐฎ ์์ง๋ง ์์ฐ์ ์ํด์๋ ๋ฌธ์ ์ ์ด ๋ฐ์ํ๋ค. ๋คํ์ค๋ฝ๊ฒ๋ SystemJS์๋ ์ฌ๋ฌ ๊ฐ์ ์์ ๋ชจ๋์ ๋ ํฐ ๋ฌถ์์ผ๋ก ๋ฌถ์ ์์๋ ๋๊ตฌ๊ฐ ํจ๊ป ์ ๊ณต๋๋ค. ๋ชจ๋์ด ํ์ํ ๋, ๊ทธ ๋ชจ๋์ ํฌํจํ ๋ฒ๋ค (๊ทธ๋ฆฌ๊ณ ๋ค๋ฅธ ๋ชจ๋๋ค)์ด ๋ค์ด๋ก๋๊ฐ ๋ฐ์ํ๋ค.
์ด ์์ ์ ์ํ ํ ์์๋ ์ ์ผํ ๋๊ตฌ๋ ์๋๋ฉฐ ์ํ๋ ๊ฒฝ์ฐ Webpack๊ณผ ๊ฐ์ ๋ค๋ฅธ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ ์๋ ์๋ค.
SystemJS๋ฅผ ์ค์นํด๋ณด์.
npm install --save systemjs
์ฐ๋ฆฌ๋ SystemJS๋ฅผ ์ ์ ์ผ๋ก ๋ก๋ํ๊ณ ๋ถํธ ์คํธ๋ฉ ๋ชจ๋์ด (๋ฉ์ธ์) ์ด๋์ ์๋์ง ์๋ ค์ค ํ์๊ฐ ์๋ค. @angular์ ๊ฐ์ด ์ฐ๋ฆฌ ์ ํ๋ฆฌ์ผ์ด์ ์ ์์กด์ฑ์ ์ด๋์์ ์ฐพ์ ์ง ์๋ ค์ค ํ์๊ฐ ์๋ค. ํ์ง๋ง ๋จผ์ reflect-metadata์ zone.js๋ฅผ ํฌํจ ์์ผ์ผํ๋ค.
<html>
<head>
<script src="node_modules/zone.js/dist/zone.js"></script>
<script src="node_modules/reflect-metadata/Reflect.js"></script>
<script src="node_modules/systemjs/dist/system.js"></script>
<script>
System.config({
// we want to import modules without writing .js at the end
defaultJSExtensions: true,
// the app will need the following dependencies
map: {
'@angular/core': 'node_modules/@angular/core/bundles/core.umd.js',
'@angular/common': 'node_modules/@angular/common/bundles/common.umd.js',
'@angular/compiler': 'node_modules/@angular/compiler/bundles/compiler.umd.js',
'@angular/platform-browser': 'node_modules/@angular/platformbrowser/bundles/platform-browser.umd.js',
'@angular/platform-browser-dynamic': 'node_modules/@angular/platform-browserdynamic/bundles/platform-browser-dynamic.umd.js',
'rxjs': 'node_modules/rxjs'
}
});
// and to finish, let's boot the app!
System.import('main');
</script>
</head>
<body>
<ponyracer-app>
You will see me while Angular starts the app!
</ponyracer-app>
</body>
</html>
From zero to something better with angular-cli
์ค์ ํ๋ก์ ํธ์์๋ ๋ค์๊ณผ ๊ฐ์ ๋ช๊ฐ์ง๋ฅผ ์ค์ ํด์ผ ํ๋ค.
์ฐ๋ฆฌ๊ฐ ์ผ์ ๊นจ๋จ๋ฆฌ์ง ์๋์ง ํ์ธํ๋ ๋ช ๊ฐ์ง ํ ์คํธ
๋น๋ ๋๊ตฌ, ๋ค์ํ ์์ (์ปดํ์ผ, ํ ์คํธ, ํจํค์ง ๋ฑ)์ ์กฐ์จ ํ ์ ์์ต๋๋ค.
์ผ์ด ์ด๋ป๊ฒ ์งํ๋๋์ง ์ดํดํ๊ธฐ ์ํด ํ ๋ฒํด์ผํ๋ค๊ณ ์๊ฐํ๋๋ผ๋ ๋ชจ๋ ๊ฒ์ ์ค์ค๋ก ์ค์ ํ๋ ๊ฒ์ ์ฝ๊ฐ ๋ฒ๊ฑฐ ๋ก์ธ ์ ์๋ค.
์ง๋ ๋ช ๋ ๋์ ๋ง์ ์๊ท๋ชจ ํ๋ก์ ํธ ์์ฑ๊ธฐ๊ฐ Yeonman์ ์ฌ์ฉํ์ฌ ๋น์ ๋ณด์๋ค. ์ด์ Angularjs 1.x ๋ฒ์ ผ์์๋ Yeonman์ ๋ง์ด ์ฌ์ฉํ๊ณ 2์์๋ ๊ทธ๋ฐ ์๋๊ฐ ์์๋ค.
๊ทธ๋ฌ๋ ํ์ฌ Google ํ์์๋ angular-cli๋ฅผ ๊ฐ๋ฐํ๋ฉด์ ํ๋ก์ ํธ๋ฅผ ์ฝ๊ฒ ์์ํ ์ ์๊ณ , ๋ค์ํ tool, test, packge ๋ค์ ์ค์ ํ ์ ์๋ค.
์์ด๋์ด๋ ์๋ก์ด ๊ฒ์ ์๋๋ฉฐ ์ค์ ๋ก ๋ค๋ฅธ ์ธ๊ธฐ์๋ ํ๋ ์ ์ํฌ ์ธ EmberJS์ ๊ทธ ์ ๋ช ํ ember-cli์์ ์ฐฉ์ ํ์๋ค.
์ด ๋๊ตฌ๋ ์์ง ๊ฐ๋ฐ ์ค์ ๋๋ค๋ง, ํฅํ Angular 2 ์ฑ์ ๋ง๋๋ ๋ฐ ์์ด ์ฌ์ค์์ ํ์ค์ด ๋ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ๋ค. ๊ทธ๋์ ์๋ํด ๋ณผ ํ์๊ฐ ์๋ค. ์ด๊ฒ์ ์ฐ๋ฆฌ๊ฐ ์๋์ผ๋กํ๋ ๊ฒ๊ณผ ๋๊ฐ์ ํจ๊ณผ๋ฅผ ๊ฐ์ง๊ณ ์์ ๊ฒ์ ๋๋ค.
npm i -g angular-cli
ng new ponyracer
๊ทธ๋ฌ๋ฉด ํ๋ก์ ํธ ponyracer๊ฐ ์์ฑ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋ค์๊ณผ ํจ๊ป ์ฑ์ ์์ํ ์ ์๋ค.
ng serve
์ด๋ ๊ฒํ๋ฉด ํซ ๋ฆฌ๋ก๋ ๊ตฌ์ฑ์ ์ฌ์ฉํ์ฌ ๋ก์ปฌ๋ก ์์ HTTP ์๋ฒ๊ฐ ์์๋๋ค. ์ฆ, ํ์ผ์ ์์ ํ๊ณ ์ ์ฅํ ๋๋ง๋ค ๋ธ๋ผ์ฐ์ ์์ ์ฑ์ด ์๋ก ๊ณ ์นจ์ด ๋๋ค. ์ปดํฌ๋ํธ ponyracer ์์ฑ๊ณผ ๊ฐ์ ๋ช ๊ฐ์ง ๋ค๋ฅธ ๊ฐ๋ฅ์ฑ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
ng generate component pony
์ด๋ ๊ฒํ๋ฉด ๊ด๋ จ ํ ํ๋ฆฟ, ์คํ์ผ ์ํธ ๋ฐ ํ ์คํธ ํ์ผ๊ณผ ํจ๊ป ๊ตฌ์ฑ ์์ ํ์ผ์ด ๋ง๋ค์ด ์ง๊ฒ์ด๋ค. ์ด ๋๊ตฌ๋ ์์ฉ ํ๋ก๊ทธ๋จ์ ๊ฐ๋ฐํ๋ ๋ฐ ๋์์ด ๋ ๋ฟ๋ง ์๋๋ผ ๋ฐฐํฌ์ ๊ฐ์ ๋ช ๊ฐ์ง ์์ ์ ๋จ์ํํ๋ ํ๋ฌ๊ทธ์ธ ์์คํ ๊ณผ ํจ๊ป ์ ๊ณต๋๋ค. ์๋ฅผ ๋ค์ด github-pagesplugin์ ์ฌ์ฉํ์ฌ Github Pages์ ์ ์ํ๊ฒ ๋ฐฐํฌ ํ ์ ์๋ค.
ng github-pages:deploy
์ด๊ฒ์ ์ฅ๊ธฐ์ ์ผ๋ก ๋ณด์์ ๊ฒฝ์ฐ์ ์ฑ๋ฅ์ด ์ข์ ๊ฒ์ด๋ค. ์ฐ๋ฆฌ๋ ํ๋ก์ ํธ ์ ๋ฐ์ ๊ฑธ์ณ ๋์ผํ ์ฝ๋ ์กฐ์ง, ์ฑ์ ๋น๋ํ๊ณ ๋ฐฐํฌํ๋ ์ผ๋ฐ์ ์ธ ๋ฐฉ๋ฒ, ๊ทธ๋ฆฌ๊ณ ์๋ง๋ ์ผ๋ถ ์์ ์ ๋จ์ํํ๊ธฐ์ํ ๊ฑฐ๋ํ ์์ฝ ์์คํ ํ๋ฌ๊ทธ์ธ์ ๋ณด์ ํ๊ฒ ๋ ๊ฒ์ด๋ค. ๊ทธ๋ฌ๋ฏ๋ก angular-cli๋ฅผ ์ดํด๋ณด๋๋ก ํด๋ผ.
Reference URL
Last updated
Was this helpful?