io.js 주간 뉴스 2015년 6월 19일

io.js와 Node.js 소식

이번 주에는 io.js 릴리스가 없었습니다. 전체 변경사항은 GitHub에서 확인할 수 있습니다.

커뮤니티 업데이트

다가오는 이벤트

  • Nodeday 입장권은 무료입니다. 6월 26일 런던의 DigitasLBi에서 열립니다.
  • CascadiaJS 입장권을 판매하고 있습니다. 7월 8일부터 10일까지 워싱턴 주에서 열립니다.
  • BrazilJS Conf 입장권을 판매하고 있습니다. 8월 21일과 22일 BarraShoppingSul 쇼핑 센터에서 열립니다.
  • NodeConf EU 입장권을 판매하고 있습니다. 9월 6일부터 9일까지 아일랜드 워터포드에서 열립니다.
  • JSConf CO가 10월 16일부터 17일까지 Medellin의 Ruta N에서 열립니다.

npm is Massive

npm이 현재까지 가장 큰 패키지 생태계라는 것을 알고 있는가? JavaScript와 Node.js 세상에서 npm은 강력하다. npm은 너무 강력하고 훌륭해서 투자하려고 고생할 필요도 없다. npm은 그 규모에서나 Node 커뮤니티 내의 중요성에서나 강력하다.

npm은 Node.js의 패키지 관리자고 개발자들이 JavaScript 애플리케이션에서 파일이나 메타데이터, 의존성을 쉽게 관리하도록 만들어졌다. 2009년 오픈 소스 프로젝트로 시작된 npm은 개발자들이 인터넷을 통한 서비스로 오픈 소스 코드를 관리할 수 있도록 패키지 저장소 기능을 제공한다.

질문. npm은 무엇처럼 보이는가?

현재 npm, Inc에서 npm 프로젝트와 저장소를 무료로 서비스하고 관리하고 있다.

답변. NodeSource 디자인 팀은 npm을 위처럼 만들었다. npm의 N|Signt의 시각화를 확인해 봐라(Hugh Kennedy가 만든 인터랙티브 디자인이다).

npm이 만들어진 후 그 역할은 프론트엔드 웹 애플리케이션, 모바일 애플리케이션, 그 외 JavaScript 개발 도구나 프레임워크의 관리를 포함해서 JavaScript와 Node.js 개발자 커뮤니티의 더 넓어진 요구사항을 만족하도록 확장되었다.

저장소: 매시브

이 글을 쓰는 시점에 공개 npm 저장소에는 155,000개가 넘는 패키지가 존재한다. 5천 개 이상의 패키지가 지난주에 추가되었고 지난달에는 15억 번의 다운로드가 발생했다. 무덤덤한 사람들도 npm의 규모에는 어느 정도 큰 인상을 받을 것이다.

하지만 이 규모는 저장소가 잘 동작하게 하는데 도전이 되기도 해서 아주 유용한 몇 가지 파싱 트릭이 좀 필요했다.

  • readme 파일을 지원하지 않는 패키지는 제외한다. 이는 핵심 요소이다.
  • package.json 파일에 license 필드가 없는 패키지는 제외한다. 라이센스가 없는 패키지는 허가 없이 상업적으로 이용할 수 없다.
  • 원본 소스를 가진 GitHub 저장소가 연결되어 있지 않은 패키지는 제외한다. 저장소가 없으면 리뷰하거나 개선점을 제안하기가 어렵다.
  • 테스트 스크립트가 포함되어 있는지 검사한다. 모든 패키지가 테스트 스크립트를 가진 것은 아니지만, 테스트 스크립트가 있다면 커뮤니티가 잘 관리하고 있다는 좋은 표시이다.

기업용 Node 회사가 공개 npm 저장소 외에 이점을 취할 방법이 몇 가지 있다. npm, Inc.는 패키지를 올린 사람이나 올린 사람이 공유한 다른 유료 사용자만 볼 수 있는 비공개 npm 모듈을 등록할 수 있는 서비스를 제공한다. npm Enterprise는 프라이버시, 스토리지 같은 요구사항이나, 배포 가능한 번들을 만족하도록 방화벽 내에서 동작한다.

의존성

저장소의 순수한 크기를 넘어서 npm의 중요한 역할 중 하나는 Node.js 모듈의 의존성을 관리하는 것이다. 모듈화가 Node 개발의 핵심 설계 원칙 중 하나이므로 Node 모듈이 확장 모듈로 (거대하게) 늘어나는 경향을 보았다.(그래서 모듈 간에 의존성을 가진다.) 이로써 패키지의 사용성이 증가하고 더 작게 모듈화된 컴포넌트를 작성하는 경향이 커지게 된다.

npm은 Node 패키지의 수가 증가하는 조직을 npm의 scoped 패키지 기능으로 잘 지원할 수 있다. 이 기능으로 발행하고 사용하고 배포하는 코드와 의존성에 대한 이해를 제공한다.

NodeSource와 npm

NodeSource는 npm을 Node 개발과 빠른 프로젝트의 진화, Node 형식의 코드 모듈화를 위한 필수 도구로 본다. npm은 개발자에게 최소한의 부담을 주면서 코드를 쉽게 공유할 수 있게 하고 내/외부 Node 패키지에 쉽게 접근할 수 있게 한다. npm은 공개 저장소와 분리해서 Node 프로젝트를 안전하고 안정적으로 배포할 수 있게 하는 좋은 선택이다.

NodeSource는 Node 기초에 대한 소개 과정에서 npm을 가르치고 중급 과정에서는 npm의 구체적인 내용에 집중하고 며칠 동안 진행되는 DevOps 과정에서는 npm의 고급 개념을 가르친다.

npm은 성공적인 Node.js 조직이나 프로젝트에 고루 퍼져있다. npm은 Node/JavaScript 커뮤니티, Node.js에 관련된 일반적인 오픈 소스 유산, 특징과 공통된 목표를 가진다. 그것은 npm을 세계 수준인 Node 전략의 핵심 부분으로 만드는 것이다.

정말 강력하다.

N|Sight 소개

