Angular - HiroSung/Study GitHub Wiki

Angular SPA (Single Page Application)

๊ฐœ์š”

  1. front-end
    • Angular, React, Vue.js 3ํŒŒ์ „.
  2. front-end์˜ history
    • ์›นํ‘œ์ค€. ๋ธŒ๋ผ์šฐ์ €. Chrome. MVC pattern. ๋“ฑ
    • ์™„์ „ํžˆ ๊ฑฐ๋“ญ๋‚˜๊ณ  ์žˆ์Œ. ๊ฐœ๋ฐœ์ž ์˜์—ญ์œผ๋กœ ๋„˜์–ด์˜ด.
    • ์›นํ‘œ์ค€ : HTML5: W3C Recommendation (https://html.spec.whatwg.org/multipage/)
  3. Angular...
    • angular.io. ๊ตฌ๊ธ€์ด ๋งŒ๋“ฌ
    • 2010๋…„๋„ ํ›„๋ฐ˜์— jquery์˜ ๋ชจ๋ธ๊ณผ๋Š” ๋‹ค๋ฅธ mvc์˜ ์‹œ์ž‘์€ backbone.js ์ด๋‹ค. (backbonejs.org). jQuery์˜ ์‹œ์ž‘์„ ๋ฐ”๊พผ๊ฒƒ.
    • ๊ทธ ๋‹ค์Œ embarjs
    • ๊ทธ ๋‹ค์Œ์œผ๋กœ angularjs ๋‚˜์˜ด. Angular2์™€๋Š” ๋‹ค๋ฆ„. ์„ฑ๋Šฅ์˜ ๋ฌธ์ œ ๋ฐœ์ƒ.
    • React : F/B์€ ์‚ฌ์šฉ์ž๋ฅผ 50์–ต๋ช… ๊ธฐ๋ฐ˜์œผ๋กœ ๋งŒ๋“ค๊ฒ ๋‹ค๋Š” ๋ฒ”์œ„๋กœ ์„ค๊ณ„ํ•จ. ๊ทธ๋ž˜์„œ ๋งŒ๋“ ๊ฒƒ์€ react์ž„. O2O๋Š” react๋กœ ๊ฐ€๊ณ  ์žˆ์Œ. why? ๊ฐœ๋ฐœ์ž๊ฐ€ ๋งŽ์Œ.
    • Vue.js : ์ค‘๊ตญไบบ ๋งŒ๋“ ์–ธ์–ด. ๊ฐœ๋ฐœ์ž ๊ด€์ ์—์„œ ์‰ฌ์›€.
    • Angular๋Š” TypeScript ์ด๋‹ค.
    • ๋ฐฐ์šธ ๋‚ด์šฉ Web Application (Framework) HTML / CSS / Javascript EcmaScript6 / TypeScript / Node.js Angular CLI / NPM Angular 5.x (6.x)... ํ˜„์žฌ๋Š” 8.x : Components, Router, Service (Dependency Injection / Reactive Programming), Forms (Angular Form / Reactive Form)

์‹œ์ž‘ํ•˜๊ธฐ.

  • https://angular.io/ : ๊ต์žฌ๋Š” 6๋ฒ„์ ผ. 5์ดํ›„๋ถ€ํ„ฐ ๋งŽ์ด ๋ฐ”๋€œ
  • https://poiemaweb.com/ ์ €์ž ์ด์›…๋ชจ. ํฌ์ด์—๋งˆ. ์‚ฌ์ดํŠธ์— ๋„ˆ๋ฌด๋‚˜~~~ ์ž˜ ์ •๋ฆฌ๋˜์–ด ์žˆ์Œ.

์‚ฌ์ „์ง€์‹

  • ์›น์˜ ๋ฐœ์ „. 2010๋…„๋„ ์›นํ‘œ์ค€์ด ๋งŒ๋“ค์–ด์ง„ ์‹œ์ .
  • ์›นํ‘œ์ค€. W3C. HTML5/CSS3/EcmaScript5
  • Web Components : https://d2.naver.com/helloworld/188655, https://www.webcomponents.org/. ๋ฏธ๋ž˜์˜ ์›น ํ™˜๊ฒฝ์„ ๋ฐ”๊ฟ€๊ฒƒ์ด๋ผ ์˜ˆ์ƒ. devide and concom. ํ™”๋ฉด์„ ๋ถ„๋ฆฌํ•˜์—ฌ ์ ์šฉํ•œ๋‹ค. (์˜ˆ. div ๋‹จ์œ„๋กœ ๊ฐœ๋ฐœ)
  • Angular์—๋Š” web components ๊ฐœ๋…์ด ์ ์šฉ๋˜์–ด ์žˆ์Œ.
  • ์›น ์ปดํฌ๋„ŒํŠธ : ์›น ํŽ˜์ด์ง€๋ฅผ ํŠน์ • ๋ทฐ ๋‹จ์œ„๋กœ ๋ถ„๋ฆฌ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ด ์คŒ. Custom Elements, HTML Imports, Template, Shadow DOM
  • ECMA ์Šคํฌ๋ฆฝํŠธ์— ๋Œ€ํ•˜์—ฌ. (European Computer Manufacturers Association) 97๋…„๋„์— ์ค‘์žฌ๋ฅผ ์‹œ์ž‘ํ•จ. ES5 ์™„์„ฑ. ES6 ๊ธฐ๋Šฅ์ถ”๊ฐ€.
  • ECMAscript 2015, 2016 ์†Œ๊ฐœ : Modules, Classes, Arrow Functions(=>) ๋žŒ๋‹ค์‹ ๋ฌธ๋ฒ• ์ง€์›, Let and Const ์ƒˆ๋กœ์šด ๋ณ€์ˆ˜ ์„ ์–ธ ํ‚ค์›Œ๋“œ, Default/Rest/Spread ํ•จ์ˆ˜ํŒŒ๋ผ๋ฏธํ„ฐ ์„ธ ๊ฐ€์ง€ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ.
  • Angular ES6๋ฅผ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Œ. but React๋Š” ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•ด์„œ ๋ณต์žก.

๊ฐœ๋ฐœํ™˜๊ฒฝ

  • vscode, nodejs ์„ค์น˜

Javascript / ES6 / TypeScript

Javascript

  • javascript๋Š” ๋ณ€์ˆ˜์˜ type์„ ์•Œ๋ฉด ๋จ. (์ˆซ์ž, ๋ฌธ์ž, ๋ฐฐ์—ด, ํ•จ์ˆ˜, object)
  • ๋ฐ์ดํ„ฐ๋Š” object ๋‹จ์œ„๋กœ ์ „๋‹ฌ๋จ.
// ๋ณ€์ˆ˜์˜ 3๊ฐ€์ง€ Type
// 1. ์ˆซ์ž
var my_number = 3;
var my_number2 = 3.14;
console.log( typeof my_number);
console.log( typeof my_number2);

// 2. ์ŠคํŠธ๋ง ํƒ€์ž…
var my_string = 'Hello World';

console.log( my_string);
console.log( my_string.replace('World', 'EXO'));

// 3. Object ํƒ€์ž…
// 3.1 Object ํƒ€์ž… ์„ธ ๊ฐ€์ง€
// 3.1.1 ๋ฐฐ์—ด array - ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฃจ๊ธฐ ์œ„ํ•จ.
var my_arry = [1, 2, 3, 4, 5];

// 3.1.2 ํ•จ์ˆ˜
var my_function = function ( a, b) { // ํ•จ์ˆ˜ ํ‘œํ˜„์‹ - ์„ ์–ธ์ „ ์‚ฌ์šฉ ๋ถˆ๊ฐ€. ๋ช…ํ™•ํ•˜์—ฌ ์„ ํ˜ธํ•จ.
    return a + b;
};

// function ์—†์• ๊ณ  =>  ์ ๊ณ  body ์ž‘์„ฑ : ES6 ์—์„œ ๋‚˜์˜จ๊ฒƒ. ๋žŒ๋‹ค์‹ ๋ฌธ๋ฒ•
var my_function3 = (a, b) => {
    return a + b;
};

function my_function2 (a, b) { // ํ•จ์ˆ˜ ์„ ์–ธ์‹ - ์„ ์–ธ์ „์— ์‚ฌ์šฉ๊ฐ€๋Šฅ. hoisting ๊ฐ€๋Šฅ.
    return a + b;
}

console.log( my_function( 1, 2));

// 3.1.3 Object ๊ฐ์ฒด
var my_object = { // {} ์ค‘๊ด„ํ˜ธ ์‚ฌ์šฉ
    title: '์˜ค๋Š˜์€ ๊ต์œก์ค‘',
    author: 'DO',
    likes: 100,
    tags: ['javascript', 'angular', 'education'],
    replys: [
        { author: 'Lee', content: '๋„ˆ๋Š” ์™œ'},
        { author: 'Gowang', content: '๋„ˆ๋‚˜ ์ž˜ ํ•˜์„ธ์š”'}
    ] 
}; 

EM6

  • let, const ์ถ”๊ฐ€๋จ.
    • const ์ฒ˜์Œ ์ •์˜๋œ ๊ฐ’์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†์Œ
    • ์žฌํ• ๋‹น์ด ํ•„์š”ํ•œ ๋ณ€์ˆ˜๋Š” let์œผ๋กœ ์ •์˜.

TypeScript

  • Type์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์Šคํฌ๋ฆฝํŠธ์ž„.
    • number, string, boolean, array, function, object
  • ๋ณ€์ˆ˜๋ช…: ํƒ€์ž…๋ช… = value
  • const ํ•จ์ˆ˜๋ช… = function(๋ณ€์ˆ˜:ํƒ€์ž…): ๋ฆฌํ„ดํƒ€์ž… { ... };
// ๋ฐ์ดํ„ฐํƒ€์ž…
// number, string, boolean, array, function, object
// - ๋ณ€์ˆ˜๋ช…: ํƒ€์ž…๋ช…

const my_number_ts: number = 3;

const my_string_ts: string = 'hello world';

const my_array_ts: Array<number> = [1, 2, 3, 4];
const my_array2_ts: Array<number> = [1, 2, 3, 'kim'];  // -> error

const my_object_ts: Object = {
    title: 'hello',
    author: 'kim'
}

const my_object2_ts: any = {
    title: 'hello',
    author: 'kim'
} 

const my_func = function(a: number, b: number): number {
    return a + b;
};
  • ์ฝ”๋”ฉ์˜ ์ฐจ์ด
    • ๋ณ€์ˆ˜๋ช…์„ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ช…์นญ์œผ๋กœ ์ •์˜ํ•จ. my_func_list... etc
    • stackoverfllow ๋งŽ์ด ์ฐธ์กฐํ•˜์˜€์œผ๋ฉด ํ•จ.
  • ๋ฐฐํฌํ™˜๊ฒฝ๊ณผ ๊ฐœ๋ฐœํ™˜๊ฒฝ์ด ์ƒ์ดํ•ด์ง€๊ณ  ์žˆ์Œ.
  • ์Šค์บํด๋”ฉ ํˆด : webpack ๊ณผ ๊ฐ™์€ ํˆด๋กœ ํ†ตํ•ฉ๋˜๊ณ  ์žˆ์Œ.

angular CLI ์„ค์น˜ : ์„ค์น˜๋˜๋Š” CLI ๋ฒ„์ ผ์„ ์ฒดํฌํ•ด์•ผ ํ•จ.

  • ์„ค์น˜

npm install -g @angular/cli

  • cli project ์ƒ์„ฑ (ํ˜„์žฌ ๋””๋ ‰ํ† ๋ฆฌ)

ng new hello-angular routing - NO CSS - SCSS // ๊ด€๋ จ๋œ ํŒŒ์ผ๋“ค์ด ์ƒ์„ฑ๋จ.

 vscode์—์„œ ์˜คํ”ˆํด๋” - ๋งŒ๋“  ํด๋” ์„ ํƒ
    - node_modules : library
    - root : ์„ค์ •ํŒŒ์ผ
    - e2e : test ๊ด€๋ จ ํŒŒ์ผ
    - src : ๊ฐœ๋ฐœ๊ณผ ๊ด€๋ จ๋œ ํŒŒ์ผ

๊ฐœ๋ฐœํ™˜๊ฒฝ (์›น ์„œ๋ฒ„๊ฐ€ ํ•„์š”ํ•œ)

  • ๊ฐœ๋ฐœํ™˜๊ฒฝ ๊ตฌ์„ฑํ•˜๊ธฐ ์œ„ํ•œ ์›น์„œ๋ฒ„ ๊ตฌ์„ฑ.

ng serve --open

D:\hello-angular>ng serve
10% building 3/3 modules 0 activei ๏ฝขwds๏ฝฃ: Project is running at http://localhost:4200/webpack-dev-server/
i ๏ฝขwds๏ฝฃ: webpack output is served from /
i ๏ฝขwds๏ฝฃ: 404s will fallback to //index.html

chunk {main} main.js, main.js.map (main) 47.8 kB [initial] [rendered]
chunk {polyfills} polyfills.js, polyfills.js.map (polyfills) 264 kB [initial] [rendered]
chunk {runtime} runtime.js, runtime.js.map (runtime) 6.15 kB [entry] [rendered]
chunk {styles} styles.js, styles.js.map (styles) 10 kB [initial] [rendered]
chunk {vendor} vendor.js, vendor.js.map (vendor) 3.81 MB [initial] [rendered]
Date: 2020-01-20T05:56:17.394Z - Hash: 3a64ed6363a44f91c693 - Time: 5445ms
** Angular Live Development Server is listening on **localhost:4200**, open your browser on http://localhost:4200/ **
i ๏ฝขwdm๏ฝฃ: Compiled successfully.
  • chrome์—์„œ http://localhost:4200 ํ˜ธ์ถœํ•˜๋ฉด ํŽ˜์ด์ง€ ์กฐํšŒ๋จ.
  • ์†Œ์Šค๋ฅผ ์ˆ˜์ •ํ•˜๋ฉด ๋ฐ”๋กœ๋ฐ”๋กœ ๋ฐ˜์˜๋จ.
  • ๋ฐฐํฌ๋Š” ๋ณ„๋„๋กœ ์žˆ์Œ.

์ปดํฌ๋„ŒํŠธ

  • ์„ธ๋ถ€์ ์œผ๋กœ ๊ตฌ์„ฑํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Œ.
  • sample์€ app ํ•˜๋‚˜์˜ component ๋ฅผ ๊ตฌ์„ฑํ•œ๊ฒƒ์ž„. ์ปดํฌ๋„ŒํŠธ ํ•˜๋‚˜๊ฐ€ ํ•˜๋‚˜์˜ ๋””๋ ‰ํ† ๋ฆฌ์ด๋‹ค -- ๊ทธ๋Ÿฌ๋ฉด ์ค‘๋ณต๋˜๋Š” ํด๋”๊ฐ€ ๋งŽ์•„์ง€๋Š”๋ฐ์š”?
  • ์ปดํฌ๋„ŒํŠธ(ํ™”๋ฉด)๋Š” ๊ณ„์ธต์ ์ด๋‹ค. - ๊ทธ๋ž˜์„œ ์ƒ๋‹จ/๋ฉ”๋‰ด/์ปจํ…์ธ /๋ฐ”ํ‹ˆ ์œผ๋กœ ๊ตฌ์„ฑํ•˜๋”๋ผ๋„ root ์˜ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ํ•„์š”ํ•˜๋‹ค. - root/ top/left/content/footer. ๊ทธ๋ž˜์„œ 5๊ฐœ์˜ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ตœ์†Œ ํ•„์š”. ๋กœ๊ธด์€ top์— ์†ํ•œ ์ปดํฌ๋„ŒํŠธ. - ๊ตฌ์„ฑํ•˜๊ธฐ ๋‚˜๋ฆ„.
  • app/app.components. (์•„๋ž˜์˜ 3๊ฐœ์˜ ํŒŒ์ผ์ด ํ•˜๋‚˜์˜ set์ด ๋จ)
    • .html
    • .scss
    • .ts
  • app/app.module.ts : ํ•˜๋‚˜์˜ application๊ณผ ๊ด€๋ จ๋œ ๋ชจ๋“ˆ. ์—ฌ๋Ÿฌ๊ฐœ์˜ ๋ชจ๋“ˆ๋กœ ๋งŒ๋“ค๋ฉด raise loading ์„ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Œ.
  • ๋Œ€๋ถ€๋ถ„ ์†Œ๋ฌธ์ž๋กœ ๋งŒ๋“ฌ.
  • ์ปดํฌ๋„ŒํŠธ๋ช….components. ๋กœ ์ƒ์„ฑ๋จ.*

ng generate

  • ์ปดํฌ๋„ŒํŠธ ์ถ”๊ฐ€ ์ƒ์„ฑํ•˜๊ธฐ

ng generate component ์ด๋ฆ„

D:\hello-angular>ng g c header
CREATE src/app/header/header.component.html (21 bytes)
CREATE src/app/header/header.component.spec.ts (628 bytes)
CREATE src/app/header/header.component.ts (270 bytes)
CREATE src/app/header/header.component.scss (0 bytes)
UPDATE src/app/app.module.ts (396 bytes)
  • header.component.ts ํŒŒ์ผ์ด ์ค‘์š”ํ•จ. ๋ฐ์ดํ„ฐ๊ฐ€ ์œ„์น˜ํ•˜๊ฒŒ ๋˜๋Š” ํŒŒ์ผ. ํด๋ž˜์Šค๋กœ ๋งŒ๋“ค์–ด์ง€๊ณ  ์ปดํฌ๋„ŒํŠธ ์ด๋ฆ„์„ ์นด๋ฉœํ˜•ํƒœ๋กœ ๋งŒ๋“ค์–ด์ง.
import { Component, OnInit } from '@angular/core';

@Component({
  selector: **'app-header'**,  ==> **ํƒœ๊ทธ์˜ ์ด๋ฆ„์ž„**
  templateUrl: './header.component.html',
  styleUrls: ['./header.component.scss']
})
export class **HeaderComponent **implements OnInit {

  constructor() { }

  ngOnInit() {
  }

}
  • app.component.html ์•ˆ์—
   ์ถ”๊ฐ€
  • ์ด๋Ÿฐ ์‹์œผ๋กœ ... ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์‰ฝ๋‹ค!
  • *.html ํŒŒ์ผ๋งŒ ๋ณด๋”๋ผ๋„ ์–ด๋– ํ•œ ๋‚ด์šฉ์œผ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋Š”์ง€ ๊ฐ€๋…์„ฑ์ด ์žˆ์Œ.

demo

  • Front-end ๊ฐœ๋ฐœ์€ ์ข…ํ•ฉ์ ์ธ ์˜ˆ์ˆ ์ž„.
  • ๋งŒ๋“ค์–ด์ง„ ํ™”๋ฉด์„ angular๋กœ ๋ฐ”๊พธ๋Š” ์ž‘์—…์„ ํ•˜๊ณ ์ž ํ•จ.
  • bootstrap : ๋””์ž์ธ ์ ์ธ ๊ด€์ ์˜ ์ปดํฌ๋„ŒํŠธ

Node.js & npm

Node.js

  • 2008๋…„ chrome v8 ๋ฐœํ‘œ. v8์˜ js ์—”์ง„์ด 200๋ฐฐ ๋นจ๋ผ์ง์— ๋”ฐ๋ผ ๋ผ์ด์–ธ๋‹ฌ์ด Node.js ๋ฐœํ‘œ.
  • node.js ๋Š” javascript์„ OS๋กœ ํฌํŒ…ํ•œ ๊ฒƒ์ž„.
  • node.js๋Š” ๋น„๋™๊ธฐ์‹์œผ๋กœ ๋™์ž‘ํ•˜์—ฌ ๋…ผ๋ธ”๋กœํ‚นI/O ์ฒ˜๋ฆฌ.
  • javascript library๋ฅผ ๋ชจ์•„๋‘” centeral repository.
  • ์ฃผ๋กœ ์ด์Šˆ๊ฐ€ ๋˜๋Š” javascript lib ์ฐพ์•„ ๋ณผ ์ˆ˜ ์žˆ์Œ. ์˜ˆ) lodash. rxjs. ...
  • node.js ์šฉ vs ๋ธŒ๋ผ์šฐ์ €์šฉ js ๋˜๋Š” ๋ชจ๋‘ ์ง€์›ํ•˜๋Š” universal ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ๊ตฌ๋ถ„. rxjs๋Š” ๋ชจ๋‘ ์‚ฌ์šฉ.
  • npm์œผ๋กœ ์„ค์น˜๋˜๋ฉด project root์— package.json ํŒŒ์ผ์ด ์žˆ์Œ.
    • package.json ์€ javascript ํ”„๋กœ์ ํŠธ์˜ ๋ฉ”์ธ์„ค์ •ํŒŒ์ผ์ž„.
  • ์„ค์ •ํŒŒ์ผ...
    • .json ์Šคํƒ€์ผ๋กœ.
    • yaml : ์ตœ๊ทผ์—๋Š” phthon์˜ ๋ฌธ๋ฒ•์„ ์‚ฌ์šฉํ•˜์—ฌ ์ •์˜ํ•จ. spring boot.

