본문 바로가기

Backend/Node.js

CLI program

주절주절 프롤로그) 팀에서 담당하는 서버 중 이미지 서버가 현재는 요청받은 원본 이미지에 대해 JPEG + WEBP 이미지를 생성해서 업로드하고 있는데 WEBP 가 뒤늦게 추가된 스펙이다보니 옛날 이미지들에 대해선 WEBP 가 생성되어있지 않은 이슈가 있었고,

몇 건 되지 않는 이미지이다보니 JPEG 이미지 주소를 입력받으면 WEBP 로 만들어서 업로드해주는 CLI 가 있으면 쓸 수 있을 것 같다는

요청이 있어 NodeJS 로 작업해본 CLI 프로그램을 간단히 올려봅니다.

 

개발자에겐 cli 는 아주 익숙하리라 생각되구요. NodeJS 진영에서도 이미 리액트나, NestJS 등을 사용해본 개발자라면
create-react-app 또는 nest-cli 등을 통해 CLI 를 사용해본 경험이 있을겁니다. 이번에 만들건 이런식으로 동작하는 프로그램입니다.

 

> mkdir webp && cd webp
> npm init

 

우선 webp 디렉토리를 만들고 npm 프로젝트로 만들어줬습니다.

 

{
  "name": "webp",
  "version": "1.0.0",
  "description": "A CLI tool for creating webp from exist JPEG image",
  "type": "module",
  "main": "webp.mjs",
  "engines": {
    "node": ">=16.18"
  },
  "scripts": {},
  "bin": {
    "webp": "webp.mjs"
  },
  "author": "",
  "license": "ISC"
}

 

사실 뭐 거의 이게 전부인 수준인데.. 가장 핵심은 package.json 의 bin 속성입니다.

bin 속성을 통해 실행 가능한 자바스크립트 파일을 노출할 수 있습니다. 현 설정은 webp 명령어가 입력되면 webp.mjs 파일을 실행하라는

의미입니다. 그 외에는 노드버전, ecmascript 등을 사용하기 위한 설정들이 전부입니다.

 

{
  "bin": {
    "create-react-app": "./index.js"
  }
}

 

위에서 얘기했던 react 의 경우 이런식으로 bin 속성이 되어 있으니 이를 참고하시면 이해가 더 빠를거라 생각됩니다.

 

#!/usr/bin/env node

(async () => {
  const [, , thumbnailUrl] = process.argv;
  const regex = /https:\/\/xxx.io\/thumbnail\/[\w\-\.]+\/[\w\-\.]+\/[\w\-\.]+\/[\w\-\.]+.(jpg|jpeg)/g;

  if (!thumbnailUrl || !regex.test(thumbnailUrl)) {
    console.info('wrong thumbnail-url');
    return;
  }

  /*
    jpeg -> webp 로 생성후 업로드 하는 코드
  */

  console.info('upload done');
})();

 

작성한 webp.mjs 파일입니다. 이번 포스팅에서 얘기하려던건 cli 작성 부분이다보니 대부분의 코드는 주석처리했습니다.

메인이 되는 부분은 즉시실행함수로 작성했고, 코드 내용은 콘솔창에서 webp https://xxx.io/thumbnail... 와 같이 실행했을 때 인자로
받은 url 을 유효성 체크한 후 webp 로 변환, 업로드 하면 완료입니다.

 

가장 상위에 #!/usr/bin/env node 는 리눅스 등의 운영체제에서 CLI 프로그램의 node 위치를 지정하기 위한 문구입니다.

윈도우 운영체제라면 필요없는 걸로 알고 있습니다.

 

npm install -g

 

우리가 보통 npm 에 cli 로 사용할 수 있도록 등록된 라이브러리를 설치할 때 글로벌로 설치하죠.

지금 작성한 cli 프로그램도 그걸 의도한 것이므로 글로벌로 설치합니다.

설치 후 사용중인 node 버전의 위치로 가서 bin 디렉토리로 들어가보면 webp 가 있는것을 확인할 수 있습니다.

저 같은 경우엔 nvm 을 통해 node@16.18 을 사용했으므로 $HOME/.nvm/versions/node/v16.18.0/bin 에 위치해있네요.

 

> webp xxx
> wrong thumbnail

> webp https://xxx.io/thumbnail...
> upload done

 

이제 작성한대로 CLI 를 실행해보면, 잘 동작하는 것을 확인할 수 있습니다.

적고나서보니 실제 코드는 대부분 주석처리한게 좀 무성의한 것 같긴 하네요. 그냥 간단한 예시로 적을걸 그랬나 싶기도..

 

#!/usr/bin/env node

(() => {
  const [, , a, b] = process.argv;
  console.info('args', a, b);

  console.info('result:', Number(a) + Number(b));
})();

 

그래서 그냥 하나 더 만들었습니다. 간단하게 인자로 받은 두 수를 더하는 CLI 프로그램입니다.

일단 sum.mjs 라는 파일로 위와 같이 작성했구요.

 

{
  "bin": {
    "sample-sum": "sum.mjs"
  }
}

 

package.json 의 bin 프로퍼티에 sample-sum 을 추가했습니다. 그냥 sum 이라고 해도 되는데 명령어가 무언가랑 겹쳐서 앞에

sample- 을 붙인것 외에 별 의미는 없습니다. 동일하게 npm install -g 로 전역 설치합니다.

 

 

작성한 sample-sum 을 실행해보면 잘 동작하는 것을 확인할 수 있습니다.

 

저는 사내에서 사용할 CLI 프로그램이다보니 작성했던 패키지를 github private packages 에 올리고

필요한 개인이 전역으로 설치해 사용할 수 있도록 구성을 했었습니다. 하나의 예시일뿐이나 이처럼 CLI 를 작성하는건 아주 간단하니

필요에 따라 잘 활용하면 좋을 것 같습니다.

'Backend > Node.js' 카테고리의 다른 글

ZeroMQ 의 다양한 패턴  (0) 2023.02.18
Use AMQP (w/ RabbitMQ)  (0) 2023.02.11
Use ZeroMQ  (0) 2023.02.05
Messaging System  (0) 2023.01.28
MSA  (0) 2023.01.14