angular2 톺아보기

26
Angular2 톺톺톺톺

Upload: -

Post on 16-Apr-2017

90 views

Category:

Engineering


1 download

TRANSCRIPT

Page 1: Angular2 톺아보기

Angular2 톺아보기

Page 2: Angular2 톺아보기

Angular1 을 만들고 보니 ..

- 양방향 바인딩 (Two-Way-Binding) 의 성능 문제

- 의존성 주입 (Dependency Injection)의 불편함

- Directive 문제

- Scope 상속 문제

- 서버사이드 렌더링을 할 수 없는 문제

Page 3: Angular2 톺아보기

양방향 바인딩의 성능문제

모든 model 들은 $watch list 에 등록이 됨

$scope.$apply() 실행$digest loop 수행

Page 4: Angular2 톺아보기

양방향 바인딩의 성능문제

$digest loop 는 $watch list 의 데이터들에 대해 dirty check 를 하는 로직

dirty check 를 하는 시간이 길어질 수록 DOM rendering 시간은 늘어남

$watch list 의 갯수가 늘어나면 치명적인 성능문제를 일으 킬 수 있음

$scope.$apply() 가 발생하면 이 $digest loop 는 계속해서일어남으로 , $http 를 통해서 데이터를 받아와 ng-repeat 로

데이터를 뿌려줄 때등 , 많은 경우에 해당 loop 를 수행하게 됨

결국 복잡한 web application 일수록 해당 현상은 심각하게일어남

Page 5: Angular2 톺아보기

의존성 주입 (Dependency Injection) 의 불편함Angular1 의 의존성 주입은 파라미터의 이름으로 수행함 .

하지만 난독화 할 경우 파라미터의 이름을 찾지 못해 안습 (...) 작업이 멈추는 현상이 발생 현재는 아래와 같은 패턴이 일반화

되어있다 .

애초에 의존성 주입 방법이 파라미터 방식이 아니었다면 좀 더 깔끔한 코드를 볼 수 있지 않았을까 ..

Page 6: Angular2 톺아보기

의존성 주입 (Dependency Injection) 의 불편함Angular1 의 의존성 주입 선언 방법은 하나로 통일 되어있다 .

그런데 Angular1 에서의 의존성 종류 ( provider, factory, value, service, constant ) 가 많음에도 결국은 위의 하나의 방법으로

선언하기 때문에 딱히 다른 의존성이라고 생각하기 힘들다 .

Angular1 을 사용하는 사람중에 저 모든것을 구분해서 사용하는 사람이 얼마나 될까 ?

이런 의존성은 정리가 좀 필요하다 .

Page 7: Angular2 톺아보기

직관적이지 못한 scope 상속 문제

위의 두 ng-model 의 obj 는 같은 scope 에 위치 해 있을까요 ? NO

ng-if 로 인해 새로운 scope 가 생성ng-if 뿐 아니라 ng-repeat 등 모든 동작에서 새로운 scope 를생성한다

scope 생성시 필수적으로 부모 scope 를 상속하지만 부모scope 의 변수를 함께 공유하며 사용하는 건 .. … 음

Page 8: Angular2 톺아보기

server-side rendering 지원 문제

- server-side rednering 의 엄청난 속도 지원 불가- ( 물론 server-side rendering 을 지원하지 않는 angular 코드가 간결할진 모르지만 , 트렌드를

지원하지 못한다는 점은 어쩔 수 없는 단점 )

- SEO( Search Engine Optimize, 검색엔진 최적화 ) 지원 불가

Page 9: Angular2 톺아보기

Angular1 vs Angular2

Page 10: Angular2 톺아보기

Angular1 의 단점을 보완한 Web Framework

- Component 기반으로 변경

- 단방향 바인딩 지원

- 간단한 architecture

- ServerSide 랜더링 지원

= ReactJS?- 추가 ) TypeScript 지원

- 추가 ) Redux / RxJs 연동

Page 11: Angular2 톺아보기

Angular2 의 구조적 변화

- $scope 삭제

- dependency 를 service 로 통합

- MVC 모델 변경

Page 12: Angular2 톺아보기

Moduleapplication

AppModule

AModule

BModule

CModule

component service

value fn

Page 13: Angular2 톺아보기

Component- Angular1 의 controller +

view

- Angular2 에서의 view 의 단위

- 자체적인 life cycle 을 가지고 있음

Page 14: Angular2 톺아보기

template- Component 의 표현 개체

- Component 에서 metadata 로 templateUrl, template 로 연결

