2025/09/29 FastAPI -1

김기훈·2025년 9월 29일

TIL

목록 보기
28/191

pip

  • pip freeze : 현재 설치된 모든 패키지와 버전을 한 줄씩 출력
    • Flask==3.0.3 이런식으로 보여주기 때문에 어떤 패키지가 설치돼 있는지 알 수 있음
  • pip freeze > requirements.txt
    • 협업이나 배포할 때, 동일한 환경을 재현하기 위해서 사용
      • requirements.txt 안에 현재 버전 정보가 저장
      • pip install -r requirements.txt 이 방식으로 파일을 받아서 똑같은 환경 만듬
  • 개발 환경마다 같은 패키지여도 최신버전을 받을때마다 동작이 바뀔수 있는데
    • pip freeze로 현재 잘 돌아가는 버전을 기록해두면 프로젝트시에 문제를 줄일 수 있음

Poetry

  • 매번 pip freeze 할 필요 없이, 알아서 poetry.lock로 종속성을 관리
  • pyproject.toml 로 프로젝트를 관리하는 것을 도와줌
    • black, isort, mypy, ruff, coverage, pytest 설정을 pyproject.toml 한 곳에 모음
  • pip 와 달리 종속성을 group 에 따라 나눌 수 있다.
    • 개발에만 필요한 종속성 : black,pytest
    • 실제 배포시에 필요한 종속성 : fastapi

Black(코드 포메터)

코드 포메터 : 프로젝트시에 개발자들끼리 일관된 코드스타일을 유지하도록 도와주는 것

  • 들여쓰기, 따옴표, 줄바꿈 등등 작성한 코드를 black 코드 스타일에 맞게 자동 수정해줌

ruff (formatter + linter)

코드 스타일 검사, 사용하지 않는 import/변수 탐지, 잠재적 버그 패턴 잡기

  • linter : 소스코드를 읽어들인 후 잘못 쓰여진 부분을 자동으로 고쳐주거나 고칠 수 없을때에는 사용자에게 경고를 해주는 툴 (정적 검사)
  • ruff formatter 는 black의 일부기능을 대체할 수 있다.


ruff 명령어


