본문으로 건너뛰기
Kreath Archive
TechProjectsBooksAbout
TechProjectsBooksAbout

내비게이션

  • Tech
  • Projects
  • Books
  • About
  • Tags

카테고리

  • AI / ML
  • 웹 개발
  • 프로그래밍
  • 개발 도구

연결

  • GitHub
  • Email
  • RSS
© 2026 Kreath Archive. All rights reserved.Built with Next.js + MDX
홈TechProjectsBooksAbout
//
  1. 홈
  2. 테크
  3. 10장: Ruff와 ty - 차세대 린터, 포매터, 타입 체커
2026년 2월 3일·프로그래밍·

10장: Ruff와 ty - 차세대 린터, 포매터, 타입 체커

Astral의 Ruff(린터/포매터)와 ty(타입 체커)를 다룹니다. 기존 도구 대체, 설정 방법, 규칙 커스터마이징, IDE 통합, 프로젝트 도입 전략을 안내합니다.

14분566자12개 섹션
pythontypescriptperformancedevtoolsconcurrency
공유
python-trends10 / 13
12345678910111213
이전9장: uv - 차세대 Python 패키지 매니저다음11장: typing 고급 기능 실전 활용

Ruff: 하나의 도구로 통합

Python 프로젝트의 코드 품질 관리에는 전통적으로 여러 도구가 필요했습니다.

기존 도구 조합
text
코드 린팅:    flake8 + 플러그인 (flake8-bugbear, flake8-import-conventions 등)
코드 포매팅:  black
임포트 정렬:  isort
코드 업그레이드: pyupgrade
보안 검사:    bandit

Ruff는 이 모든 도구를 하나의 바이너리로 통합합니다. Rust로 작성되어 flake8 대비 10~100배 빠르며, 800개 이상의 린트 규칙을 내장하고 있습니다.

설치

Ruff 설치
bash
# uv로 설치 (권장)
uv tool install ruff
 
# pip로 설치
pip install ruff
 
# Homebrew
brew install ruff
 
# 버전 확인
ruff --version

Ruff 린터 사용법

기본 사용

린터 기본 명령
bash
# 현재 디렉토리 검사
ruff check .
 
# 특정 파일 검사
ruff check src/main.py
 
# 자동 수정 가능한 문제 수정
ruff check --fix .
 
# 안전하지 않은 수정도 포함
ruff check --fix --unsafe-fixes .
 
# 차이점 미리보기
ruff check --diff .

규칙 체계

Ruff의 규칙은 기존 도구의 규칙 코드를 따릅니다. 접두사로 어떤 도구에서 유래했는지 구분합니다.

규칙 접두사
text
E/W   - pycodestyle (스타일 규칙)
F     - Pyflakes (논리적 오류)
I     - isort (임포트 정렬)
N     - pep8-naming (네이밍 규칙)
UP    - pyupgrade (최신 문법 권장)
B     - flake8-bugbear (버그 유발 패턴)
S     - bandit/flake8-bandit (보안)
C4    - flake8-comprehensions (컴프리헨션 최적화)
SIM   - flake8-simplify (코드 단순화)
RUF   - Ruff 고유 규칙

pyproject.toml 설정

pyproject.toml
toml
[tool.ruff]
# 대상 Python 버전
target-version = "py312"
 
# 줄 길이
line-length = 88
 
# 검사할 디렉토리
src = ["src", "tests"]
 
# 제외할 패턴
exclude = [
    ".venv",
    "__pycache__",
    "migrations",
]
 
[tool.ruff.lint]
# 활성화할 규칙 세트
select = [
    "E",    # pycodestyle errors
    "W",    # pycodestyle warnings
    "F",    # Pyflakes
    "I",    # isort
    "N",    # pep8-naming
    "UP",   # pyupgrade
    "B",    # flake8-bugbear
    "S",    # flake8-bandit (보안)
    "C4",   # flake8-comprehensions
    "SIM",  # flake8-simplify
    "RUF",  # Ruff 고유 규칙
]
 