- Angular 고유의 attribute들 지원 마크업을 깨트리는 아크마

<h2>Hero List</h2><p><i>Pick a hero from the list</i></p><ul> <li *ngFor="let hero of heroes"

(click)="selectHero(hero)"> {{hero.name}} </li></ul><hero-detail *ngIf="selectedHero"

[hero]="selectedHero"></hero-detail>

Page 15: Angular2 톺아보기

template- meta data 의 selector 와

template 의 특정 tag 를 연결 , 자식 component 로 연결 가능

Page 16: Angular2 톺아보기

Data-binding

<li>{{hero.name}}</li><hero-detail [hero]="selectedHero"></hero-detail><li (click)="selectHero(hero)"></li>

Page 17: Angular2 톺아보기

Service- Application 이 필요로 하는

function, value, data 등을 정의 해 놓은 것

- 각종 Component 에서 공통적으로 사용하는 내용 및 Component내에서 메인 로직외의 내용을 따로 정리하고 싶을때 사용

- Angular1 에서의 service 군 (factory, value, service, provider, constant) 을 하나로 통합한 내용

Page 18: Angular2 톺아보기

Dependency-InjectionService 를 Component 에 주입하는 방법

1)Component 의 constructor 의 파라미터로 연동하는 방법 본격 파라미터 덕후

2)Component metadata 변수인 provider 로 연동하는 방법

3)Module 의 metadata 변수인 provider 로 연동하는 방법

Page 19: Angular2 톺아보기

TypeScript - MicroSoft 에서 만든 스크립트 스크립트계의 IE

- 자바스크립트가 대형 프로젝트에 어울리지 않는다는 이유로 제작

특징 )

- 변수별로 type 이 존재하며 , interface를 통해 type 선언이 가능

- 기본적으로 객체지향 언어로 개발 되었다

- 상당히 C# 스러운 문법을 구사 ..

- ES6 를 통해 자바스크립트 자체적으로 많은 부분 개선 되었기 때문에 지속적으로 필요한가는 의문

- 자체적인 lint 도 지원하다 OMG..

Page 20: Angular2 톺아보기

Typescript CompileTypeScript 는 기본적으로 자바스크립트가 아니다 . 자바스크립트로 C# 을 구현했으니까

파일 확장자도 *.ts 로 다르기 때문에 스크립트로 사용하려면 자바스크립트 형태로의 변환이 필요하다 .

angular2 에서는 기본적으로 컴파일러 모듈을 지원한다 . (@angular/compiler)

typescript-compiler 모듈은 npm 모듈로 별도로 존재한다 .

compile option 은 tsconfig.json 을 통해 정의 가능하다 .

Page 21: Angular2 톺아보기

Typescript 맛보기

Page 22: Angular2 톺아보기

Why Typescript ?Angular2 는 Typescript, Javascript, Dart 를 이용해 개발 가능

공식사이트도 그렇고 Typescript 를 활용한 예제들이 많음

Angular1 이 대형 프로젝트에서 약점을 많이 보여 TypeScript 를 이용해 상당부분의 약점들을 해결하고자 함 .

ES6 보다 좀 더 OOP 스러운 문법들을 많이 지원함 ( interface, 상속 , 각종 type )

google 내 angular 팀이 typescript 를 상당히 선호한다는 말도 있음 . 결국 개발자 마음

Page 23: Angular2 톺아보기

Code 로 확인하는 Angular2 Application

- 상당히 주관적으로 개발해 본 내용이므로 다르게 개발 가능

- 상당히 불편하게 개발하는 내용을 포함하고 있을지도 모르니 주의

Page 24: Angular2 톺아보기

Directory 구조

- app/ : application root 디렉토리- build/ : gulp 로 빌드 했을때 destination 디렉토리- typings/ : typing 으로 정의한 라이브러리들의 destination

디렉토리- bs-config.json : lite-server 로 웹서버 돌릴때 config 파일- gulpfile.ts : gulp config 파일- index.html : angular2 application 을 렌더링하는 root 파일- systemjs.config.js : systemjs config 파일- tsconfig.json : typescript-compiler 의 설정 파일- tslint.json : tslint 사용시 설정파일- typings.json : typing 이용할 때 설정파일

Page 25: Angular2 톺아보기

package.json

주요 모듈

- @angular 계열- gulp 계열- typescript 계열- rxjs 모듈- systemjs 모듈- lite-server 모듈

Page 26: Angular2 톺아보기

tsconfig.json