Outsider's Dev Story

Stay Hungry. Stay Foolish. Don't Be Satisfied.
RetroTech 팟캐스트 44BITS 팟캐스트

node.js v0.8의 API 변경사항

2일전에 v0.6.19가 릴리즈 되었습니다. 메일링에서 오가는 얘기를 보면 몇 주내에 새로운 안정버전인 v0.8이 릴리즈 될 예정이고 0.8에 대한 개발버전인 0.7은 0.7.9까지 릴리즈 된 상태입니다. 0.8에 대한 API는 완전히 프리징된 상태이고 하나나 두개의 버전을 통해서 테스트를 거친뒤에 안정화되면 아마 0.8이 릴리즈될 것입니다. 공식 트위터를 통해서 다음과 같이 공지하면서 0.8에 대한 준비에 들어가기 시작했습니다.

사용자 삽입 이미지

0.8이 릴리즈되면 초반의 안정화단계를 거치고 나면 바로 0.9 개발버전이 시작될 것입니다. 참고삼아 말하면 0.9가 진행되어봐야 정확하겠지만 메일링에서 오간 얘기를 보면 다음 안정버전이 1.0이 된다는 보장은 없습니다. 아마 0.10이 될 가능성이 더 높아보입니다. 버전이 찼다고 1.0을 내지않고 1.0수준에 도달했다고 생각했을 때 1.0 버전업을 하겠다고 밝힌 바 있습니다.

어쨌든 여러달 전부터 Node.js 개발팀은  위키에 API changes between v0.6 and v0.8 페이지에서 0.8에서의 API 변경사항을 문서화 해놓았습니다. 아직 0.8이 릴리즈 되지는 않았지만 API자체는 픽스되었기 때문에 0.8을 준비하는 차원에서 내용을 정리해두는게 좋겠다고 생각했습니다.



폐기된 API
  • http.Client()는 폐기되었습니다. 사용하면 곧 제거될 API라는 안내 메시지가 나올 것이라는 의미이고 주석을 보면 0.9부터는 제거될 듯 합니다. 이 http.Client()는 현재 API 문서에도 나와있지 않지만 v0.3까지 사용되었고 v0.4부터는 http.Agent가 추가되면서 문서에서도 제거되었습니다. 레거시코드에 대한 하위호환성을 위해서 코드상에서만 남아있었지만 이번에 deprecated 처리되었습니다.
  • path.exists(p, [callback])path.existsSync(p)fs.exists(p, [callback]), fs.existsSync(p)로 변경되었습니다. exists(p)는 p 경로의 파일이 실제 파일시스템에 존재하는지 확인하는 함수로 path 객체에서 이 메서드를 사용하면 fs.exists / fs.existsSync를 사용하라는 경고 메시지가 나옵니다.
  • tty.setRawMode(mode)tty.ReadStream#setRawMode()로 이동했습니다. (예를 들어 process.stdin.setRawMode()입니다.) 마찬가지로 tty.setRawMode를 사용하면 process.stdin.setRawMode를 사용하라는 경고 메시지나 나옵니다.



제거된 API
  • 0.8부터는 waf 빌드시스템이 제거되고 gyp 빌드시스템을 사용하는 것으로 변경되었습니다.(어찌보면 0.8에서의 가장 큰 변화고 빌드가 필요한 많은 모듈들이 0.8초기에 문제를 일으킬 수 있어보입니다.) 네이티브 모듈 작성자라면 기존 모듈을 node-gyp로 마이그레이션 해야합니다. waf는 파이썬기반의 프로그램으로 node.js 초창기부터 빌드시스템으로 사용하고 있었습니다.(node를 설치하면 node-waf가 들어 있습니다.) waf는 v0.4까지는 문제가 되지 않았지만 v0.6부터 윈도우지원이 추가되면서 waf의 비쥬얼 스튜디오 msbuild에서 빌드가 제대로 안되는 등의 문제가 발생하기 시작했습니다. 그래서 waf를 버리고 gyp로 갈아탔습니다. gyp(Generate Your Projects)Chromium의 크로스플랫폼 빌드를 위해서 만들어진 프로젝트입니다.
  • sys가 제거되었습니다. sys는 0.6에서 util로 변경되면서 deprecated된 상태였기 때문에 그동안 sys를 사용하면 util을 사용하라는 경고메시지가 나왔는데 0.8에서는 완전히 제거되었습니다.(현재 일부 모듈을 사용할 때 sys를 사용하고 있어서 경고메시지가 나오는 경우가 많은데 0.8 초기에는 이부분에 대한 오류가 발생할 듯 합니다.)



