티스토리 뷰
Angular 2+ 프로젝트를 3개 이상 진행해보면서 수백번 빌드하여 배포를 했었다.
기본적인 빌드 방법 및 지식은 알고 있었지만 조금 더 파해쳐보고 싶어 다시 한번 머리속으로 정리할겸 포스팅을 시작한다.
Angular 에서 빌드 시 JIT, AOT로 빌드를 할 수 있다.
기본 세팅으로는 Angular CLI로 빌드 시 JIT 방식으로 빌드를 한다. 하지만 수많은 사람들이 JIT 방식보다는 AOT 방식을 많이 선호하고 사용한다.
그 이유에 대해서 알아보자.
JIT (Just In Time) 란 ?
프로그램을 실제 실행하는 시점에 기계어로 번역하는 컴파일하는 방식
-> 브라우저에 필요한 바이너리를 스스로 이해하지 못하기 때문에 브라우저가 필요하고 필요함에 있어서 JavaScript 파일을 로드하면 해당 바이너리로 컴파일되어 브라우저에서 해석하고 실행함
Angular Documentation에서는 "앱이 브라우저에서 실행 후 런타임 안에서 컴파일 시작" 이라고 설명한다.
* 런타임이란 ? 프로그램이 실행되고 있을 때 존재하는 곳
AOT (Ahead Of Time) 란 ?
목표 시스템의 기계어와 무관하게 중간 언어 형태로 배포된 후 목표 시스템에서 인터프리터 및 JIT 컴파일 등 기계어 번역을 통해 실행되는 중간 언어를 미리 시스템에 맞는 기계어로 번역하는 방식
-> JIT랑 코드가 컴파일 될 때를 제외한 나머지는 같음
Angular Documentation에서는 "앱을 빌드할 때 컴파일 시작" 이라고 설명한다.
JIT(Just In Time)와 AOT(Ahead Of Time)의 개념은 위와 같다.
그런데 왜 Angular에서는 두 가지 방식 중 AOT 방식을 선호할까 ?
Angular에서는 아래와 같이 설명을 한다.
1. 빠른 렌더링
AOT를 사용하면 브라우저가 사전 컴파일 된 응용 프로그램 버전을 다운로드하며 실행 가능한 코드를 로드 하므로 컴파일 할 때까지 기다리지 않고 즉시 렌더링이 가능
2. 비동기 요청 감소
컴파일러는 어플리케이션 JavaScript 내에서 외부 HTML 및 CSS를 인라인 하여 해당 소스 파일에 대한 별도의 ajax 요청을 제거
3. Framework 다운로드 크기가 감소
앱이 이미 컴파일을 해서 나와 컴파일러를 생략하기 때문에 Payload가 크게 감소
4. 템플릿 오류를 더 빨리 감지
사용자가 직접 빌드 단계에서 템플릿 바인딩 오류를 감지하고 확인 가능
5. 보안 강화
AOT는 HTML 구성 요소를 클라이언트에 제공 되기 전 JavaScript 파일로 컴파일한다. 그러므로 템플릿을 읽을 필요가 없기 때문에 클라이언트 측 주입식 공격 하기가 어려움
위의 내용을 머리속으로 정리하여 개념적으로 접근을 해보자 !
Angular 2+ 부터는 TypeScript를 사용한다. 하지만 대부분의 TypeScript는 브라우저에서 지원을 하지 않기 때문에 TypeScript compiler 도구를 사용해서 컴파일 후 브라우저에서 사용이 가능하다. 만약 JIT로 build 시 코드가 브라우저에서 로드 된 후 런타임 상태에서 TS -> JS -> binary 방식으로 컴파일된다. 결국 두번 컴파일을 실행한다. 그에 반면 AOT build를 할 시 이미 build할 때 컴파일 되어 나오기 때문에 payload가 감소하며 빠른 렌더링이 가능하다는 결론이 나온다.
감사합니다.
오늘도 해피 코딩하세요 !
'프레임워크 및 라이브러리 공부 > Angular 2+' 카테고리의 다른 글
Angular에서 sitemap, robots.txt 등록하기 (0) | 2019.03.12 |
---|---|
Angular Lazy-loading-ngmodules 사용해보기 (0) | 2019.02.21 |
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 웹사이트
- 가상돔
- class component
- ES6
- string
- TypeScript
- this
- HTML
- useEffect
- react
- JavaScript
- 함수 컴포넌트
- useState
- Let
- window
- Prototype
- const
- scope
- 클래스형 컴포넌트
- 클래스 컴포넌트
- website
- 리엑트
- NestJS
- Angular
- virtual dom
- Function Component
- 깃헙
- github
- Es5
- array
- Total
- Today
- Yesterday