NodeSource에서는 문제를 시각화할 수 있는지가 문제를 해결하는 핵심이라고 생각한다. 당신의 팀이 지리적으로 얼마나 분산되어 있는지를 얘기할 수도 있고 보여줄 수도 있다. 이것이 NodeSource N|Sight를 만든 이유이고, 이는 Node의 강력함과 아름다움을 보여주는 일련의 시각화다. N|Sight로 종종 시각화를 만들어서 공유할 예정이다. 주제에 대해서 많은 말을 하는 것보다 더 명확하고 기억에 남는 이야기를 할 수 있다.

"Understanding npm"은 N|Sight 시각화의 첫 번째 작품이다. 우리가 만든 것을 즐겁게 보기를 바라고 원하는 시각화가 있다면 #visualizethis 해시태그를 달아서 트위터(@nodesource)에 알려주기 바란다.

"npm"과 "npm 저장소"는 npm, Inc의 소유이고 모든 권리는 npm, Inc.에 있다.

io.js 주간 뉴스 2015년 6월 12일

io.js 2.3 릴리스

이번 주에는 io.js v2.3.0 릴리스가 있었습니다. 전체 변경사항은 GitHub에서 확인할 수 있습니다.

주요 변경 사항

  • libuv: 1.6.0, 1.6.1로 업그레이드 했습니다. 자세한 내용은 전체 변경사항을 확인하세요. (Saúl Ibarra Corretgé) #1905 #1889. 주요 변경:
    • OS X에서 TTY가 멈추는 문제를 수정했습니다.
    • UDP가 보내는 콜백이 동기가 되지 않도록 수정했습니다.
    • uv_os_homedir()를 추가했습니다. (os.homedir()로 사용할 수 있습니다. 아래를 참조하세요.)
  • npm: 자세한 내용은 전체 릴리스 노트를 확인하세요. (Kat Marchán) #1899. 주요 변경:
    • GIT_SSH_COMMAND 사용 (Git 2.3에서 사용가능)
  • openssl:
    • 1.0.2b, 1.0.2c로 업그레이드 했습니다. DHE 중간자 공격 방어(Logjam)를 도입하고 변형된 ECParameter가 무한 루프를 발생시키던 문제를 수정했습니다. (CVE-2015-1788). 더 자세한 내용은 보안 권고를 확인하세요. (Shigeki Ohtsu) #1950 #1958
    • OpenSSL의 FIPS 모드를 지원합니다. 소개 글은 README를 확인하세요. (Fedor Indutny) #1890
  • os: os.homedir() 메서드가 추가되었습니다. (Colin Ihrig) #1791
  • smalloc: 전체 모듈을 폐기할 예정입니다. (Vladimir Kurchatkin) #1822
  • 새로운 협력자가 추가되었습니다.

알려진 이슈

현재 알려진 이슈의 전체 목록은 https://github.com/nodejs/io.js/labels/confirmed-bug에서 보실 수 있습니다.

  • beforeExit 중에 참조 해제된 타이머에 대한 문제가 아직 남아 있습니다. #1264
  • REPL에 입력된 서로게이트 페어가 터미널을 얼릴 수 있습니다. #690
  • process.send()가 문서에 쓰여진 것처럼 동기적이지 않으며, 이 문제는 1.0.2에서 발생했습니다. #760#774에서 해결했습니다.
  • DNS 질의 진행 중에 호출된 dns.setServers()가 실패한 단언문으로 프로세스를 크래시시킬 수 있습니다. #894
  • url.resolve가 다른 두 호스트 사이를 해석하는 중 URL의 인증 정보 부분을 교환할 수 있습니다. #1435

커뮤니티 업데이트

다가오는 이벤트

  • CascadiaJS 입장권을 판매하고 있습니다. 7월 8일부터 10일까지 워싱턴 주에서 열립니다.
  • BrazilJS Conf 입장권을 판매하고 있습니다. 8월 21일과 22일 BarraShoppingSul 쇼핑 센터에서 열립니다.
  • NodeConf EU 입장권을 판매하고 있습니다. 9월 6일부터 9일까지 아일랜드 워터포드에서 열립니다.
  • JSConf CO가 10월 16일부터 17일까지 Medellin의 Ruta N에서 열립니다.

io.js 주간 뉴스 2015년 6월 5일

io.js 뉴스

이번 주에는 io.js의 릴리스는 없습니다. 전체 변경사항은 GitHub에서 확인할 수 있습니다.

커뮤니티 업데이트

다가오는 이벤트

  • NodeConf Adventure 입장권을 판매하고 있습니다. 6월 11일부터 14일까지 캘리포니아 Walker Creek Ranch에서 열립니다.
  • CascadiaJS 입장권을 판매하고 있습니다. 7월 8일부터 10일까지 워싱턴 주에서 열립니다.
  • BrazilJS Conf 입장권을 판매하고 있습니다. 8월 21일과 22일 BarraShoppingSul 쇼핑 센터에서 열립니다.
  • NodeConf EU 입장권을 판매하고 있습니다. 9월 6일부터 9일까지 아일랜드 워터포드에서 열립니다.

io.js 주간 뉴스 2015년 5월 29일

io.js 2.2 릴리스

이번 주에는 io.js의 v2.2.0, v2.2.1 버전을 릴리스했습니다. 전체 변경사항은 GitHub에서 확인할 수 있습니다.

주요 변경 사항

v2.2.0

  • node: 가비지 컬렉션으로 정리될 객체를 많이 만들지 않도록 fs.statSync()fs.readFileSync()의 내부 구현을 최적화해, require()의 속도를 향상시켰습니다. 가장 주요한 이점은 애플리케이션 기동 속도를 향상시킨 것과, 수천 가지 예외 이벤트 중 대부분을 제거해 디버거의 기동 속도를 향상시킨 것입니다. (Ben Noordhuis) #1801.
  • node: 프리 로드 모듈을 처리할 때(-r, --require) 단순히 경로를 처리(resolving paths)하는 대신 표준 require() 규칙을 따릅니다. 그래서 이제 node_modules 안의 모듈을 프리 로드할 수 있습니다. (Ali Ijaz Sheikh) #1812.
  • npm: npm을 v2.11.0으로 업그레이드 했습니다. preversion, version, postversion 생명주기 이벤트를 위한 새로운 훅, 몇 가지 SPDX에 관한 라이센스 변경과 라이센스 파일이 추가되었습니다. 더 자세한 내용은 릴리스 노트를 보세요.

