GN⁺ 9달전 | parent | ★ favorite | on: 모던 Node.js 패턴 (2025)(kashw1n.com)
Hacker News 의견
  • 가장 큰 변화는 ESM이 아니라 Node에 fetch와 AbortController가 내장된 점임, axios나 node-fetch를 제거하고 Lambda 번들의 크기도 줄었고 콜드 스타트 지연도 약 100ms 단축됨, 습관적으로 npm i axios를 쓰는 사람이라면 2025 Node 릴리스가 그만둘 때임
    • API 호출과 유효성 검증을 모두 아우르는 ts-rest를 전체 스택에서 선호함, zod/json schema 기반 라이브러리 중에 가장 가벼우면서도 robust한 타입 안전성을 제공함, HTTP 클라이언트도 원하는 것을 꽂아쓸 수 있고(bun, node엔진에서는 fastify 선택함), 오버헤드가 있지만 타입 안전성을 컴파일 단계로 옮길 수 있다는 점에서 충분히 가치 있는 선택임, 혹시 더 좋은 대안이나 생각 있으신지 궁금함, 찾을 수 있는 한 다 찾아봤는데 ts-rest만이 경량성과 타입 안전성을 모두 챙길 수 있었음
    • fetch 문법과 await response.json 등 추가적인 예외 처리 작업이 그렇게 마음에 들진 않았음, axios 쓸 때가 훨씬 직관적임, 예시 코드에서도 axios는 단순하게 response.data를 처리할 수 있고, fetch는 직접 status 체크한 뒤 JSON을 파싱해야 해서 더 번거로움
    • 라이브러리 저자로서는 오히려 ESM 도입이 훨씬 힘들고 아팠지만 그만큼 가치있는 업그레이드였음, fetch 자체는 훌륭하지만 ESM 덕에 진짜 많은 것을 얻을 수 있었음
    • node fetch가 axios보다 훨씬 쉽고 단순해서 더 좋음, 아직 어떤 분들은 axios를 계속 쓰는지 몰랐음
    • 내장 요청 라이브러리인 Undici가 굉장히 기대됨, undici 공식 사이트 참고
  • 다음과 같이 파일 시스템이나 네트워크 접근 권한을 제한해서 실행할 수 있게 됨
    # 파일 시스템 접근 제한 예시
    node --experimental-permission \
      --allow-fs-read=./data --allow-fs-write=./logs app.js
    
    # 네트워크 제한 예시
    node --experimental-permission \
      --allow-net=api.example.com app.js
    
    Deno에서 영감을 받은 것 같음, 정말 훌륭한 기능임, Deno 퍼미션 기능 문서
  • chalk나 picocolors를 설치하지 않아도 이제 직접 텍스트 스타일링이 가능해짐
    const { styleText } = require('node:util');
    
    공식 styleText 문서 참고
  • 바로 적용 가능한 여러 가지를 알게 됨
    1. Node에 내장 테스트가 들어와서 jest를 굳이 쓸 필요가 없어짐
    2. Node에 watch 기능도 내장돼서 nodemon도 필요 없어짐
    • 아직도 jest를 선호함, jest-extended를 쓸 수 있기 때문임
    • Node의 내장 테스트 시스템은 퀄리티가 떨어진다고 생각함, 실제로 몇 주 써보면 왜 그런지 알게 되고, 이슈를 제기해도 Node 팀은 별 관심이 없음
  • Matteo Collina에 따르면 node fetch는 내부적으로 undici의 fetch를 사용함, WHATWG 웹 스트림을 만들어야 해서 본질적으로 undici의 request 방식보다 느림,
    언급한 유튜브,
    undici 작동 원리 블로그
    • 궁금한 사람을 위해 벤치마크는 이곳에서 볼 수 있음, 최근 M3 Max 맥북 프로에서 로컬과 네트워크 환경에서 테스트했는데 undici가 로컬에선 최고였지만 네트워크에선 Axios가 더 빠른 결과가 나옴, 이유는 정확히 모르겠지만 지난 1년 반 동안 undici 사용 경험은 뛰어났음, 프로덕션에서도 충분히 안정적으로 쓸 수 있지만, 뛰어난 성능을 최대로 뽑으려면 상황에 맞는 고민이 꼭 필요함
  • Node의 네이티브 typescript 트랜스파일러 덕분에 TS를 쓰는 사람들은 복잡도가 많이 줄어듦
    • 사실 타입만 제거하고 트랜스파일은 아님, TS enum 같은 건 제대로 동작하지 않음
    • 아직 실사용하기엔 부족함, Enum은 신경 안 쓰지만 확장자 없이 로컬 파일 import도 안되고, 생성자에서 class property 정의도 안 됨
    • --experimental-strip-types 플래그도 이제 필요 없음
  • 새로운 기능을 이런 식으로 우연히 알게 되는 경우가 많음, 브라우저 쓸 때처럼 “그건 최신이니까”라는 막연한 느낌이 있음, 예전 C#만 할 때는 새 언어 기능 소개를 읽고 정말 신나했는데 요즘은 다양한 언어를 병행하다 보니 한 언어만 따라가기도 쉽지 않음, 거의 블로그나 주변 영향을 통한 랜덤 학습임
    • Node(V8) 소식에 관심 많아서 2~3개월에 한 번씩 릴리즈 노트 읽고 이런 기능들을 챙김, 때로는 ECMA proposals도 읽어봄, 파이프라인 오퍼레이터가 꼭 들어갔으면 하는 바램임
  • 한동안 Node 생태계와 거리를 뒀다가 다시 보니 정말 흥미로운 신기능이 많아졌음, Deno와 Bun이 시장을 흔들면서 Node 개발진이 한층 분발한 결과라고 봄
  • 점점 Node가 Bun.js, Deno 등과의 경쟁에서 만만치 않은 존재로 변화 중임, 그런 상호 경쟁이 JS 런타임 발전에 긍정적임
    • 변화는 느리지만 확실하고 반가움, 그래도 Bun의 $ shell function이 아직 그리움, JS를 스크립트처럼 쓰는 게 정말 편리해서 서버에 두 런타임을 함께 올리고 싶진 않음
  • 브라우저처럼 Node의 신기능도 두 가지로 나눌 수 있다고 봄
    1. 전혀 새로운 기술
    2. 이미 있는 기능 위에 얹어진 "멋내기" 단계의 레이어
      사람들이 어느 쪽에 더 비중을 두는지 보는 것도 흥미로움
    • 누군가에겐 “멋내기 레이어”가 또 누군가에겐 사용성(ergonomics)이 될 수 있음