개요
개발을 할 때, 코드의 품질을 높이기 위해 Lint와 같은 정적 분석 도구를 사용하곤 합니다. 하지만 정적 분석 툴은 일반적인 규칙만 제공하지 모든 규칙을 제공하지 않습니다. 그래서 정적 분석툴이 제공하지 않는 규칙을 코드 검사에 추가하고 싶을 때는, Lint의 커스텀 규칙을 추가해서 사용하곤 합니다.
이렇게 추가한 커스텀 규칙은 Lint의 대상이 되는 코드만 검사가 가능하지만 주석과 같은 부분은 검사를 하지 못하는 경우가 있습니다. 이런 경우 Semgrep
을 사용하여 정규식을 통해 커스텀 규칙을 만들 수 있습니다.
Semgrep
Semgrep
은 코드의 안전성, 품질, 스타일을 자동으로 검사하고 개선하기 위한 정적 분석 도구입니다. 주로 소스 코드를 분석하여 보안 취약점, 버그, 코드 품질 문제를 찾아내는 데 사용됩니다.
- Semgrep: https://github.com/semgrep/semgrep
Semgrep
은 사용자 정의 규칙을 정규식 패턴으로 작성할 수 있는데, 이를 사용하면 Lint와 같은 정적 분석 도구로는 검사하기 어려운 부분을 검사할 수 있습니다.
이번 블로그 포스트에서는 Semgrep
을 사용하여 정규식으로 코드를 검사하는 방법을 알아보겠습니다.
Semgrep 설치
Semgrep
은 파이썬에서 동작하므로, 기본적으로 파이썬이 설치되어있어야 합니다. 각 OS에 파이썬을 설치하는 방법은 생략하도록 하겠습니다.
Semgrep
은 파이썬 패키지로 설치할 수 있습니다. Semgrep
을 설치하기 위해서 다음 명령어를 실행합니다.
pip install semgrep
설치하였다면, 다른 곳에서도 사용할 수 있도록 requirements.txt
을 생성합니다.
pip freeze > requirements.txt
requirements.txt
을 열면 다음과 같은 내용이 추가된 것을 확인할 수 있습니다.
semgrep==1.97.0
이 requirements.txt
을 활용하여, 다른 곳에서 Semgrep
을 설치할 때 다음 명령어를 사용하면 됩니다.
pip install -r requirements.txt
Semgrep 규칙 설정
이제 Semgrep
을 사용하여 정규식으로 코드를 검사하기 위해 코드 규칙을 작성해 보겠습니다. 먼저, code-rules.yaml
파일을 생성하고 다음과 같은 내용을 작성합니다.
rules:
- id: missing-param-description
severity: ERROR
message: 【Comment error】 Add correct comment.
languages:
- javascript
- typescript
patterns:
- pattern-regex: \*\s*@.*-\s*(\n|\r\n|$)
이 규칙은 다음과 같은 내용을 검사합니다.
❌ Incorrect
다음과 같이 주석을 작성하지 않은체 -
을 남겨둔 경우, 에러가 발생합니다.
/**
* Add two numbers
* @param {number} a - number for addition
* @param {number} b -
* @returns {number}
*/
✅ Correct
다음과 같이 모든 주석이 작성되어 있는 경우, 에러가 발생하지 않습니다.
/**
* Add two numbers
* @param {number} a - number for addition
* @param {number} b - number for addition
* @returns {number}
*/
Semgrep 실행
이제 Semgrep
을 사용하여 코드를 검사해보겠습니다. 다음 명령어를 실행하면, Semgrep
이 코드를 검사하고 결과를 출력합니다.
semgrep --config=code-rules.yaml --error
이 명령어를 실행하면 다음과 같은 결과를 확인할 수 있습니다.
┌──── ○○○ ────┐
│ Semgrep CLI │
└─────────────┘
Scanning 7035 files (only git-tracked) with 1 Code rule:
CODE RULES
Scanning 5089 files.
SUPPLY CHAIN RULES
No rules to run.
PROGRESS
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% 0:00:00
┌──────────────────┐
│ 93 Code Findings │
└──────────────────┘
apps/sample/view/index.ts
❯❯❱ missing-param-description
【Comment error】 Add correct comment.
12┆ * @param {Params} params -
13┆ * @return {number}
...
GitHub Actions
이렇게 설정한 Semgrep
을 사용하여 GitHub Actions에서 코드를 검사할 수 있습니다. 다음과 같이 .github/workflows/semgrep.yml
파일을 생성하고 다음과 같은 내용을 작성합니다.
name: Check code by Semgrep
on:
pull_request:
jobs:
semgrep:
name: Check code by Semgrep
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
with:
fetch-depth: 0
- uses: actions/setup-python@v5
with:
python-version: '3.13'
cache: 'pip'
- run: pip install -r requirements.txt
- name: Run Semgrep
run: |
semgrep --config=code-rules.yaml --error
이제 GitHub Actions에서 PR을 생성하면 다음과 같은 에러가 발생하는 것을 확인할 수 있습니다.
Run semgrep --config=code-rules.yaml --error
METRICS: Using configs from the Registry (like --config=p/ci) reports pseudonymous rule metrics to semgrep.dev.
To disable Registry rule metrics, use "--metrics=off".
Using configs only from local files (like --config=xyz.yml) does not enable metrics.
More information: https://semgrep.dev/docs/metrics
┌─────────────┐
│ Scan Status │
└─────────────┘
Scanning 7034 files tracked by git with 1 Code rule:
Scanning 5087 files.
┌──────────────────┐
│ 93 Code Findings │
└──────────────────┘
apps/agencyTool/src/feature/AdminStaffDetailDialog/controller/actions/initialize/index.ts
❯❯❱ missing-param-description
【Comment error】 Add correct comment.
12┆ * @param {Params} params -
13┆ * @return {number}
...
완료
이것으로 Semgrep
을 사용하여 정규식으로 코드를 검사하는 방법을 알아보았습니다. Semgrep
을 사용하면 정적 분석 도구로는 검사하기 어려운 부분을 검사할 수 있습니다.
코드 리뷰에서 반복적으로 동일한 문제를 지적하고 있다면, 우선 ESLint와 같은 정적 분석 도구에서 그 문제에 관한 규칙이 있는지 찾아보고, 있는 경우 그 규칙을 추가합니다.
만약, 그 규칙이 없고 해당 문제가 정형화된 패턴을 가지고 있다면, Semgrep
을 사용하여 정규식으로 코드를 검사하는 방법을 사용해보세요.
이 블로그 포스트가 Semgrep
을 사용하여 코드 품질을 향상시키는데 도움이 되었으면 좋겠습니다.
제 블로그가 도움이 되셨나요? 하단의 댓글을 달아주시면 저에게 큰 힘이 됩니다!
앱 홍보
Deku
가 개발한 앱을 한번 사용해보세요.Deku
가 개발한 앱은 Flutter로 개발되었습니다.관심있으신 분들은 앱을 다운로드하여 사용해 주시면 정말 감사하겠습니다.