변경사항
  • process
    • process.stdin.on('keypress')가 내부 API에서 기본으로 실행되지 않습니다.
  • cluster
    • cluster.fork()는 이제 child_process.fork() 객체를 리턴하지 않습니다. 객체를 얻으려면 cluster.fork().process를 사용해야 합니다.
    • cluster 객체의 death 이벤트는 exit 로 이름이 바뀌었습니다.
    • kill() 메서드는 destory()로 바뀌었습니다.
    • CLUSTER_WORKER_ID가 이제 CLUSTER_UNIQUE_ID로 바뀌었지만 이를 사용하지 말아야 합니다.
    • 워커프로세스가 마스터와 연결이 끊겼을 때 스스로 kill하지 않습니다.
  • http
    • http.Server는 CONNECT 메서드가 요청되었을 때 upgrade 대신 connect 이벤트를 발생합니다.
    • http.ServerResponse는 기본적으로 Date: 헤더를 보냅니다. 이를 사용하지 않으려면 response.sendDate를 false로 지정해야 합니다.
    • http.ClientRequest는 CONNECT 메서드가 응답되었을 때 request대신 connect 이벤트를 발생합니다.
  • child_process
    • child_process.fork()의 arguments와 options의 아큐먼트들이 옵션값이 되었습니다.
    • 이제 자식프로세스가 종료된 직후 exit 이벤트가 실행됩니다. 더이상 모든 stdio 파이프가 닫히기를 기다리지 않습니다.
    • 자식프로세스가 종료되고 모든 stdio 파이프가 닫힌 후에 실행되는 close 이벤트가 추가되었습니다.
  • readline
    • rl.createInterface의 arguments는 rl.createInterface(options)와 같이 옵션값이 되었습니다. 하지만 rl.createInterface(input, output, completer)와 같은 기존 스타일도 사용할 수 있습니다.
  • url
    • url.parse()는 이제 IPv6 주소를 파싱합니다.
  • fs
    • path.exests()path.existsSync()fs.exists()fs.existsSync()로 바뀌었습니다.
  • console



추가된 API
  • buffer
    • 'utf16le' 인코딩이 추가되었습니다.
  • child_process
    • child_process.fork()에 silent 옵션이 추가되었습니다. stdout과 stderr은 부모와 공유하지 않습니다.
    • child_process.fork()를 사용했을 때 .disconnect()는 자식프로세스가 gracefule하게 죽도록 합니다.
  • cluster
    • 'fork', 'online', 'listening', 'setup' 이벤트가 추가되었습니다.
    • cluster.workers(마스터에서)나 cluster.worker(워커에서)에서 제공하는 Worker 객체가 추가되었습니다.
    • cluster.fork()에 선택적인 env 아규먼트가 추가되었습니다.
    • cluster.setupMaster()cluster.settings가 추가되었습니다.
    • cluster.disconnect()worker.disconnect()가 추가되었습니다.
    • 이전에는 내부적으로 workerID로 알려진 worker.uniqueID가 추가되었습니다.
    • 워커프로세스가 끊기거나 죽었을 때 의도적이지 않은 죽음이라는 것을 나타내는 worker.suicide 플래그가 추가되었습니다.
  • crypto
    • crypto.getDiffieHellman()이 추가되었습니다.
    • cipher.setAutoPadding()decipher.setAutoPadding()가 추가되었습니다.
    • crypto.createCredentials()에 ciphers 옵션이 추가되었습니다.
  • domain
    • domain 객체가 추가되었습니다. 하나의 그룹으로 여러가지 다른 IO 작업을 다룰 수 있는 객체입니다.
    fs
    • fs.appendFile()fs.appendFileSync() 추가되었습니다.
    • fs.open()fs.openSync()wx, wx+, ax, ax+ 모드가 추가되었습니다.
  • http
    • server.close()에 선택적인 콜백 아규먼트가 추가되었습니다.
    • http.ServerResponse에 sendDate 프로퍼티가 추가되었습니다.
  • https
    • https.request()https.get()에 ciphers와 rejectUnauthorized 옵션이 추가되었습니다.
  • net
    • net.connect(options, [connectionListener)가 추가되었습니다.
    • server.close()에 선택적인 콜백 아규먼트가 추가되었습니다.
  • process
    • process.abort()가 추가되었습니다.
    • 나노초로 세밀한 hi-res 타이머인 process.hrtime()가 추가되었습니다.
  • querystring
    • querystring.parse(str, [sep], [eq], [options])가 추가되었습니다.
  • stream
    • setEncoding()'utf16le' 'ucs2' 인코딩이 추가했습니다.
  • tls

    • Client-initiated renegotiation attack mitigationtls.CLIENT_RENEG_LIMITtls.CLIENT_RENEG_WINDOW가 추가되었습니다.
    • tls.connect(options, [secureConnectionListener])가 추가되었습니다.
    • tls.connect()에 ciphers, rejectUnauthorized, socket 옵션이 추가되었습니다.
    • cleartextStream.getCipher()를 api 문서에 추가하고 public으로 바뀌었습니다.
  • zlib
    • dictionary 옵션이 추가되었습니다.

더 자세한 내용은 실제 0.8을 사용해봐야 될 것 같지만(물론 지금 7.9에서 테스트해서 피드백준다면 더 좋겠지요.) 모듈 작성자가 아니라면 큰 문제는 없을듯 합니다. 다만 현재 waf로 빌드하는 모듈을 사용하고 있다면 0.8로 업그래이드할 때 주의해야 할 겁니다. 참고로 0.8에 대한 얘기는 아니지만 process.nextTick의 동작을 변경하자는 제안을 메일링에서 논의하고 있습니다. 물론 이는 0.8에는 적용되지 않고 바뀌더라도 0.9에 적용될 것이긴 하지만 process.nextTick은 node.js에서 중요한 메서드 이므로 0.9에서 어떻게 변경될 것인지 유의해서 보아두면 좋을 것입니다.
2012/06/08 03:30 2012/06/08 03:30