v2.2.1

  • http: 문서화하지 않은 client 프로퍼티의 제거를 되돌렸습니다. 이 프로퍼티는 널리 사용되며 특히 npm의 request에서 사용되고 있습니다. (Michaël Zasso) #1852.

알려진 이슈

현재 알려진 이슈의 전체 목록은 https://github.com/nodejs/io.js/labels/confirmed-bug에서 보실 수 있습니다.

  • beforeExit 중에 참조 해제된 타이머에 대한 문제가 아직 남아 있습니다. #1264
  • REPL에 입력된 서로게이트 페어가 터미널을 얼릴 수 있습니다. #690
  • process.send()가 문서에 쓰여진 것처럼 동기적이지 않으며, 이 문제는 1.0.2에서 발생했습니다. #760 그리고 #774에서 해결했습니다.
  • DNS 질의 진행 중에 호출된 dns.setServers()가 실패한 단언문으로 프로세스를 크래시시킬 수 있습니다. #894
  • url.resolve가 다른 두 호스트 사이를 해석하는 중 URL의 인증 정보 부분을 교환할 수 있습니다. #1435

커뮤니티 업데이트

  • Rod Vagg가 쓴 노드 커뮤니티의 분열과 화해에 관한 글입니다.
  • SoundCloud에서 첫 Node 기술 결정 위원회(TSC) 미팅을 들으실 수 있습니다.
  • io.js에 새로운 벤치마킹 워킹 그룹 nodejs/benchmarking#1이 생겼습니다.
  • nodejs.com에 노드 재단 하의 iojs + node.js에 관한 블로그 글이 올라왔습니다.
  • io.js의 새 기여자를 위해 새로이 good first contribution 태그를 구현했습니다.
  • TheNewStack에 iojs와 node.js의 새로운 관계에 관한 블로그 글이 올라왔습니다.
  • Oliver Zeigermann이 ES6과 iojs 구현에 관한 저장소를 만들었습니다.

다가오는 이벤트

  • NodeConf Adventure 입장권을 판매하고 있습니다. 6월 11일부터 14일까지 캘리포니아 Walker Creek Ranch에서 열립니다.
  • CascadiaJS 입장권을 판매하고 있습니다. 7월 8일부터 10일까지 워싱턴 주에서 열립니다.
  • BrazilJS Conf 입장권을 판매하고 있습니다. 8월 21일과 22일 BarraShoppingSul 쇼핑 센터에서 열립니다.
  • NodeConf EU 입장권을 판매하고 있습니다. 9월 6일부터 9일까지 아일랜드 워터포드에서 열립니다.

io.js 주간 뉴스 2015년 5월 22일

io.js 1.8, 2.0, 2.1 릴리스

io.js 1.8, 2.0, 2.1 릴리스, 커뮤니티 업데이트와 이벤트

io.js 1.8, 2.0 그리고 2.1 릴리스

이번 주 v1.8.2, v2.0.2, v2.1.0 3개의 io.js를 릴리스했습니다. 전체 변경사항은 GitHub에서 확인할 수 있습니다.

1.8.2

유지 릴리스

  • 암호화: TLS의 메모리 사용을 상당히 줄임 (Fedor Indutny & Сковорода Никита Андреевич) #1529

  • npm: 2.9.0으로 업데이트. 자세한 사항은 v2.8.4v2.9.0 릴리스 노트를 확인하세요.

2.0.2

  • win,node-gyp: 기본값으로 윈도우 애드온의 딜레이-로드 훅이 이제 제대로 활성화 됩니다. 2.0.0에서는 실수로 비활성화되었습니다. (Bert Belder)#1433
  • os: 임시 디렉터리가 '/'에 있을 때의 이슈를 고치려고 tmpdir()의 마지막 슬래시(/) 제거를 개선했습니다. 또한 어떤 슬래시가 운영체제에서 사용되는지 고려합니다. (cjihrig) #1673
  • tls: gcm과 aes128을 사용하려고 기본 암호화를 업데이트 했습니다. (Mike MacCana) #1660
  • build: 이전의 보안 이슈를 해결한 이후 v8 팀이 제안한 대로 v8 스냅샷을 기본적으로 다시 사용할 수 있게 했습니다. 이로써 구동과 vm 컨텍스트 생성 모두에 성능 향상이 약간 있을 것입니다. (Trevor Norris) #1663
  • src: --require옵션을 사용하기 전에 다른 플래그를 사용하면 프리로드 옵션이 동작하지 않던 문제를 수정했습니다. (Yosuke Furukawa) #1694
  • dgram: send()콜백이 비동기로 동작하지 않던 문제를 수정했습니다. (Yosuke Furukawa) #1313
  • readline: emitKey는 버퍼링 데이터를 충분히 파싱할 때까지 버퍼링 데이터를 가지고 있습니다. 이 수정으로 파싱 스플릿 이스케이프에 관한 문제도 해결됩니다. (Alex Kocharin) #1601
  • cluster: cluster.worker에게 '디스커넥트'를 올바르게 보냅니다. (Oleg Elifantiev) #1386
  • events: 잡히지 않은 에러(uncaught errors)도 이제 약간의 컨텍스트를 제공합니다. (Evan Lucas) #1654

