파이썬 기술 면접 질문 및 해설

핵심 질문

  1. Python3의 GIL(Global Interpreter Lock)은 무엇이며, 이를 우회하는 방법은?
  2. MySQL 인덱스와 Django ORM에서의 인덱스 적용 방법
  3. 인덱스가 빠른 이유와 구현 원리
  4. Django 마이그레이션 롤백 가능 여부
  5. MySQL 슬로우 쿼리 대응 전략
  6. SQL 실행 시 인덱스 사용 확인 방법
  7. MySQL 트랜잭션 격리 수준과 각각 해결하는 문제
  8. 인덱스가 무효화되는 상황
  9. Python 코드 실행 프로세스
  10. 데코레이터 패턴과 활용
  11. *args와 **kwargs의 용도
  12. 언더스코어 변수명 규칙 차이점
  13. __new__와 __init__ 메서드의 차이
  14. 멀티프로세스, 멀티스레드, 코루틴 비교

상세 해설

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 ReadNon-repeatable ReadPhantom Read
READ UNCOMMITTED가능가능가능
READ COMMITTED불가가능가능
REPEATABLE READ불가불가가능
SERIALIZABLE불가불가불가

Python 실행 프로세스

  1. Lexical Analysis: 토큰화
  2. Parsing: AST(Abstract Syntax Tree) 생성
  3. Bytecode Compilation: 바이트코드 변환
  4. 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

태그: python Django MySQL Database concurrency

7월 3일 01:06에 게시됨