Skip to content

Latest commit

Β 

History

History
990 lines (790 loc) Β· 43.8 KB

File metadata and controls

990 lines (790 loc) Β· 43.8 KB

Angular CLI

Angular CLIλŠ” Angular μ‘μš© ν”„λ‘œκ·Έλž¨μ„ μ΄ˆκΈ°ν™”, 개발, 슀캐 폴딩 및 μœ μ§€ κ΄€λ¦¬ν•˜λŠ” 데 μ‚¬μš©ν•˜λŠ” λͺ…λ Ή 쀄 μΈν„°νŽ˜μ΄μŠ€ λ„κ΅¬μž…λ‹ˆλ‹€. 도ꡬλ₯Ό μ½˜μ†”μ—μ„œ 직접 μ‚¬μš©ν•˜κ±°λ‚˜ Angular μ½˜μ†”κ³Ό 같은 λŒ€ν™” ν˜• UIλ₯Ό 톡해 κ°„μ ‘μ μœΌλ‘œ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

Angular CLIλ₯Ό μœ„ν•œ μ „μš© 도ꡬ가 λ‚˜μ™”μŠ΅λ‹ˆλ‹€. Angular μ½˜μ†”μ΄λΌκ³  λΆ€λ¦…λ‹ˆλ‹€. μˆ˜μ—…μ€ κΈ°μ‘΄ μ½˜μ†”μ—μ„œ μ§„ν–‰ν•˜λ„λ‘ ν•˜κ² μŠ΅λ‹ˆλ‹€. https://angularconsole.com/

μ„€μΉ˜

λ…Έλ“œμ˜ NPM 도ꡬλ₯Ό μ‚¬μš©ν•˜μ—¬ Angular CLIλ₯Ό μ„€μΉ˜ν•©λ‹ˆλ‹€.

$ npm install -g @angular/cli

버전을 ν™•μΈν•©λ‹ˆλ‹€.