# 무시할 규칙
ignore = [
    "E501",   # line too long (포매터가 처리)
    "S101",   # assert 사용 (테스트에서 필요)
]
 
# 파일별 규칙 예외
[tool.ruff.lint.per-file-ignores]
"tests/**/*.py" = ["S101", "S106"]  # 테스트에서 assert, 하드코딩 비밀번호 허용
"__init__.py" = ["F401"]            # 미사용 임포트 허용
 
[tool.ruff.lint.isort]
# 알려진 퍼스트파티 모듈
known-first-party = ["mypackage"]
 
[tool.ruff.lint.pep8-naming]
# 커스텀 네이밍 규칙
classmethod-decorators = ["pydantic.validator"]

Ruff 포매터

Ruff 0.1.2부터 코드 포매터를 내장합니다. Black과 거의 동일한 출력을 생성하며, 훨씬 빠릅니다.

포매터 사용
bash
# 코드 포매팅
ruff format .
 
# 포매팅 확인 (수정하지 않음)
ruff format --check .
 
# 차이점 표시
ruff format --diff .
 
# 특정 파일만
ruff format src/main.py

포매터 설정

포매터 설정
toml
[tool.ruff.format]
# 따옴표 스타일
quote-style = "double"
 
# 들여쓰기 스타일
indent-style = "space"
 
# 줄 끝 문자
line-ending = "auto"
 
# 매직 트레일링 콤마
skip-magic-trailing-comma = false
 
# docstring 포매팅
docstring-code-format = true
docstring-code-line-length = 72
Info

Ruff 포매터는 Black과 99.9% 이상의 호환성을 가집니다. Black에서 Ruff 포매터로 전환할 때 대부분의 프로젝트에서 차이가 거의 없습니다. 미세한 차이는 주로 매직 트레일링 콤마 처리와 관련됩니다.

pyupgrade 규칙 활용

Ruff의 UP(pyupgrade) 규칙은 코드를 최신 Python 문법으로 자동 업그레이드합니다. Python 3.12+를 대상으로 설정하면 다음과 같은 변환이 적용됩니다.

pyupgrade 변환 예시
python
# UP006: typing 모듈 대신 내장 타입 사용
# 변환 전
from typing import List, Dict, Optional
def process(items: List[Dict[str, int]]) -> Optional[str]: ...
 
# 변환 후
def process(items: list[dict[str, int]]) -> str | None: ...
 
# UP007: Union 대신 | 연산자
# 변환 전
from typing import Union
x: Union[int, str] = 42
 
# 변환 후
x: int | str = 42
 
# UP040: TypeAlias 대신 type 문 (3.12+)
# 변환 전
from typing import TypeAlias
Vector: TypeAlias = list[float]
 
# 변환 후
type Vector = list[float]

ty: 차세대 타입 체커

ty는 Astral이 개발한 Python 타입 체커로, mypy와 Pyright의 대안입니다. Rust로 작성되어 10~100배 빠른 타입 검사를 제공합니다.

설치와 기본 사용

ty 설치와 사용
bash
# 설치
uv tool install ty
 
# 타입 검사 실행
ty check src/
 
# 특정 파일 검사
ty check src/main.py
 
# 설정 파일 생성
ty init

ty의 특징

ty의 차별점
text
1. 속도: mypy 대비 10~100배 빠름
2. 교차 타입 (Intersection Types): 네이티브 지원
3. 고급 타입 좁히기 (Type Narrowing): 정교한 분석
4. 도달 가능성 분석 (Reachability Analysis): 도달 불가능 코드 감지
5. 언어 서버: LSP 프로토콜 지원 (IDE 통합)

설정

pyproject.toml의 ty 설정
toml
[tool.ty]
# Python 버전
python-version = "3.12"
 
