Node.js 서비스를 30줄 Bash로 교체한 이유와 피해야 할 때
Source: Dev.to
몇 달 전 작은 자동화 작업을 맡았습니다: 매일 사이트에서 URL 목록을 가져와 Google과 Bing에 페이지가 변경됐음을 알리고, 새 페이지가 며칠 대신 몇 시간 안에 인덱싱되도록 했습니다.
당연한 접근법은 작은 Node.js 서비스였습니다 — Google API 클라이언트, IndexNow 헬퍼, 스케줄러 라이브러리를 끌어와 서버에 배치하면 끝이었습니다.
먼저 Node 버전을 만들었습니다. 동작했습니다. 또한 40여 개가 넘는 트랜짓 의존성을 끌어들였고, 박스에 자체 런타임이 필요했으며, 인증 헬퍼 서명이 변경된 작은 버전 업데이트 three 주일 뒤에 깨졌습니다.
하루에 한 번 실행되고 토큰 서명 및 JSON POST만 하는 스크립트였기에, 이는 유지보수할 표면적이 너무 컸습니다.
그래서 삭제하고 약 30줄의 Bash 스크립트로 전체를 다시 썼습니다: curl, openssl, jq입니다. 이후 매일 밤 별다른 의존성 업데이트 없이 실행되었습니다.
여기서 정직한 관점을 제시합니다 — 이 교환이 가치가 있는 상황과 그렇지 않은 상황을요.
두 “hard” 부분은 생각보다 쉽Turned out not to be hard. Google 서비스 계정 JWT 서명 — SDK가 함수 호출 뒤에 숨기는 것이지만 — 은 헤더와 클레임 집합을 base64url- 인코딩하고, 점으로 연결된 문자열에 openssl dgst -sha256 -sign 로 서명한 뒤, 결과를 base64url- 인코딩하는 것만입니다. 네 줄이 전부です. 액세스 토큰으로 교환하는 것은 하나의 curl 요청이고, IndexNow에 제출하는 것도 하나 더입니다.
작성한 뒤 매력적인 점은 cleverness 가 아니라 거의 Nothing 이 남지 않았다는 것이었습니다. node_modules를 감사할 필요도 없고, 호스트에 런타임을 패치하거나 lockfile 드리프트를 할 일도 없었습니다. 전체 프로그램을 한 화면에 top to bottom 으로 읽을 수 있습니다. 문제가 생기면 로그에 표시되는 HTTPステータスコード가 아니라 제가 작성하지 않은 라이브러리에서 3층 깊이의 예외가 발생하는 것이 아니라, 명시적인 HTTP 상태 코드가 로그에 보입니다.
좁고 안정적이며 I/O- 바운드인 작업 — 일정에 맞춰 API를 호출하고 JSON을 약간 파싱하고 결과를 로깅하는 작업 — 에 Bash와 curl/ jq 조합은 진정으로 좋은 선택이며, “의존성 없음” 은 기능이지 특권이 아닙니다.
여기서 “just use Bash” 라는 사람들을 빼먹는 부분입니다. 요구사항이 커지면서 모든 장점이 반전됩니다.
상태ful하거나 분기적인 Anything. 제 할당량 트래커 — “하루 200개 URL 제한” — 은 이미 스크립트의 가장醜은 부분입니다. 리트라이와 백오프가 필요했던 날, 언어가 저를 반대하는 느낌을 받았습니다. 제어 흐름과 데이터 구조는 Bash가 줄 노이즈로 변하는 곳이죠.
테스트가 필요한 Anything. curl 호출의 집합에 대해 편안한 단위 테스트 스토리는 없습니다. 제 “테스트 스위트”는 실행하고 로그를 읽는 것입니다. 일일 인덱서는 괜찮지만, 사업에 중요한 것이라면 그렇지 않습니다.
타인에게 유지보수되는 Anything. 재능 있는 Bash 한 줄은 읽기 전용 매체입니다. 다음 엔지니어 — 혹은 6개월 뒤 저 — 는 30줄의 tr과 프로세스 치환을 읽고 조용히 파이썬으로 다시 쓰겠죠.
실제 파싱이 필요한 Anything. HTML에서 필드를 추출하기 위해 정규식을 찾거나 중첩된 JSON 엣지 케이스를 처리하는 순간 멈추세요. jq에는 한계가 있고, Bash 문자열 처리는 더 많습니다.
결정은 “Bash vs. Node” 가 아니라 “이것이 얼마나 변할까” 와 “누가 이를 감당해야 할까” 의 문제입니다. 타이머에 한 번 실행되고, 당신이 소유하며, 크게 보이고 명확하게 실패하는 스크립트에서는 런타임과 의존 트리를 버리는 것이 실제적이고 지속적인 승리입니다. 상태, 테스트, 동료, 또는 복잡한 파싱이 필요해질 순간, 제거한 의존성은 제공하던 것이었고, 다시 구입해야 합니다.
저는 Bash 인덱서가 결코 커지지 않았기 때문에 유지하고 있습니다. 그 자체로 전체 포인트입니다: 저는它이 작게 유지될 것이라고 알고 선택했고, 그것이 더 이상 사실이 되지 않는 날 다시 전환할 것입니다.
“지루하고 의존성 없는 도구”를 사용하는 것이 지루한 가정 아래에 맞춰 좋은 조언이며, 기술은 그 가정이 중단되는 시점을 포착하는 것입니다.