2.1.0

  • crypto: 디피-헬만 키 교환(DHE) 매개변수(‘dhparams’)는 1024비트 이거나 그 이상이어야 합니다. 그 외에는 에러를 던지게 됩니다. 2048비트 이하로 사용할 경우 경고 메시지를 콘솔에 출력하게 됩니다. 이 보안 문제에 대해서는 https://weakdh.org/에서 자세히 보실 수 있습니다. (Shigeki Ohtsu) #1739
  • node: 새로운 --trace-sync-io 커맨드 라인 플래그는 경고를 출력하고 동기 API가 사용될 때 스택을 추적합니다. 애플리케이션을 느리게 만드는 동기 호출을 추적할 때 사용할 수 있습니다. (Trevor Norris) #1707
  • node: 메서드 체이닝을 위해 ‘net’, ‘dgram’, ‘http’, ‘https’, ‘tls’에서 사용한 setTimeout(), setKeepAlive(), setNoDelay(), ref(), unref() 메서드는 undefined 대신 현재의 인스턴스를 반환합니다. (Roman Reiss & Evan Lucas) #1699 #1768 #1779
  • npm: v2.10.1로 업그레이드 한 릴리스 노트를 https://github.com/npm/npm/releases/tag/v2.10.1https://github.com/npm/npm/releases/tag/v2.10.0에서 볼 수 있습니다
  • util: console.log()에서 사용되는 util.format()에 한 개의 문자열 인자를 넘기는 일반적인 경우를 위한 속도 향상(35% 정도)이 있었습니다. (Сковорода Никита Андреевич) #1749

알려진 이슈

현재 알려진 이슈의 전체 목록은 https://github.com/nodejs/node/labels/confirmed-bug에서 보실 수 있습니다.

  • beforeExit 중에 참조 해제된 타이머에 대한 문제가 아직 남아 있습니다. #1264
  • REPL에 입력된 서로게이트 페어가 터미널을 얼릴 수 있습니다. #690
  • process.send()가 문서에 쓰여진 것처럼 동기적이지 않으며, 이 문제는 1.0.2에서 발생했습니다. #760 그리고 #774에서 해결했습니다.
  • DNS 질의 진행 중에 호출된 dns.setServers()가 실패한 단언문으로 프로세스를 크래시시킬 수 있습니다. #894
  • url.resolve가 다른 두 호스트 사이를 해석하는 중 URL의 인증 정보 부분을 교환할 수 있습니다. #1435

커뮤니티 업데이트

다가오는 이벤트

  • NodeConf Adventure 입장권을 판매하고 있습니다. 6월 11일부터 14일까지 캘리포니아 Walker Creek Ranch에서 열립니다.
  • CascadiaJS 입장권을 판매하고 있습니다. 7월 8일부터 10일까지 워싱턴 주에서 열립니다.
  • BrazilJS Conf 입장권을 판매하고 있습니다. 8월 21일과 22일 BarraShoppingSul 쇼핑 센터에서 열립니다.
  • NodeConf EU 입장권을 판매하고 있습니다. 9월 6일부터 9일까지 아일랜드 워터포드에서 열립니다.

Growing Up.

성장하기

io.js는 재단이 필요합니다.

2012년 node.js는 잘 진행되었습니다. 우리는 일정한 핵심 기여와 활발한 커뮤니티를 가지고 있었고, 세계에서 가장 빠르게 자라고 있었다고 확신했습니다. 최근 몇몇 사람들은 프로젝트의 소유권에 대한 그들의 걱정을 알렸습니다. 커뮤니티는 프로젝트를 성공으로 이끌어 왔고 나와 여러 사람의 걱정은 커졌습니다.

2014년. 거의 모든 사람이 핵심(core)을 종료하는 것에 동의했고 여기에 큰 문제가 있었습니다. 우리는 모두 어떻게 이 문제를 해결할지에 대한 아이디어가 있었지만, 시도할 수 없었습니다. 왜냐하면, 우리의 소유가 아니었기 때문입니다. 몇 달 후 io.js는 문제 해결의 아이디어를 시도해보기 위해서 만들어졌고 더 많은 기여자를 참여시키고 프로젝트를 배포했습니다.

이런 아이디어는 잘 먹혔습니다. 열린 참여, 자유로운 기여 정책 그리고 정기적 배포는 더 많은 기여자를 모으고 프로젝트를 개선하기 위한 것이었습니다.

우리는 그 커뮤니티의 모든 레벨에 기여한 프로젝트도 만들었습니다. 실행 그룹은 웹 사이트를 유지하고 전파하는 그리고 흐름을 구현하는 그룹입니다.

우리는 현실적으로 개인이나 회사가 소유한 io.js의 다양한 자산들을 커뮤니티 소유의 법인 없이 커뮤니티 소유가 되는 것을 고려하고 있습니다. 도메인 이름은 Fedor의 소유이고, GitHub org를 위한 결제 계약은 Colin, 배포를 결정하는 키를 가진 것은 NodeSource인 등의 이유 때문입니다. 이 문제들이 2012년의 node.js의 문제가 아니었던 것처럼 현재의 모든 소유자가 선의로 행동하는 이 소유권들은 급한 문제가 아닙니다. 더 좋은 결과를 얻고 싶지만, 이 문제는 더 나빠졌고, 나의 밤잠을 설치게 했습니다.

커뮤니티와 많은 회사가 io.js 프로젝트를 지원했습니다. 빌드 자원은 DigitalOcean, Rackspace, NodeSource, Linaro, Scaleway, Joyent와 Voxer가 기부하고 있습니다. 일찍이 TC의 개발자들이 NodeSource, Strongloop, Voxer와 Walmart에서 io.js만을 위해 일하기 위해 고용되었습니다. 프로젝트는 커뮤니티에 의해 운영되지만 우리는 계속 회사의 도움으로 프로젝트를 진행해 나갔습니다.

우리는 프로젝트 운영이라는 좋은 일을 마쳤지만, 우리가 하지 못한 많은 것들이 있습니다. 우리는 직접적인 재정자원을 가지지 못했기 때문입니다. 전통적 마케팅, 공개적/분석적 관계, 그리고 법적으로 모두 그대로입니다. 프로젝트 초기에 이런 문제들은 거의 없었지만 우리는 이 문제들을 우리의 계속된 성공의 장벽으로 키웠습니다. 우리는 이 끝나지 않은 프로젝트에서 이익을 추구하지 않습니다. 사실 우리가 너무 오랫동안 이 문제에 대해 기다린다면 프로젝트를 둘러싼 상업적 관심들은 프로젝트의 주인이 되려고 하거나 무산될 수 있습니다.

io.js는 집이 필요합니다. 그 집은 여전히 커뮤니티에 의해 운영되는 프로젝트를 지원할 수 있는 중립적 기관입니다.

