SW/JavaScript

패키지.json의 이해 II: 스크립트 활용법

얇은생각 2024. 11. 9. 07:30
반응형

Node.js 개발 환경에서 효율적인 빌드, 테스트, 배포 과정을 구현하기 위해 필수적인 요소 중 하나가 package.json에 정의된 npm 스크립트입니다. 개발자는 반복적인 작업을 자동화하고, 프로젝트 워크플로우를 간소화하며, 작업의 일관성을 유지하기 위해 npm 스크립트를 적극적으로 활용할 수 있습니다. 본 글에서는 npm 스크립트의 기본 개념구조, 사용법, 활용 사례에 대해 깊이 있게 알아보고, 이를 통해 개발 프로세스를 어떻게 효율적으로 만들 수 있는지 설명합니다.

 

패키지.json의 이해 II: 스크립트 활용법

 


 

1. NPM 스크립트란 무엇인가?

npm 스크립트는 Node.js 프로젝트에서 반복적으로 발생하는 다양한 작업을 자동화하기 위해 사용됩니다. package.json 파일의 scripts 필드에 명령어를 정의함으로써, 별도의 빌드 도구나 추가적인 의존성 없이 다양한 명령어를 손쉽게 실행할 수 있습니다.

 

NPM 스크립트를 사용하는 이유

  1. 빌드 및 개발 워크플로우 단순화: 빌드, 테스트, 배포 등의 작업을 자동화함으로써 복잡한 작업 흐름을 간단하게 만듭니다. 이를 통해 개발자는 생산성을 향상시키고 오류를 줄일 수 있습니다.
  2. 추가적인 빌드 도구 불필요: npm 스크립트는 Node.js에 내장되어 있기 때문에, 별도의 빌드 도구나 의존성이 필요 없습니다. 이는 개발 환경을 단순화하고 다양한 플랫폼에서 코드 공유를 용이하게 만듭니다.
  3. 쉬운 사용과 커스터마이징: npm 스크립트는 간단하게 사용할 수 있으며, 프로젝트의 필요에 따라 자유롭게 커스터마이징할 수 있습니다. 이는 개발자가 복잡한 빌드 도구나 설정 파일을 필요로 하지 않고도 작업을 자동화할 수 있게 합니다.
  4. 워크플로우 문서화 및 공유: npm 스크립트를 사용하면 팀 내에서 일관된 워크플로우를 정의하고 공유할 수 있습니다. 이를 통해 모든 팀원이 같은 프로세스를 따르도록 하여 일관성을 유지할 수 있습니다.
  5. 사전 및 사후 스크립트 제공: npm 스크립트는 특정 명령어 실행 전후에 사전(pre-) 및 사후(post-) 스크립트를 실행할 수 있는 기능을 제공합니다. 이는 명령어 실행 전후에 필요한 설정 작업이나 정리 작업을 자동화하는 데 유용합니다.

 


 

2. NPM 스크립트의 기본 구조

package.json 파일에서 scripts 필드를 추가하여 스크립트를 정의할 수 있습니다. 이 객체 안에는 key-value 형태로 스크립트가 저장됩니다. key는 스크립트 이름이고, value는 실행할 셸 명령어입니다.

NPM 스크립트 기본 예시

{
  "scripts": {
    "build": "npm run compile && node server.js",
    "test": "mocha"
  }
}

 

 

이 예시에서 build 스크립트는 두 가지 명령어를 실행합니다. 첫 번째로 npm run compile을 실행한 후, 성공적으로 완료되면 node server.js 명령어를 실행합니다. test 스크립트는 mocha 테스트 프레임워크를 사용하여 테스트를 실행합니다.

 

 

스크립트 실행 방법

스크립트를 실행하기 위해서는 터미널에서 npm run 스크립트명을 입력하면 됩니다. 예를 들어, test 스크립트를 실행하려면 다음과 같이 입력합니다.

npm run test

 

특정 스크립트는 npm run을 생략할 수 있습니다. 예를 들어 test 스크립트는 npm test 또는 npm t로 간단히 실행할 수 있습니다. 이와 마찬가지로 start 스크립트는 npm start로 실행할 수 있습니다.

 


 

3. NPM 스크립트 활용 사례

npm 스크립트는 단순한 명령어 실행을 넘어, 여러 명령어를 조합하거나 변수와 함께 사용할 수 있습니다. 이를 통해 더욱 강력한 자동화 기능을 제공합니다.

 

