Python의 LEGB 규칙: 변수 스코프 이해와 실무 적용

카테고리

프로그래밍/소프트웨어 개발

서브카테고리

개발 툴

대상자

Python 개발자, 특히 데이터 파이프라인, 마이크로서비스, 비동기 프레임워크에 참여하는 중급~고급 개발자

핵심 요약

  • LEGB 규칙은 Python이 변수 이름을 검색하는 순서(Local > Enclosing > Global > Built-in)를 정의하며, shadowing은 외부 변수를 덮어쓰는 원인이 되는 핵심 문제
  • Shadowing은 FastAPI, Celery, Pydantic 등에서 발생할 수 있으며, @dataclass, Pydantic validator, mypy 등으로 방지할 수 있음
  • 실무 대응 전략타입 힌트 강화, 구성 파일 사용, 테스트 자동화로 요약

섹션별 세부 요약

1. LEGB 규칙과 shadowing의 정의

  • LEGB는 Python의 변수 검색 순서를 정의하며, built-in > global > enclosing > local 순서로 검색
  • Shadowinglocal 변수가 outer scope의 변수를 덮어쓰는 현상으로, 타입 체크 도구(mypy)도 방지하지 못함
  • 예시: GLOBAL_CONSTANT = 10을 내부 함수에서 GLOBAL_CONSTANT = 5로 재정의하는 경우

2. shadowing 발생 사례 및 대응 방법

  • FastAPI: 라우트 핸들러에서 전역 상수와 동일한 이름의 로컬 변수 사용 시, 명확한 이름 규칙 적용(예: GLOBAL_CONSTANT_PREFIX)
  • Async 작업(Celery/RQ): 불변 구성 객체(frozen dataclass)와 의존성 주입으로 shadowing 방지
  • Pydantic: validator/root_validator 사용으로 속성 이름 충돌 방지
  • CLI 툴: 구성 객체를 명시적으로 전달하여 전역 변수 오염 방지

3. 도구 활용 및 CI/CD 통합

  • mypy: --strict/disallow_untyped_defs 플래그로 타입 불일치 검출
  • pytest: Shadowing 테스트 케이스 작성으로 오류 사전 검출
  • GitHub Actions: mypypytest를 CI/CD 파이프라인에 통합하여 자동 검증

4. shadowing의 위험과 예방

  • 보안 취약점: 권한 관리 변수 shadowing 시 비인가 접근 가능
  • 성능 저하: 반복적인 로컬 변수 접근이 글로벌 변수 접근보다 느림
  • 실무 대응: 타입 힌트 강화, 모듈 분리, 구성 파일 사용(YAML/TOML), 의존성 주입

결론

  • LEGB 규칙을 이해하고 shadowing을 방지하는 실무 전략(타입 힌트, 의존성 주입, 구성 파일 사용)을 적용해야 안정적인 Python 시스템 구축 가능
  • CI/CD에 mypy/pytest 통합단위/제품 기반 테스트(Hypothesis)를 통해 조기 오류 탐지를 실현해야 함