작년 7월 나는 모든 종류의 structures 그리고 지지와 함께 다양한 재단을 찾기 위한 시간을 보냈습니다. 내가 얻은 것은 다른 핵심 기여자들과 Linux Foundation의 Collaborative Projects Initiative를 통해 프로젝트를 준비하라는 조언이었습니다.

핵심은 자치권입니다. 커뮤니티는 프로젝트를 운영하고 기술적인 결정을 내리고, 배포하는 등의 일을 합니다. io.js의 모든 것은 앞으로도 커뮤니티에 의해 관리 될 것입니다.

우리는 자치권이 얼마나 강력하고 중요한지 이미 알고 있습니다. 이 자치권은 io.js 실행 그룹 모델의 근간입니다.

재단을 유지하려면 돈이 필요하고, 돈은 재단에 영향을 줄 수 있습니다. 이 외에는 별다른 방법이 없습니다. 궁금한 점은, 그 영향력의 범위가 어느 정도일까 하는 것입니다. 만약 우리가 이 영향력을 무시하거나 이 영향력 주변에 구조물을 건설하지 않는다면, 더 넓은 영역에서의 비공식적인 영향을 받을 수 있습니다. 대신에, 재단에 협력하겠다는 표현을 한 재단 이사회의 이사를 기부자로 갖는 방법이 더 좋을 수 있습니다.

이사회는 재단의 이사회를 관리합니다. 또한, 내규와 마케팅을 담당할 직접적인 역할을 하고 있습니다. 이 말은 재단이 관심 있는 단일 사업을 독점하겠다는 말도 아니고, 어떠한 법적 장벽도 이해하고 해결할 수 있도록 해야 한다는 말입니다.

배포를 포함한 모든 기술적 결정은 이사회로부터 나온 자치권을 가진 기여자들에 의해서 관리됩니다. 이사회에서 기술을 담당하고 있는 구성원들은 프로젝트의 요구를 이사회로 전달하기도 합니다.


2월 초, Joyent는 node.js 자산을 재단에 포함하겠다고 알렸습니다. 그 재단은 지금 Linux Foundation의 지원을 받고 위에 설명한 대로의 구조를 가지고 있는 형태입니다.

얼마 전, node.js, io.js와 어울리던 Linux Foundation이 관리 모델과 새로운 재단으로 프로젝트들을 다시 가져오는 기여 정책위에서 움직이기 시작했습니다. 관리, 실행 집단들, 개발 통합정책들은 준비되어있습니다.

이 재단의 정책들은 우리가 만든 io.js를 진행할 수 있게 보호하도록 설계되었습니다. 그들은 자유 기여 정책을 채택했고, 글자 그대로의 io.js의 열린 지배 구조를 채택했습니다. 그뿐만 아니라 이 재단은 위 정책 아래서 관리 자산을 소유할 수 있는 중립적인 기관과 함께 지원합니다.


그래서 우리는 조직되어 있고 우리가 참여하길 바라는 재단이 필요합니다. 개인적인 생각으로 io.js를 위한 이상적인 구조로 되어 있으면 좋겠습니다. 추가로 여전히 양분된 node.js와 io.js 커뮤니티의 분열과 혼란이 종식되기를 바랍니다. 만약 선택할 수 있다면, 우리는 이 모든 것을 얻고 싶고 관리 방법, 배포 과정, 그리고 실행 그룹을 온전히 지켜내고 싶습니다.

io.js 주간 뉴스 2015년 5월 15일

io.js 뉴스

**"io.js가 노드 재단에 합류"**하게 되었다는 소식을 전하게 되어 기쁩니다. 이에 따라 조직명이 nodejs로 바뀌게 될 것입니다.

그 첫 단계로, iojs 조직에서 nodejs 조직으로 옮겨가게 되고 joyent/node로 서서히 통합될 것입니다. 통합이 완료되기 전까지 계속 io.js를 릴리스할 것입니다.

통합 계획의 자세한 내용이 보고 싶으시면, jasnell의 저장소를 확인하세요. 질문하실 것이 있으시면 가볍게 @Fishrock123으로 질문해 주세요. 토론 기록은 여기에 있습니다.

커뮤니티 업데이트

  • 성능 대결: Node.js 대 io.js v2.0.0.
  • Microsoft가 JavaScript VM Chakra에서 실행하는 node.js를 발표했습니다.
  • {node,io}.js 밴치마크 그래프.
  • TC 맴버가 io.js에서 Node 재단으로 옮기기로 결정하고 조직 이름이 nodejs로 바뀝니다.
  • YouTube에서 하드웨어 WG 미팅을 볼 수 있습니다.
  • YouTube에서 io.js/node.js 빌드 통합 미팅을 볼 수 있습니다.
  • YouTube에서 TC 미팅을 볼 수 있습니다.

다가오는 이벤트

  • NodeConf Adventure 입장권을 판매하고 있습니다. 6월 11일부터 14일까지 캘리포니아 Walker Creek Ranch에서 열립니다.
  • CascadiaJS 입장권을 판매하고 있습니다. 7월 8일부터 10일까지 워싱턴 주에서 열립니다.
  • BrazilJS Conf 입장권을 판매하고 있습니다. 8월 21일과 22일 BarraShoppingSul 쇼핑 센터에서 열립니다.
  • NodeConf EU 입장권을 판매하고 있습니다. 9월 6일부터 9일까지 아일랜드 워터포드에서 열립니다.

2015년의 JavaScript와 babel 이야기

시작하며

Node.js 일본 유저 그룹 대표인 후루카와(@yosuke_furukawa)입니다. 루비마에는 처음 글을 써보네요. 잘 부탁드립니다.

오늘은 JavaScript의 기본적인 이야기와, 앞으로의 JavaScript인 ECMAScript2015(구 ECMAScript6)의 이야기를 중심으로 할까 합니다.

ECMAScript2015(이하 ES2015)는 올해 6월에 다음 공식 ECMAScript 사양으로 발표되었습니다. 이 ECMAScript의 사양을 준수한 언어 구현이 JavaScript이며, 간단히 설명하면 앞으로의 브라우저에는 이 ES2015의 사양을 준수하는 새로운 JavaScript를 사용할 수 있게 됩니다.