ECMAScript 6

script

  • ๋ฐฑํ‹ฑ์ด ์ƒ์„ฑ๋จ('')
    • ์ŠคํŠธ๋ง ์ดํ„ฐํด๋ ˆ์ด์…˜์ด ๊ฐ€๋Šฅํ•จ. '๋‚ด ๋‚˜์ด๋Š” ${this.age} ์ž…๋‹ˆ๋‹ค'
  • ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ : ์•„๋ž˜ ์˜ˆ์ œ 1๋ฒˆ๊ณผ 2๋ฒˆ์€ ๋™์ผํ•œ ๊ฒฐ๊ณผ
  test(first: string, second:string): any {
    // 1๋ฒˆ
    // const result = {
    //   first: first,
    //   second: second
    // }
    // return result;
    // 2๋ฒˆ
    return {first, second};
  }
- ํ•จ์ˆ˜๋ฅผ value๋กœ ๊ฐ€๋Šฅ : age, age2๋Š” ๊ฐ™์€ ๊ฒƒ์ž„.
  post = {
    title: '์•„์ด์œ ',
    author: 'IU',
    likes: 30, 
    age: function (a, b) {
      return a + b;
    }, 
    age2 (a, b) {
      return a+b;
    }

  }

๊ฐ์ฒด ๋””์ŠคํŠธ๋Ÿญ์ฒ˜๋ง

  test2(first: string, second:string):any {
    // ๋ฐฐ์—ด์„ ํ•ด์ฒดํ•ด์„œ ๋‹ด๋Š” ๊ฒฝ์šฐ.
    const a = [1,2,3];
    const b = a[0];
    const c = a[1];
    const d = a[3];

    // ์œ„์˜ ์ฝ”๋“œ๋ฅผ ์•„๋ž˜์™€ ๊ฐ™์ด ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ
    const [e,f,g] = a;
  }

