Python 프레임워크 및 핵심 개념 신입 면접
새 면접Q. Python의 데코레이터(Decorator)가 무엇인지 설명하고, 실무에서 어떤 상황에 사용되는지 예를 들어 설명해주세요.
함수를 인자로 받아서 새로운 기능을 추가한 함수를 반환하는 패턴을 생각해보세요.
데코레이터는 기존 함수나 클래스의 코드를 수정하지 않고 기능을 추가할 수 있는 패턴입니다. @ 기호를 사용해 함수 위에 선언하며, 내부적으로는 함수를 인자로 받아 래퍼 함수를 반환합니다. 실무에서는 로깅, 성능 측정, 권한 검사, 캐싱 등에 주로 사용됩니다. 예를 들어 Flask 프레임워크의 @app.route()나 Django의 @login_required 같은 것들이 대표적인 데코레이터입니다. 코드의 재사용성을 높이고 관심사를 분리할 수 있어 유지보수에 유리합니다.
- • 함수를 인자로 받아 기능을 추가한 함수를 반환하는 패턴
- • @ 기호를 사용해 선언적으로 적용
- • 로깅, 권한 검사, 캐싱 등 횡단 관심사 처리에 활용
웹 프레임워크에서 라우팅, 인증, 로깅 등의 공통 기능을 데코레이터로 구현하여 코드 중복을 줄입니다.
여러 개의 데코레이터를 하나의 함수에 적용할 때 실행 순서는 어떻게 되나요?
Q. Python의 제너레이터(Generator)와 일반 함수의 차이점을 설명하고, yield 키워드의 역할을 설명해주세요.
메모리 효율성과 지연 평가(lazy evaluation) 관점에서 생각해보세요.
제너레이터는 yield 키워드를 사용하여 값을 하나씩 생성하는 이터레이터를 반환하는 함수입니다. 일반 함수는 return으로 모든 값을 한 번에 반환하지만, 제너레이터는 yield로 값을 하나씩 생성하며 함수의 상태를 유지합니다. next() 함수나 for 루프로 호출될 때마다 다음 yield까지 실행되고 일시 중단됩니다. 대용량 데이터를 처리할 때 모든 데이터를 메모리에 올리지 않고 필요할 때마다 생성하므로 메모리 효율적입니다. 무한 시퀀스를 표현하거나 파일을 한 줄씩 읽을 때 유용하게 사용됩니다.
- • yield 키워드로 값을 하나씩 생성하며 함수 상태 유지
- • 메모리 효율적이며 지연 평가 방식으로 동작
- • 대용량 데이터 처리나 무한 시퀀스 표현에 유용
대용량 로그 파일을 분석할 때 전체 파일을 메모리에 올리지 않고 한 줄씩 처리하여 메모리 부족 문제를 방지합니다.
제너레이터 표현식(Generator Expression)과 리스트 컴프리헨션의 차이점은 무엇인가요?
Q. Python의 with 문과 컨텍스트 매니저(Context Manager)의 개념을 설명하고, 왜 파일 처리에서 권장되는지 설명해주세요.
리소스의 획득과 해제를 자동으로 관리하는 방법을 생각해보세요.
컨텍스트 매니저는 with 문과 함께 사용되어 리소스의 획득과 해제를 자동으로 관리하는 객체입니다. with 블록에 진입할 때 __enter__ 메서드가 호출되고, 블록을 벗어날 때 __exit__ 메서드가 자동으로 호출됩니다. 파일 처리에서 with open()을 사용하면 예외가 발생하더라도 파일이 자동으로 닫히므로 리소스 누수를 방지할 수 있습니다. 명시적으로 close()를 호출할 필요가 없어 코드가 간결하고 안전해집니다. 데이터베이스 연결, 락(Lock) 관리 등에도 동일한 패턴을 적용할 수 있습니다.
- • 리소스의 획득과 해제를 자동으로 관리
- • 예외 발생 시에도 __exit__가 호출되어 리소스 정리 보장
- • 파일, DB 연결, 락 등의 리소스 관리에 사용
데이터베이스 트랜잭션 처리 시 with 문으로 연결을 관리하여 커밋 또는 롤백을 자동화합니다.
직접 컨텍스트 매니저를 만들려면 어떤 메서드를 구현해야 하나요?
Q. Python의 가상환경(Virtual Environment)이 무엇이며, 왜 프로젝트마다 가상환경을 만들어 사용하는 것이 권장되는지 설명해주세요.
프로젝트별로 독립된 패키지 의존성을 관리하는 이유를 생각해보세요.
가상환경은 프로젝트별로 독립된 Python 실행 환경과 패키지 저장소를 제공하는 도구입니다. venv나 virtualenv를 사용해 생성하며, 각 프로젝트마다 필요한 라이브러리와 버전을 독립적으로 관리할 수 있습니다. 프로젝트 A가 Django 3.0을, 프로젝트 B가 Django 4.0을 사용하더라도 충돌 없이 개발할 수 있습니다. 시스템 전역 Python 환경을 오염시키지 않으며, requirements.txt로 의존성을 명확히 관리할 수 있어 협업과 배포가 용이합니다. 개발 환경의 재현성을 높여 다른 개발자나 서버에서도 동일한 환경을 구성할 수 있습니다.
- • 프로젝트별로 독립된 패키지 환경 제공
- • 라이브러리 버전 충돌 방지
- • requirements.txt로 의존성 관리 및 환경 재현
여러 프로젝트를 동시에 진행할 때 각 프로젝트의 라이브러리 버전을 독립적으로 관리하여 호환성 문제를 예방합니다.
가상환경을 활성화하는 명령어와 비활성화하는 명령어는 무엇인가요?
Q. pip와 requirements.txt의 역할을 설명하고, 새로운 프로젝트를 받았을 때 의존성 패키지를 설치하는 과정을 설명해주세요.
패키지 설치 도구와 의존성 명세 파일의 관계를 생각해보세요.
pip는 Python 패키지를 설치하고 관리하는 공식 패키지 관리 도구입니다. requirements.txt는 프로젝트에 필요한 패키지와 버전 정보를 명시한 텍스트 파일입니다. 새로운 프로젝트를 받으면 먼저 가상환경을 생성하고 활성화한 후, pip install -r requirements.txt 명령으로 모든 의존성 패키지를 한 번에 설치합니다. 현재 환경의 패키지 목록을 저장하려면 pip freeze > requirements.txt 명령을 사용합니다. 이를 통해 팀원 간 동일한 개발 환경을 유지하고, 배포 시에도 정확한 버전의 패키지를 설치할 수 있습니다.
- • pip는 패키지 설치 및 관리 도구
- • requirements.txt는 의존성 명세 파일
- • pip install -r requirements.txt로 일괄 설치
Git에서 프로젝트를 클론받은 후 requirements.txt를 통해 동일한 개발 환경을 빠르게 구성합니다.
특정 버전의 패키지를 설치하려면 requirements.txt에 어떻게 명시하나요?
Q. Python에서 __init__.py 파일의 역할과 패키지(Package)와 모듈(Module)의 차이를 설명해주세요.
디렉토리를 패키지로 인식시키는 방법과 import 동작을 생각해보세요.
모듈은 .py 확장자를 가진 단일 Python 파일이며, 패키지는 여러 모듈을 포함하는 디렉토리입니다. __init__.py 파일은 디렉토리를 Python 패키지로 인식하게 만드는 특수 파일입니다. Python 3.3 이상에서는 __init__.py가 없어도 패키지로 인식되지만, 패키지 초기화 코드나 __all__ 변수 정의를 위해 여전히 사용됩니다. __init__.py에서 하위 모듈을 import하면 패키지 사용자가 더 간편하게 접근할 수 있습니다. 패키지 구조를 통해 관련 모듈을 논리적으로 그룹화하고 네임스페이스를 관리할 수 있습니다.
- • 모듈은 단일 파일, 패키지는 모듈을 포함한 디렉토리
- • __init__.py는 디렉토리를 패키지로 인식시키는 파일
- • 패키지 초기화 및 네임스페이스 관리에 활용
대규모 프로젝트에서 기능별로 모듈을 패키지로 구조화하여 코드의 가독성과 유지보수성을 높입니다.
from package import *를 실행할 때 어떤 모듈들이 import되는지 제어하려면 어떻게 해야 하나요?
Q. Python의 리스트 컴프리헨션(List Comprehension)이 무엇인지 설명하고, 일반 for 루프와 비교했을 때의 장점을 설명해주세요.
한 줄로 리스트를 생성하는 간결한 문법의 특징을 생각해보세요.
리스트 컴프리헨션은 기존 시퀀스를 기반으로 새로운 리스트를 생성하는 간결한 문법입니다. [표현식 for 항목 in 시퀀스 if 조건] 형태로 작성하며, 일반 for 루프보다 코드가 짧고 가독성이 높습니다. 내부적으로 C 레벨에서 최적화되어 실행 속도가 일반 루프보다 빠릅니다. 조건문을 포함하여 필터링과 변환을 동시에 수행할 수 있습니다. 다만 너무 복잡한 로직은 오히려 가독성을 해칠 수 있으므로, 간단한 변환과 필터링에 사용하는 것이 좋습니다.
- • 간결한 문법으로 리스트 생성
- • 일반 루프보다 빠른 실행 속도
- • 필터링과 변환을 한 줄로 표현 가능
데이터 전처리 과정에서 리스트의 각 요소를 변환하거나 조건에 맞는 요소만 추출할 때 간결하게 작성합니다.
딕셔너리 컴프리헨션이나 셋 컴프리헨션도 가능한가요?
아직 댓글이 없습니다. 첫 번째 댓글을 남겨보세요!