# 소스 디렉토리
src = ["src"]
 
# 규칙 설정
[tool.ty.rules]
# 오류 수준 규칙
possibly-unbound = "error"
division-by-zero = "error"
 
# 경고 수준 규칙
unused-variable = "warn"

언어 서버

ty는 LSP(Language Server Protocol) 기반의 언어 서버를 내장합니다. VS Code, PyCharm, Neovim 등에서 사용할 수 있습니다.

언어 서버 기능
text
- 코드 탐색 (Go to Definition, Find References)
- 자동완성 (Completions)
- 인레이 힌트 (Inlay Hints)
- 호버 정보 (Hover Information)
- 코드 액션 (Code Actions, Auto-import)
- 실시간 진단 (Diagnostics)
언어 서버 실행
bash
# VS Code: Ruff 확장 설치 시 ty가 자동으로 통합
# Neovim: LSP 설정에 ty 추가
ty server

Ruff + ty 통합 워크플로우

Ruff와 ty를 함께 사용하면 완전한 코드 품질 파이프라인을 구축할 수 있습니다.

통합 설정 (pyproject.toml)
toml
[tool.ruff]
target-version = "py312"
line-length = 88
src = ["src"]
 
[tool.ruff.lint]
select = ["E", "W", "F", "I", "N", "UP", "B", "C4", "SIM", "RUF"]
 
[tool.ruff.format]
quote-style = "double"
docstring-code-format = true
 
[tool.ty]
python-version = "3.12"
src = ["src"]
통합 명령어 흐름
bash
# 1. 코드 포매팅
ruff format .
 
# 2. 린트 검사 및 자동 수정
ruff check --fix .
 
# 3. 타입 검사
ty check src/
 
# 또는 uv run으로 통합 실행
uv run ruff format .
uv run ruff check --fix .
uv run ty check src/

pre-commit 통합

.pre-commit-config.yaml
yaml
repos:
  - repo: https://github.com/astral-sh/ruff-pre-commit
    rev: v0.9.0
    hooks:
      - id: ruff
        args: [--fix]
      - id: ruff-format
pre-commit 설정
bash
# pre-commit 설치
uv tool install pre-commit
pre-commit install
 
# 수동 실행
pre-commit run --all-files

기존 도구에서 마이그레이션

flake8에서 전환

flake8 규칙 변환
bash
# flake8 설정을 Ruff로 변환
# .flake8 또는 setup.cfg의 설정을 pyproject.toml로 이동
 
# flake8의 주요 규칙은 Ruff에서 동일한 코드로 지원
# 플러그인은 대부분 내장 규칙으로 대체 가능
플러그인 매핑
text
flake8-bugbear      -> B 규칙
flake8-comprehensions -> C4 규칙
flake8-simplify     -> SIM 규칙
flake8-bandit       -> S 규칙
flake8-import-conventions -> ICN 규칙
pep8-naming         -> N 규칙

Black + isort에서 전환

Black + isort 제거
bash
# 기존 도구 제거
uv remove black isort
 
# Ruff가 대체
# pyproject.toml에서 [tool.black]과 [tool.isort] 섹션을
# [tool.ruff.format]과 [tool.ruff.lint.isort]로 변환

mypy에서 ty로 전환

mypy -> ty 전환 고려사항
text
호환되는 기능:
  - 기본 타입 검사
  - Generic, Protocol, TypedDict
  - PEP 695 새 문법
 
ty 고유 기능:
  - 교차 타입 (Intersection Types)
  - 더 정밀한 타입 좁히기
  - 빠른 증분 분석
 
전환 시 주의:
  - mypy 플러그인 시스템은 ty에서 지원하지 않음 (향후 계획)
  - 일부 엣지 케이스에서 다른 결과가 나올 수 있음
  - ty는 2026년 기준 아직 베타 단계
Warning

