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

React๋ณด๋‹ค Angular2์— ๋” ์ฃผ๋ชฉํ•ด์•ผํ•˜๋Š” ์ด์œ 

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

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