ํด๋ž˜์Šค (3.9)

  • ๋ฐ์ดํ„ฐ์™€ ๋ฉ”์†Œ๋“œ๋กœ ์ด๋ฃจ์–ด์ง

ํ”„๋กœ๋ฏธ์Šค

  • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•ด ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•จ.
  • ์ฝœ๋ฐฑ ํŒจํ„ด์€ ๊ฐ€๋…์„ฑ์ด ๋‚˜์˜๊ณ  ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ์ค‘ ๋ฐœ์ƒํ•œ ์—๋Ÿฌ์˜ ์˜ˆ์™ธ์ฒ˜๋ฆฌ๊ฐ€ ๊ณค๋ž€

๋ชจ๋“ˆ (3.14)

Babel๊ณผ Webpack

Babel (babeljs.io)

  • ํŠธ๋žœ์ŠคํŒŒ์ผ๋Ÿฌ

Webpack (webpack.js.org)

  • ๋ชจ๋“ˆ ๋ฒˆ๋“ค๋Ÿฌ

TypeScript

  • TypeScript > ES6 > ES5
  • ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ ํ˜•ํƒœ(๋˜๋Š” ์–ด๋…ธํ…Œ์ด์…˜)์œผ๋กœ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Œ.

Angular์˜ ํŒŒ์ผ๊ตฌ์กฐ์™€ ์ฒ˜๋ฆฌ ํ๋ฆ„

  • ํด๋”๊ตฌ์กฐ
  • main.ts
