Python
목차
Python의 핵심 특징
Python은 문법이 간결하고 표현력이 높은 범용 프로그래밍 언어입니다.
백엔드 면접에서는 보통 다음 특징을 중심으로 설명하면 좋습니다.
- 가독성: 문법이 비교적 단순해서 비즈니스 로직을 빠르게 표현하기 좋습니다
- 생산성: 표준 라이브러리와 생태계가 풍부해 개발 속도가 빠른 편입니다
- 동적 타이핑: 유연하게 코드를 작성할 수 있지만, 큰 코드베이스에서는 타입 관리가 중요해집니다
- 멀티 패러다임: 절차형, 객체지향, 함수형 스타일을 모두 활용할 수 있습니다
여기서 중요한 점은 “쉽다”로 끝내지 않는 것입니다.
실무에서는 빠른 개발 속도와 함께, 타입 힌트와 테스트로 유지보수성을 보강하는 흐름까지 같이 설명하는 편이 좋습니다.
백엔드에서 Python이 많이 쓰이는 이유
Python이 백엔드에서 자주 선택되는 이유는 단순히 입문이 쉬워서가 아닙니다.
보통은 다음 장점이 큽니다.
- 빠른 제품 개발: MVP, 내부 도구, API 서버를 빠르게 만들기 좋습니다
- 풍부한 생태계: Django, FastAPI, Flask 같은 웹 프레임워크가 잘 갖춰져 있습니다
- 데이터 영역과의 연결: 배치, 데이터 처리, 머신러닝 파이프라인과 붙이기 쉽습니다
- 자동화 친화성: 운영 스크립트, 백오피스, 배치 작업과 잘 맞습니다
특히 백엔드에서는 “웹 API + 배치 + 데이터 파이프라인”을 한 언어로 묶기 쉬운 점이 강점으로 자주 언급됩니다.
다만 모든 서비스에 무조건 최적이라는 뜻은 아닙니다.
- CPU 계산이 아주 무거운 서비스
- 극단적인 저지연이 중요한 서비스
- 스레드 기반 병렬 계산이 핵심인 워크로드
이런 경우에는 다른 언어나 아키텍처 분리가 더 맞을 수 있습니다.
GIL과 동시성
Python 면접에서 가장 자주 나오는 주제 중 하나가 GIL(Global Interpreter Lock)입니다.
중요한 점은 GIL이 Python 언어 전체의 규칙이라기보다, 대표 구현체인 CPython의 실행 특성이라는 점입니다.1
CPython에서는 한 프로세스 안에서 한 번에 하나의 스레드만 Python 바이트코드를 실행합니다.1
이 설명에서 바로 이어져야 하는 포인트는 다음입니다.
- CPU-bound 작업: 스레드를 많이 늘려도 한계가 있습니다
- I/O-bound 작업: 네트워크나 디스크 대기 중에는 다른 작업으로 전환할 수 있어 여전히 유용합니다
- 대응 방식: CPU-heavy 작업은
multiprocessing, 워커 프로세스 분리, 네이티브 확장을 검토할 수 있습니다
즉, GIL을 설명할 때는 “Python은 느리다”가 아니라
어떤 종류의 병목에서 스레드 확장이 제한되고, 어떤 경우에는 충분히 실용적인가로 답해야 합니다.
동시성 일반론은 동시성 (Concurrency), 메모리와 런타임 비용은 메모리와 실행 모델 (Memory & Execution Model)과 연결해서 보면 좋습니다.
비동기 처리와 asyncio
Python 백엔드에서 동시성을 풀 때는 스레드만 보는 것이 아니라 비동기 처리도 같이 봐야 합니다.
asyncio는 이벤트 루프 기반으로 많은 I/O 작업을 효율적으로 다루는 표준 비동기 프레임워크입니다.2
잘 맞는 경우는 다음과 같습니다.
- 외부 API를 많이 호출하는 서비스
- DB, 캐시, 메시지 브로커와 I/O가 많은 API 서버
- 긴 대기 시간이 있지만 CPU 계산은 크지 않은 작업
반대로 주의할 점도 분명합니다.
- 장점: 스레드를 많이 늘리지 않고도 많은 I/O를 처리할 수 있습니다
- 장점: FastAPI 같은 프레임워크와 잘 결합됩니다
- 단점: 블로킹 함수를 섞으면 이벤트 루프가 막힐 수 있습니다
- 단점: 디버깅과 호출 흐름 추적이 익숙하지 않으면 복잡하게 느껴질 수 있습니다
면접에서는 “async/await를 쓸 수 있다”보다
I/O-bound 작업이 많아 이벤트 루프가 효율적일 때 선택한다고 설명하는 편이 낫습니다.
스레드, 프로세스, 비동기 비교
| 방식 | 잘 맞는 경우 | 주의점 |
|---|---|---|
| 스레드 | I/O 작업, 라이브러리 호환성이 중요할 때 | CPython에서는 CPU 병렬 실행 한계가 있음 |
| 프로세스 | CPU-heavy 작업, 강한 격리 | 메모리 사용량과 IPC 비용이 큼 |
| 비동기 | 많은 동시 I/O, 높은 연결 수 | 블로킹 호출이 섞이면 효과가 줄어듦 |
장점과 주의점
장점
- 생산성: 문법이 간결하고 프레임워크 선택지가 넓습니다
- 생태계: 웹, 데이터, 배치, 자동화까지 폭넓게 대응할 수 있습니다
- 학습 비용: 팀 합류와 온보딩이 비교적 빠른 편입니다
주의점
- 성능 특성: CPU-bound 워크로드에서는 구조적 보완이 필요할 수 있습니다
- 런타임 특성: GIL과 이벤트 루프의 제약을 이해하지 않으면 병목 판단이 흐려질 수 있습니다
- 유지보수: 동적 타이핑에 기대면 큰 코드베이스에서 실수가 숨어들기 쉽습니다
그래서 실무에서는 다음 보완책이 자주 같이 나옵니다.
- 타입 힌트와 정적 분석 도구 사용
- 테스트 자동화 강화
- CPU-heavy 워크로드 분리
- 비동기 경계와 블로킹 호출 관리
좋은 답변은 장점만 나열하지 않고,
왜 Python이 빠른 개발에 강한지와 어떤 상황에서는 보완이 필요한지를 같이 설명합니다.
코드 예시
아래 예시는 여러 외부 API 요청을 asyncio로 동시에 처리하는 기본 패턴입니다.
import asyncio
async def fetch_profile(user_id: int) -> str:
await asyncio.sleep(0.1)
return f"profile:{user_id}"
async def fetch_profiles(user_ids: list[int]) -> list[str]:
tasks = [fetch_profile(user_id) for user_id in user_ids]
return await asyncio.gather(*tasks)
def main() -> None:
profiles = asyncio.run(fetch_profiles([1, 2, 3]))
print(profiles)
이 예시에서 중요한 포인트는 다음과 같습니다.
- 각 작업은 CPU 계산보다 대기 시간이 큰 I/O라고 가정합니다
asyncio.gather()로 여러 작업을 겹쳐 처리할 수 있습니다- 이런 패턴은 I/O-bound 작업에는 잘 맞지만, CPU-heavy 계산을 빠르게 만드는 도구는 아닙니다
면접 포인트
- Python은 간결한 문법과 풍부한 생태계 덕분에 백엔드에서 빠른 개발과 운영 자동화에 강합니다.
- GIL은 CPython의 실행 특성이며, 특히 CPU-bound 스레드 확장에 한계를 만든다는 점을 설명할 수 있어야 합니다.
- I/O-bound 작업에서는 스레드나
asyncio가 여전히 실용적이고, CPU-heavy 작업은 프로세스 분리나 다른 실행 전략을 검토합니다. - Python의 장점만 말하지 말고, 동적 타이핑과 런타임 특성을 어떻게 보완하는지도 같이 설명하는 편이 좋습니다.
- 좋은 답변은 생산성, 생태계, 동시성 모델, 성능 한계를 한 흐름으로 연결합니다.