파일을 린트(lint) : 코드에서 문법 오류, 스타일 위반, 잠재적인 버그, 일관성 문제 등을 자동으로 검사하고 지적해주는 과정

  • ruff check
    • 입력받아 발견된 모든 Python 파일을 린트, 수정 가능한 오류는 선택적으로 수정
  • lint.select / lint.extend-select / lint.ignore
    • select = ["E", "F"] : E,F 두 카테로기만을 검사 대상으로 삼겠다는 뜻
    • ignore = ["F401"] : 이 규칙만은 검사 대상에서 빼겠다는 뜻
  • 설정 파일에서 (pyproject.toml) 수정 할 경우
    • 프로젝트 전체에 공통으로 적용, 모두가 같은 규칙을 쓰고 싶으면 파일에 적음
  • 터미널에서 (CLI) : ruff check --select E --extend-select B --ignore F401
    • 일회성으로 실행할 때 사용
      • ruff check --select E 이런 명령에만 적용되고 기록이나 저장이 되지 않는다.
    • toml 설정보다 명령어에서 준 옵션이 더 우선순위가 높음
      • toml에 설정이 있어도 CLI 옵션이 덮어씌움
  • noqa
              코드 내에서 개별 규칙 무시: x = 1  # noqa: F841   # F841 규칙 무시
              전체 줄 무시 (모든 규칙): y = 2  # noqa # 
              파일의 맨 위에 # ruff: noqa : or # ruff: noqa: F401
  • RUF100 : “쓸데없는 주석(# noqa)을 잡아냄”
              x = 1  # noqa: F841   # ← 사실 문제 없음 (불필요한 noqa)
              
  • ruff check app.py --add-noqa
    • 기존 코드에 린트 위반이 너무 많을 때, 일단 자동으로 # noqa 주석을 달아줍니다.
            import os   # 사용 안 함 → F401   # noqa: F401
            x= 1        # 공백 문제 → E221    # # noqa: E221
  • --fix
    • 발견한 문제 중 자동으로 고칠 수 있는 것을 린트 규칙에 맞게 수정
  • --unsafe-fixes
    • ruff는 코드의 의미를 바꿀 수 있는 위험한 수정은 건드리지 않지만 이 명령어를 사용하면 강제로 고침
# Show unsafe fixes
ruff check --unsafe-fixes
Apply unsafe fixes
ruff check --fix --unsafe-fixes

[tool.ruff.lint]
extend-safe-fixes = ["F601"] # 안전하지 않은 F601를 안전한 수정 사항으로 승격
extend-unsafe-fixes = ["UP034"] # 안전한 UP034를안전하지 않은 수정 사항으로 강등
  • fixable / unfixable
    • 자동 수정할 규칙만 지정 / 수정하지 않을 규칙을 지정
[tool.ruff.lint]
fixable = ["ALL"]		   # 수정 사항만 활성화

[tool.ruff.lint]
fixable = ["E", "F"]       # E, F 카테고리만 자동 수정
unfixable = ["F401"]       # 사용하지 않는 import(F401)는 고치지 않음

Exit Code

Ruff 실행이 끝날 때 프로그램 종료 코드(Exit code) 로 상태를 알려줌

  • 0 → 문제 없음 / 1 → 위반 발견 / 2 → 설정 오류
    • --exit-zero : 위반이 있어도 항상 성공(0)으로 종료
    • --exit-non-zero-on-fix : 자동으로 고쳤더라도 위반이 있었으면 1로 종료

Mypy

타입 힌트를 검사하여 잘못된 타입의 사용을 미리 잡아줌

  • FastAPI는 Pydantic과 타입 힌트를 적극적으로 활용

타입 힌팅

  • strict = true
    • strict 설정으로 argument 와 return 값에 type hint 가 제대로 되어있는지를 검사합니다.

명령어

                              [tool.mypy]
                              python_version = "3.11"
                              ignore_missing_imports = true
                              disallow_untyped_defs = true
                              warn_unused_ignores = true
                              strict = true
  • mypy 파일명(ex: app.py) or mypy 폴더명/
  • mypy 파일명 --ignore-missing-imports
    • 외부 라이브러리에 타입 힌트가 없어도 무시
  • mypy app.py --strict
    • 가장 엄격한 검사 모드
  • mypy 파일명(ex) app.py) --ignore-missing-imports
    • 타입 힌트 없는 함수 정의를 금지
  • mypy app.py --disallow-untyped-defs
    • 타입 힌트 없는 함수라도 내부 로직은 검사
  • mypy app.py --warn-unused-ignores
    • 쓸데없이 붙인 # type: ignore 경고
  • mypy . --exclude tests/
    • 특정 파일/폴더 제외
  • mypy app.py --show-error-codes
    • 어떤 에러 코드인지 표시
  • mypy . --install-types --non-interactive
    • 필요한 stubs 자동 설치

정적 vs 동적

  • 타입 힌팅
    • 타입 힌팅이 없으면 동적으로 판단
      • mypy는 동적에 대해 타입힌팅을 하지 않는다.
  • 실행하기 전에 이미 결정된것은 정적 , 실행중에 바뀌는 것은 동적

pytest

단위테스트

단위테스트는 작성한 코드가 예상한 대로 동작하는지 검증
단위 테스트를 실행하는 도중에 한 번도 예상하지 못한 에러가 발생하지 안았다면 테스트는 성공 으로 간주되고, 반대로 예상치 못한 에러가 발생했다면 테스트는 실패로 간주

  • 실제 테스트에서는 무엇이든 검증하고자 할때 assert를 사용
    • assert : 디버깅용 검증 명령어
      • 파이썬에서 특정 조건이 참(True) 이어야 한다고 가정할 때 쓰이고,
      • 그 조건이 거짓(False)이면 AssertionError 예외를 발생시켜 프로그램을 멈춤


pytest 실습


profile
안녕하세요.

0개의 댓글