하지만 이것은 이후의 브라우저이며, 현재 배포 중인 브라우저에서는 사용할 수 없습니다. ES2015의 기능을 지원하는 브라우저를 기다리지 않고, ES2015로 구현해, 이것을 지금 배포 중인 브라우저에서도 동작하게 하는 트랜스파일러 babel(구 6to5)에 대해서 이번에 설명할까 합니다.

또, Ruby를 쓰시는 분들 중에 웹 애플리케이션을 만드시는 분들도 많다고 생각합니다만, 이 babel은 다음 Sprockets의 v4.x에 도입을 검토하고 있고, 새로운 Sprockets에서는 ES6로 작성 가능해질 수도 있습니다.

트랜스파일러의 장점

트랜스파일러란, ES2015 이후의 문법으로 적힌 JavaScript를 지금 사용 중인 브라우저에서도 사용할 수 있게 변환하는 도구입니다.

ES2015는 6월에 사양 공개가 예정되어 있으며, 활발하게 토론 중입니다. Chrome의 개발 빌드(Canary)나 Firefox의 개발판(Aurora)에도 많은 ES2015의 기능이 구현되어 있으며, 일부 기능은 이미 지금 브라우저에서도 사용할 수 있게 되었습니다. 하지만 모든 기능을 사용할 수 있는 브라우저는 아직 없습니다.

더욱이, JavaScript에는 다른 언어에서는 반드시 있을 법한 일반적인 기능이 없을 때가 많고, 그것을 보완하기 위한 Underscore라는 라이브러리나 CoffeeScript, TypeScript, JSX 같은 altJS가 나오게 되었습니다.

ES2015에 대응하는 JavaScript를 사용함으로써, 라이브러리가 필요 없게 되어, 기존 라이브러리를 줄일 수 있게 된다든가, altJS에 기대지 않고도 풍부한 언어 기능을 사용할 가능성이 커졌습니다.

또 수 년 후에는 ES2015가 널리 퍼져있을 거라 생각하면, 그때가 되기 전에 ES2015의 새로운 문법, 신기능을 배워두는 편이 부드럽게 이전할 수 있습니다.

ECMAScript 2015에 대하여

ECMAScript 2015에는, 밑에 있는 사양이 기능으로 추가됩니다.

  • let/const에 의한 블록 스코프
  • Map/Set/WeakMap/WeakSet에 의한 컬렉션
  • 형을 정의하는 클래스
  • 제너레이터/for..of
  • Promises
  • Template String Literals
  • 화살표 함수
  • 모듈

babel에 관하여

지금 가장 업데이트가 자주되는 트랜스파일러 중 하나입니다. 다른 트랜스파일러도 몇 가지 있지만, 새로운 문법을 가장 많이 지원하고 있는 게 babel입니다. 덤으로 읽는 법은 정해저 있지 않습니다. 여러 읽는 법이 허용되므로, "바벨"이 아니라 "바브"로 읽어도 된다고 합니다.[1]

babel에서 지원하는 문법 목록 babel에서 지원하는 문법 목록 http://kangax.github.io/compat-table/es6/

ECMAScript 2015에서 변하는 JavaScript의 문법

ES2015에는 여기에 전부 다 소개하기 힘들 정도로 많은 기능이 들어있습니다. 개인적으로 중요하다고 생각하는 것은 소개하겠지만, 전부 확인하고 싶으신 경우엔 ES2015의 드래프트를 일독하시길 권합니다.

ES2015의 목표는 아까 말한 드래프트에 적혀 있고, 다음과 같은 내용입니다.

ECMAScript 제6판의 목표에는 다음과 같은 내용이 포함되어 있습니다.

  • 대규모 앱의 개발 지원
  • 라이브러리 구축지원
  • 다른 언어에서 컴파일 대상으로 사용될 것

구체적인 개선안으로,

  • 모듈화
  • 클래스 정의
  • 블록 스코프
  • iterator, generator
  • 비동기 프로그램을 위한 Promise
  • 디스트럭처링
  • 꼬리 재귀 최적화

라는 내용이 포함되어 있습니다.

또, ECMAScript의 라이브러리로 map, set, binary 배열, 유니코드 보조 문자, 정규표현 확장이 빌트인으로 추가 됩니다. 이런 빌트인 기능을 서브 클래스로 확장하는 것도 가능합니다. 즉, 대규모 개발을 견딜 수 있도록, 적절히 모듈화하고, 적절한 단위로 클래스를 설계해 블록 스코프로 변수를 한정적으로 취급하는 것도 가능합니다.

또 비동기 프로그래밍에 관해서는 Promise로 비동기 처리를 추상화할 수 있게 되었습니다. 더욱이 iterator나 generator를 사용해 지연 반복 처리도 할 수 있게 되었습니다. 이런 기능은 관계형 언어의 흐름에 따르는 거라 필자는 생각하고 있고, 또 꼬리 재귀의 최적화도 이런 유행을 따르는 기능 추가라고 생각합니다.

그러면, 이런 기능에 대해 하나하나 소개해보도록 하겠습니다. 사실 그 밖에도 Template String Literals라던가, 화살표 함수가 정의되어 있지만, 이 글에서는 설명하지 않겠습니다.

모듈화

모듈을 나눌 수 있게 되었습니다. 여태까지 JavaScript에서는 언어 레벨의 모듈 분할이 불가능 했습니다. 그래서 JavaScript를 모듈화해 프론트에서 읽을 때에는 require.js를 사용하거나, browserify를 사용하거나 해서, 라이브러리로 해결하거나, 전역 공간에 커스텀 이름 공간을 만들어 거기에서 만드는 등의 처리를 했습니다.

ES2015부터는 이런 모듈화를 하기 위한 전용 구문 export와 import를 사용할 수 있게 되었습니다.

기본적으로는 commonjs와 비슷합니다. 즉, export로 객체를 import할 수 있게 하고, require 대신 import 구문으로 객체를 사용할 수 있게 합니다.

그 밖에...

그 밖에 =>로 함수를 정의하는 Arrow Functions나 문자열 중간에 변수를 넣거나 히어독을 사용할 수 있는 Template String Literals, Symbols이나 Proxy등 전부 다 언급하기 힘들 정도로 많은 기능이 있습니다.

이후의 ECMAScript2015의 전망

