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 순서로 검색
- Shadowing은 local 변수가 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:
mypy
및pytest
를 CI/CD 파이프라인에 통합하여 자동 검증
4. shadowing의 위험과 예방
- 보안 취약점: 권한 관리 변수 shadowing 시 비인가 접근 가능
- 성능 저하: 반복적인 로컬 변수 접근이 글로벌 변수 접근보다 느림
- 실무 대응: 타입 힌트 강화, 모듈 분리, 구성 파일 사용(YAML/TOML), 의존성 주입
결론
- LEGB 규칙을 이해하고 shadowing을 방지하는 실무 전략(타입 힌트, 의존성 주입, 구성 파일 사용)을 적용해야 안정적인 Python 시스템 구축 가능
- CI/CD에 mypy/pytest 통합과 단위/제품 기반 테스트(Hypothesis)를 통해 조기 오류 탐지를 실현해야 함