anchor.diff:  a(id="polyfills")
   .l-main-section
   :marked
  +  ### 폴리필 패키지###
  +
     ### Polyfill packages
     
  +  Angular는 어플리케이션 환경에 특정한 [폴리필](https://en.wikipedia.org/wiki/Polyfill)이 필요합니다.
  +  npm 패키지를 이용해 이 폴리필들을 설치하면 Angular는 `package.json`의 *peerDependencies* 섹션에 목록화합니다.
  +
     Angular requires certain [polyfills](https://en.wikipedia.org/wiki/Polyfill) in the application environment.
     Install these polyfills using the npm packages that Angular lists in the *peerDependencies* section of its `package.json`.
     
  +  반드시 여러분의 `package.json`의 `dependencies`에 이 패키지들을 목록화하세요.
  +
     You must list these packages in the `dependencies` section of your own `package.json`.
     
   .l-sub-section
     :marked
  +    이 필요사항들에 대한 배경지식으로는 [왜 peerDependencies?](#why-peer-dependencies)를 참고하세요.
  +
       For background on this requirement, see [Why peerDependencies?](#why-peer-dependencies).
   :marked
  +  ***core-js*** - ES2015(ES6)의 필수 기능들을 글로벌 컨텍스트(윈도우)에 적용합니다. 동일한 핵심 API를 제공하는 폴리필로 대체할 수도 있습니다.
  +  API들이 주요 브라우저에 구현될 때, 이 의존성은 불필요해질 것입니다.
  +
     ***core-js*** - Patches the global context (window) with essential features of ES2015 (ES6).
      You may substitute an alternative polyfill that provides the same core APIs. 
      When these APIs are implemented by the major browsers, this dependency will become unnecessary.
  -  
  +
  +  ***rxjs*** - [TC39](http://www.ecma-international.org/memento/TC39.htm) 위원회가 JavaScript 언어의 표준을 결정하기 전 [Observables 명세](https://github.com/zenparsing/es-observable)를 위한 폴리필입니다. 여러분은 Angular의 업데이트를 기다리지 않고도 원하는 버전의 *rxjs*를 선택(호환성이 허용하는 범위 내에서)할 수 있습니다.
  +
     ***rxjs*** - A polyfill for the [Observables specification](https://github.com/zenparsing/es-observable) currently before the 
     [TC39](http://www.ecma-international.org/memento/TC39.htm) committee that determines standards for the JavaScript language.
     You can pick a preferred version of *rxjs* (within a compatible version range) 
     without waiting for Angular updates.
     
  +  ***zone.js*** - [TC39](http://www.ecma-international.org/memento/TC39.htm) 위원회가 JavaScript 언어의 표준을 결정하기 전 [Zone 명세](https://gist.github.com/mhevery/63fdcdf7c65886051d55)을 위한 폴리필입니다. 여러분은 Angular의 업데이트를 기다리지 않고도 원하는 버전의 *rxjs*를 선택(호환성이 허용하는 범위 내에서)할 수 있습니다.
  +
     ***zone.js*** - A polyfill for the [Zone specification](https://gist.github.com/mhevery/63fdcdf7c65886051d55) currently before the 
     [TC39](http://www.ecma-international.org/memento/TC39.htm) committee that determines standards for the JavaScript language.
     You can pick a preferred version of *zone.js* to use (within a compatible version range) 
  
positive.code: a(id="other")
  .l-main-section
  :marked
    ### Other helper libraries
    
    ***angular-in-memory-web-api*** - An Angular-supported library that simulates a remote server's web api 
    without requiring an actual server or real http calls. 
    Good for demos, samples, and early stage development (before we even have a server).
    Read about it in the [Http Client](server-communication.html#appendix-tour-of-heroes-in-memory-server) page.
    
    ***bootstrap*** - [Bootstrap](http://getbootstrap.com/) is a popular HTML and CSS framework for designing responsive web apps.
    Some of the samples improve their appearance with *bootstrap*.
    
  
negative.code: .l-main-section
  :marked
    ## *devDependencies*
    `package.json`의 *devDependencies*에 목록화된 패키지들은 여러분이 어플리케이션을 개발하는데 도움을 줍니다.
    프로덕션 어플리케이션에 이 패키지들을 포함하게 되더라도 이상은 없지만, 굳이 포함할 필요는 없습니다. 
  
    The packages listed in the *devDependencies* section of the `package.json` help you develop the application.
    You don't have to deploy them with the production application although there is no harm in doing so.
  
    ***[concurrently](https://www.npmjs.com/package/concurrently)*** - 
    OS/X, 윈도우즈, 그리고 리눅스 운영체제 상에서 여러개의 npm 명령어를 작동시키기 위한 유틸리티.
  
    A utility to run multiple *npm* commands concurrently on OS/X, Windows, and Linux operating systems.
    
    ***[lite-server](https://www.npmjs.com/package/lite-server)*** - 
    [John Papa](http://johnpapa.net/)가 작성한 가볍고 정적인 파일 서버,
    라우팅을 사용하는 Angular 앱을 훌륭하게 지원합니다. 
  
    A light-weight, static file server, by [John Papa](http://johnpapa.net/) 
    with excellent support for Angular apps that use routing.
  
    ***[typescript](https://www.npmjs.com/package/typescript)*** - 
    *tsc* 컴파일러를 포함한 TypeScript 언어 서버
  
    the TypeScript language server, including the *tsc* TypeScript compiler.
    
    ***@types/\**** 
    - TypeScript 정의 파일들.
    자세한 사항은 [TypeScript 설정](typescript-configuration.html#typings)에서 살펴보세요.
  
    - TypeScript definition files.
    Learn more about it in the [TypeScript Configuration](typescript-configuration.html#typings) chapter.
  
  .l-main-section
  a(id="why-peer-dependencies")
  :marked
    ## 왜 *peerDependencies*?
  
    ## Why *peerDependencies*?
    
    바른시작 섹션에서 다룬 `packae.json`에는 *peerDependencies*가 없었습니다.
    하지만 Angular의 package.json 파일에는 여러분 어플리케이션에 중요한 *peerDependencies*가 있습니다.
  
    There isn't a *peerDependencies* section in the QuickStart `package.json`. 
    But Angular has a *peerDependencies* section in 
    *its* package.json, which has important consequences for your application. 
    
    이는 왜 [폴리필](#polyfills)의 *의존성* 패키지를 빠른시작의 `package.json`에서 불러왔는지 설명해줍니다.
    또한 왜 그 패키지들이 여러분 어플리케이션에 필요한 것인지도 설명해줍니다.
  
    It explains why you load the [polyfill](#polyfills) *dependency* packages in the QuickStart `package.json`,
    and why you'll need those packages in your own applications.
    
    이에대한 설명은 [peer dependencies](https://nodejs.org/en/blog/npm/peer-dependencies/)을 참고하세요.
  
    An explanation of [peer dependencies](https://nodejs.org/en/blog/npm/peer-dependencies/) follows.
    
    패키지들은 다른 패키지에 의존합니다. 예를들면, 여러분의 어플리케이션은 Angular 패키지에 의존합니다.
  
    Packages depend on other packages. For example, your application depends on the Angular package.
    
    두 패키지 "A", "B"가 동시에 또 다른 패키지 "C"에 의존할 수 있습니다.
    "A"와 "B"는 모두 "C"를 그들의 *dependencies*로 목록화 할 것입니다.
  
    Two packages, "A" and "B", could depend on the same third package "C". 
    "A" and "B" might both list "C" among their *dependencies*.
    
    만약에 "A"와 "B"가 서로 다른 버젼의 "C" ("C1"과 "C2")를 의존하면 어떨까요? npm 패키지 시스템은 이를 지원합니다.
    npm은 "C1"을 "A"를 위해 `node_modules` 폴더에 설치하고, "C2"를 "B"를 위해 `node_modules` 폴더에 설치합니다.
    "A"와 "B"는 모두 각각의 "C"의 복사본을 갖게 되고, 서로 간섭하지 않고 작동할 수 있습니다.
  
    What if "A" and "B" depend on different versions of "C" ("C1" and "C2"). The npm package system supports that. 
    It installs "C1" in the `node_modules` folder for "A" and "C2" in the `node_modules` folder for "B".
    Now "A" and "B" have their own copies of "C" and they run without interferring with one another.
  
    하지만 문제가 있습니다. 패키지 "A"는 "C1"의 존재를 직접 실제로 호출하지 않고도 알아야 할 것입니다.
    "A"는 오직 *다른 누군가가 "C1"을 사용할 때* 작동할 수도 있습니다. 어플리케이션의 다른 부분이 "C2"에 의존하면 무너지게 됩니다.
    
    But there is a problem. Package "A" may require the presence of "C1" without actually calling upon it directly.
    "A" may only work if *everyone is using "C1"*. It falls down if any part of the application relies on "C2".
    
    해결책은 "A"가 "C1"에 대해 *상호 의존성(peer dependency)*를 선언하는 것입니다.
  
    The solution is for "A" to declare that "C1" is a *peer dependency*.
    
    `dependency`와 `peerDependency`의 차이는 대략 다음과 같습니다:
  
    The difference between a `dependency` and a `peerDependency` is roughly this:
    
    >**dependency**는 이렇게 말합니다. "나는 이것이 직접 *나에게* 사용될 수 있어야 돼"*
    >
    >A **dependency** says, "I need this thing directly available to *me*."
    >
    >**peerDependency**는 이렇게 말합니다. "나를 사용하려면, *당신은* 이것들을 사용할 수 있어야 돼"*
    >
    >A **peerDependency** says, "If you want to use me, you need this thing available to *you*."
     
    Angular의 `package.json`파일은 몇몇의 *peerDependency* 패키지를 명시하며,
    각각은 특정 버전의 서드파티 패키지에 고정되어 있습니다.
  
    The Angular `package.json` specifies several *peer dependency* packages, 
    each pinned to a particular version of a third-party package.
  
    ### Anuglar의 *peerDependencies*는 직접 설치해야만 합니다.
  
    ### We must install Angular's *peerDependencies* ourselves.
    
    *npm*은 `dependencies` 목록에서 *여러분의* 패키지를 설치할 떄,
    *그 패키지들*의 `dependencies`에 있는 패키지들 또한 설치합니다.
    그 과정은 재귀적입니다.
  
    When *npm* installs packages listed in *your* `dependencies` section,
    it also installs the packages listed within *their* packages `dependencies` sections.
    The process is recursive.
    
    하지만, 버전 3에서는 *npm*은 *peerDependencies* 목록의 패키지를 설치하지 *않습니다*.
  
    However, as of version 3, *npm* does *not* install packages listed in *peerDependencies* sections.
  
    이는 여러분의 어플리케이션이 Angular를 설치할 때, 
    ***npm*은 자동으로 Angular의 *peerDependencies* 목록의 패키지들을 설치하지 않는다**는 것입니다.
  
    This means that when your application installs Angular, ***npm* doesn't automatically install
    the packages listed in Angular's *peerDependencies* section**.
    
    다행이도 *npm*은 경고를 통해 (a) *상호 의존성(peer dependencies)*이 깨질때, 또는 (b)
    어플리케이션이나 다른 의존성이 다른 버전의 *상호 의존성*을 설치할 때 알려줍니다.
  
    Fortunately, *npm* issues a warning (a) When any *peer dependencies* are missing, or (b)
    When the application or any of its other dependencies
    installs a different version of a *peer dependency*. 
  
    이 경고는 버전 불일치로 인한 우연한 실패를 막아줍니다.
    여러분에게 패키지와 버전 결정을 할 수 있게 해줄 것입니다.
    
    These warnings guard against accidental failures due to version mismatches.
    They leave you in control of package and version resolution.
    
    따라서 *상호 의존성* 패키지를 **여러분의 *devDependencies*에** 목록화 하는 것은 여러분이 해야할 일입니다.
  
    It is your responsibility to list all *peer dependency* packages **among your own *devDependencies***.
    
  .l-sub-section
    :marked
      #### *peerDependencies*의 미래
      
      #### The future of *peerDependencies*
      
      Angular의 폴리필 의존성은 강한 요구사항을 필요로 합니다. 현재는, 이를 선택적으로 만들 수 있는 방법이 없습니다.
  
      The Angular polyfill dependencies are hard requirements. Currently, there is no way to make them optional.
      
      하지만, npm의 기능 요청 중 "선택적인 peerDependencies"가 있습니다. 이것을 통해 여러분은 이 관계를 더 잘 구상할 수 있습니다.
      이 요청이 구현되면, Angular는 *peerDependencies*에서 *optionalPeerDependencies*로 모든 폴리필을 대체할 것입니다.
  
      However, there is an npm feature request for "optional peerDependencies," which would allow you to model this relationship better. 
      When this feature request is implemented, Angular will switch from *peerDependencies* to *optionalPeerDependencies* for all polyfills.
  