00.Angular - nkiateam/angular-tutorial GitHub Wiki
Angular 1.x์ ๋์ ์์ฐ์ฑ์ผ๋ก ๋ง์ ๊ฐ๋ฐ์๋ค์๊ฒ ์ข์ ํ๊ฐ๋ฅผ ๋ฐ์์ง๋ง Two-way binding(๋ฐ์ดํฐ ๋ณ๊ฒฝ๋ง์ผ๋ก ๋ทฐ๋ค์ ์ผ๊ด ๋ณ๊ฒฝํ ์ ์๋ ๊ธฐ๋ฅ์ ์ ๊ณตํ์ง๋ง, ์ด์ ๊ฐ์ด ๋ฐ์ดํฐ ํ๋ฆ์ด ์๋ฐฉํฅ์ผ๋ก ์ด๋ฃจ์ด ์ง๋ค ๋ณด๋, cascade ํจ๊ณผ๊ฐ ๋ฐ์ํ์ฌ, ๋ถํ์ํ digest๊ฐ ๋ฐ์)๊ณผ client rendering(Client Rendering์ผ๋ก ์ธํด ํ์ํ๋ฉด์ด ๋ณด์ด๋ ๊ฒ? (FOUC:Flash of unstyled content)) ๊ตฌ์กฐ๋ก ์ฑ๋ฅ์ ๋ฌธ์ ๊ฐ ์๋ค๋ผ๋ ์งํ.
-
Two-way binding -> ๋จ๋ฐฉํฅ ๋ฐ์ดํฐ ํ๋ฆ์ ๊ตฌ์กฐ
-
client rendering -> Server Rendering ๊ฐ์ ๋๋ฉฐ React์ Angular2 ๋ฑ์ฅ
-
Front-End ํ๋ ์์ํฌ์ ๋ํ ๊ด์ฌ์ Facebook์ React๊ฐ ๋ฐ์ ํ๋ฉฐ Virtual DOM๊ณผ JSX์ server rendering์ ์ด์ฉํ์ฌ ์ฑ๋ฅ์ด ์ข๋ค ๋ผ๋ ์ด์ผ๊ธฐ์ ํจ๊ป ๊ฐ๋ฐ์๋ค์๊ฒ ํผ์ง
-
๊ตฌ๊ธ ์ฃผ๋ํ์ Angular2๋ Angular1๊ณผ ๊ฐ์ ๋จ์ ์ ๋ณด๊ฐํ๊ณ , React์ ๊ฐ์ ๊ตฌ์กฐ๋ก ์๋ก ๋ง๋ค์ด์ง.
Angular2 ํ๋ ์์ํฌ๋ ์ต์ ์นํ๋ก ๋ ๊ธฐ์ ์ ๊ธฐ๋ฐ์ผ๋ก ์น ๊ฐ๋ฐ์ ์ข ๋ ๊ตฌ์กฐ์ ์ผ๋ก ํ ์ ์๋ ํ๊ฒฝ์ ์ ๊ณตํด ์ค๋๋ค. ๋ฐ๋ผ์ ๊ธฐ์กด์ ์๋ฒ ๊ฐ๋ฐ๋ง ์ฃผ๋ก ํ์ จ๋ ๋ถ๋ค๋ Angular2๋ฅผ ์ฌ์ฉํ๋ฉด ์ข ๋ ์ฝ๊ณ ์ฌ๋ฏธ์๊ฒ ์น์ฑ์ ๊ฐ๋ฐํ ์ ์์ต๋๋ค. Angular2๋ ๊ตฌ๊ธ ์ฃผ๋ํ์ ๊ฐ๋ฐํ๊ณ 2016๋ ์ํด Angular 2๊ฐ 5์ 3์ผ ๊ธฐ์ค Release Candidate ๋ฒ์ . Angular2๋ 2016๋ง ์ ์๋ฆด๋ฆฌ์ฆ๋ฅผ ์ค๋น์ค์ด๋ฉฐ, ํ์ฌ๋ RC.4๊น์ง ์งํ๋์์ต๋๋ค. Angular2๋ Angular1์ ํ์ฅ์ด ์๋ ์๋ก ๋ง๋ค์ด์ง
Angular2์ ์ฃผ์ ๊ตฌ์ฑ๋จ์
- Module, Component, Template
- Metadata, Data Binding, Directive
- Service, Dependency Injection
1) ํ ํ๋ฆฟ(๋งํฌ์ )๊ณผ ์ฝ๋์ ๋ถ๋ฆฌ
- react ๋จ์
React๋ ๊ฐ๋ฐ์ ์ฝ๋ ์์ JSX๊ฐ ํฌํจ
render() {
var list = this.props.pagelist.map((v, i) => {
return <li key={i}><Link to={v.url}>{v.text}</Link></li>
});
return (
<div className="main-container">
<h1>{this.props.title}</h1>
<p>{this.state.message}</p>
<nav className="navbar navbar-default" role="navigation">
<div className="col-sm-7 col-sm-offset-2">
{list}
</div>
</nav>
{this.props.children}
</div>
);
}
ํ์ง๋ง, Angular2์์๋ ๋ค์๊ณผ ๊ฐ์ด ํ ํ๋ฆฟ ์์ฒด๋ฅผ ๋ณ๋์ ํ์ผ๋ก ๊ด๋ฆฌ
@Component({
templateUrl: 'app.component.html',
// ...
})
2) HTML ํ์ค๊ณผ Web Component
React๋ JSX๋ผ๋ ์๋ก์ด ์ธ์ด๋ก ๋ทฐ๋ฅผ ๋ง๋ญ๋๋ค. ์ด JSX ๋ ์ฐ๋ฆฌ๊ฐ ์๊ฐํ๋ ๋งํฌ์ (HTML)๊ณผ ๋น์ทํ์ง๋ง, ๋ค๋ฅธ ์ธ์ด์ ๋๋ค. HTML ํ์ค ๋งํฌ์ ์ ํ ํ๋ฆฟ์ผ๋ก ์ฌ์ฉํ๋ Angular2๋ JSX์ ์ ์ฝ์ด ์ ํ ์์ต๋๋ค. ๋๊ตฐ๋ค๋ Web Component ๋ฅผ ์ง์ํ๊ณ ์๊ธฐ ๋๋ฌธ์, Shadow DOM๊ณผ ๊ฐ์ด ๋ทฐ ๋จ์๋ก css๋ฅผ ์ง์ ํ ์๋ ์์ต๋๋ค.
3) TypeScript
Typescript๋ Microsoft์์ ๋ง๋ ์ธ์ด์ ๋๋ค. ์๋ฐ์คํฌ๋ฆฝํธ์ โํ์ โ์ ์ถ๊ฐํด์ ๋ง๋ ํ์ฅํ ์๋ฐ์คํฌ๋ฆฝํธ ์ธ์ด ํ์ ์ด ์กด์ฌํ์ง๋ง. ์กด์ฌํ์ง ์๋ ์ธ์ด TypeScript๋ฅผ ์ง์ํ๊ธฐ ๋๋ฌธ์ Angular2๊ฐ ์ง์ ์ฅ๋ฒฝ์ด๋ผ๊ณ ์ด์ผ๊ธฐํ์๋ ๋ถ์ด ๋ง์ต๋๋ค. ์ฌ์ค, ์ ๋ํ ๊ทธ๋ฌ์ต๋๋ค. ํ์ง๋ง, ์ข ์จ๋ณด๋ ๊ทธ๋ ์ง ์์ ๊ฒ ๊ฐ์ต๋๋ค. ์๋ฅผ ๋ค์ด, React์์๋ Component์ prop์ ํ์ ์ ์ง์ ํฉ๋๋ค. ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
Main.propTypes = {
title: PropTypes.string.isRequired,
pagelist: PropTypes.array
};
์์ ๋๊ฐ ๋์ JavaScript์์ ์ ์ด๋ฐ ์์ ์ ํ๋ ๊ฒ์ผ๊น์? ๋น์ฐํ ํ์ํ๊ธฐ ๋๋ฌธ์ ๋๋ค. Front-End ๋น์ค์ด ๋์์ง๋ฉด ์ง์๋ก, ํ์ ์ฒดํฌ๋ ๊ผญ ํ์ํ ๊ธฐ๋ฅ ์ค ํ๋์ธ๊ฑฐ์ฃ . ํ์ง๋ง, TypeScript๋ ๋ค์๊ณผ ๊ฐ์ด ์ฝ๋์์ ๋ถํฐ ํ์ ์ ๋ช ์ํ ์ ์์ต๋๋ค.
var title: string;
var pagelist: string[];
๊ฐ์ฅ ์ข์ ์ ์ ํ์ ์ ์ง์ ํ๋ ๊ฒ์ด ๊ผญ! ํ์๋ ์๋๋ค๋ ๊ฒ์ ๋๋ค. ๊ทธ๋์ TypeScript๋ก ๊ฐ๋ฐ์ ํ๋๋ผ๋ ๊ทธ๋ฅ JavaScript์ ๊ฐ์ด ์ธ์ ์์ต๋๋ค.
๋ฏธ๋๋ฅผ ์ค๋นํ๋ ์ธ์ด
React๋ฅผ ์ฐ๋ ค๋ฉด JSX๋ฅผ ๋ณ๊ฒฝํ๊ธฐ ์ํด transpile ๊ณผ์ ์ ๊ผญ! ํด์ผ๋ง ํฉ๋๋ค. ๊ทธ๋์ ์ผ๋ฐ์ ์ผ๋ก๋ ES6 ๊น์ง ํจ๊ป ์ ์ฉํ์ฌ ๊ฐ๋ฐ์ ํฉ๋๋ค. Angular2๊ฐ ์ฌ์ฉํ๋ TypeScript ๋ํ ๊ผญ! transplie ๊ณผ์ ์ ๊ฑฐ์นฉ๋๋ค. ์ด์ฐจํผ ๊ฐ๋ฐํ๊ฒฝ์์ ํ๋ ์ผ์ ๋์ผํฉ๋๋ค. ํ์ง๋ง, TypeScript๋ ์๋์ ๊ฐ์ด ES5,6 ๊ธฐ๋ณธ ์คํ์ ํฌํจํ๊ณ ์๊ณ , ๋๋ถ์ด annotations๊ณผ type์ ๊ฐ์ง๊ณ ์์ต๋๋ค. ES2017์์ decorator, async์ ๊ฐ์ ์คํ์ด ์ด๋ฏธ ๋ ผ์๋๊ณ ์์ต๋๋ค. ์ด ๋ถ๋ถ์ด TypeScript๋ฅผ ์ฌ์ฉํ๊ฒ ๋๋ฉด ๋ฏธ๋ฆฌ ์ฌ์ฉํ ์ ์๋ ์ฅ์ ์ด ์์ต๋๋ค. ์ฆ, ์ต์ ์ ECMAScript ๋ฅผ ์ฌ์ฉํ ์ ์๋ค๋ ๊ฒ์ ๋๋ค.
4) ํ๋ ์์ํฌ ๋ด์์์ ์ค๊ณ
Angular1์ controller, service, directive๋ฑ๊ณผ DI(Dependency Injection) ๋ฐฉ์์ ์ ๊ณตํ์ฌ ๋ง์ ๋ฉด์์ ์ ํด์ง ๋ฃฐ(?)์ ์ํด ๊ฐ๋ฐ์ ํ ์ ์๋ ์ฅ์ ์ด ์์ต๋๋ค. ๋ฐ๋ฉด, React๋ Flux๋ Redux์ ๊ฐ์ ๋ฐ์ดํ ํ๋ก์ฐ ์ค๊ณ์ ๋ํ ๋ง์ ์ ํ์ง๊ฐ ์์ต๋๋ค. ๋ง์ ์ ํ์ง๊ฐ ์๋ค๋ ๊ฒ์ ์ ํ์ ํด์ผํ๋ ์์ ๋๊ฐ ๋์ ์ ์ฐ์ฑ์ด ์ข๋ค๋ ์๋ฏธ์ด๊ธฐ๋ ํ์ง๋ง, ๋ค๋ฅธ ํํธ์ผ๋ก๋ ์ฌ๋ฐ๋ฅธ ์ ํ์ ํ๊ธฐ ์ํด์๋ ๋ง์ ๊ฒฝํ๊ณผ ๋์ ์ดํด๋๊ฐ ํ์ํ๋ค๋ ์ด์ผ๊ธฐ ์ ๋๋ค. Angular2๋ Angular1๊ณผ React์ ์ค๊ฐ์ ์ ์๋ค๊ณ ์๊ฐ๋ฉ๋๋ค. React์ ๋ค๋ฅด๊ฒ ํ๋ ์์ํฌ์ด๊ธฐ ๋๋ฌธ์, ์ด๋ ์ ๋ ์ ํด์ง ํ๋ก์ฐ๋ฅผ ์ฌ์ฉํ๋ฉด์, Flux, Redux, RxJS์ ๊ฐ์ ๊ฒ์ ์ ์ฐํ๊ฒ ์ ์ฉํ ์๋ ์์ต๋๋ค.
5) ๋ธ๋ผ์ฐ์ ๋ฒค๋ โ๊ตฌ๊ธโ. Angular2๋ ๊ตฌ๊ธ ์ฃผ๋ํ์ ๊ฐ๋ฐ
Angular2๋ ๊ตฌ๊ธ ์ฃผ๋ํ์ ๊ฐ๋ฐ๋๊ณ ์๋ Front-End ํ๋ ์์ํฌ์ ๋๋ค. ๋ธ๋ผ์ฐ์ ๋ฅผ ๋ง๋๋ ๊ตฌ๊ธ์ด๊ธฐ ๋๋ฌธ์, Angular2์๋ ๋ธ๋ผ์ฐ์ ์ ํ์ค์ ๋ฐ๋ฅด๋ ค๊ณ ํ๋ ๋ชจ์ต์ด ๋ณด์ ๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก ์ฌ์ฉํ๋ ํ ํ๋ฆฟ๋ HTMLํ์ค์ด๊ณ , ์ปดํฌ๋ํธ๋ค์ ๋ชจ์ต๋ Web Component๋ฅผ ์งํฅํ๊ณ ์์ผ๋ฉฐ, ์ฌ์ง์ด ์ ๋๋ฉ์ด์ ์ฒ๋ฆฌํ๋ ๋ถ๋ถ๋ Web Animation API๋ฅผ ์งํฅํ๊ณ ์์ต๋๋ค. ๋ฌผ๋ก , Facebook์ React๋ ๊ทธ ํ๋ณด๊ฐ ์ ์ฌํ์ง๋ง, ๊ตฌ๊ธ๊ณผ ๊ฐ์ด ๋ฏผ์ฒฉํ๊ณ ์ง์ ์ ์ผ๋ก ํ์ค์ ์ง์ผ๋๊ฐ๋ ๋ชจ์ต์ ์๋๋๋ค.
Angular2 ํ๋ ์์ํฌ ์์ ์ด๋ฏธ ์ต์ ์ ํ๋ก ํธ ์๋ ๊ธฐ์ ๊ณผ ๊ฐ๋ ๋ค์ด ์ด์ฐ๋ ค์ ์ฌ์ฉ๋๊ณ ์๊ธฐ ๋๋ฌธ์ ์ฐ๋ฆฌ๋ ์ด ๊ฐ๋ ๋ค์ ํ๋์ฉ ์ดํดํ๊ณ ๋์ด๊ฐ์ผ ํฉ๋๋ค. ๋ฐ๋ผ์ Angular2๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด ์ ์ด๋ ์๋์ ๊ฐ์ ํค์๋๋ฅผ ํ ๋ฒ์ฉ ํ์ด๋ณด์ง ์์ ์ ์์ต๋๋ค.
. NPM . ES6์ Module(CommonJS, AMDโฆ) . Transpiler(Polyfill, shim) . TypeScript, (typings, tsd) . Angular ํ๋ ์์ํฌ ๊ด๋ จ ๊ฐ๋ : MVVM, Change Detector, Observable, Immutable, Two-way Binding, Zone.js . RxJs . Webpack ๋ฑ์ Bundler
๊ตฌ์ถ http://www.notforme.kr/archives/1585
Angular2์์ Typescript๋ฅผ ์ฌ์ฉํ๋ ์ด์ [Angular2] ์ง์์(Directive) ๋ฐ์ํ ํ๋ก๊ทธ๋๋ฐ ๋ถ๋ฅ [Angular2] ๋ฐ์ดํฐ ๋ฐ์ธ๋ฉ [Angular2] ์ํ ๋ค๋ฃจ๊ธฐ [Angular2] ์์ ํ๋ก๊ทธ๋จ ๋ฐ ํ๋ก์ ํธ ์ ํ [Angular2] Component Angular2: QuickStart ๋ฐ๋ผํ๊ธฐ Angular2 ์์ํ๊ธฐ http://www.notforme.kr/archives/tag/angular2