import { enableProdMode } from '@angular/core';
import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';

import { AppModule } from './app/app.module';
import { environment } from './environments/environment';

if (environment.production) { // ๊ฐœ๋ฐœ/์ƒ์šฉ ๊ตฌ๋ถ„ ์—ฌ๋ถ€
  enableProdMode();
}

platformBrowserDynamic().bootstrapModule(AppModule) 
  .catch(err => console.error(err));
  • polyfills.ts
    • ํฌ๋กœ์Šค ๋ธŒ๋ผ์šฐ์ง•์„ ์œ„ํ•œ ์›นํ‘œ์ค€์„ ์ œ๊ณต ์ž„ํฌํŠธ ์—ญํ• .
  • app.module.ts
    • App์—์„œ ์‚ฌ์šฉํ•˜๋Š” ์ฝคํฌ๋„ŒํŠธ ๋กœ๋”ฉ ๋ฐ ์ •์˜

์ปดํฌ๋„ŒํŠธ

์ปดํฌ๋„ŒํŠธ๋Š” ํ™”๋ฉด์ด๋‹ค.

  • typescript๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉฐ, viewํŽ˜์ด์ง€์—์„œ {{ }} ํ˜•ํƒœ๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ๋ฐ”์ธ๋”ฉ ๋˜์–ด ์žˆ๋Š” ๊ฒƒ์ž„.
  • ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ  ๋ฐ›๋Š” ๋ฐฉ๋ฒ•.
  • ๋ฐ์ดํ„ฐ๋ฐ”์ธ๋”ฉ์„ ํ…œํ”Œ๋ฆฟํŒ…์ด๋ผ ํ•จ.

๋ฐ”์ธ๋”ฉ

  • {{expression}}
  • [property]="expression"
  • (event)="handler"
  • [(ngModel)]="property"

1. ์ธํ„ฐํด๋ ˆ์ด์…˜