복수 명령어 실행

다음 예시에서는 빌드테스트 명령어를 함께 실행하는 스크립트를 정의합니다.

{
  "scripts": {
    "build-and-test": "npm run build && npm run test",
    "build-and-test-parallel": "npm run build & npm run test"
  }
}

 

  • && 연산자를 사용하여, build 명령어가 성공적으로 완료된 후 test 명령어를 실행합니다.
  • & 연산자를 사용하면 buildtest 명령어를 동시에 실행합니다. 이 경우 어느 명령어가 먼저 끝날지는 보장되지 않습니다.

 

변수 사용

npm 스크립트에서 package.json 파일의 값을 변수로 사용할 수 있습니다. 예를 들어, 패키지의 버전 정보를 가져오는 스크립트는 다음과 같이 정의할 수 있습니다.

{
  "scripts": {
    "build": "echo VERSION=$npm_package_version"
  }
}

 

 

이 스크립트를 실행하면 package.json 파일에 정의된 version 값이 출력됩니다.

 


 

4. NPM 스크립트에서 쉘 명령어 활용

npm 스크립트는 기본적으로 (sh) 명령어로 실행되므로, 쉘의 다양한 기능을 활용할 수 있습니다. 특히 &&, || 등의 연산자를 통해 명령어 실행 조건을 제어할 수 있습니다.

 

실패 시 다른 명령어 실행

다음 예시에서는 첫 번째 명령어가 실패하면 두 번째 명령어를 실행합니다.

{
  "scripts": {
    "test-or-fail": "npm run test || echo 'Test failed'"
  }
}

 

 

쉘 변경

Windows에서는 기본적으로 cmd 셸을 사용하지만, 다음 명령어를 사용하여 Git Bash 등 다른 셸로 변경할 수 있습니다.

npm config set script-shell "C:\\Program Files\\git\\bin\\bash.exe"

 


 

5. 라이프사이클 스크립트

NPM 라이프사이클 스크립트는 특정 단계에서 자동으로 실행되는 스크립트입니다. 예를 들어 preinstall, postinstall 스크립트는 패키지 설치 전후에 자동으로 실행됩니다.

 

라이프사이클 스크립트 예시

{
  "scripts": {
    "preinstall": "echo Running pre-install script",
    "postinstall": "echo Running post-install script"
  }
}

 

위 예시에서는 npm install 명령어를 실행할 때, 패키지 설치 전후에 각각 다른 스크립트를 자동으로 실행합니다.

 

 

주의 사항

특히 postinstall 스크립트는 보안 문제를 유발할 수 있기 때문에 사용 시 주의가 필요합니다. 공급망 보안 소프트웨어에서 경고가 발생할 수 있으며, 이는 악의적인 코드가 설치 중에 실행될 수 있는 취약점 때문입니다. npm 패키지 배포 시에는 postinstall 스크립트를 포함하지 않는 것이 좋습니다.

 


 

6. NPM 스크립트 작성 시 베스트 프랙티스

  1. 스크립트는 간단하고 읽기 쉽게 작성: 스크립트는 명확한 이름을 사용하고, 가능하면 짧게 작성하여 가독성을 유지합니다. 복잡한 작업은 여러 개의 작은 스크립트로 나누는 것이 좋습니다.
  2. 변수 사용 권장: 환경 변수나 package.json의 값을 변수로 활용하여, 경로나 파일명을 하드코딩하지 않도록 합니다.
  3. 플랫폼 독립적인 명령어 사용: 플랫폼 간의 차이를 최소화하기 위해 cross-platform 도구를 사용하여 스크립트를 작성하는 것이 좋습니다.
  4. 스크립트 독립성 유지: 스크립트 간의 의존성을 최소화하여, 서로 독립적으로 실행될 수 있도록 합니다. 필요한 경우 GulpGrunt와 같은 태스크 러너를 활용하여 작업 흐름을 관리할 수 있습니다.

 


 

결론

npm 스크립트는 Node.js 개발자라면 반드시 알아야 할 강력한 도구입니다. 이를 통해 반복 작업을 자동화하고, 개발 워크플로우를 크게 간소화할 수 있습니다. 또한, 스크립트 작성 시 몇 가지 베스트 프랙티스를 따르면 프로젝트의 유지보수성을 높이고, 팀 간 협업을 개선할 수 있습니다.

반응형