Gitsunmin

TIL

TIL
(=Today I Learned)

Gritql

GritQL이란?

GritQL은 코드베이스에서 특정 패턴을 **검색(Search)**하고 **변환(Transform)**하기 위한 선언적 쿼리 언어입니다. Tree-sitter 기반 AST 매칭을 사용해 코드 구조를 이해하며, 코드 리팩토링, API 마이그레이션, 린트 규칙 자동화에 강력하게 활용됩니다.

“코드 그 자체를 쿼리로 쓴다”는 콘셉트로, console.log($msg)와 같이 코드 예시 그대로 패턴을 정의할 수 있습니다.


주요 특징

1. 코드 기반 패턴 매칭

  • 코드 스니펫을 백틱(“) 으로 감싸 패턴으로 사용
  • $변수로 메타변수를 지정해 다양한 코드 구조를 매칭 가능
`console.log($msg)`

2. 코드 변환 (Rewrite)

  • => 연산자를 통해 매치된 코드를 새 코드로 대체 가능
`console.log($msg)` => `winston.info($msg)`

3. 조건 필터링 (where 절)

  • 매칭된 패턴에 조건 추가 가능 (e.g., 특정 블록 내/외부 여부)
`console.log($msg)` => `.` where {
  $msg <: not within `if (DEBUG) { $_ }`
}

4. 복합 패턴 조합 (or / and)

or {
  `console.log($msg)`,
  `console.error($msg)`
} => `logger.info($msg)`

5. 문맥 한정자 (within, contains, after, before)

  • AST 계층 구조를 활용한 문맥 제약 가능
`$call` where {
  $call <: within `try { $_ } catch { $_ }`
}

6. 다중 언어 지원

  • JS/TS, Python, Rust, Go, SQL, JSON, YAML, Terraform 등
  • 동일 문법으로 다양한 언어 처리 가능

7. 패턴 라이브러리와 커스터마이징

  • 기본 제공되는 수백 개의 표준 패턴 (예: react_to_hooks)
  • 사용자 정의 패턴 모듈 작성 및 재사용 가능

설치 방법

npm install --location=global @getgrit/cli

또는:

curl -fsSL https://docs.grit.io/install | bash

사용 예시

✅ 콘솔 로그를 winston.log로 교체

grit apply '`console.log($msg)` => `winston.log($msg)`'

console.log 삭제 (단, try 블록 안은 유지)

`console.log($msg)` => `.` where {
  $msg <: not within `try { $_ } catch { $_ }`
}

✅ 테스트 함수 안에서는 변경하지 않기

patterns:
  - name: replace_log
    body: |
      `console.log($msg)` => `winston.log($msg)` where {
        $msg <: not within or {
          `it($_, $_)`, `test($_, $_)`, `describe($_, $_)`
        }
      }

활용 사례

  • 대규모 API 변경 및 리팩토링
  • 프레임워크 마이그레이션 (예: react_to_hooks)
  • 자동 린트 및 코드 품질 검사 (CI에서 grit check 사용)
  • 보안 패턴 탐지 및 자동 수정
  • 다국어 코드베이스 구조적 검색

🔗 공식 문서: https://docs.grit.io

📦 GitHub: https://github.com/getgrit/gritql