데보션앱 소개페이지 바로가기
로그인 선택

신고하기

CLOSE
신고사유 (대표 사유 1개)
상세내용 (선택)
0/200
  • 신고한 게시글은 더 이상 보이지 않습니다.
  • 이용약관과 운영정책에 따라 신고사유에 해당하는지 검토 후 조치됩니다.
  • 허위 신고인 경우, 신고자의 서비스 이용이 제한될 수 있으니 유의하시어 신중하게 신고해 주세요.
(이 회원이 작성한 모든 댓글과 커뮤니티 게시물이 보이지 않고, 알림도 오지 않습니다.)

미리보기

커뮤니티

      1,234

      badge 23.06.15

      글 등록

      카테고리를 선택해주세요.

      DEVOTEE를 활성화 시키면
      지금 작성한 커뮤니티 글에 대해 1개의 댓글을 달아줍니다.

      버튼을 누르면 글 수정 시 ChatGPT가 작성한 댓글이 수정됩니다.

      임시저장함에 저장되었습니다. 저장일시 : 2022.5.17 14:29:08

      임시저장함

      제목을 선택하시면 이어서 작성이 가능하며,
      최대 20건까지 저장합니다.
      컨텐츠 유형, 제목, 저장일시, 삭제로 이뤄진 임시저장 목록
      컨텐츠 유형 제목 저장일 삭제

      데보션 블로그 게재 요청

      CLOSE
      • *
      • *

      본인인증

      효율적인 데보션 서비스 이용 및
      고객님의 소중한 개인정보보호를 위해
      본인인증을 진행해주세요. 본인인증 미 진행 시 로그인이 제한됩니다.
      본인인증 실패

      본인인증 로그인에 실패하였습니다.
      회원이 아니시거나 본인인증 등록이
      완료되지 않은 사용자입니다.

      회원정보 연결

      Python 통합 코드 품질 도구 Ruff : Flake8, isort, Black의 대안

      mihosang 25.05.16
      5,341 7 1
      DEVOTEE 요약
      Ruff는 Rust로 작성된 초고속 Python 린터 및 코드 포맷터로, Flake8, isort, Black의 기능을 통합하여 최대 10~100배 빠른 성능을 제공합니다. 간단한 설치와 설정을 통해 대규모 프로젝트에서도 효율적인 코드 품질 관리가 가능하며, pre-commit을 활용해 커밋 시 자동으로 코드 검사와 포맷팅을 수행할 수 있습니다. 이를 통해 일관된 코드 품질 유지와 개발 효율성 향상을 기대할 수 있습니다.
      DEVOTEE 추천 블로그

      Overview

      Ruff는 Rust로 작성된 매우 빠른 Python linter 및 code formatter입니다. 기존의 도구들의 다양한 역할을 하나로 통합하여 코드에 대한 품질 검사와 포맷팅을 수행합니다.

      Rust로 작성되서 기존 도구 대비 10-100배 빠른 속도를 자랑하고 있습니다.


      ruff-benchmark

      Linting the CPython codebase from scratch.

      이번 글에서는 Ruff가 Python 코드 품질 도구로 널리 알려진 Flake8, isort, Black을 어떻게 효과적으로 대체할 수 있는지,

      그 설치 및 구성 방법, 그리고 pre-commit을 통해 코드 베이스에 코드를 커밋하기 전에 미리 검사하고 수정할 수 있도록 하는 방법에 대해 다룹니다.


      Ruff의 등장 배경

      Python 개발에서 코드 품질을 유지하기 위해 사용되는 다양한 도구들 중 가장 널리 사용되는 것들은 다음과 같습니다:

      • Flake8: Python 코드의 문법 오류 및 코딩 스타일 위반을 검사하는 linter

      • isort: Python import 문을 자동 정렬 도구

      • Black: Python 코드 스타일을 자동으로 포맷팅하는 도구

      기존 도구들은 각각 특정 기능에 초점을 맞추어 개발되었지만, 여러 도구를 함께 사용해야 하는 복잡성과 성능 이슈가 존재했습니다.

      코드베이스가 커짐에 따라 이러한 도구들의 실행 시간이 길어지면 개발 효율성을 저하시키는 문제가 있습니다.


      이러한 문제를 해결하기 위해 Rust로 작성된 Ruff가 등장했습니다.

      지금은 Apache Airflow, Superset, FastAPI, Hugging Face, Pandas, SciPy 등 메이저 오픈 소스에서 널리 사용되고 있으며 지원하는 빌트인 규칙이 800개 이상이며 플러그인 시스템을 통해 추가적인 규칙을 지원합니다.


      Ruff의 주요 기능

      • 속도: 기존 linter(Flake8)와 formatter(Black)보다 10-100배 빠름

      • 통합 기능: Flake8, isort, Black에 대한 Drop-in 대체재

      • 자동 수정: 사용되지 않는 import 문 제거 등 자동 오류 수정 지원

      • 캐싱: 변경되지 않은 파일은 재분석하지 않음

      • 풍부한 규칙: 800개 이상의 내장 규칙 지원


      Ruff 설치 및 설정

      기본 설치 방법

      Ruff는 pip를 통해 쉽게 설치할 수 있습니다:

      pip install ruff

      CLI 사용법

      설치 후 다음과 같이 사용할 수 있습니다:

      # 현재 디렉토리의 Python 파일 검사
      ruff check .
      
      # 자동 수정 기능 사용
      ruff check --fix .
      
      # 코드 포맷팅
      ruff format .

      설정 방법

      Ruff는 pyproject.toml, ruff.toml 또는 .ruff.toml 파일을 통해 구성할 수 있습니다.

      pyproject.toml 설정 예시

      [tool.ruff]
      # Exclude a variety of commonly ignored directories.
      exclude = [
          ".git",
          ".venv",
      ]
      
      # Code Formatting (Black) configuration
      line-length = 120
      indent-width = 4
      
      # Assume Python 3.12
      target-version = "py312"
      
      [tool.ruff.lint]
      # Enable Pyflakes (`F`) and a subset of the pycodestyle (`E`)  codes by default.
      # Unlike Flake8, Ruff doesn't enable pycodestyle warnings (`W`) or
      # McCabe complexity (`C901`) by default.
      select = ["E4", "E7", "E9", "F", "I"]
      ignore = []
      
      # Allow fix for all enabled rules (when `--fix`) is provided.
      fixable = ["ALL"]
      unfixable = []
      
      # Allow unused variables when underscore-prefixed.
      dummy-variable-rgx = "^(_+|(_+[a-zA-Z0-9_]*[a-zA-Z0-9]+?))$"
      
      [tool.ruff.format]
      # Like Black, use double quotes for strings.
      quote-style = "double"
      
      # Like Black, indent with spaces, rather than tabs.
      indent-style = "space"
      
      # Like Black, respect magic trailing commas.
      skip-magic-trailing-comma = false
      
      # Like Black, automatically detect the appropriate line ending.
      line-ending = "auto"
      
      # Enable auto-formatting of code examples in docstrings. Markdown,
      # reStructuredText code/literal blocks and doctests are all supported.
      #
      # This is currently disabled by default, but it is planned for this
      # to be opt-out in the future.
      docstring-code-format = false
      
      # Set the line length limit used when formatting code snippets in
      # docstrings.
      #
      # This only has an effect when the `docstring-code-format` setting is
      # enabled.
      docstring-code-line-length = "dynamic"


      기존 도구에서 Ruff로의 마이그레이션 전략

      단계적 접근 방법

      대규모 코드베이스에서 Ruff로 마이그레이션하는 권장 전략은 다음과 같습니다:

      1. 1단계: Ruff를 코드베이스에 추가하고 규칙 없이 실행

      2. 2단계: 최소한의 Ruff 설정을 제공하고, 필요한 규칙을 하나씩 추가하며 호환성 확인

      3. 3단계: 규칙을 하나씩 또는 작은 배치로 활성화하고 코드를 수정

      flake8-to-ruff 도구 활용

      기존 Flake8 설정을 Ruff 설정으로 변환하려면 flake8-to-ruff 도구를 사용할 수 있습니다:

      pip install flake8-to-ruff
      flake8-to-ruff path/to/setup.cfg
      flake8-to-ruff path/to/tox.ini
      flake8-to-ruff path/to/.flake8

      이 도구는 해당 파일을 분석하여 Ruff 호환 pyproject.toml 섹션을 생성합니다.

      pre-commit 훅 설정

      pre-commit을 활성화해두면 커밋될때 마다 자동으로 코드 품질 검사와 포맷팅을 수행합니다.

      이를 통해 일관된 코드 스타일과 정적 문법 오류를 줄일 수 있습니다.


      기존의 경우 pre-commit 설정을 다음과 같이 Flake8, isort, Black으로 구성했습니다.

      # .pre-commit-config.yaml
      repos:
        - repo: https://github.com/PyCQA/isort
          rev: 6.0.1
          hooks:
            - id: isort
              exclude: ^app/alembic/.*$
      
        - repo: https://github.com/ambv/black
          rev: 25.1.0
          hooks:
            - id: black
              args: [--line-length=120]
              exclude: ^app/alembic/.*$
      
        - repo: https://github.com/pycqa/flake8
          rev: 7.1.2
          hooks:
            - id: flake8
              args: [--config=.flake8]
              exclude: ^app/alembic/.*$

      Ruff를 사용하는 경우 다음과 같이 통합해서 설정 가능합니다.

      # .pre-commit-config.yaml
      repos:
        - repo: https://github.com/astral-sh/ruff-pre-commit
          rev: v0.11.8
          hooks:
            - id: ruff
              args: [--fix]
            - id: ruff-format
              args: [--line-length=120]
              exclude: ^app/alembic/.*$

      설정한 pre-commit 훅을 설치하고 모든 파일 검사 및 수정을 수행할 수 있습니다.

      # pre-commit 훅 설치
      uvx pre-commit clean
      uvx pre-commit install
      
      # 모든 파일 검사 및 수정
      uvx pre-commit run --all-files


      도입 효과

      Ruff를 사용하면 Flake8, isort, Black을 대체할 수 있을 뿐만 아니라 다음과 같은 효과를 얻을 수 있습니다:

      • 코드 리뷰 프로세스 간소화: 일관된 코드 품질을 유지하고 리뷰 시간 단축

      • CI/CD 파이프라인 통합: 자동화된 품질 체크를 통한 지속적인 코드 품질 관리

      • 개발 효율성 향상: 빠른 피드백 루프로 실시간 품질 문제 식별 및 수정


      TL;DR

      • Ruff는 Flake8, isort, Black의 기능을 하나로 통합한 초고속 Python 코드 품질 관리 도구입니다.

      • 기존 도구들보다 10~100배 빠르며, 대부분의 규칙과 포맷팅 방식을 호환해 손쉽게 대체설치와 설정이 간편해 대규모 프로젝트에서도 효율적인 코드 품질 관리가 가능합니다.

      • Pre-commit을 통해 커밋될때 마다 자동으로 코드 품질 검사와 포맷팅을 수행합니다.


      References

      댓글 0

      DEVOTEE를 활성화 시키면
      지금 작성한 댓글에 AI가 댓글을 달아줍니다.

      mihosang 님의 최신 블로그

      더보기

      DEVOTEE 추천 블로그

      동영상 기고하기