2. ํ”„๋กœํผํ‹ฐ ๋ฐ”์ธ๋”ฉ

<img [src]="imgSrc">
export class AppComponent {
  imgSrc = '/assets/IU.jpg'
}  

3. ์ด๋ฒคํŠธ ๋ฐ”์ธ๋”ฉ

<a (click)='btnSiginClicked()'>Sign In</a>
export class AppComponent {
  title = 'ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค.'
  name = '์–ด๋ฐด์ €์Šค'
  age = 30
  myString = `Hello! ${this.name}.`

  btnSiginClicked() {
    this.myString = '์•„์ด์œ ';
  }
}

4. ์–‘๋ฐฉํ–ฅ ๋ฐ”์ธ๋”ฉ (p.231)

  • ๋ฐ์ดํ„ฐ๊ฐ€ ๋ฐ”๋€Œ์–ด๋„ ํ™”๋ฉด์ด ๋ฐ”๋€Œ๊ณ  ํ™”๋ฉด์ด ๋ฐ”๋€Œ์–ด๋„ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ฐ”๋€Œ๋Š” ๊ฒƒ.
  • FormsModule๋ฅผ module.ts ํŒŒ์ผ์— ์ถ”๊ฐ€ํ•ด์•ผ ํ•จ.
import { FormsModule } from '@angular/forms';
@NgModule({
  imports: [
    FormsModule 
  ],
})
<input type='text' [(ngModel)]='initInputString'>
<span>{{initInputString}}</span>
export class AppComponent {
  initInputString = '์ด๋ฆ„์„ ์ž…๋ ฅํ•˜์„ธ์š”.'
}
  • input text์— ๊ฐ’์„ ์ž…๋ ฅํ•˜๋ฉด span ์•ˆ์˜ {{initInputString}} ๊ฐ’๋„ ํ•จ๊ป˜ ๋ณ€๊ฒฝ๋จ.
  • ๋ฐ˜๋ณตํ•ด์„œ ๋ณด์—ฌ์ง€๋Š” ๋ฐ์ดํ„ฐ
    • ngFor
    • ngIf

์ปดํฌ๋„ŒํŠธ๊ฐ„ ์ƒํƒœ๊ณต์œ 

๋ฃฐ

  • ๋ถ€๋ชจ๊ฐ€ ์ž์‹์—๊ฒŒ๋งŒ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ์Œ.
  • ํ• ์•„๋ฒ„์ง€๊ฐ€ ์ž์‹์—๊ฒŒ ์ฃผ๋ ค๋ฉด, ํ• ์•„๋ฒ„์ง€ - ์•„๋ฒ„์ง€ - ์ž์‹ ์—๊ฒŒ ์ „๋‹ฌํ•ด์•ผ ํ•จ.
  • ์ž์‹์€ ๋ถ€๋ชจ์—๊ฒŒ๋งŒ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์Œ.
  • Service ์ฒ˜๋ฆฌํ•จ

๋ถ€๋ชจ๊ฐ€ ์ž์‹์—๊ฒŒ

  • ๋ถ€๋ชจ๊ฐ€ ์ž์‹์„ ํ˜ธ์ถœํ•˜๋Š” html์— [์ž์‹์ด ๋ฐ›์„ ๋ณ€์ˆ˜๋ช…]='๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ์— ์ •์˜๋œ ๋„˜๊ธธ ๊ฐ’'
<app-content [colors]='objFavoriteColors'></app-content>
  • ์ž์‹์˜ components.ts ํŒŒ์ผ์— ์ •์˜ํ•จ
export class ContentComponent implements OnInit {
  @Input()
  colors:any = {}
}

์ž์‹ ๋ฐ์ดํ„ฐ๋ฅผ ๋ถ€๋ชจ์—๊ฒŒ (p.267)

Stateful ์ปดํฌ๋„ŒํŠธ์™€ Stateless ์ปดํฌ๋„ŒํŠธ

Stateful ์ปดํฌ๋„ŒํŠธ

  • ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์ปดํฌ๋„ŒํŠธ
  • ๊ทธ๋•Œ ๊ทธ๋•Œ ๋‹ค๋ฅด๋‹ค

Stateless ์ปดํฌ๋„ŒํŠธ

  • ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์ง€ ์•Š๋Š” ์ปดํฌ๋„ŒํŠธ

๋””๋ ‰ํ‹ฐ๋ธŒ (์ง€์‹œ์ž)

  • ์žฌ์‚ฌ์šฉ ์ปดํฌ๋„ŒํŠธ. ์• ํŠธ๋ฆฌ๋ทฐํŠธ๋ฅผ customํ•˜๊ฒŒ ๋งŒ๋“ค์–ด์„œ ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•จ.

๋””๋ ‰ํ‹ฐ๋ธŒ ์ข…๋ฅ˜

  • ์–ดํŠธ๋ฆฝ๋ทฐํŠธ ๋””๋ ‰ํ‹ฐ๋ธŒ
  • ๊ตฌ์กฐ ๋””๋ ‰ํ‹ฐ๋ธŒ : ngFor, ngIf ๋ฅผ ํ†ตํ•ด์„œ DOM ๋ ˆ์ด์•„์›ƒ ๋ณ€๊ฒฝ
  • ์ปดํฌ๋„ŒํŠธ ๋””๋ ‰ํ‹ฐ๋ธŒ
D:\js-demo\MyStore>ng g directive textBlue
CREATE src/app/text-blue.directive.spec.ts (233 bytes)
CREATE src/app/text-blue.directive.ts (145 bytes)
UPDATE src/app/app.module.ts (897 bytes)
  • ์•„๋ž˜์™€ ๊ฐ™์€ text-blue.directive.ts ํŒŒ์ผ ์ƒ์„ฑ๋˜๊ณ , app.module.ts ์— ์ž๋™ ์ถ”๊ฐ€๋จ.
import { Directive, ElementRef } from '@angular/core';

@Directive({
  selector: '[textBlue]'
})
export class TextBlueDirective {

  // ๊ธ€์ž์ƒ‰์„ ํŒŒ๋ž‘์œผ๋กœ ๋ณ€๊ฒฝ
  constructor(el: ElementRef) { 
    el.nativeElement.style.color = 'blue';
  }
}
  • ํ…œํ”Œ๋ฆฟ์— ์•„๋ž˜์™€ ๊ฐ™์ด ์ถ”๊ฐ€ํ•˜๋ฉด ์กฐํšŒ์‹œ ํŒŒ๋ž‘๊ธ€์ด ์กฐํšŒ๋จ
<p textBlue>textBlue directive</p>

ํŒŒ์ดํ”„

