[Code Quality] Semgrep을 사용하여 정규식으로 코드 검사하기

2025-01-11 hit count image

Semgrep을 사용하면 정규식으로 코드를 검사하여 코드 품질을 향상시키는 방법에 대해서 알아봅시다.

개요

개발을 할 때, 코드의 품질을 높이기 위해 Lint와 같은 정적 분석 도구를 사용하곤 합니다. 하지만 정적 분석 툴은 일반적인 규칙만 제공하지 모든 규칙을 제공하지 않습니다. 그래서 정적 분석툴이 제공하지 않는 규칙을 코드 검사에 추가하고 싶을 때는, Lint의 커스텀 규칙을 추가해서 사용하곤 합니다.

이렇게 추가한 커스텀 규칙은 Lint의 대상이 되는 코드만 검사가 가능하지만 주석과 같은 부분은 검사를 하지 못하는 경우가 있습니다. 이런 경우 Semgrep을 사용하여 정규식을 통해 커스텀 규칙을 만들 수 있습니다.

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을 사용하여 코드 품질을 향상시키는데 도움이 되었으면 좋겠습니다.

제 블로그가 도움이 되셨나요? 하단의 댓글을 달아주시면 저에게 큰 힘이 됩니다!

앱 홍보

책 홍보

블로그를 운영하면서 좋은 기회가 생겨 책을 출판하게 되었습니다.

아래 링크를 통해 제가 쓴 책을 구매하실 수 있습니다.
많은 분들에게 도움이 되면 좋겠네요.

스무디 한 잔 마시며 끝내는 React Native, 비제이퍼블릭
스무디 한 잔 마시며 끝내는 리액트 + TDD, 비제이퍼블릭
[심통]현장에서 바로 써먹는 리액트 with 타입스크립트 : 리액트와 스토리북으로 배우는 컴포넌트 주도 개발, 심통
Posts