핵심 질문
- Python3의 GIL(Global Interpreter Lock)은 무엇이며, 이를 우회하는 방법은?
- MySQL 인덱스와 Django ORM에서의 인덱스 적용 방법
- 인덱스가 빠른 이유와 구현 원리
- Django 마이그레이션 롤백 가능 여부
- MySQL 슬로우 쿼리 대응 전략
- SQL 실행 시 인덱스 사용 확인 방법
- MySQL 트랜잭션 격리 수준과 각각 해결하는 문제
- 인덱스가 무효화되는 상황
- Python 코드 실행 프로세스
- 데코레이터 패턴과 활용
- *args와 **kwargs의 용도
- 언더스코어 변수명 규칙 차이점
- __new__와 __init__ 메서드의 차이
- 멀티프로세스, 멀티스레드, 코루틴 비교
상세 해설
GIL(Global Interpreter Lock)
개념: CPython 인터프리터의 스레드 동기화 메커니즘으로, 한 번에 하나의 스레드만 파이썬 바이트코드를 실행하도록 제한한다.
해결 방안:
- Multiprocessing을 통한 병렬 처리
- Numpy 등 C 확장 라이브러리 활용 (GIL 해제)
- Celery 기반 분산 작업 큐
- C 확장을 통한 계산 집약적 작업 처리
Django ORM 인덱스 설정
from django.db import models
class UserProfile(models.Model):
username = models.CharField(max_length=50)
email = models.EmailField()
created = models.DateTimeField(auto_now_add=True)
class Meta:
indexes = [
models.Index(fields=['username']),
models.Index(fields=['username', 'email']),
models.Index(fields=['email'], name='email_unique_idx', unique=True),
]
마이그레이션 적용:
python manage.py makemigrations
python manage.py migrate
인덱스 성능 원리
B+ 트리 구조:
- 균형 트리 구조로 3-4층으로 수십억 건 데이터 탐색 가능
- 리프 노드는 정렬된 양방향 연결 리스트 형식
- 범위 검색 최적화
해시 인덱스:
- O(1) 시간 복잡도로 정확 일치 검색 최적화
- 범위 검색 미지원
슬로우 쿼리 대응
로그 활성화:
SET GLOBAL slow_query_log = 'ON';
SET GLOBAL long_query_time = 2;
SET GLOBAL log_queries_not_using_indexes = 'ON';
쿼리 분석:
EXPLAIN SELECT * FROM orders WHERE user_id = 1000 ORDER BY created DESC LIMIT 10;
트랜잭션 격리 수준
| 격리 수준 | Dirty Read | Non-repeatable Read | Phantom Read |
|---|---|---|---|
| READ UNCOMMITTED | 가능 | 가능 | 가능 |
| READ COMMITTED | 불가 | 가능 | 가능 |
| REPEATABLE READ | 불가 | 불가 | 가능 |
| SERIALIZABLE | 불가 | 불가 | 불가 |
Python 실행 프로세스
- Lexical Analysis: 토큰화
- Parsing: AST(Abstract Syntax Tree) 생성
- Bytecode Compilation: 바이트코드 변환
- Execution: PVM을 통한 실행
데코레이터 패턴
def timing_decorator(func):
import time
def wrapper(*parameters, **options):
start = time.time()
result = func(*parameters, **options)
end = time.time()
print(f"실행 시간: {end - start:.4f}초")
return result
return wrapper
@timing_decorator
def calculate_sum(n):
return sum(range(n))
가변 인자 처리
def flexible_function(required_param, *args, optional_param=None, **kwargs):
print(f"필수: {required_param}")
print(f"추가 위치 인자: {args}")
print(f"옵션: {optional_param}")
print(f"키워드 인자: {kwargs}")
flexible_function("필수값", 1, 2, 3, optional_param="옵션", key1="값1", key2="값2")
네임 맹글링
class BaseClass:
def __init__(self):
self._protected = "보호됨"
self.__private = "비공개"
class DerivedClass(BaseClass):
def __init__(self):
super().__init__()
self.__private = "하위 클래스 비공개"
base = BaseClass()
derived = DerivedClass()
print(base._protected) # 접근 가능
print(base._BaseClass__private) # 이름 맹글링을 통한 접근
객체 생성 과정
class SampleObject:
def __new__(cls, initialization_value):
print("객체 생성 중")
instance = super().__new__(cls)
return instance
def __init__(self, initialization_value):
print("객체 초기화 중")
self.data = initialization_value
obj = SampleObject("초기값")
병렬 처리 방식 비교
| 방식 | 실행 단위 | 리소스 소모 | CPU 활용 | 적합한 작업 |
|---|---|---|---|---|
| 멀티프로세스 | Process | 높음 | 완전 병렬 | CPU 집약적 |
| 멀티스레드 | Thread | 중간 | GIL로 제한 | I/O 집약적 |
| 코루틴 | Coroutine | 낮음 | 단일 스레드 | 고병발 I/O |