위의 언급에서도 알 수 있듯이, JavaScript에 클래스나 모듈이 도입되어, 최적의 단위로 모듈과 클래스를 분해해 설계하는 것이 가능해졌습니다. 또 let이나 const로 변수의 스코프를 제한할 수도 있게 되었습니다. 이런 기능은 대규모 앱 개발을 할 때나 라이브러리를 만들 때 도움이 될 것입니다.

또, generator/iterator/Promise 등의 함수형 프로그래밍 개념이 도입되고, 꼬리 재귀의 최적화로 부작용을 줄이는 작성법도 할 수 있게 되었습니다. ES6에는 ES5까지의 방법보다 현대적인 기능이 들어 있습니다.

이미 ECMAScript의 사양을 정한 TC39는 다음 ES7에 대한 준비도 하고 있습니다. 현시점에서는 아직 검토 중입니다만, async-await라는 비동기 호출을 동기처럼 호출할 수 있는 C#에 있는 기능이라든가, Optional Typing 기능으로 인한 types나 Object의 감시를 하는 Object.observe라는 기능이 검토되고 있습니다.

이런 기능 전부 브라우저에서 사용 가능하게 되는 건 아직 훗날의 일입니다만, babel에는 몇 가지 실험적으로 먼저 구현해본 ES7의 기능도 있습니다. 또 babel에는 구현되어 있지 않더라도, flow와 함께 사용해 타입 검사를 하거나, jsx와 함께 사용해 전에 있었던 E4X 같은 XML 리터럴을 사용할 수도 있게 되었습니다.[2]

여기에서는 전부 소개할 수 없었지만, babel에는 이 밖에도 미정의의 변수/함수를 체크하는 기능이라든가 실행되지 않는 코드를 지우는 데드 코드 삭제 기능, 인라인 전개 기능 등의 최적화가 들어있어, 굉장히 많은 기능이 있습니다.

babel을 사용해 새로운 JavaScript를 배우고 싶으신 분들을 위해 tower-of-babel이라는 ES6 튜토리얼 학습 도구를 만들었습니다.

tower-of-babel 한국어로 번역되어 있으니 이것도 한번 해보세요.

정리

앞으로의 JavaScript인 ES6의 이야기를 트랜스파일러인 babel과 함께 설명했습니다. ES6의 사양은 확정되지 않았고, 지금 사양에 관한 피드백을 받는 중입니다. 이 단계에서 적극적으로 ES6를 사용해 커뮤니티를 활발하게 하고 싶습니다. 버그나 문제가 있으면 피드백하면 개선될 가능성도 있습니다.

또, 이번 기능을 정리한 tower-of-babel을 만들었습니다.

꼭 사용해 보세요.

참고문헌

저자에 관하여

후루카와 요스케(古川陽介 / Yosuke Furukawa / @yosuke_furukawa). 일본 Node.js 유저 그룹 대표, io.js 에반젤리스트, io.js 컨트리뷰터. 글 작성 시점에는 회사에서 서버사이드로 Perl을 프론트로 JavaScript를 사용하는 풀스택 엔지니어


  1. 읽는법: https://github.com/babel/babel/issues/780#issuecomment-74426418

  2. 편집자 주: https://atnd.org/events/38810

io.js 주간 뉴스 2015년 5월 8일

io.js 2.0 릴리스

이번 주에 io.js v2.0.0v2.0.1을 릴리스했습니다. 전체 변경사항은 GitHub에서 확인할 수 있습니다.

주요 변경 사항

2.0.1

  • async_wrap: (Trevor Norris) #1614
    • 이제 프로바이더로 필터를 적용할 수 있습니다.
    • bit 플래그가 제거되고 바인딩 객체에서 메서드 콜로 대체되었습니다.
    • 이 API는 불안정하기 때문에 기능 추가와 비호환 변경으로 io.js의 유의적 버전을 변경하지는 않습니다.
  • libuv: 많은 io.js 문제를 해결했습니다.
    • #862 무효한 stdio 파일 서술자로 자식 프로세스를 만드는 것을 방지합니다.
    • #1397 Windows에서 fs.access(W_OK)할 때의 EPERM 오류를 수정했습니다.
    • #1621 동봉된 libuv와 관련된 빌드 에러입니다.
    • #1512 Windows 종료 오류를 수정했습니다.
  • addons: 오래된 컴파일러로 애드온을 컴파일할 때 NODE_DEPRECATED 매크로가 문제될 수 있었습니다. 이 문제는 이제 해결되었습니다.(Ben Noordhuis) #1626
  • V8: V8을 4.2.77.18에서 4.2.77.20으로 업그레이드했습니다. FreeBSD에서 빌드를 할 수 없는 버그를 포함한 자잘한 수정이 포함됩니다.