๋ฐ์ดํ„ฐ ์ž์ฒด๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์€ ๋ถ€์ˆ˜ ํšจ๊ณผ๊ฐ€ ์žˆ์œผ๋ฏ€๋กœ ํ™”๋ฉด์— ํ‘œ์‹œํ•˜๋Š” ํ˜•์‹๋งŒ ๋ณ€๊ฒฝํ•˜๊ณ  ์‹ถ์„ ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ํŒŒ์ดํ”„ ์ด๋‹ค.

๋นŒํŠธ์ธ ํŒŒ์ดํ”„

์ฒด์ด๋‹ ํŒŒ์ดํ”„

  • ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํŒŒ์ดํ”„๋ฅผ ์กฐํ•ฉํ•˜์—ฌ ๊ฒฐ๊ณผ๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ๊ฒƒ์„ '์ฒด์ด๋‹ ํŒŒ์ดํ”„' ๋ผํ•จ.

์ปค์Šคํ…€ ํŒŒ์ดํ”„

์ƒ๋ช…์ฃผ๊ธฐ์™€ ํ›… ๋ฉ”์†Œ๋“œ

์ƒ๋ช…์ฃผ๊ธฐ

  • ์ปดํฌ๋„ŒํŠธ์™€ ๋””๋ ‰ํ‹ฐ๋ธŒ๋Š” ์ƒ๋ช…์ฃผ๊ธฐ๋ฅผ ๊ฐ€์ง€๋ฉฐ, ์ƒ๋ช…์ฃผ๊ธฐ ์ด๋ฆ„ ์•ž์— ng๊ฐ€ ๋ถ™์€ ์ƒ๋ช…์ฃผ๊ธฐ ํ›… ๋ฉ”์†Œ๋“œ๋ฅผ ์ œ๊ณตํ•œ๋‹ค.
  • ๋ผ์ดํ”„์‹ธ์ดํด ํ•จ์ˆ˜ ์‹คํ–‰ ์ˆœ์„œ
  • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” On* : ์ด๋ฒคํŠธ์™€ ๊ด€๋ จ๋œ ์ฝœ๋ฐฑ ํ•จ์ˆ˜์ธ ๊ฒฝ์šฐ๊ฐ€ ๋Œ€๋ถ€๋ถ„์ž„

ํ›… ๋ฉ”์†Œ๋“œ

  • ์ธํ„ฐํŽ˜์ด์Šค์˜ ํ˜•ํƒœ๋กœ ์ œ๊ณต๋จ.
  • cf) mutable & immutable (์„ค๋ช…)

์„œ๋น„์Šค

  • ์ปดํฌ๋„ŒํŠธ๋Š” ํ™”๋ฉด์„ ๊ตฌ์„ฑํ•˜๋Š” ๋ทฐ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ์ฃผ๋œ ์—ญํ• .
  • ์ปดํฌ๋„ŒํŠธ์˜ ์ฃผ์š” ๊ด€์‹ฌ์‚ฌ ์ด์™ธ์˜ ๋ถ€๊ฐ€์ ์ธ ๊ธฐ๋Šฅ์€ ์ฝ”๋“œ ์ค‘๋ณต๋˜๊ณ  ์žฌ์‚ฌ์šฉ์„ฑ์ด ๋‚ฎ์•„์ง€๊ณ  ๋ณต์žก๋„๋Š” ์˜ฌ๋ผ๊ฐ.
  • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ „์—ญ์˜ ๊ด€์‹ฌ์‚ฌ๋ฅผ ๋ถ„๋ฆฌ ํ•˜๋Š” ๊ฒƒ์ด ํ•„์š”. ==> ๊ธฐ๋Šฅ์„ ์„œ๋น„์Šค๋กœ ๋ถ„๋ฆฌ ๊ตฌ์„ฑ

์˜์กด์„ฑ ์ฃผ์ž…

  • DI : ์˜์กด๊ด€๊ณ„๊ฐ€ ์†Œ์Šค์ฝ”๋“œ ๋‚ด๋ถ€๊ฐ€ ์•„๋‹Œ ์™ธ๋ถ€์˜ ์„ค์ •์—์„œ ์ •์˜๋˜๊ฒŒ ํ•˜๋Š” ๋””์ž์ธ ํŒจํ„ด ์ค‘์˜ ํ•˜๋‚˜.
  • ์ฐพ์•„๋ณผ๊นŒ? google : dependency injection
  • ์„œ๋น„์Šค ์ƒ์„ฑ
    • article.service.ts ํŒŒ์ผ์ด ์ƒ์„ฑ.
import { Injectable } from '@angular/core';

**@Injectable**({
  providedIn: 'root'
})
export class ArticleService{
  getArticles():Array<any> {
    return  [
        {title: 'Angular', content: 'Angular Study', author: 'lee', likes: 30},
        {title: 'Google', content: 'Google Cloud', author: 'gee', likes: 40},
        {title: 'Vue.js', content: 'Vue.js Study', author: 'yu', likes: 50},
        {title: 'Mom', content: 'Mom Study', author: 'lee', likes: 60},
        {title: 'Java8', content: 'java ramda Study', author: 'jee', likes: 70}
      ]  
  }
}
export class AppComponent implements OnInit {
  // ์ƒ์„ฑ์ž ์—ญํ• ์€ ์„œ๋น„์Šค ์ดˆ๊ธฐํ™”
  constructor( private articleService: ArticleService) {
  }
}
<h1>์ฑ… ๋ชฉ๋ก</h1>

<ul>
  <li *ngFor='let article of objArticles'>
    {{article.title}} by {{article.author}}
  </li>

</ul>
  • ์„œ๋ธŒ์‹œ ํŒŒ์ผ์— providedIn: 'root' ๋ผ๋Š” ์ •์˜๋Š” angular6๋ถ€ํ„ฐ ์ƒ์„ฑ๋จ.
    • ์ด์ „์—๋Š” app.module.ts ํŒŒ์ผ์˜ NgModule.providers ๋ผ๋Š” ๋ถ€๋ถ„์— ์ •์˜ํ•ด์„œ ์‚ฌ์šฉํ•จ.
    • ๋ˆ„๋ฝ์ด ๋ฐœ์ƒํ•˜์—ฌ ์„œ๋น„์Šค์— ์ •์˜ํ•จ.
    • root? ์ปดํฌ๋„ŒํŠธ์˜ root. ํ™”๋ฉด์˜ root๋ฅผ ์˜๋ฏธํ•จ.
    • ํŠน์ • ์ปดํฌ๋„ŒํŠธ๋กœ ์ œ์•ฝํ•  ์ˆ˜ ์žˆ์Œ.

์ธ์ ํ„ฐ ํŠธ๋ฆฌ