$ ng --version

     _                      _                 ____ _     ___
    / \   _ __   __ _ _   _| | __ _ _ __     / ___| |   |_ _|
   / β–³ \ | '_ \ / _` | | | | |/ _` | '__|   | |   | |    | |
  / ___ \| | | | (_| | |_| | | (_| | |      | |___| |___ | |
 /_/   \_\_| |_|\__, |\__,_|_|\__,_|_|       \____|_____|___|
                |___/


Angular CLI: 7.1.1
Node: 10.14.1
OS: win32 x64
Angular:
...

Package                      Version
------------------------------------------------------
@angular-devkit/architect    0.11.1
@angular-devkit/core         7.1.1
@angular-devkit/schematics   7.1.1
@schematics/angular          7.1.1
@schematics/update           0.11.1
rxjs                         6.3.3
typescript                   3.1.6

μ‚¬μš©λ²•

μžμ£Όμ“°λŠ” ν•„μˆ˜μ μΈ λͺ…λ Ήμ–΄λ₯Ό μ‚΄νŽ΄λ΄…λ‹ˆλ‹€.

ng new [project-name]

μƒˆ μ•΅κ·€λŸ¬ ν”„λ‘œμ νŠΈλ₯Ό μƒμ„±ν•©λ‹ˆλ‹€. λ‹€μŒκ³Ό 같은 μž‘μ—…μ΄ μ΄λ£¨μ–΄μ§‘λ‹ˆλ‹€.

  • κ°œλ°œμ— ν•„μš”ν•œ 폴더 및 ν™˜κ²½μ„€μ • νŒŒμΌλ“€μ΄ μƒμ„±λ©λ‹ˆλ‹€.
  • 루트 λͺ¨λ“ˆ 및 기동 μ»΄ν¬λ„ŒνŠΈκ°€ 기본으둜 μƒμ„±λ©λ‹ˆλ‹€.
  • package.json νŒŒμΌμ— λ””νŽœλ˜μ‹œ 내역에 λ”°λΌμ„œ λΌμ΄λΈŒλŸ¬λ¦¬κ°€ λ‹€μš΄λ‘œλ“œ λ©λ‹ˆλ‹€.

ν”„λ‘œμ νŠΈ 생성 μ‹œ λΌμš°νŒ… λͺ¨λ“ˆμ„ μΆ”κ°€λ‘œ λ§Œλ“€κ²ƒμΈμ§€ λ¬Όμ–΄λ΄…λ‹ˆλ‹€.
Would you like to add Angular routing? yes

ν”„λ‘œμ νŠΈ 생성 μ‹œ CSS 기술둜 무엇을 μ‚¬μš©ν•  것인지 μΆ”κ°€λ‘œ λ¬Όμ–΄λ΄…λ‹ˆλ‹€.
Which stylesheet format would you like to use? scss

λŒ€λ‹΅μ΄ λλ‚˜λ©΄ ν”„λ‘œμ νŠΈ μƒμ„±μž‘μ—…μ„ μ‹œμž‘ν•©λ‹ˆλ‹€.

  • --minimal=true
    creates a project without any testing frameworks.
    ν…ŒμŠ€νŠΈμ™€ κ΄€λ ¨ν•œ jasmine, karma, protractor λ“±μ˜ λ””νŽœλ˜μ‹œλ₯Ό μ œμ™Έν•©λ‹ˆλ‹€. 기동 μ»΄ν¬λ„ŒνŠΈμΈ AppComponentκ°€ μΈλΌμΈν…œν”Œλ¦Ώ, μΈλΌμΈμŠ€νƒ€μΌ λ°©μ‹μœΌλ‘œ μƒμ„±λ©λ‹ˆλ‹€. μƒˆ μ»΄ν¬λ„ŒνŠΈλ₯Ό μƒμ„±ν•˜λ©΄ spec.ts νŒŒμΌμ€ μƒμ„±λ©λ‹ˆλ‹€.
    Default: false

package.json

"dependencies": {
  "@angular/animations": "~7.1.0",
  "@angular/common": "~7.1.0",
  "@angular/compiler": "~7.1.0",
  "@angular/core": "~7.1.0",
  "@angular/forms": "~7.1.0",
  "@angular/platform-browser": "~7.1.0",
  "@angular/platform-browser-dynamic": "~7.1.0",
  "@angular/router": "~7.1.0",
  "core-js": "^2.5.4",
  "rxjs": "~6.3.3",
  "tslib": "^1.9.0",
  "zone.js": "~0.8.26"
},
"devDependencies": {
  "@angular-devkit/build-angular": "~0.11.0",
  "@angular/cli": "~7.1.1",
  "@angular/compiler-cli": "~7.1.0",
  "@angular/language-service": "~7.1.0",
  "@types/node": "~8.9.4",
  "ts-node": "~7.0.0",
  "tslint": "~5.11.0",
  "typescript": "~3.1.6"
}
  • --skipTests=true
    When true, does not generate "spec.ts" test files for the new project.
    ν…ŒμŠ€νŠΈμ™€ κ΄€λ ¨ν•œ jasmine, karma, protractor λ“±μ˜ 섀정은 ν¬ν•¨λ˜λ‚˜ angular.json νŒŒμΌμ— 섀정을 μΆ”κ°€ν•˜μ—¬ spec.ts 파일의 생성을 λ§‰μŠ΅λ‹ˆλ‹€. κ΄€λ ¨ν•˜μ—¬ angular.json νŒŒμΌμ— μ„€μ •λ˜λŠ” λ‚΄μš©μ€ λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.
    Default: false

angular.json

"schematics": {
  "@schematics/angular:component": {
    "styleext": "scss",
    "spec": false
  },
  "@schematics/angular:class": {
    "spec": false
  },
  "@schematics/angular:directive": {
    "spec": false
  },
  "@schematics/angular:guard": {
    "spec": false
  },
  "@schematics/angular:module": {
    "spec": false
  },
  "@schematics/angular:pipe": {
    "spec": false
  },
  "@schematics/angular:service": {
    "spec": false
  }
},
  • --prefix=prefix
    The prefix to apply to generated selectors for the initial project.
    μ»΄ν¬λ„ŒνŠΈμ˜ selector 값에 μžλ™μœΌλ‘œ λΆ™λŠ” λ‘λ¬Έμžλ₯Ό λ³€κ²½ν•©λ‹ˆλ‹€. κ΄€λ ¨ 섀정은 angular.json 파일의 "prefix": "app" ν•­λͺ©μ—μ„œ μ°Ύμ•„ λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€.
    Default: app

  • --skipInstall=true
    When true, does not install dependency packages.
    ν”„λ‘œμ νŠΈ μŠ€μΊν΄λ”© μž‘μ—… ν›„ package.json 파일의 dependencies, devDependencies 섀정에 λ”°λ₯Έ λ””νŽœλ˜μ‹œ μ„€μΉ˜μž‘μ—…μ„ μˆ˜ν–‰ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. λ‚˜μ€‘μ— 직접 npm install λͺ…λ ΉμœΌλ‘œ μ„€μΉ˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 무엇을 install ν•  μ§€ λͺ…μ‹œν•˜μ§€ μ•ŠμœΌλ©΄ μžλ™μœΌλ‘œ package.json νŒŒμΌμ— μ„€μ •λœ λ””νŽœλ˜μ‹œλ“€μ„ λͺ¨λ‘ μ„€μΉ˜ν•©λ‹ˆλ‹€.
    Default: false

  • --inlineTemplate=true
    μ»΄ν¬λ„ŒνŠΈμ˜ HTML νŒŒμΌμ„ λ³„λ„λ‘œ λ§Œλ“€μ§€ μ•Šκ³  class νŒŒμΌμ—μ„œ μž‘μ—…ν•  수 μžˆλ„λ‘ μ‘°μΉ˜ν•©λ‹ˆλ‹€.
    Default: false

  • --inlineStyle=true
    μ»΄ν¬λ„ŒνŠΈμ˜ CSS νŒŒμΌμ„ λ³„λ„λ‘œ λ§Œλ“€μ§€ μ•Šκ³  class νŒŒμΌμ—μ„œ μž‘μ—…ν•  수 μžˆλ„λ‘ μ‘°μΉ˜ν•©λ‹ˆλ‹€. κ΄€λ ¨ν•˜μ—¬ μ„€μ •λœ λ‚΄μš©μ€ angular.json νŒŒμΌμ—μ„œ 찾을 수 μžˆμŠ΅λ‹ˆλ‹€.
    Default: false

angular.json

"schematics": {
  "@schematics/angular:component": {
    "inlineTemplate": true,
    "inlineStyle": true,
    "styleext": "scss"
  }
},

app.component.ts

import { Component } from '@angular/core';

@Component({
  selector: 'app-root',
  template: `
    <!--The content below is only a placeholder and can be replaced.-->
    <div style="text-align:center">
      <h1>
        Welcome to {{title}}!
      </h1>
      <!-- μƒλž΅ -->
    <router-outlet></router-outlet>
  `,
  styles: []
})
export class AppComponent {
  title = 'small-project';
}
  • --skipGit=true
    When true, does not initialize a git repository.
    κΈ°λ³Έ 값이 false라고 곡식 μ‚¬μ΄νŠΈμ— λ‚˜μ™€ μžˆμœΌλ‚˜ μ˜΅μ…˜μ„ μ‚¬μš©ν•˜μ§€ μ•Šμ•„λ„ κΉƒ μ €μž₯μ†ŒλŠ” μƒμ„±λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. κΈ°λ³Έ 값은 true라고 λ³΄λŠ” 것이 μ˜³κ² μŠ΅λ‹ˆλ‹€.
    ν•˜λ‚˜μ˜ μ›Œν¬ 슀페이슀 폴더에 μ—¬λŸ¬ μ•΅κ·€λŸ¬ ν”„λ‘œμ νŠΈλ₯Ό μž‘μ—…ν•  λ•ŒλŠ” κ°œλ³„ 적으둜 κΉƒ μ €μž₯μ†Œλ₯Ό λ§Œλ“€κΈ° λ³΄λ‹€λŠ” μ›Œν¬ 슀페이슀 λ‹¨μœ„λ‘œ λ§Œλ“œλŠ” 것을 μ„ ν˜Έν•  수 있기 λ•Œλ¬Έμ— ν•„μš”ν•œ μ˜΅μ…˜μ΄λΌ ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

μ΅œμ†Œ μ‚¬μ΄μ¦ˆ ν”„λ‘œμ νŠΈ λ§Œλ“€κΈ°

이것 저것 λΊ€ ν”„λ‘œμ νŠΈλ₯Ό λ‹€μŒ λͺ…λ ΉμœΌλ‘œ λ§Œλ“€μ–΄ λ΄…μ‹œλ‹€. ν”„λ‘œμ νŠΈμ˜ ꡬ성과 package.json 파일과 angular.json 파일의 섀정뢀뢄을 μ‚΄νŽ΄λ³΄μ„Έμš”.

$ ng new small-project --inlineTemplate=true --inlineStyle=true --minimal=true --skipTests=true --skipGit=true --skipInstall=true

ng serve -o

ν”„λ‘œμ νŠΈ 루트 ν΄λ”μ—μ„œ λͺ…령을 μ‹€ν–‰ν•˜λ©΄ μ•΅κ·€λŸ¬ ν”„λ‘œμ νŠΈλ₯Ό λΉŒλ“œ 및 λ²ˆλ“€λ§ μž‘μ—…μ„ μ§„ν–‰ν•˜κ³  μ›ΉνŒ© ν…ŒμŠ€νŠΈ μ„œλ²„λ₯Ό κΈ°λ™ν•©λ‹ˆλ‹€. λ”λΆˆμ–΄μ„œ -o μ˜΅μ…˜μ„ μΆ”κ°€ν•˜λ©΄ λΈŒλΌμš°μ €κ°€ μ‹€ν–‰λ˜κ³  μ›ΉνŒ© ν…ŒμŠ€νŠΈ μ„œλ²„μ— μ ‘μ†ν•˜μ—¬ index.html νŒŒμΌμ„ λ‹€μš΄λ°›μ•„μ„œ 화면에 ν‘œμ‹œν•©λ‹ˆλ‹€.

ng g c [component-name]

μƒˆ μ»΄ν¬λ„ŒνŠΈλ₯Ό μƒμ„±ν•©λ‹ˆλ‹€. μ»΄ν¬λ„ŒνŠΈ μ „μš©ν΄λ”κ°€ μƒμ„±λ©λ‹ˆλ‹€. g λ¬ΈμžλŠ” generate λ¬Έμžμ—΄μ„ μ€„μ—¬μ„œ μ“΄ 것이고 c λ¬ΈμžλŠ” component λ¬Έμžμ—΄μ„ μ€„μ—¬μ„œ μ“΄ κ²ƒμž…λ‹ˆλ‹€.

  • --dryRun=true
    When true, runs through and reports activity without writing out results.
    κ²°κ³Όκ°€ μ˜ˆμƒλ˜μ§€ μ•Šμ„ λ•Œ, μ‹€μ œλ‘œ μˆ˜ν–‰ν•˜λŠ” λŒ€μ‹  μˆ˜ν–‰κ³„νšλ§Œμ„ 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.

  • --module=app
    μ»΄ν¬λ„ŒνŠΈλ₯Ό 등둝할 λŒ€μƒ λͺ¨λ“ˆμ„ μ§€μ •ν•©λ‹ˆλ‹€.

    • app λ¬Έμžμ—΄μ€ AppModule ν΄λž˜μŠ€μ—μ„œ Module 단어λ₯Ό λΊ€ ν›„ μ†Œλ¬Έμžλ‘œ μ‚¬μš©ν•©λ‹ˆλ‹€.
    • μƒλž΅ν•˜λ©΄ 루트 λͺ¨λ“ˆμ— λ“±λ‘λ©λ‹ˆλ‹€.
    • μ»΄ν¬λ„ŒνŠΈ 생성 μ‹œ νŠΉμ • 폴더 밑에 λ§Œλ“€λΌκ³  ν•œ 경우, ν•΄λ‹Ή 폴더에 λͺ¨λ“ˆ 파일이 μ‘΄μž¬ν•œλ‹€κ³  ν•  λ•Œ, μƒλž΅ν•˜λ©΄ ν•΄λ‹Ή 폴더에 μ‘΄μž¬ν•˜λŠ” λͺ¨λ“ˆμ— λ“±λ‘λ©λ‹ˆλ‹€.
  • --selector=selector
    μ»΄ν¬λ„ŒνŠΈμ˜ selector 값을 μ§€μ •ν•©λ‹ˆλ‹€. μƒλž΅ν•˜λ©΄ μ»΄ν¬λ„ŒνŠΈλͺ…에 μžλ™μœΌλ‘œ μ§€μ •λ©λ‹ˆλ‹€.

  • --prefix=my
    μ»΄ν¬λ„ŒνŠΈμ˜ selector κ°’μ—μ„œ μ‚¬μš©ν•  λ‘λ¬Έμžλ₯Ό μ§€μ •ν•©λ‹ˆλ‹€. μƒλž΅ν•˜λ©΄ angular.json 파일의 섀정을 λ”°λ¦…λ‹ˆλ‹€.

  • --inlineTemplate=true
    HTML νŒŒμΌμ„ λ³„λ„λ‘œ λ§Œλ“€μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. μƒλž΅ν•˜λ©΄ λ³„λ„λ‘œ HTML νŒŒμΌμ„ μƒμ„±ν•©λ‹ˆλ‹€.

  • --inlineStyle=true
    CSS νŒŒμΌμ„ λ³„λ„λ‘œ λ§Œλ“€μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. μƒλž΅ν•˜λ©΄ λ³„λ„λ‘œ CSS νŒŒμΌμ„ μƒμ„±ν•©λ‹ˆλ‹€.

  • --spec=false
    ν…ŒμŠ€νŠΈ 파일(~.spec.ts)을 λ³„λ„λ‘œ λ§Œλ“€μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. μƒλž΅ν•˜λ©΄ λ³„λ„λ‘œ ν…ŒμŠ€νŠΈ νŒŒμΌμ„ μƒμ„±ν•©λ‹ˆλ‹€.

  • --flat=true
    μ»΄ν¬λ„ŒνŠΈλ₯Ό μœ„ν•œ μ „μš© 폴더λ₯Ό λ³„λ„λ‘œ λ§Œλ“€μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. μƒλž΅ν•˜λ©΄ λ³„λ„λ‘œ μ»΄ν¬λ„ŒνŠΈλ₯Ό μœ„ν•œ μ „μš© 폴더λ₯Ό μƒμ„±ν•©λ‹ˆλ‹€.

  • 보닀 μžμ„Έν•œ λ‚΄μš©μ€ 곡식 μ‚¬μ΄νŠΈλ₯Ό μ°Έκ³ ν•˜μ„Έμš”.
    https://angular.io/cli/generate#component

ng g s [service-name]

μƒˆ μ„œλΉ„μŠ€λ₯Ό μƒμ„±ν•©λ‹ˆλ‹€. s λ¬ΈμžλŠ” service λ¬Έμžμ—΄μ„ μ€„μ—¬μ„œ μ“΄ κ²ƒμž…λ‹ˆλ‹€.
https://angular.io/cli/generate#directive

ng g g [guard-name]

μƒˆ κ°€λ“œλ₯Ό μƒμ„±ν•©λ‹ˆλ‹€. κ°€λ‹€λŠ” μ„œλΉ„μŠ€μ˜ μΌμ’…μœΌλ‘œ λΌμš°νŒ… 처리 μ‹œ μž‘λ™ν•˜λŠ” μ„œλΉ„μŠ€μž…λ‹ˆλ‹€. 두 번째 g λ¬ΈμžλŠ” guard λ¬Έμžμ—΄μ„ μ€„μ—¬μ„œ μ“΄ κ²ƒμž…λ‹ˆλ‹€.
https://angular.io/cli/generate#guard

ng g p [pipe-name]

μƒˆ νŒŒμ΄ν”„λ₯Ό μƒμ„±ν•©λ‹ˆλ‹€. p λ¬ΈμžλŠ” pipe λ¬Έμžμ—΄μ„ μ€„μ—¬μ„œ μ“΄ κ²ƒμž…λ‹ˆλ‹€.
https://angular.io/cli/generate#pipe

  • --export=true
  • --module=module
  • --spec=false

ng g d [directive-name]

μƒˆ λ””λ ‰ν‹°λΈŒλ₯Ό μƒμ„±ν•©λ‹ˆλ‹€. d λ¬ΈμžλŠ” directive λ¬Έμžμ—΄μ„ μ€„μ—¬μ„œ μ“΄ κ²ƒμž…λ‹ˆλ‹€.
https://angular.io/cli/generate#directive

  • --export=true
  • --module=module
  • --spec=false

ng g class [class-name]

μƒˆ 클래슀λ₯Ό μƒμ„±ν•©λ‹ˆλ‹€. c λ¬ΈμžλŠ” component λ¬Έμžμ—΄μ„ μ˜λ―Έν•˜κΈ° λ•Œλ¬Έμ— μ‚¬μš©ν•  수 μ—†μŠ΅λ‹ˆλ‹€. 이럴 λ•ŒλŠ” 쀄여 μ“°μ§€ 말고 κ·ΈλŒ€λ‘œ class λΌλŠ” λ¬Έμžμ—΄μ„ μ‚¬μš©ν•˜λ©΄ λ©λ‹ˆλ‹€.
https://angular.io/cli/generate#class

ng g i [interface-name]

μƒˆ μΈν„°νŽ˜μ΄μŠ€λ₯Ό μƒμ„±ν•©λ‹ˆλ‹€. i λ¬ΈμžλŠ” interface λ¬Έμžμ—΄μ„ μ€„μ—¬μ„œ μ“΄ κ²ƒμž…λ‹ˆλ‹€.
https://angular.io/cli/generate#interface

ng g m [module-name]

μƒˆ λͺ¨λ“ˆμ„ μƒμ„±ν•©λ‹ˆλ‹€. λͺ¨λ“ˆ μ „μš©ν΄λ”κ°€ μƒμ„±λ©λ‹ˆλ‹€. m λ¬ΈμžλŠ” module λ¬Έμžμ—΄μ„ μ€„μ—¬μ„œ μ“΄ κ²ƒμž…λ‹ˆλ‹€.

  • --routing=true λΌμš°νŒ… 정보λ₯Ό λ³„λ„μ˜ 파일둜 μ·¨κΈ‰ν•  수 μžˆλ„λ‘ λΌμš°νŒ… λͺ¨λ“ˆ νŒŒμΌμ„ μΆ”κ°€λ‘œ μƒμ„±ν•©λ‹ˆλ‹€. μƒλž΅ν•˜λ©΄ μƒμ„±λ˜μ§€ μ•Šκ³  λͺ¨λ“ˆνŒŒμΌλ§Œ μƒμ„±λ©λ‹ˆλ‹€.

  • --module=app
    μƒˆ λͺ¨λ“ˆμ„ 루트 λͺ¨λ“ˆμ— λ“±λ‘ν•˜λŠ” μž‘μ—…μ„ μΆ”κ°€λ‘œ μˆ˜ν–‰ν•©λ‹ˆλ‹€.

  • 보닀 μžμ„Έν•œ λ‚΄μš©μ€ 곡식 μ‚¬μ΄νŠΈλ₯Ό μ°Έκ³ ν•˜μ„Έμš”.
    https://angular.io/cli/generate#module

Angular CLI 곡식 μ‚¬μ΄νŠΈ

기타 μžμ„Έν•œ μ‚¬μš©λ²•μ€ 곡식 μ‚¬μ΄νŠΈλ₯Ό μ°Έκ³ ν•˜μ„Έμš”.

  • https://angular.io/cli
  • https://cli.angular.io/

첫 ν”„λ‘œμ νŠΈ λ§Œλ“€κΈ°

μ‹€μŠ΅μ„ ν†΅ν•΄μ„œ μ•΅κ·€λŸ¬ CLI μ‚¬μš©λ²•μ„ ν•™μŠ΅ν•©λ‹ˆλ‹€. μ λ‹Ήν•œ 폴더λ₯Ό μž‘μ—…κ³΅κ°„(μ›Œν¬ 슀페이슀)으둜 κ°„μ£Όν•˜κ³  μ½˜μ†”μ—μ„œ μ»€μ„œλ₯Ό 이동 μ‹œν‚΅λ‹ˆλ‹€. $ κΈ°ν˜ΈλŠ” ν”„λ‘¬ν”„νŠΈλ₯Ό μ˜λ―Έν•©λ‹ˆλ‹€. $ 기호 λ‹€μŒ λͺ…령을 λ”°λΌν•˜μ„Έμš”.

$ ng new my-angular1
? Would you like to add Angular routing? No
? Which stylesheet format would you like to use? CSS
$ cd my-angular1
$ ng serve -o
** Angular Live Development Server is listening on localhost:4200, 
open your browser on http://localhost:4200/ **

Date: 2018-12-05T02:47:04.201Z
Hash: dc84e834c1cad91bd980
Time: 9772ms
chunk {main} main.js, main.js.map (main) 9.82 kB [initial] [rendered]
chunk {polyfills} polyfills.js, polyfills.js.map (polyfills) 223 kB [initial] [rendered]
chunk {runtime} runtime.js, runtime.js.map (runtime) 6.08 kB [entry] [rendered]
chunk {styles} styles.js, styles.js.map (styles) 16.3 kB [initial] [rendered]
chunk {vendor} vendor.js, vendor.js.map (vendor) 3.43 MB [initial] [rendered]
i ο½’wdmο½£: Compiled successfully.

둜그λ₯Ό μ‚΄νŽ΄λ³΄λ©΄ http://localhost:4200/ μ£Όμ†Œλ‘œ μ›Ή μ„œλΉ„μŠ€κ°€ μ‹œμž‘λœ 것을 μ•Œ 수 μžˆμŠ΅λ‹ˆλ‹€. ng serve -o λͺ…λ Ήμ—μ„œ --open μ˜΅μ…˜μ„ μ£Όμ—ˆκΈ° λ•Œλ¬Έμ— λ°”λ‘œ λΈŒλΌμš°μ €κ°€ 뜨고 λ‹€μŒκ³Ό 같은 화면을 λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€.

λΈŒλΌμš°μ €μ—μ„œ μ†ŒμŠ€λ³΄κΈ°λ₯Ό ν•©λ‹ˆλ‹€. μ†ŒμŠ€μ˜ λ‚΄μš©μ€ λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

<!doctype html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <title>MyAngular1</title>
  <base href="/">

  <meta name="viewport" content="width=device-width, initial-scale=1">
  <link rel="icon" type="image/x-icon" href="favicon.ico">
</head>
<body>
  <app-root></app-root>
  <script type="text/javascript" src="runtime.js"></script>
  <script type="text/javascript" src="polyfills.js"></script>
  <script type="text/javascript" src="styles.js"></script>
  <script type="text/javascript" src="vendor.js"></script>
  <script type="text/javascript" src="main.js"></script></body>
</html>

ng serve -o λͺ…λ Ή μ‹œ 좜λ ₯된 둜그λ₯Ό μ‚΄νŽ΄ 보면 μ›Ή μ„œλ²„λ₯Ό μ‹œμž‘ν•˜κΈ° 전에 5개의 νŒŒμΌλ“€λ‘œ λ²ˆλ“€λ§ μž‘μ—…μ΄ μ§„ν–‰λ˜μ—ˆμŒμ„ μ•Œ 수 μžˆμŠ΅λ‹ˆλ‹€. ν”„λ‘œμ νŠΈ λ£¨νŠΈμ—μ„œ src 폴더 밑에 μ‘΄μž¬ν•˜λŠ” index.html νŒŒμΌμ€ μžλ°”μŠ€ν¬λ¦½νŠΈ νŒŒμΌμ„ μž„ν¬νŠΈν•˜λŠ” μ½”λ“œκ°€ μ—†μ§€λ§Œ λ™μ μœΌλ‘œ λΉŒλ“œν•˜λŠ” κ³Όμ •μ—μ„œ index.html νŒŒμΌμ— μΆ”κ°€κ°€ λœλ‹€κ³  μ΄ν•΄ν•˜μ‹œλ©΄ λ˜κ² μŠ΅λ‹ˆλ‹€.

  • runtime.js : μ›Ή 팩 μ„œλ²„κ΄€λ ¨ 둜직
  • polyfills.js : 폴리필 라이브러리
  • styles.js : CSS 처리 κ΄€λ ¨ 둜직
  • vendor.js : μ•΅κ·€λŸ¬ 기술
  • main.js : κ°œλ°œμžκ°€ μΆ”κ°€ν•œ 둜직

개발 쀑 μ›ΉνŒ©μ„ ν…ŒμŠ€νŠΈ μ›Ήμ„œλ²„λ‘œ μ‚¬μš©ν•˜λŠ”λ° μœ„ μ²˜λ¦¬λŠ” 개발 쀑 λΉŒλ“œμ— ν•΄λ‹Ήν•©λ‹ˆλ‹€. 개발 쀑 λΉŒλ“œ, 배포 ν…ŒμŠ€νŠΈ λΉŒλ“œ, μ‹€ μ„œλΉ„μŠ€ λΉŒλ“œλŠ” μ²˜λ¦¬κ²°κ³Όκ°€ 쑰금 μ”© λ‹€λ¦…λ‹ˆλ‹€. μ΄λŠ” λ’€μ—μ„œ μžμ„Ένžˆ μ‚΄νŽ΄λ³΄κ² μŠ΅λ‹ˆλ‹€.

μ²˜λ¦¬νλ¦„

  1. index.html 파일이 λΈŒλΌμš°μ €μ—κ²Œ μ „λ‹¬λ©λ‹ˆλ‹€. index.html νŒŒμΌμ€ μ•΅κ·€λŸ¬ μ½”λ“œλ₯Ό λΈŒλΌμš°μ €μ—κ²Œ μ „λ‹¬ν•˜λŠ” μš©λ„λ‘œ μ‚¬μš©λ©λ‹ˆλ‹€.

  2. main.ts 파일이 μ•΅κ·€λŸ¬ μ½”λ“œμ˜ μ§„μž…μ μž…λ‹ˆλ‹€. 이 섀정은 angular.json 파일 λ‚΄ "main": "src/main.ts" 섀정에 따라 μ΄λ£¨μ–΄μ§‘λ‹ˆλ‹€. 이 νŒŒμΌμ€ μ½”λ“œλ‘œ 전역적인 ν™˜κ²½μ„€μ •μ„ ν•˜κΈ°μœ„ν•œ μš©λ„μ˜ νŒŒμΌμž…λ‹ˆλ‹€.

  3. app.module.ts 파일이 루트 λͺ¨λ“ˆ(μ‹œμž‘ λͺ¨λ“ˆ)μž…λ‹ˆλ‹€. μ΄λŠ” main.ts 파일 λ‚΄ platformBrowserDynamic().bootstrapModule(AppModule) μ½”λ“œμ— 따라 μ΄λ£¨μ–΄μ§‘λ‹ˆλ‹€. μ•΅κ·€λŸ¬ ν”„λ‘œκ·Έλž¨μ—μ„œ 루트λͺ¨λ“ˆμ€ ν•˜λ‚˜λ§Œ μ§€μ •ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

  4. app.component.ts 파일이 μ‹œμž‘ μ»΄ν¬λ„ŒνŠΈμž…λ‹ˆλ‹€. μ΄λŠ” app.module.ts 파일 λ‚΄ bootstrap: [AppComponent] 섀정에 따라 μ΄λ£¨μ–΄μ§‘λ‹ˆλ‹€. 기동 μ»΄ν¬λ„ŒνŠΈλŠ” 루트 λͺ¨λ“ˆμ— λ“±λ‘λœ μ»΄ν¬λ„ŒνŠΈ 쀑에 ν•˜λ‚˜λ₯Ό μ„ νƒν•΄μ„œ λ“±λ‘ν•©λ‹ˆλ‹€. 루트 λͺ¨λ“ˆμ—κ²Œ μž„ν¬νŠΈ 된 λͺ¨λ“ˆμ΄ μ†Œμœ ν•œ μ»΄ν¬λ„ŒνŠΈλ₯Ό λͺ…μ‹œμ μœΌλ‘œ μ΅μŠ€ν¬νŠΈν–ˆλ‹€λ©΄ μ‹œμž‘ μ»΄ν¬λ„ŒνŠΈλ‘œ μ‚¬μš©ν•  수 μžˆμœΌλ‚˜ 일반적으둜 μ΄λ ‡κ²Œ μ‚¬μš©ν•˜μ§€λŠ” μ•ŠμŠ΅λ‹ˆλ‹€.

  5. app.component.html 파일이 첫 화면을 κ΅¬μ„±ν•˜λŠ” HTML νŒŒμΌμž…λ‹ˆλ‹€. μ΄λŠ” app.component.ts 파일 λ‚΄ templateUrl: './app.component.html' 섀정에 따라 μ΄λ£¨μ–΄μ§‘λ‹ˆλ‹€. app.component.ts 파일 λ‚΄ styleUrls: ['./app.component.css'] 섀정에 따라 HTML νŒŒμΌμ— λ””μžμΈμ΄ μ μš©λ©λ‹ˆλ‹€.

  6. AppComponent μ²˜λ¦¬κ°€ μ™„λ£Œλ˜λ©΄ index.html 파일 λ‚΄ <app-root></app-root> νƒœκ·Έ 사이에 처리된 λ‚΄μš©μ„ μΆ”κ°€ν•©λ‹ˆλ‹€. λ”°λΌμ„œ, μ•΅κ·€λŸ¬λŠ” μ»€μŠ€ν…€ νƒœκ·Έ μ‚¬μš© μ‹œ 마감 νƒœκ·Έκ°€ ν•­μ‹œ μ‘΄μž¬ν•΄μ•Όλ§Œ ν•˜λ©΄ μ€„μ—¬μ„œ μ‚¬μš©ν•  수 μ—†μŠ΅λ‹ˆλ‹€. app-roo λ¬Έμžμ—΄μ€ app.component.ts νŒŒμΌμ—μ„œ μ •μ˜ν•œ selector: 'app-root' λ‚΄μš©κ³Ό μΌμΉ˜ν•΄μ•Ό ν•©λ‹ˆλ‹€.

Profile

κ°œλ°œμ€‘μ΄λΌλ©΄ environment.ts 파일이 μ‚¬μš©λ©λ‹ˆλ‹€. λΉŒλ“œμ—μ„œ --prod μ˜΅μ…˜μ„ μ„€μ •ν•˜λ©΄ environment.prod.ts 파일이 μ‚¬μš©λ©λ‹ˆλ‹€. 개발λͺ¨λ“œμ—μ„œ μ‚¬μš©ν•˜λŠ” μ„€μ •μ •λ³΄λŠ” environment.ts νŒŒμΌμ— ν•©λ‹ˆλ‹€. μ„œλΉ„μŠ€λͺ¨λ“œ(배포λͺ¨λ“œ)μ—μ„œ μ‚¬μš©ν•˜λŠ” μ„€μ •μ •λ³΄λŠ” environment.prod.ts νŒŒμΌμ— ν•˜λ©΄ λ©λ‹ˆλ‹€.

λ‹€μŒ μ‚¬μš©μ˜ˆλ₯Ό μ‚΄νŽ΄λ³΄μ„Έμš”. import μ½”λ“œλŠ” 변경될 ν•„μš”κ°€ μ—†μŠ΅λ‹ˆλ‹€.

import { environment } from '../environments/environment';

const MODE = environment.production ? 'prod' : 'dev';

environment νŒŒμΌμ„ μž„ν¬νŠΈν•˜λŠ” λŒ€μ‹  isDevMode() ν•¨μˆ˜λ₯Ό μ΄μš©ν•  μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€.

import { Component, OnInit, isDevMode } from '@angular/core';

@Component({ ... })
export class AppComponent implements OnInit {
  ngOnInit() {
    if (isDevMode()) {
      console.log('Development');
    } else {
      console.log('Production');
    }
  }
}

μ°Έκ³ : https://alligator.io/angular/environment-variables/

ν™˜κ²½μ„€μ • μ‚΄νŽ΄λ³΄κΈ°

package.json

λ…Έλ“œκ°€ μ œμ•ˆν•˜λŠ” ν”„λ‘œμ νŠΈ 정보 및 λ””νŽœλ˜μ‹œ μ„€μ •νŒŒμΌμž…λ‹ˆλ‹€.

{
  "name": "my-angular1",
  "version": "0.0.0",
  "scripts": {
    "ng": "ng",
    "start": "ng serve",
    "build": "ng build",
    "test": "ng test",
    "lint": "ng lint",
    "e2e": "ng e2e"
  },
  "private": true,
  "dependencies": {
    "@angular/animations": "~7.1.0",
    "@angular/common": "~7.1.0",
    "@angular/compiler": "~7.1.0",
    "@angular/core": "~7.1.0",
    "@angular/forms": "~7.1.0",
    "@angular/platform-browser": "~7.1.0",
    "@angular/platform-browser-dynamic": "~7.1.0",
    "@angular/router": "~7.1.0",
    "core-js": "^2.5.4",
    "rxjs": "~6.3.3",
    "tslib": "^1.9.0",
    "zone.js": "~0.8.26"
  },
  "devDependencies": {
    "@angular-devkit/build-angular": "~0.11.0",
    "@angular/cli": "~7.1.1",
    "@angular/compiler-cli": "~7.1.0",
    "@angular/language-service": "~7.1.0",
    "@types/node": "~8.9.4",
    "@types/jasmine": "~2.8.8",
    "@types/jasminewd2": "~2.0.3",
    "codelyzer": "~4.5.0",
    "jasmine-core": "~2.99.1",
    "jasmine-spec-reporter": "~4.2.1",
    "karma": "~3.1.1",
    "karma-chrome-launcher": "~2.2.0",
    "karma-coverage-istanbul-reporter": "~2.0.1",
    "karma-jasmine": "~1.1.2",
    "karma-jasmine-html-reporter": "^0.2.2",
    "protractor": "~5.4.0",
    "ts-node": "~7.0.0",
    "tslint": "~5.11.0",
    "typescript": "~3.1.6"
  }
}
  • scripts ν•­λͺ©μ—λŠ” μ•΅κ·€λŸ¬ CLI λͺ…λ Ήμ˜ 별칭을 λ“±λ‘ν•©λ‹ˆλ‹€. 자주 μ“°λŠ” λͺ…λ Ήμ΄λ‚˜ μ˜΅μ…˜μ΄ λ§Žμ€ λͺ…령듀을 등둝해 놓고 μ‚¬μš©ν•˜λ©΄ νŽΈλ¦¬ν•©λ‹ˆλ‹€.
  • dependencies ν•­λͺ©μ—λŠ” 개발 및 μ„œλΉ„μŠ€ 쀑에 ν•„μš”ν•œ λ””νŽœλ˜μ‹œλ“€μ„ λ“±λ‘ν•©λ‹ˆλ‹€.
  • devDependencies ν•­λͺ©μ—λŠ” 개발 μ€‘μ—λ§Œ ν•„μš”ν•œ λ””νŽœλ˜μ‹œλ“€μ„ λ“±λ‘ν•©λ‹ˆλ‹€.
  • ν•„μš”ν•œ λŒ€λΆ€λΆ„μ˜ μ•΅κ·€λŸ¬ λ””νŽœλ˜μ‹œλŠ” 섀정이 λ˜μ–΄ μžˆμœΌλ‚˜ @angular/httpλŠ” λΉ μ Έ μžˆμŠ΅λ‹ˆλ‹€. @angular/http λͺ¨λ“ˆμ— λŒ€μ²΄ 기술둜써 인기 μžˆλŠ” axios 같은 κΈ°μˆ μ„ μ‚¬μš©ν•˜λΌλŠ” 배렀인 것 κ°™μŠ΅λ‹ˆλ‹€.
  • core-jsλŠ” 폴리필 λΌμ΄λΈŒλŸ¬λ¦¬μž…λ‹ˆλ‹€.
  • rxjsλŠ” MSκ°€ λ§Œλ“  비동기 처리 κΈ°μˆ μž…λ‹ˆλ‹€.
  • tslibλŠ” νƒ€μž…μŠ€ν¬λ¦½νŠΈ λŸ°νƒ€μž… λΌμ΄λΈŒλŸ¬λ¦¬μž…λ‹ˆλ‹€.
  • zone.jsλŠ” ꡬ글이 λ§Œλ“  변경감지 κΈ°μˆ μž…λ‹ˆλ‹€.
  • jasmineλŠ” μΈκΈ°μžˆλŠ” μžλ°”μŠ€ν¬λ¦½νŠΈ ν…ŒμŠ€νŠΈ ν”„λ ˆμž„μ›Œν¬μž…λ‹ˆλ‹€.
  • karmaλŠ” ν…ŒμŠ€νŠΈ λŸ°λ„ˆμž…λ‹ˆλ‹€.
  • protractorλŠ” 톡합 ν…ŒμŠ€νŠΈ κΈ°μˆ μž…λ‹ˆλ‹€.
  • @types/jasmine 타이핑 μ •μ˜λ₯Ό μΆ”κ°€λ‘œ μ„€μΉ˜ν•˜λ©΄ IDE 툴 μ‚¬μš© μ‹œ 자슀민과 κ΄€λ ¨ν•œ 도움말 μ„œλΉ„μŠ€λ₯Ό 받을 수 μžˆμŠ΅λ‹ˆλ‹€.

angular.json

μ•΅κ·€λŸ¬ 버전에 따라 angular.json 파일의 λ‚΄μš©μ΄ λ³€ν™”κ°€ μžˆμœΌλ‹ˆ μ°Έκ³  ν•˜μ‹œκΈ° λ°”λžλ‹ˆλ‹€. μ—¬κΈ° 전체 λ‚΄μš©μ„ κΈ°λ‘ν•˜λŠ” μ΄μœ λŠ” λ―Έλž˜μ— 변경될 μˆ˜λ„ 있기 λ•Œλ¬Έμž…λ‹ˆλ‹€.

{
  "$schema": "./node_modules/@angular/cli/lib/config/schema.json",
  "version": 1,
  "newProjectRoot": "projects",
  "projects": {
    "my-angular1": {
      "root": "",
      "sourceRoot": "src",
      "projectType": "application",
      "prefix": "app",
      "schematics": {},
      "architect": {
        "build": {
          "builder": "@angular-devkit/build-angular:browser",
          "options": {
            "outputPath": "dist/my-angular1",
            "index": "src/index.html",
            "main": "src/main.ts",
            "polyfills": "src/polyfills.ts",
            "tsConfig": "src/tsconfig.app.json",
            "assets": [
              "src/favicon.ico",
              "src/assets"
            ],
            "styles": [
              "src/styles.css"
            ],
            "scripts": []
          },
          "configurations": {
            "production": {
              "fileReplacements": [{
                "replace": "src/environments/environment.ts",
                "with": "src/environments/environment.prod.ts"
              }],
              "optimization": true,
              "outputHashing": "all",
              "sourceMap": false,
              "extractCss": true,
              "namedChunks": false,
              "aot": true,
              "extractLicenses": true,
              "vendorChunk": false,
              "buildOptimizer": true,
              "budgets": [{
                "type": "initial",
                "maximumWarning": "2mb",
                "maximumError": "5mb"
              }]
            }
          }
        },
        "serve": {
          "builder": "@angular-devkit/build-angular:dev-server",
          "options": {
            "browserTarget": "my-angular1:build"
          },
          "configurations": {
            "production": {
              "browserTarget": "my-angular1:build:production"
            }
          }
        },
        "extract-i18n": {
          "builder": "@angular-devkit/build-angular:extract-i18n",
          "options": {
            "browserTarget": "my-angular1:build"
          }
        },
        "test": {
          "builder": "@angular-devkit/build-angular:karma",
          "options": {
            "main": "src/test.ts",
            "polyfills": "src/polyfills.ts",
            "tsConfig": "src/tsconfig.spec.json",
            "karmaConfig": "src/karma.conf.js",
            "styles": [
              "src/styles.css"
            ],
            "scripts": [],
            "assets": [
              "src/favicon.ico",
              "src/assets"
            ]
          }
        },
        "lint": {
          "builder": "@angular-devkit/build-angular:tslint",
          "options": {
            "tsConfig": [
              "src/tsconfig.app.json",
              "src/tsconfig.spec.json"
            ],
            "exclude": [
              "**/node_modules/**"
            ]
          }
        }
      }
    },
    "my-angular1-e2e": {
      "root": "e2e/",
      "projectType": "application",
      "prefix": "",
      "architect": {
        "e2e": {
          "builder": "@angular-devkit/build-angular:protractor",
          "options": {
            "protractorConfig": "e2e/protractor.conf.js",
            "devServerTarget": "my-angular1:serve"
          },
          "configurations": {
            "production": {
              "devServerTarget": "my-angular1:serve:production"
            }
          }
        },
        "lint": {
          "builder": "@angular-devkit/build-angular:tslint",
          "options": {
            "tsConfig": "e2e/tsconfig.e2e.json",
            "exclude": [
              "**/node_modules/**"
            ]
          }
        }
      }
    }
  },
  "defaultProject": "my-angular1"
}
  • "prefix": "app" μ»΄ν¬λ„ŒνŠΈλ₯Ό 생성할 λ•Œ μ»΄ν¬λ„ŒνŠΈλ₯Ό κ°€λ¦¬ν‚€λŠ” μ»€μŠ€ν…€ νƒœκ·Έλͺ…을 μ§€μ •ν•©λ‹ˆλ‹€. 이λ₯Ό selector라고 λΆ€λ₯΄λŠ”λ° prefixλŠ” μ…€λ ‰ν„° λ¬Έμžμ—΄ μ•žμ— μžλ™μœΌλ‘œ λΆ™λŠ” λ‘λ¬Έμžλ₯Ό κ°€λ¦¬ν‚΅λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄μ„œ, μžλ™μœΌλ‘œ λ§Œλ“€μ–΄μ§„ app.component.ts νŒŒμΌμ„ 보면 selector: 'app-root'라고 ν•˜λŠ” 섀정이 보이싀 κ²λ‹ˆλ‹€. ν•„μš”ν•  λ•Œ λ°”κΎΈμ–΄μ„œ μ‚¬μš©ν•˜λ©΄ λ©λ‹ˆλ‹€.
  • "outputPath": "dist/my-angular1" λΉŒλ“œκ²°κ³Ό 파일이 μ €μž₯λ˜λŠ” μœ„μΉ˜μž…λ‹ˆλ‹€.
  • "index": "src/index.html" μœ„ 섀정에 따라 index.html 파일이 μ•΅κ·€λŸ¬ μ½”λ“œλ₯Ό μž„ν¬νŠΈν•΄μ„œ λΈŒλΌμš°μ €μ—κ²Œ μ „λ‹¬ν•˜λŠ” 역할을 μˆ˜ν–‰ν•©λ‹ˆλ‹€.
  • "main": "src/main.ts" μœ„ 섀정에 따라 main.ts 파일이 개발자 둜직의 μ‹œμž‘μ μ΄ λ©λ‹ˆλ‹€.
  • "polyfills": "src/polyfills.ts" 폴리필 κ΄€λ ¨ μ„€μ •νŒŒμΌμž…λ‹ˆλ‹€. IE λΈŒλΌμš°μ €μ—μ„œλ„ μ•΅κ·€λŸ¬ μ œλŒ€λ‘œ μž‘λ™ν•˜κΈ°λ₯Ό μ›ν•œλ‹€λ©΄ polyfills.ts νŒŒμΌμ—μ„œ ν•„μš”ν•œ 뢀뢄에 μ£Όμ„μ²˜λ¦¬λ₯Ό ν•΄μ œν•˜λ©΄ λ©λ‹ˆλ‹€.
  • "assets": ["src/favicon.ico","src/assets"] 정적 λ¦¬μ†ŒμŠ€λ₯Ό λ“±λ‘ν•˜λŠ” μœ„μΉ˜μ™€ κ΄€λ ¨ν•œ μ„€μ •μž…λ‹ˆλ‹€. λ”°λΌμ„œ, 이미지 νŒŒμΌμ€ assets 폴더 밑에 λ°°μΉ˜ν•˜λ©΄ λ©λ‹ˆλ‹€.
  • "styles": ["src/styles.css"] index.html 파일의 <head> νƒœκ·Έ 사이에 CSS 섀정을 해도 λ˜μ§€λ§Œ styles.css νŒŒμΌμ— ν•˜λ©΄ 보닀 κΉ”λ”ν•˜κ²Œ index.html νŒŒμΌμ„ 관리할 수 μžˆμŠ΅λ‹ˆλ‹€.
  • "scripts": [] λΉŒλ“œ μ‹œ 포함될 μ „μ—­ μžλ°”μŠ€ν¬λ¦½νŠΈ νŒŒμΌμ„ λ“±λ‘ν•©λ‹ˆλ‹€.

기타 μžμ„Έν•œ λ‚΄μš©μ€ λ‹€μŒ μ‚¬μ΄νŠΈλ₯Ό μ°Έκ³ ν•˜μ‹œκΈ° λ°”λžλ‹ˆλ‹€.

  • https://github.com/angular/angular-cli/wiki/angular-cli
  • https://github.com/angular/angular-cli/wiki/angular-workspace
  • https://nitayneeman.com/posts/understanding-the-angular-cli-workspace-file/

Component μΆ”κ°€ν•˜κΈ°

μ΄μ œλΆ€ν„° μ»΄ν¬λ„ŒνŠΈλ₯Ό μΆ”κ°€ν•΄λ³΄λ©΄μ„œ ν•™μŠ΅ν•΄ 보도둝 ν•˜κ² μŠ΅λ‹ˆλ‹€. λ‹€μŒ λͺ…령을 ν”„λ‘œμ νŠΈ 루트 λ°‘μ—μ„œ μ‹€ν–‰ν•˜μ„Έμš”. ng serve λͺ…령을 μˆ˜ν–‰ν•˜κ³  μžˆλŠ” μ½˜μ†”μ°½μ€ κ·ΈλŒ€λ‘œ λ‘μ‹œκ³  λ³„λ„μ˜ μ½˜μ†”μ°½μ„ μ΄μš©ν•©λ‹ˆλ‹€.

$ ng g c books --module=app
CREATE src/app/books/books.component.html (24 bytes)
CREATE src/app/books/books.component.spec.ts (621 bytes)
CREATE src/app/books/books.component.ts (265 bytes)
CREATE src/app/books/books.component.css (0 bytes)
UPDATE src/app/app.module.ts (392 bytes)

booksλΌλŠ” μ΄λ¦„μœΌλ‘œ μ»΄ν¬λ„ŒνŠΈλ₯Ό μƒμ„±ν•˜λΌκ³  λͺ…λ Ήν•˜λ©΄ μ»΄ν¬λ„ŒνŠΈμ™€ κ΄€λ ¨ν•œ 4개의 파일이 μƒμ„±λ©λ‹ˆλ‹€.

  • src/app 폴더 λ°‘μœΌλ‘œ μ»΄ν¬λ„ŒνŠΈλ₯Ό μœ„ν•œ 폴더 booksκ°€ μƒμ„±λ©λ‹ˆλ‹€.
  • books.component.html νŒŒμΌμ€ μ»΄ν¬λ„ŒνŠΈ μ „μš© HTML νŒŒμΌμž…λ‹ˆλ‹€.
  • books.component.spec.ts νŒŒμΌμ€ ν…ŒμŠ€νŠΈλ₯Ό μœ„ν•œ νŒŒμΌμž…λ‹ˆλ‹€. 자슀민 ν…ŒμŠ€νŠΈ ν”„λ ˆμž„μ›Œν¬ ν…ŒμŠ€νŠΈ μ½”λ“œλ₯Ό μž‘μ„±ν•˜λŠ” μš©λ„μž…λ‹ˆλ‹€. --spec=false μ˜΅μ…˜μ„ μΆ”κ°€ν•˜λ©΄ 이 파일의 생성을 막을 수 μžˆμŠ΅λ‹ˆλ‹€.
  • books.component.ts νŒŒμΌμ€ μ»΄ν¬λ„ŒνŠΈ μžλ°”μŠ€ν¬λ¦½νŠΈ 클래슀 νŒŒμΌμž…λ‹ˆλ‹€.
  • books.component.css νŒŒμΌμ€ μ»΄ν¬λ„ŒνŠΈ μ „μš© CSS νŒŒμΌμž…λ‹ˆλ‹€.
  • app.module.ts νŒŒμΌμ— μƒˆλ‘œ μƒμ„±λœ μ»΄ν¬λ„ŒνŠΈκ°€ λ“±λ‘λ˜λŠ” μ½”λ“œκ°€ μΆ”κ°€λ˜μ–΄ UPDATE λ˜μ—ˆλ‹€κ³  ν‘œμ‹œλ˜μ—ˆμŠ΅λ‹ˆλ‹€.
$ ng g c books/book
CREATE src/app/books/book/book.component.html (23 bytes)
CREATE src/app/books/book/book.component.spec.ts (614 bytes)
CREATE src/app/books/book/book.component.ts (261 bytes)
CREATE src/app/books/book/book.component.css (0 bytes)
UPDATE src/app/app.module.ts (472 bytes)
  • --module=app μ˜΅μ…˜μ„ μƒλž΅ν•˜λ©΄ μƒˆ μ»΄ν¬λ„ŒνŠΈλŠ” 루트 λͺ¨λ“ˆμ— λ“±λ‘λ©λ‹ˆλ‹€.
  • books/book 처럼 μ‚¬μš©ν•˜λ©΄ / μ•žμ— λ¬Έμžμ—΄μ€ ν΄λ”λ‘œ μ·¨κΈ‰λ©λ‹ˆλ‹€. ν•΄λ‹Ή 폴더가 μ‘΄μž¬ν•˜μ§€ μ•ŠμœΌλ©΄ 폴더가 μžλ™μœΌλ‘œ μƒμ„±λ˜κ³  이미 μ‘΄μž¬ν•˜λ©΄ μƒμ„±λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. book μ΄λΌλŠ” μ΄λ¦„μ˜ μƒˆ μ»΄ν¬λ„ŒνŠΈλŠ” books 폴더 λ°‘μœΌλ‘œ μ „μš© 폴더 book을 λ§Œλ“  ν›„ κ·Έ λ°‘μœΌλ‘œ μ»΄ν¬λ„ŒνŠΈ κ΄€λ ¨ νŒŒμΌμ„ μƒμ„±ν•©λ‹ˆλ‹€.

Component 화면에 ν‘œμ‹œν•˜κΈ°

μ»΄ν¬λ„ŒνŠΈκ°€ λ§Œλ“€μ–΄μ‘Œλ‹€κ³  λ°”λ‘œ 화면에 ν‘œμ‹œλ˜μ§€λŠ” μ•ŠμŠ΅λ‹ˆλ‹€. μ–΄λ–»κ²Œ 화면에 λ°°μΉ˜ν•  수 μžˆλŠ”μ§€ μ•Œμ•„λ³΄λ„λ‘ ν•˜κ² μŠ΅λ‹ˆλ‹€.

기동 μ»΄ν¬λ„ŒνŠΈμΈ AppComponentκ°€ μ‚¬μš©ν•˜λŠ” app.component.html νŒŒμΌμ„ μ—΄μ–΄μ„œ λ‹€μŒμ²˜λŸΌ λ³€κ²½ν•©λ‹ˆλ‹€.

<h1>I am app.component.html</h1>
<h2>{{title}}</h2>
  • {{title}} 더블 μ€‘κ΄„ν˜ΈλŠ” μΈν„°ν΄λ ˆμ΄μ…˜ ν‘œν˜„μ‹μœΌλ‘œ μ•ˆμͺ½μ— κ°„λ‹¨ν•œ μžλ°”μŠ€ν¬λ¦½νŠΈ μ½”λ“œλ₯Ό μž‘μ„±ν•  수 μžˆμŠ΅λ‹ˆλ‹€. title에 λ¬Έμžμ—΄ κΈ°ν˜Έκ°€ μ—†μœΌλ―€λ‘œ λ³€μˆ˜λ₯Ό μ˜λ―Έν•©λ‹ˆλ‹€. μ»΄ν¬λ„ŒνŠΈ ν΄λž˜μŠ€κ°€ κ°–κ³  μžˆλŠ” 값이 μΉ˜ν™˜λ˜μ–΄ λ°°μΉ˜λ©λ‹ˆλ‹€. μΈν„°ν΄λ ˆμ΄μ…˜ ν‘œν˜„μ‹μ€ νƒœκ·Έλ„ λ¬Έμžμ—΄μ²˜λŸΌ μ·¨κΈ‰ν•©λ‹ˆλ‹€.

λΈŒλΌμš°μ € ν™”λ©΄μ˜ λ³€ν™”λ₯Ό ν™•μΈν•˜μ„Έμš”.

ng serve λͺ…령을 μˆ˜ν–‰ν•œ μ½˜μ†”μ°½μ„ ν™•μΈν•˜μ„Έμš”.

Date: 2018-12-05T07:05:25.266Z - Hash: 0d918a5704ebff4207f1 - Time: 3709ms
4 unchanged chunks
chunk {main} main.js, main.js.map (main) 13.8 kB [initial] [rendered]
i ο½’wdmο½£: Compiled successfully.

μ•΅κ·€λŸ¬λŠ” 파일이 μ €μž₯될 λ•Œ μžλ™μœΌλ‘œ 재 λΉŒλ“œμž‘μ—…μ„ μˆ˜ν–‰ν•©λ‹ˆλ‹€. κ°œλ°œμžκ°€ μž‘μ„±ν•œ μ½”λ“œλŠ” main.js에 ν¬ν•¨λ˜λ―€λ‘œ ν•΄λ‹Ή 파일만 재 λ²ˆλ“€λ§ λ˜μ—ˆλ‹€λŠ” 것을 μ•Œ 수 μžˆμŠ΅λ‹ˆλ‹€. 개발 μ‹œ 맀번 ν…ŒμŠ€νŠΈ μ›Ήμ„œλ²„λ₯Ό 재 κΈ°λ™ν•˜μ§€ μ•Šμ•„λ„ λ°”λ‘œ 적용되기 λ•Œλ¬Έμ— 맀우 νŽΈλ¦¬ν•©λ‹ˆλ‹€.

app.component.html νŒŒμΌμ„ λ‹€μŒμ²˜λŸΌ μˆ˜μ •ν•©λ‹ˆλ‹€.

<h1>I am app.component.html</h1>
<h2>{{title}}</h2>
<app-books></app-books>

  • <app-books></app-books> app.component.html νŒŒμΌμ—μ„œ books μ»΄ν¬λ„ŒνŠΈμ— selector λ¬Έμžμ—΄μ„ μ»€μŠ€ν…€ νƒœκ·Έμ²˜λŸΌ μ‚¬μš©ν•˜λ©΄ 화면에 books μ»΄ν¬λ„ŒνŠΈκ°€ κ°€μ§„ HTML λ‚΄μš©μ΄ ν‘œμ‹œλ©λ‹ˆλ‹€. μ•΅κ·€λŸ¬λŠ” HTML5μ—μ„œ λ„μž…ν•œ μ»€μŠ€ν…€ νƒœκ·Έλ₯Ό κ·Έ 보닀도 μ•žμ„œμ„œ μ§€μ›ν•œ λ©‹μ§„ κΈ°μˆ μž…λ‹ˆλ‹€.

μ»€μŠ€ν…€ νƒœκ·Έμ˜ λŠ₯λ ₯은 μ‹€λ‘œ λ§‰κ°•ν•©λ‹ˆλ‹€. 이λ₯Ό 느껴보기 μœ„ν•΄μ„œ books.component.html νŒŒμΌμ„ λ‹€μŒμ²˜λŸΌ μˆ˜μ •ν•©λ‹ˆλ‹€.

<h2>I am books.component.html</h2>
<p #target>Custom tag has a lot of potential!</p>
<button type="button" (click)="target.innerText='Can you feel it?'">Say</button>
  • Say λ²„νŠΌμ„ ν΄λ¦­ν•˜λ©΄ p νƒœκ·Έμ•ˆμ— λ¬Έμžμ—΄μ΄ λ³€κ²½λ©λ‹ˆλ‹€.
  • 반볡적으둜 μ‚¬μš©ν•˜λŠ” HTML μ—˜λ¦¬λ¨ΌνŠΈλ“€μ„ μ»΄ν¬λ„ŒνŠΈν™” ν•œ ν›„ κ°„λ‹¨νžˆ μ»€μŠ€ν…€ νƒœκ·Έλ‘œ 이λ₯Ό μ›ν•˜λŠ” 곳에 μ μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ—˜λ¦¬λ¨ΌνŠΈλ“€μ΄ λ³΅μž‘ν•˜λ©΄ ν•  수둝 μ΄λŠ” 빛을 λ°œν•©λ‹ˆλ‹€.
  • #target #λ³€μˆ˜ μ„€μ •μœΌλ‘œ κ°„λ‹¨νžˆ μ—˜λ¦¬λ¨ΌνŠΈ μ°Έμ‘° 객체λ₯Ό μƒμ„±ν•©λ‹ˆλ‹€.
  • (click)="μžλ°”μŠ€ν¬λ¦½νŠΈ μ½”λ“œ" λ²„νŠΌμ— 클릭 μ΄λ²€νŠΈκ°€ λ°œμƒν•˜λ©΄ 였λ₯Έμͺ½μ— 배치된 μžλ°”μŠ€ν¬λ¦½νŠΈ μ½”λ“œκ°€ μ‹€ν–‰λ©λ‹ˆλ‹€. targetμ΄λΌλŠ” μ—˜λ¦¬λ¨ΌνŠΈ μ°Έμ‘°λ₯Ό ν†΅ν•΄μ„œ p νƒœκ·Έμ— μ ‘κ·Όν•˜κ³  target.innerText μ†μ„±μœΌλ‘œ p νƒœκ·Έ μ•ˆμ— λ¬Έμžμ—΄μ„ λ³€κ²½ν•©λ‹ˆλ‹€.

app.component.html νŒŒμΌμ„ λ‹€μŒμ²˜λŸΌ μˆ˜μ •ν•©λ‹ˆλ‹€.

<h1>I am app.component.html</h1>
<h2>{{title}}</h2>
<hr>
<app-books></app-books>
<hr>
<app-books></app-books>

  • <app-books></app-books> μ»€μŠ€ν…€ νƒœκ·Έλ₯Ό 두 번 μ‚¬μš©ν–ˆμŠ΅λ‹ˆλ‹€. 첫 번째 BooksComponent μ»΄ν¬λ„ŒνŠΈμ˜ Say λ²„νŠΌμ„ ν΄λ¦­ν–ˆμŠ΅λ‹ˆλ‹€. 두 번째 μ»΄ν¬λ„ŒνŠΈμ˜ ν™”λ©΄ λ‚΄μš©μ€ κ·ΈλŒ€λ‘œ 인걸 λ³΄μ‹œμ£ . μ»΄ν¬λ„ŒνŠΈλŠ” 화면에 배치될 λ•Œ 맀번 μƒˆλ‘œ λ§Œλ“€μ–΄ μ§‘λ‹ˆλ‹€. λ”°λΌμ„œ, 초기 ν™”λ©΄ λ‚΄μš©μ€ 같을지라도 μ»΄ν¬λ„ŒνŠΈ κ°μ²΄λŠ” λ”°λ‘œ μ‘΄μž¬ν•˜λŠ” 것이며 μ΄λ²€νŠΈμ— μ˜ν•΄μ„œ ν™”λ©΄λ‚΄μš©μ΄ λ°”λ€Œμ–΄λ„ λ‹€λ₯Έ μ»΄ν¬λ„ŒνŠΈμ— 영ν–₯을 μ£Όμ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

Component μ•ˆμ— λ‹€λ₯Έ Component λ°°μΉ˜ν•˜κΈ°

AppComponent μ»΄ν¬λ„ŒνŠΈλŠ” 기동 μ»΄ν¬λ„ŒνŠΈλ‘œμ¨ 전체화면을 λ‹΄λ‹Ήν•˜λŠ” μ»΄ν¬λ„ŒνŠΈμž…λ‹ˆλ‹€. κ·Έλž˜μ„œ 기동 μ»΄ν¬λ„ŒνŠΈλŠ” μƒμ„Έν•œ ν™”λ©΄λ‚΄μš©μ„ κ΅¬μ„±ν•˜κΈ° λ³΄λ‹€λŠ” 전체 ν™”λ©΄μ˜ κ΅¬μ‘°λ§Œμ„ μ²˜λ¦¬ν•˜λŠ” μ—­ν• λ‘œ μ‚¬μš©ν•˜λŠ” 것이 μ’‹μŠ΅λ‹ˆλ‹€.

μš°λ¦¬λŠ” μ•žμ„œμ„œ AppComponent μ»΄ν¬λ„Œμ˜ HTML νŒŒμΌμ—μ„œ BooksComponent μ»΄ν¬λ„ŒνŠΈμ˜ selectorλ₯Ό μ»€μŠ€ν…€ νƒœκ·Έλ‘œ μ‚¬μš©ν•˜μ—¬ AppComponent μ»΄ν¬λ„ŒνŠΈ 화면에 일뢀λ₯Ό BooksComponent μ»΄ν¬λ„ŒνŠΈλ‘œ μ±„μ› μŠ΅λ‹ˆλ‹€. 이 경우, AppComponent μ»΄ν¬λ„ŒνŠΈλŠ” λΆ€λͺ¨ μ»΄ν¬λ„ˆνŠΈκ°€ 되면 BooksComponent μ»΄ν¬λ„ŒνŠΈλŠ” μžμ‹ μ»΄ν¬λ„ŒνŠΈλΌκ³  λΆ€λ¦…λ‹ˆλ‹€. μ΄λŸ¬ν•œ κ΄€κ³„λŠ” μ»΄ν¬λ„ŒνŠΈ 생성 μ‹œ κ²°μ •λ˜λŠ” 것이 μ•„λ‹ˆλΌ μ‚¬μš© μ‹œ κ²°μ •λ©λ‹ˆλ‹€.

BookComponent μ»΄ν¬λ„ŒνŠΈ νŒŒμΌλ“€μ„ μ˜λ„μ μœΌλ‘œ books 폴더 밑에 λ§Œλ“€μ—ˆμŠ΅λ‹ˆλ‹€. μ™œλƒν•˜λ©΄ BookComponent μ»΄ν¬λ„ŒνŠΈλŠ” 항상 BooksComponent μ»΄ν¬λ„ŒνŠΈλ§Œ μžμ‹ μ»΄ν¬λ„ŒνŠΈλ‘œ μ‚¬μš©ν•  μ˜ˆμ •μ΄κΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€. κ·Έλ ‡κΈ° λ•Œλ¬Έμ— 관리 λͺ©μ • 상 books 폴더 밑에 BookComponent μ»΄ν¬λ„ŒνŠΈ νŒŒμΌλ“€μ„ λ§Œλ“œλŠ” 것이 μ’‹μŠ΅λ‹ˆλ‹€.

이제 BooksComponent μ»΄ν¬λ„ŒνŠΈκ°€ BookComponent μ»΄ν¬λ„ŒνŠΈλ₯Ό μžμ‹ μ»΄ν¬λ„ŒνŠΈλ‘œ μ‚¬μš©ν•˜λ„λ‘ 해보죠.

μš°μ„  books.component.ts νŒŒμΌμ„ μˆ˜μ •ν•©λ‹ˆλ‹€.

import { Component, OnInit } from '@angular/core';

export class Book {
  public id: number;
  public title: string;
  public author: string;
  constructor(id: number, title: string, author: string) {
    this.id = id;
    this.title = title;
    this.author = author;
  }
}

@Component({
  selector: 'app-books',
  templateUrl: './books.component.html',
  styleUrls: ['./books.component.css']
})
export class BooksComponent implements OnInit {
  books: Array<Book> = [];

  constructor() { }

  ngOnInit() {
    this.books.push(new Book(1, 'Google', 'Chris'));
    this.books.push(new Book(2, 'Angular', 'John'));
    this.books.push(new Book(3, 'Ionic', 'Iaan'));
  }
}
  • class Book 객체 λͺ¨λΈλ‘œ Book 클래슀λ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€. νƒ€μž…μŠ€ν¬λ¦½νŠΈλ₯Ό μ‚¬μš©ν•˜λŠ” 즐거움을 포기할 수 μ—†μŠ΅λ‹ˆλ‹€.
  • books: Array<Book> ν…ŒμŠ€νŠΈλ₯Ό μœ„ν•œ λ°°μ—΄μž…λ‹ˆλ‹€. Book μžλ£Œν˜•μ˜ 객체λ₯Ό μš”μ†Œλ‘œ κ°–μŠ΅λ‹ˆλ‹€.
  • ngOnInit() μ»΄ν¬λ„ŒνŠΈ 라이프 사이클 λ©”μ†Œλ“œ 쀑에 ν•˜λ‚˜μž…λ‹ˆλ‹€. implements OnInit ν•œ λ‹€μŒ κ΅¬ν˜„ν•΄μ„œ λ‘œμ§μ„ λ°°μΉ˜ν•©λ‹ˆλ‹€. 객체가 μƒμ„±λœ 직 ν›„(즉, constructor() μ²˜λ¦¬κ°€ 된 ν›„) κΈ°λ™ν•©λ‹ˆλ‹€.

books.component.html νŒŒμΌμ„ μˆ˜μ •ν•©λ‹ˆλ‹€.

<div class="container">
  <h2>I am books.component.html</h2>
  <p #target>Custom tag has a lot of potential!</p>
  <button type="button" (click)="target.innerText='Can you feel it?'">Say</button>
</div>
<br>
<div class="container-fluid">
  <div class="row">
    <div class="col-sm-6 mb-2" *ngFor="let b of books">
      <app-book [book]="b"></app-book>
    </div>
  </div>
</div>
  • class="container", class="container-fluid"

  • class="row", class="col-sm-6" Bootstrap λ””μžμΈμ„ μ μš©ν•˜κΈ° μœ„ν•΄μ„œ CSS ν΄λž˜μŠ€λ“€μ„ μΆ”κ°€ν–ˆμŠ΅λ‹ˆλ‹€.

  • *ngFor="let b of books" ngForλŠ” μ•΅κ·€λŸ¬ μ œκ³΅ν•˜λŠ” 빌트인 λ””λ ‰ν‹°λΈŒμž…λ‹ˆλ‹€. 반볡 처리 μ‹œ μ‚¬μš©ν•©λ‹ˆλ‹€. books λ°°μ—΄μ˜ 길이만큼 μˆ˜ν–‰λ˜λ©° μž„μ‹œ λ³€μˆ˜ b에 λ°°μ—΄μ˜ μš”μ†Œλ₯Ό ν• λ‹Ήν•©λ‹ˆλ‹€. ngForκ°€ μ„€μ •λœ div μ—˜λ¦¬λ¨ΌνŠΈκ°€ 반볡적으둜 μƒμ„±λ©λ‹ˆλ‹€.

  • <app-book [book]="b"></app-book> λ³€μˆ˜ b에 λ‹΄κΈ΄ 객체λ₯Ό μžμ‹ μ»΄ν¬λ„ŒνŠΈμΈ app-bookμ—κ²Œ book μ΄λΌλŠ” ν‚€λ‘œ μ „λ‹¬ν•©λ‹ˆλ‹€. [book]="b" 섀정은 μ»€μŠ€ν…€ 속성을 μ‚¬μš©ν•˜λŠ” 것이라고 λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€. μ£Όμ˜μ‚¬ν•­μ΄ μžˆλŠ”λ° μ•΅κ·€λŸ¬λŠ” μ»€μŠ€ν…€ 속성을 μ‚¬μš©ν•  λ•Œ λΆ€λͺ¨ μ»΄ν¬λ„ŒνŠΈμ—μ„œλ§Œ μž‘μ—…μ„ μˆ˜ν–‰ν•œ μƒνƒœλΌλ©΄ μ—λŸ¬κ°€ λ°œμƒν•©λ‹ˆλ‹€. μžμ‹ μ»΄ν¬λ„ŒνŠΈμ—μ„œ [book]="b" 섀정에 λŒ€μ‘ν•˜λŠ” μž‘μ—…μ΄ μ΄λ£¨μ–΄μ Έμ•Όλ§Œ μ—λŸ¬κ°€ λ°œμƒν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. 즉, λΆ€λͺ¨κ°€ μžμ‹μ—κ²Œ 데이터λ₯Ό μ „λ‹¬ν•˜λ €λ©΄ λΆ€λͺ¨ μ»΄ν¬λ„ŒνŠΈμ—μ„œ μ€€λ‹€λŠ” 섀정을 ν•΄μ•Όν•˜κ³  μžμ‹ μ»΄ν¬λ„ŒνŠΈμ—μ„œ λ°›λŠ”λ‹€λŠ” 섀정이 λ™μ‹œμ— 이루어져야 ν•œλ‹€λŠ” μ˜λ―Έμž…λ‹ˆλ‹€.

book.component.ts νŒŒμΌμ„ μˆ˜μ •ν•©λ‹ˆλ‹€.

import { Component, OnInit, Input } from '@angular/core';
import { Book } from '../books.component';

@Component({
  selector: 'app-book',
  templateUrl: './book.component.html',
  styleUrls: ['./book.component.css']
})
export class BookComponent implements OnInit {
  @Input('book') book: Book;

  constructor() { }

  ngOnInit() { }
}
  • Input λŒ€λΆ€λΆ„μ˜ λ°μ½”λ ˆμ΄ν„°λŠ” @angular/core λͺ¨λ“ˆμ— μžˆμŠ΅λ‹ˆλ‹€.
  • @Input('book') book λΆ€λͺ¨ μ»΄ν¬λ„ŒνŠΈκ°€ bookμ΄λΌλŠ” ν‚€λ‘œ 데이터λ₯Ό 전달할 λ•Œ κ·Έ ν‚€ 값을 @Input('book')처럼 μ„€μ •ν•©λ‹ˆλ‹€. λ³€μˆ˜λͺ…이 ν‚€ κ°’κ³Ό μΌμΉ˜ν•œλ‹€λ©΄ ν‚€ 섀정은 μƒλž΅ν•˜μ—¬ @Input()처럼 μ„€μ •ν•  수 μžˆμŠ΅λ‹ˆλ‹€. λΆ€λͺ¨ μ»΄ν¬λ„ŒνŠΈκ°€ bookμ΄λΌλŠ” ν‚€λ‘œ 데이터λ₯Ό μ£Όμ§€μ•Šμ•„λ„ μ—λŸ¬λŠ” λ°œμƒν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

book.component.html νŒŒμΌμ„ μˆ˜μ •ν•©λ‹ˆλ‹€.

<div class="card">
  <div class="card-body">
    <h4 class="card-title">
      {{book.id + '. ' + book.title}} by {{book.author}}
    </h4>
    <p class="card-text">
      Here are the top resources for all things related to the Sun.
    </p>
    <a href="#" class="card-link">Sun Gone</a>
    <a href="#" class="card-link">Still Gone</a>
  </div>
</div>
  • class="card", class="card-body" λ“±λ“± Bootstrap 4 μΉ΄λ“œ λ””μžμΈμ„ μ μš©ν•˜κΈ° μœ„ν•΄μ„œ μ‚¬μš©ν•©λ‹ˆλ‹€.
  • {{book.id + '. ' + book.title}} by {{book.author}} μΈν„°ν΄λ ˆμ΄μ…˜ ν‘œν˜„μ‹μ•ˆμ—μ„œ κ°„λ‹¨ν•œ μžλ°”μŠ€ν¬λ¦½νŠΈ μ½”λ“œλ₯Ό μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 띄어쓰기λ₯Ό μ²˜λ¦¬ν•˜λŠ” 방법에 차이λ₯Ό μ‚΄νŽ΄λ³΄μ„Έμš”.

index.html νŒŒμΌμ„ μˆ˜μ •ν•©λ‹ˆλ‹€. μ΄λŠ” Bootstrap 4 CSS 라이브러리λ₯Ό μž„ν¬νŠΈ ν•˜κΈ° μœ„ν•©μž…λ‹ˆλ‹€. λ‹€μŒ μ‚¬μ΄νŠΈλ₯Ό μ°Έκ³ ν–ˆμŠ΅λ‹ˆλ‹€.

https://getbootstrap.com/docs/4.1/getting-started/introduction/

<!doctype html>
<html lang="en">

<head>
  <meta charset="utf-8">
  <title>MyAngular1</title>
  <base href="/">

  <meta name="viewport" content="width=device-width, initial-scale=1">
  <link rel="icon" type="image/x-icon" href="favicon.ico">

  <link
    rel="stylesheet"
    href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css"
    integrity="sha384-MCw98/SFnGE8fJT3GXwEOngsV7Zt27NXFoaoApmYm81iuXoPkFOJwJ8ERdknLPMO"
    crossorigin="anonymous">
  <style media="screen">
    body {
      margin-top: 20px;
      margin-bottom: 20px;
    }
  </style>
</head>

<body>
  <app-root></app-root>
</body>

</html>

μž‘μ—…κ²°κ³Όλ₯Ό λΈŒλΌμš°μ €μ—μ„œ ν™•μΈν•©λ‹ˆλ‹€.

화면이 λ³΅μž‘ν•΄ μ‘ŒμŠ΅λ‹ˆλ‹€. ν•˜μ§€λ§Œ app.component.html νŒŒμΌμ„ 보면 μ—¬μ „νžˆ <app-books></app-books>라고 ν•˜λŠ” μ„€μ •λ§ŒμœΌλ‘œ λ³΅μž‘ν•œ BooksComponentλ₯Ό μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

μ»΄ν¬λ„ŒνŠΈλŠ” μž¬ν™œμš©μ΄ κ°€λŠ₯ν•œ ν™”λ©΄μ˜ μ²˜λ¦¬λ‹¨μœ„μž…λ‹ˆλ‹€. μ»΄ν¬λ„ŒνŠΈλ₯Ό μ–΄λŠ μ •λ„λ‘œ λ³΅μž‘ν•˜κ²Œ λ§Œλ“€μ–΄μ•Ό ν•˜λŠ”μ§€μ— λŒ€ν•œ κ°€μ΄λ“œλΌμΈμ€ μ—†μŠ΅λ‹ˆλ‹€. μ€‘μš”ν•œ 것은 재 ν™œμš©ν•˜κΈ° μš©μ΄ν•˜λŠλƒ μ•„λ‹ˆλƒλ‘œ νŒλ‹¨ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€. μ‡Όν•‘λͺ°μ²˜λŸΌ λ³΅μž‘ν•œ 화면을 λͺ‡κ°œμ— μ»΄ν¬λ„ŒνŠΈλ‘œ λ‚˜λˆ„λ©΄ 쒋을지 νŒ€μ›λ“€κ³Ό λ…Όμ˜ν•΄ λ³΄μ„Έμš”. ꢌμž₯ν•˜κ³  싢은 νŒλ‹¨κΈ°μ€€μ€ μ΄λ ‡μŠ΅λ‹ˆλ‹€. A ν”„λ‘œμ νŠΈ μˆ˜ν–‰κ²°κ³Όλ‘œμ¨ 얻은 λ‹€μˆ˜μ˜ μ»΄ν¬λ„ŒνŠΈλ“€μ΄ B ν”„λ‘œμ νŠΈμ—μ„œ 재 μ‚¬μš©ν•˜κΈ°μ— νŽΈλ¦¬ν•΄μ•Ό ν•©λ‹ˆλ‹€.

λΉŒλ“œν•˜κΈ°

개발이 λλ‚˜λ©΄ λΉŒλ“œκ³Όμ •μ„ ν†΅ν•΄μ„œ λ°°ν¬νŒŒμΌμ„ μƒμ„±ν•©λ‹ˆλ‹€. 개발 μ€‘μ—λŠ” νŒŒμΌμ€ 역할에 따라 λ‘œμ§μ— 따라 λ‹€μˆ˜μ˜ 파일둜 λ‚˜λˆ„μ–΄μ„œ κ°œλ°œν•˜λŠ” 것이 νŽΈλ¦¬ν•˜μ§€λ§Œ μ‹€ μ‚¬μš©μžμ—κ²Œ μ„œλΉ„μŠ€ν•  λ•ŒλŠ” λ‹€μš΄λ‘œλ“œ 속도λ₯Ό 염두에 두어 ν•˜λ‚˜μ˜ 파일둜 λ¬Άμ–΄μ„œ μ œκ³΅ν•˜λŠ” 것이 μœ λ¦¬ν•©λ‹ˆλ‹€. μ΄λŸ¬ν•œ μž‘μ—…μ„ λ²ˆλ“€λ§μ΄λΌκ³  λΆ€λ¦…λ‹ˆλ‹€. μ•΅κ·€λŸ¬λŠ” μ›ΉνŒ©μ„ μ‚¬μš©ν•˜μ—¬ λ²ˆλ“€λ§ μž‘μ—…μ„ μˆ˜ν–‰ν•©λ‹ˆλ‹€. μΆ”κ°€λ‘œ μžλ°”μŠ€ν¬λ¦½νŠΈ μ½”λ“œλŠ” 압좕과정을 톡해 μ‚¬μ΄μ¦ˆκ°€ κΈ‰κ²©ν•˜κ²Œ μ€„μ–΄λ“€κ²Œ λ©λ‹ˆλ‹€.

μ•΅κ·€λŸ¬ CLI 도ꡬ가 μ œκ³΅λ˜μ§€ μ•Šμ•˜μ„ λ•ŒλŠ” κ±Έν”„, 그런트 같은 κΈ°μˆ μ„ ν•„μˆ˜λ‘œ μ‚¬μš©ν–ˆμ–΄μ•Ό ν–ˆμŠ΅λ‹ˆλ‹€. κ·ΈλŸ¬λ‹€κ°€ μ›ΉνŒ©μ΄λΌλŠ” κ±ΈμΆœν•œ 도ꡬ가 μΆœν˜„ν•˜μ—¬ κ·Έ μ§€μœ„λ₯Ό μ΄μ–΄λ°›μ•˜μŠ΅λ‹ˆλ‹€. κ·Έ 후에, μ•΅κ·€λŸ¬ CLIκ°€ μ„œλΉ„μŠ€λ˜μ—ˆλŠ”λ° 이 λ„κ΅¬λŠ” μ›ΉνŒ©μ„ μ² μ €νžˆ 포μž₯ν•˜μ—¬ κ²‰μœΌλ‘œλŠ” μ›ΉνŒ©μ˜ μ‘΄μž¬μœ λ¬΄λ„ μ•Œ 수 μ—†λŠ” μ •λ„μž…λ‹ˆλ‹€. node_modules 폴더λ₯Ό λ³΄μ‹œλ©΄ webpack κ΄€λ ¨ 기술의 쑴재λ₯Ό 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.

μ•΅κ·€λŸ¬κ°€ μ œκ³΅ν•˜λŠ” λΉŒλ“œλŠ” 2κ°€μ§€κ°€ μžˆμŠ΅λ‹ˆλ‹€.

  • 배포 ν…ŒμŠ€νŠΈλ₯Ό μœ„ν•œ λΉŒλ“œ
  • μ‹€ μ„œλΉ„μŠ€λ₯Ό μœ„ν•œ λΉŒλ“œ

배포 ν…ŒμŠ€νŠΈλ₯Ό μœ„ν•œ λΉŒλ“œ

일반적으둜 개발자 PCμ—μ„œλŠ” λ‹¨μœ„ν…ŒμŠ€νŠΈλ₯Ό μ§„ν–‰ν•©λ‹ˆλ‹€. κ°œλ°œμžλ“€μ˜ κ°œλ°œλ‚΄μ—­μ„ λͺ¨μ•„μ„œ ν…ŒμŠ€νŠΈ μ„œλ²„μ— 올리고 ν†΅ν•©ν…ŒμŠ€νŠΈλ₯Ό μˆ˜ν–‰ν•©λ‹ˆλ‹€. μΆ”κ°€λ‘œ μ‚¬μš©μžλ₯Ό λΆ„μ„ν•˜μ—¬ 페λ₯΄μ†Œλ‚˜λ₯Ό μ„€λ¦½ν•˜κ³  μ‚¬μš©μžμ˜ 행동을 μ˜ˆμƒν•˜μ—¬ μ§„ν–‰ν•˜λŠ” ν…ŒμŠ€νŠΈκ°€ μžˆμŠ΅λ‹ˆλ‹€. 이 ν…ŒμŠ€νŠΈλ₯Ό μœ„ν•œ λΉŒλ“œκ°€ 배포 ν…ŒμŠ€νŠΈλ₯Ό μœ„ν•œ λΉŒλ“œκ°€ λ˜κ² μŠ΅λ‹ˆλ‹€. ν…ŒμŠ€νŠΈ μ‹œ μ‹€μ œ λΈŒλΌμš°μ €λ₯Ό μ΄μš©ν•œλ‹€λŠ” 점이 λ‹¨μœ„ν…ŒμŠ€νŠΈ, ν†΅ν•©ν…ŒμŠ€νŠΈμ™€ λ‹€λ₯Έ 점이라 ν•˜κ² μŠ΅λ‹ˆλ‹€. λ‹¨μœ„ν…ŒμŠ€νŠΈ, ν†΅ν•©ν…ŒμŠ€νŠΈλŠ” μ½”λ“œμ μœΌλ‘œ μ²˜λ¦¬ν•˜μ—¬ μžλ™μœΌλ‘œ μ²˜λ¦¬ν•˜κ³  μ‚¬μš©μžμ— λΉ™μ˜ν•œ ν…ŒμŠ€νŠΈλŠ” μˆ˜λ™μœΌλ‘œ μ§„ν–‰ν•©λ‹ˆλ‹€.

λ‹€μŒ λͺ…λ ΉμœΌλ‘œ 배포 ν…ŒμŠ€νŠΈλ₯Ό μœ„ν•œ λΉŒλ“œλ₯Ό μˆ˜ν–‰ν•©λ‹ˆλ‹€.

$ ng build

Date: 2018-12-07T03:27:52.735Z
Hash: 8c93d80bd782a0b7c788
Time: 9858ms
chunk {main} main.js, main.js.map (main) 14.3 kB [initial] [rendered]
chunk {polyfills} polyfills.js, polyfills.js.map (polyfills) 223 kB [initial] [rendered]
chunk {runtime} runtime.js, runtime.js.map (runtime) 6.08 kB [entry] [rendered]
chunk {styles} styles.js, styles.js.map (styles) 16.3 kB [initial] [rendered]
chunk {vendor} vendor.js, vendor.js.map (vendor) 3.11 MB [initial] [rendered]
  • dist 폴더가 μƒμ„±λ˜κ³  λ°‘μœΌλ‘œ ν”„λ‘œμ νŠΈλͺ… 폴더가 μƒμ„±λ©λ‹ˆλ‹€.
  • map νŒŒμΌμ€ μ›Ή λΈŒλΌμš°μ € ν…ŒμŠ€νŠΈ μ‹œ λ°œμƒν•˜λŠ” μ—λŸ¬μ˜ μœ„μΉ˜λ₯Ό .ts 파일의 μœ„μΉ˜λ₯Ό μ—°κ²°ν•˜κΈ° μœ„ν•œ λ§€ν•‘ λͺ©μ •μ˜ νŒŒμΌμž…λ‹ˆλ‹€.
  • ν…ŒμŠ€νŠΈ μ‹œ μ½”λ“œ 좔적을 μœ„ν•΄μ„œ μžλ°”μŠ€ν¬λ¦½νŠΈ νŒŒμΌμ€ 압좕이 된 μƒνƒœκ°€ μ•„λ‹™λ‹ˆλ‹€. 배포 λΉŒλ“œμ—μ„œλŠ” 압좕이 μ μš©λ˜μ–΄ μ‚¬μ΄μ¦ˆκ°€ 크게 μ€„μ–΄λ“­λ‹ˆλ‹€.
  • index.html νŒŒμΌμ„ 파일경둜둜 λΈŒλΌμš°μ €μ— μ—΄λ©΄ 패슀 문제둜 μž‘λ™ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

http-server μ‚¬μš©ν•˜κΈ°

μ›Ή λΈŒλΌμš°μ €μ—μ„œ ν…ŒμŠ€νŠΈν•˜κΈ° μœ„ν•΄μ„œλŠ” λΉŒλ“œ κ²°κ³Όλ₯Ό μ›Ή μ„œλ²„κ°€ 배포 μ„œλΉ„μŠ€λ₯Ό ν•΄μ£Όμ–΄μ•Ό ν•©λ‹ˆλ‹€. 이λ₯Ό μœ„ν•΄μ„œ κ°„λ‹¨ν•˜κ²Œ μ‚¬μš©ν•  수 μžˆλŠ” http-server κΈ°μˆ μ„ μ†Œκ°œν•©λ‹ˆλ‹€.

http-serverλ₯Ό μ„€μΉ˜ν•©λ‹ˆλ‹€.

$ npm i -g http-server
$ http-server dist/my-angular1
Starting up http-server, serving dist/my-angular1
Available on:
  http://192.168.0.54:8080
  http://127.0.0.1:8080
Hit CTRL-C to stop the server

http://127.0.0.1:8080 μ£Όμ†Œλ‘œ λΈŒλΌμš°μ €λ₯Ό μ‚¬μš©ν•˜μ—¬ μ ‘μ†ν•˜κ³  ν…ŒμŠ€νŠΈλ₯Ό μ§„ν–‰ν•˜μ„Έμš”.

μ‹€ μ„œλΉ„μŠ€λ₯Ό μœ„ν•œ λΉŒλ“œ

ng build --prod

Date: 2018-12-07T04:21:35.631Z
Hash: bd09008c2b3627ecf9b4
Time: 15784ms
chunk {0} runtime.ec2944dd8b20ec099bf3.js (runtime) 1.41 kB [entry] [rendered]
chunk {1} main.07a238c657bdab0ce505.js (main) 179 kB [initial] [rendered]
chunk {2} polyfills.20ab2d163684112c2aba.js (polyfills) 37.5 kB [initial] [rendered]
chunk {3} styles.3ff695c00d717f2d2a11.css (styles) 0 bytes [initial] [rendered]
  • 배포 λΉŒλ“œ 결과둜 생긴 νŒŒμΌλ“€μ˜ 크기λ₯Ό μ‚΄νŽ΄λ΄…λ‹ˆλ‹€. μ•΅κ·€λŸ¬ ν”„λ ˆμž„μ›Œν¬ μ½”λ“œμ™€ κ°œλ°œμžκ°€ μž‘μ„±ν•œ μ½”λ“œλŠ” main.λ‚œμˆ˜κ°’.js νŒŒμΌμ— λ“€μ–΄ μžˆμŠ΅λ‹ˆλ‹€. 이 파일의 μ‚¬μ΄μ¦ˆλŠ” 179KB μ •λ„λ‘œμ¨ μ΄λŠ” 맀우 μž‘λ‹€κ³  ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

  • λ†€λΌμš΄ 점은 파일의 크기가 Angular CLI 버전이 올라갈 수둝 점점 μž‘μ•„μ§€κ³  μžˆλ‹€λŠ” μ‚¬μ‹€μž…λ‹ˆλ‹€. λΉ„μŠ·ν•œ μ½”λ“œλ₯Ό React둜 짜고 λΉŒλ“œ ν–ˆμ„ λ•Œ μ•½ 150KB μ •λ„μ˜ 크기λ₯Ό κ°–μŠ΅λ‹ˆλ‹€. 이제 크기둜 μ•΅κ·€λŸ¬λ₯Ό λΉ„λ‚œν•˜λŠ” Vue.js μ˜Ήν˜Έμžλ“€μ˜ μ–˜κΈ°λŠ” 크게 와닿지 μ•Šκ²Œ λ˜μ—ˆμŠ΅λ‹ˆλ‹€.
  • μ•΅κ·€λŸ¬κ°€ μžλž‘ν•˜λŠ” Tree Shaking 처리둜 κ°œλ°œμžκ°€ μ‹€μ œλ‘œ μ‚¬μš©ν•˜λŠ” 라이브러리 κΈ°λŠ₯만이 ν¬ν•¨λ©λ‹ˆλ‹€.
  • μžλ°”μŠ€ν¬λ¦½νŠΈ νŒŒμΌμ€ 압좕이 μ μš©λ˜μ–΄ νŒŒμΌμ„ μ—΄μ–΄λ³΄μ‹œλ©΄ 읽을 수 μžˆλŠ” μƒνƒœλΌλŠ” 것을 μ•Œ 수 μžˆμŠ΅λ‹ˆλ‹€.
  • 배포 νŒŒμΌμ„ μ›Ή μ„œλ²„μ˜ 정적 λ¦¬μ†ŒμŠ€ μ„œλΉ„μŠ€ 폴더에 λ°°μΉ˜ν•΄μ„œ λΈŒλΌμš°μ €μ— μš”μ²­ μ‹œ HTML νŒŒμΌμ„ μ „λ‹¬ν•©λ‹ˆλ‹€. λΈŒλΌμš°μ €κ°€ HTML νŒŒμΌμ„ μ²˜λ¦¬ν•˜λŠ” 도쀑에 μ•΅κ·€λŸ¬μ˜ μžλ°”μŠ€ν¬λ¦½νŠΈ μ½”λ“œκ°€ κΈ°λ™ν•˜μ—¬ μ„œλΉ„μŠ€κ°€ μ‹œμž‘λ©λ‹ˆλ‹€.
  • μžλ°”μŠ€ν¬λ¦½νŠΈ 파일λͺ… 쀑에 μ‚¬μš©λœ λ‚œμˆ˜κ°’μ€ 파일 이름 μΆ©λŒμ„ μ˜ˆλ°©ν•˜λŠ” μ°¨μ›μ˜ μ„œλΉ„μŠ€μž…λ‹ˆλ‹€. 배포 μ‹œ index.html 파일λͺ…은 λ³€κ²½ν•˜μ—¬ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • μ •μƒμž‘λ™ μ—¬λΆ€λŠ” μ•žμ—μ„œ μ‚¬μš©ν•΄ λ³Έ http-serverλ₯Ό μ΄μš©ν•˜μ„Έμš”.