2.0.0

  • crypto: TLS의 메모리 사용량이 현저히 감소했습니다.(Fedor Indutny & Сковорода Никита Андреевич) #1529
  • net: socket.connect()은 이제 사용자 정의 DNS 해결 메커니즘을 위한 'lookup' 옵션을 받을 수 있습니다. 기본값은 dns.lookup()입니다.(Evan Lucas) #1505
  • npm: npm을 2.9.0으로 업그레이드 했습니다. 더 자세한 내용은 릴리스 노트 v2.8.4v2.9.0을 참조하세요. 주목할 만한 것들은 다음과 같습니다.
    • npm init -y를 사용자 입력 없이 할 수 있도록 기본 저자 필드에 대한 지원을 추가했습니다.(@othiym23) npm/npm/d8eee6cf9d
    • npm outdatednpm update에 지역 모듈이 추가되었습니다.(@ArnaudRinquin) npm/npm#7426
    • npm version의 버전 번호 앞에 붙는 접두사는 이제 tag-version-prefix로 설정할 수 있습니다.(@kkragenbrink) npm/npm#8014
  • os: os.tmpdir()은 이제 크로스 플랫폼에서 일관되게 동작하고 더 이상 어떤 플랫폼에서도 경로 뒤에 슬래시를 붙여 반환하지 않습니다.(Christian Tellnes) #747
  • process:
    • process.nextTick()의 성능이 벤치마크 스위트에 의하면 2-42% 향상되었습니다. 이는 코어에서 많이 사용되기 때문에 주목할 만합니다.(Brian White) #1571
    • process.geteuid(), process.seteuid(id), process.getegid(), process.setegid(id) 함수로 프로세스의 UID와 GID를 효율적으로 get, set할 수 있습니다.(Evan Lucas) #1536
  • repl:
    • NODE_REPL_HISTORY_FILE 환경 변수에 사용자가 접근할 수 있는 파일로 설정하면 REPL 이력을 세션 간에 유지하게 할 수 있습니다. NODE_REPL_HISTORY_SIZE로 최대 이력 크기를 결정할 수 있으며, 기본값은 1000입니다.(Chris Dickinson) #1513
    • NODE_REPL_MODE 환경 변수를 사용해 REPL을 sloppy, strict, magic(기본값) 3가지 모드 중 하나로 할 수 있습니다. 새 magic 모드는 스트릭트 모드에서는 자동으로 "strict mode only" 구문을 실행합니다.(Chris Dickinson) #1513
  • smalloc: 'smalloc' 모듈은 V8 4.4에서 사용할 수 없게 되므로 폐기될 예정입니다.
  • util: Promise, Map, Set 검사를 지원합니다.(Christopher Monsanto) #1471
  • V8: 4.2.77.18로 업그레이드했습니다. 자세한 내용은 변경 로그를 참조하세요. 주목할 만한 것들은 다음과 같습니다.
    • 클래스가 스테이징 단계를 벗어났습니다. 이제 class 키워드는 스트릭트 모드에서 플래그 없이 사용할 수 있습니다.
    • 객체 리터럴 개선이 스테이징 단계를 벗어났습니다. 이제 단축 메서드와 프로퍼티 문법을 사용할 수 있습니다. ({ method() { }, property })
    • Rest 매개변수(function(...args) {})가 스테이징에서 구현되었고 --harmony-rest-parameters 플래그로 사용할 수 있습니다.
    • 연산을 사용한 프로퍼티 이름({['foo'+'bar']:'bam'})이 스테이징에서 구현되었고 --harmony-computed-property-names 플래그로 사용할 수 있습니다.
    • 유니코드 이스케이프('\u{xxxx}')가 스테이징에서 구현되었고 --harmony_unicode 플래그로 사용할 수 있습니다. --harmony_unicode_regexps 플래그를 사용하면 정규표현식에서도 사용할 수 있습니다.
  • Windows:
    • Windows에서 무작위로 프로세스가 종료하던 문제가 고쳐졌습니다.(Fedor Indutny) #1512 / #1563
    • 프로세스 이름(iojs.exe / node.exe)이 네이티브 애드온에 옵트아웃을 하는 문제를 고치기 위해 지연 로드 훅이 도입되었습니다. 네이티브 애드온은 문제가 있을 경우 이 기능을 끄려면 binding.gyp에 'win_delay_load_hook': 'false'를 포함해야 합니다.(Bert Belder) #1433
  • Governance:
    • Rod Vagg (@rvagg)가 Technical Committee(TC)에 추가되었습니다.
    • Jeremiah Senkpiel (@Fishrock123)이 Technical Committee(TC)에 추가되었습니다.

비호환 변경

자세한 내용은 https://github.com/nodejs/node/wiki/Breaking-Changes#200-from-1x 에 있습니다.

  • V8이 4.2로 업그레이드되었습니다. C++ API의 사소한 변경이 있었습니다.
  • os.tmpdir()은 이제 크로스 플랫폼에서 일관되게 동작하고 어떤 플랫폼에서도 경로 뒤에 슬래시가 붙여 반환하지 않습니다.
  • 비호환 변경은 아니지만, V8 4.4으로 업그레이드하면 지원되지 않는 'smalloc' 모듈이 폐기될 예정입니다. 자세한 정보는 #1451를 확인하세요.

주의: 'url' 모듈의 새 버전은 릴리스 이전 버전으로 돌렸습니다. 이 결정은 npm 생태에서 비호환이 발생할 가능성이 너무 컸고, 릴리스 호환성 작업이 더 이루어져야 한다는 판단에서 했습니다. 자세한 정보는 #1602를 확인하세요.

알려진 이슈

현재 알려진 이슈의 전체 목록은 https://github.com/nodejs/node/labels/confirmed-bug 에서 보실 수 있습니다.

  • beforeExit 중에 참조 해제된 타이머에 대한 문제가 아직 남아 있습니다. #1264
  • REPL에 입력된 서로게이트 페어가 터미널을 얼릴 수 있습니다. #690
  • process.send()가 문서에 쓰여진 것처럼 동기적이지 않으며, 이 문제는 1.0.2에서 발생했습니다. #760 그리고 #774에서 해결했습니다.
  • DNS 질의 진행 중에 호출된 dns.setServers()가 실패한 단언문으로 프로세스를 크래시시킬 수 있습니다. #894
  • url.resolve가 다른 두 호스트 사이를 해석하는 중 URL의 인증 정보 부분을 교환할 수 있습니다. #1435
  • readline: 분리된 이스케이프가 제대로 처리되지 않습니다. #1403

커뮤니티 업데이트

  • Michael Dawson이 Node 재단에 WG proposal을 만들었습니다.
  • Mikeal Rogers가 미디엄에 io.js의 발전에 관한 글을 적었습니다.
  • CodeSchool이 io.js 2.0의 새로운 기능에 관한 블로그 글을 적었습니다.
  • Node Lead TJ Fontaine이 리더에서 물러났습니다.

다가오는 이벤트

  • NodeConf Adventure 입장권을 판매하고 있습니다. 6월 11일부터 14일까지 캘리포니아 Walker Creek Ranch에서 열립니다.
  • CascadiaJS 입장권을 판매하고 있습니다. 7월 8일부터 10일까지 워싱턴 주에서 열립니다.
  • BrazilJS Conf 입장권을 판매하고 있습니다. 8월 21일과 22일 BarraShoppingSul 쇼핑 센터에서 열립니다.
  • NodeConf EU 입장권을 판매하고 있습니다. 9월 6일부터 9일까지 아일랜드 워터포드에서 열립니다.