ํ”„๋กœ๋ฐ”์ด๋”

์„œ๋น„์Šค ์ค‘์žฌ์ž ํŒจํ„ด

  • ์„œ๋น„์Šค๋ฅผ ์ปดํฌ๋„ŒํŠธ ๊ฐ„ ๋ฐ์ดํ„ฐ ์ค‘์žฌ์ž๋กœ ์‚ฌ์šฉํ•˜๋ฉด ์ผ์ •ํ•œ ํ˜•์‹์˜ ์ž๋ฃŒ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ปดํฌ๋„ŒํŠธ ๊ฐ„์˜ ์ƒํƒœ ๊ณต์œ  ๊ฐ€๋Šฅ.

๋ฆฌ์•กํ‹ฐ๋ธŒ ํ”„๋กœ๊ทธ๋ž˜๋ฐ๊ณผ RxJS (p.400)

  • Reactive ํ”„๋กœ๊ทธ๋ž˜๋ฐ ... ์˜ˆ๋ฅผ ๋“ค์–ด ์„ค๋ช…ํ•˜๋ฉด...
    • ์ดํ„ฐ๋ ˆ์ดํ„ฐ ํŒจํ„ด : ๋ฐ์ดํ„ฐ ์ค€๋น„์™€ ์‚ฌ์šฉ์˜ ๊ณผ์ •์„ ๋ถ„๋ฆฌํ•จ. ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ณผ์ •์—์„œ pull ํ•˜๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ ์‚ฌ์šฉ.
    • ์˜ต์ €๋ฒ„ ํŒจํ„ด : ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ• ๋•Œ push ํ•˜์—ฌ ์‚ฌ์šฉ.
    • ์˜ต์ €๋ฒ„ ํŒจํ„ด์„ ๊ณ„์Šนํ•œ๊ฒƒ์ž„.
    • ๋ฐ์ดํ„ฐ ์ „์†ก์‹œ ๋๋‚ฌ๋‹ค๋ผ๋Š” ๋ฉ”์‹œ์ง€๋„ ํ•จ๊ป˜ ์ „์†กํ•จ.
    • ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•˜๋Š” ํŒŒํŠธ๊ฐ€ ์ค‘์‹ฌ์ด ๋˜์–ด์„œ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•จ.
    • Rx (Reactive Extention) : ReactiveX
      • reactive ํ”„๋กœ๊ทธ๋žจ์˜ ํ‘œ์ค€.
    • reactive-streams.org
      • java 9, spring 5
    • ๋ฐ์ดํ„ฐ๋ฅผ ๋งˆ๋ธ”๋‹ค์ด์–ด๊ทธ๋žจ ์œผ๋กœ ์‹œ๊ฐ„์˜ ํ๋ฆ„์œผ๋กœ ์ฒ˜๋ฆฌํ•œ๋‹ค. (๋งˆ๋ธ” ๋‹ค์ด์–ด๊ทธ๋žจ์„ ํ†ตํ•ด ์ด ์—ฐ์‚ฐ์ž๋“ค์— ๋Œ€ํ•ด ์„ค๋ช…)
  • reactive ๋ฐฉ์‹์œผ๋กœ ๊ฐœ๋ฐœํ•ด์•ผ ํ•จ.
    • ์ƒ์‚ฐ์ž์™€ ์†Œ๋น„์ž๋กœ ๋ถ„๋ฆฌ
    • ๋ฐ์ดํ„ฐ๋Š” push ๋ฐฉ์‹ (emit ๋ฐฉ์ถœํ•œ๋‹ค)
    • ๋ฐ์ดํ„ฐ ์ƒ์‚ฐ์ž data emit ๋Š” ๊ฒƒ์„ provider or observer
    • ๋ฐ์ดํ„ฐ ์†Œ๋น„์ž consumer
  • RxJS
    • observable / observer
  • subscriber

Cold Observer / Hot Observer

  • ๋Œ€๋ถ€๋ถ„์ด Cold Observer

์˜คํผ๋ ˆ์ดํ„ฐ (p.413)

  • ์˜ต์ €๋ฒ„๋ธ”์„ ์ƒ์„ฑ, ๋ณ€ํ™˜, ํ•„ํ„ฐ๋ง, ์—๋Ÿฌ์ฒ˜๋ฆฌ์˜ ๊ธฐ๋Šฅ์„ ํ•˜๋Š” ํ•จ์ˆ˜.
  • ๋ฐ›์„๋•Œ ๊ฐ€๊ณตํ•˜๋ฉด์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์„ ์ˆ˜ ์žˆ์Œ.
  • subscribe ๋ฉ”์†Œ๋“œ์— ๋„๋‹ฌํ•˜๊ธฐ ์ „๊นŒ์ง€ ์ฒด์ด๋‹์„ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์Œ.

HTTPํ†ต์‹ 

  • HttpClient
    • ์›นํ‘œ์ค€์€ fetch์ด์ง€๋งŒ angular๋Š” HttpClient ์ด๋‹ค.
  • Angular4.3 ์ดํ›„์— ์ถ”๊ฐ€๋จ.
  • ์„œ๋น„์Šคํ˜•ํƒœ. ์ฃผ์ž…๋ฐ›์•„ ์‚ฌ์šฉํ•จ.

HttpClientModule

  • ์„œ๋น„์Šค ํŽ˜์ด์ง€์— ์•„๋ž˜ ๋‚ด์šฉ ์ถ”๊ฐ€
export class ArticleService{

  constructor( private http: HttpClient) {}

  fetchDataTest() {
    const html = this.http.get('http://www.google.com');
  }
...  
  • http ์‚ฌ์šฉ ๋ฐฉ์‹
    • ๋™๊ธฐ์‹ : const html = this.http.get('http://www.google.com');
    • ๋น„๋™๊ธฐ์‹ : ์š”์ฒญํ•˜๊ณ  ์‘๋‹ตํ•˜๊ณ  ์ฝ”๋“œ๊ฐ€ ์˜ค๋Š” ๋™์•ˆ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š์Œ. subscribe(์ฝœ๋ฐฑํ•จ์ˆ˜) .
  fetchDataTest() {
    this.http.get('https://api.github.com/')
      .subscribe(function(response) { // ์‘๋‹ต์ด ์˜ค๋ฉด ์ฝœ๋ฐฑ๋˜๋Š” ํ•จ์ˆ˜
        console.log(response);
      });
  }
// ์‚ฌ์šฉํ• ๋•Œ
this.articleService.fetchDataTest();
    - ์ฃผ์†Œ : endpoint
    - ๋ฐ์ดํ„ฐ ์‘๋‹ต ์ŠคํŽ™
  • Back-end๋Š” endpoint์™€ data spec ์„ ์ •์˜ํ•˜๋ฉด๋จ.
    • endpoint๋Š” API ์ฃผ์†Œ
    • API ์„ค๋ช…์„œ๊ฐ€ ํ•„์š”ํ•˜๋ฉฐ Front End๋Š” Mock ์„œ๋ฒ„๋ฅผ ํ†ตํ•ด์„œ ํ…Œ์ŠคํŠธ ํ•  ์ˆ˜ ์žˆ์Œ.
    • ์ด๋Ÿฐ์‹์˜ Arch.๋ฅผ SOA ๋ผ๊ณ ๋„ ํ•จ.
export class ArticleService{