ty는 2025년 12월에 베타가 출시되었으며, 2026년 기준 아직 안정 버전(1.0)이 나오지 않았습니다. 프로덕션 프로젝트에서는 mypy나 Pyright와 병행 사용하면서 점진적으로 전환하는 것을 권장합니다.

성능 비교

대규모 프로젝트 기준 성능 비교
text
린팅:
  flake8:  30.0s
  Ruff:     0.3s  (약 100배 빠름)
 
포매팅:
  Black:   10.0s
  Ruff:     0.1s  (약 100배 빠름)
 
타입 체킹:
  mypy:    60.0s
  ty:       3.0s  (약 20배 빠름)

OpenAI 인수와 미래

2026년 3월, OpenAI가 Astral을 인수했습니다. Ruff, uv, ty는 OpenAI의 Codex 팀에 통합될 예정이며, AI 코드 생성 시 자동으로 린팅, 포매팅, 타입 검사를 수행하는 방향으로 발전할 것으로 예상됩니다.

OpenAI는 인수 후에도 이 도구들의 오픈소스 지원을 계속하겠다고 발표했습니다.

정리

Ruff와 ty는 Python 코드 품질 도구의 새로운 표준을 제시합니다.

  • Ruff는 flake8, Black, isort, pyupgrade 등을 하나의 도구로 통합합니다
  • ty는 mypy/Pyright를 대체하는 빠른 타입 체커이자 언어 서버입니다
  • 두 도구 모두 Rust로 작성되어 기존 대비 10~100배 빠른 성능을 제공합니다
  • pyproject.toml에 모든 설정을 통합하여 관리할 수 있습니다
  • 기존 도구에서 점진적으로 마이그레이션할 수 있습니다

다음 장 미리보기

11장에서는 Python typing 모듈의 고급 기능을 다룹니다. TypedDict, Protocol, dataclass_transform, override 데코레이터 등 실전 타입 시스템 활용법을 살펴봅니다.

이 글이 도움이 되셨나요?

관련 주제 더 보기

#python#typescript#performance#devtools#concurrency

관련 글

프로그래밍

11장: typing 고급 기능 실전 활용

Python 3.12~3.13의 typing 모듈 고급 기능을 다룹니다. TypedDict, Protocol, override, dataclass_transform, TypeGuard, TypeIs 등 실전 타입 시스템을 안내합니다.

2026년 2월 5일·13분
프로그래밍

9장: uv - 차세대 Python 패키지 매니저

Rust로 작성된 차세대 Python 패키지 매니저 uv를 다룹니다. 설치, 프로젝트 관리, 가상 환경, Python 버전 관리, 스크립트 실행까지 실전 워크플로우를 안내합니다.

2026년 2월 1일·14분
프로그래밍

12장: AI 개발에서의 Python 활용

AI/ML 개발에서 Python이 차지하는 위치와 최신 트렌드를 다룹니다. PyTorch 생태계, LLM 개발 도구, 타입 안전한 AI 파이프라인, free-threaded Python의 AI 활용을 살펴봅니다.

2026년 2월 7일·13분
이전 글9장: uv - 차세대 Python 패키지 매니저
다음 글11장: typing 고급 기능 실전 활용

댓글

목차

약 14분 남음
  • Ruff: 하나의 도구로 통합
    • 설치
  • Ruff 린터 사용법
    • 기본 사용
    • 규칙 체계
    • pyproject.toml 설정
  • Ruff 포매터
    • 포매터 설정
  • pyupgrade 규칙 활용
  • ty: 차세대 타입 체커
    • 설치와 기본 사용
    • ty의 특징
    • 설정
    • 언어 서버
  • Ruff + ty 통합 워크플로우
  • pre-commit 통합
  • 기존 도구에서 마이그레이션
    • flake8에서 전환
    • Black + isort에서 전환
    • mypy에서 ty로 전환
  • 성능 비교
  • OpenAI 인수와 미래
  • 정리
  • 다음 장 미리보기