  constructor( private http: HttpClient) {}

  fetchDataTest():Observable<any> {
    return this.http.get('https://api.github.com/users/HiroSung');
    
  }
...
// ์‚ฌ์šฉํ• ๋•Œ
this.articleService.fetchDataTest()
    .subscribe(function(response) { // ์‘๋‹ต์ด ์˜ค๋ฉด ์ฝœ๋ฐฑ๋˜๋Š” ํ•จ์ˆ˜
      console.log(response);
    });
  • ๋˜ ๋‹ค๋ฅธ ์‚ฌ์šฉ๋ฒ•
   this.articleService.fetchDataTest()
      .subscribe( res =>  { // ์‘๋‹ต์ด ์˜ค๋ฉด ์ฝœ๋ฐฑ๋˜๋Š” ํ•จ์ˆ˜
        console.log(res);
        this.gitInfo = res;
      });
  • Restful API ์„œ๋น„์Šค
    • ์„œ๋น„์Šค์˜ Format์„ ์–ด๋–ป๊ฒŒ ๊ฐ€์ ธ๊ฐˆ ๊ฒƒ์ธ์ง€ ํ•„์š”
    • API ์š”์ฒญ ๋งค๋‰ด์–ผ
      • ๋„ค์ด๋ฒ„ Developer
        • ๋„ค์ด๋ฒ„ํ‚ค : clientID - 7Nfau_qhtlKWt9Duksod, Client Secret - S77xhQWZUl
        • -H: header์— ์„ค์ •ํ•  ์ •๋ณด
    • NewsAPI. API Key : 98180e15767742d79e166b95166dd7b6
curl "https://openapi.naver.com/v1/search/news.xml?query=%EC%A3%BC%EC%8B%9D&display=10&start=1&sort=sim" \
    -H "X-Naver-Client-Id: {์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋“ฑ๋ก ์‹œ ๋ฐœ๊ธ‰๋ฐ›์€ client id ๊ฐ’}" \
    -H "X-Naver-Client-Secret: {์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋“ฑ๋ก ์‹œ ๋ฐœ๊ธ‰๋ฐ›์€ client secret ๊ฐ’}" -v
    - ๊ณต๊ณต๋ฐ์ดํ„ฐํฌํ„ธ : https://www.data.go.kr/
    - ๋งˆ๋ธ” : https://developer.marvel.com/docs#!/

HttpParams

  • URI : ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€์ง€ ํฌํ•จ๋œ ์ •๋ณด
  getNews():Observable<any> {
    const params = new HttpParams()
      .set('country', 'kr')
      .set('apiKey', '98180e15767742d79e166b95166dd7b6')
    return this.http.get('https://newsapi.org/v2/top-headlines', {params});

  }

HttpHeaders

ํผ

  • DOM์„ ์ง์ ‘ handling ํ•˜๋„๋ก ํ•˜์˜€์Œ.

ํ…œํ”Œ๋ฆฟ ๊ธฐ๋ฐ˜ ํผ

  • ํผ์— ์ง์ ‘ ์ปจํŠธ๋กค

๋ฆฌ์•กํ‹ฐ๋ธŒ ๊ธฐ๋ฐ˜ ํฐ

  • FormBuilder๋ฅผ ์ƒ์„ฑ์ž์— ์ฃผ์ž…ํ•จ.

๋ผ์šฐํŒ…๊ณผ ๋„ค๋น„๊ฒŒ์ด์…˜

  • angular๊ฐ€ ์ œ์ผ ์ž˜๋˜์–ด ์žˆ์Œ
  • URL์˜ ์ฃผ์†Œ๋ฅผ ๋ณ€๊ฒฝํ•ด ์ฃผ๋Š”๊ฒƒ.
  • SPA ์—์„œ ๋ผ์šฐํŒ…์„ ์‚ฌ์šฉํ•จ.
  • ์ดˆ๊ธฐ ๋กœ๋”ฉ ์†๋„๊ฐ€ ์ค‘์š”ํ•จ.
  • SEO ๋ฌธ์ œ : index๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— ๊ฒ€์ƒ‰์—”์ง„์—์„œ ๊ฒ€์ƒ‰์ด ์•ˆ๋จ.

๋ผ์šฐํŒ…

  • Angular2 - 4(์ถœ๋ฐœ) - 5 - 6(์“ธ๋งŒํ•จ) - 8(์•ˆ์ •ํ™”)
  • '#' ์ดํ›„์˜ URI ๋Š” Client side script ์ด๋‹ค

๋ผ์šฐํŠธ ๊ฐ€๋“œ

  • ๋ณด์•ˆ์— ์ ์šฉ ๊ฐ€๋Šฅ

์ฐธ๊ณ 

  1. [์›น ํ”„๋ก ํŠธ์—”๋“œ ๊ธฐ์ˆ ์Šคํƒ ์„ ํƒ] (https://ingeec.tistory.com/107)
  2. [Angular ์ €์ž - ์ด์›…๋ชจ. ํฌ์ด์—๋งˆ์›น] (https://poiemaweb.com)
  3. Angular F/B ๋™ํ˜ธํšŒ - ๋ฆฌ์ฟ ๋ฃจํŒ….
  4. ์‚ฌ๋‚ดํฌํƒˆ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์„์ง€๋Š” ๊ณ ๋ฏผํ•ด์•ผ ํ•จ. Angular๋Š” SPA ๋ชจ๋“ˆ์ด๋‹ค.
  5. StackBlitz
  6. TypeScript. - "vue.js typescript", "angular typescript"
  7. Angular.kr ์˜ ๋”ฐ๋ผํ•˜๊ธฐ๋ฅผ ๋ชจ๋‘ ํ•ด๋ณด๊ธฐ๋ฅผ ๊ถŒ์žฅ.

HuCloud ๊น€์ˆœ๊ณค ๊ฐ•์‚ฌ. 1/20~22. ํ•œ๊ตญ์ •๋ณด๊ธฐ์ˆ ์›.

โš ๏ธ **GitHub.com Fallback** โš ๏ธ