본문 바로가기
AI 튜토리얼

파이썬 3.15 숨겨진 변경점 7가지 한눈에

by 정부우르사 2026. 5. 21.
반응형

한국어로 "Python 3.15"를 검색하면 What's New 문서를 통째로 번역한 글이 대부분이다. 정작 실무 코드가 어떻게 바뀌는지, 운영 중인 서비스에서 어떤 부분부터 손봐야 하는지는 잘 다루지 않는다. 이 글은 PEP 진행 상황과 alpha 릴리스 노트를 기준으로, Python 3.15에서 새로 도입되었거나 개선이 예고된 변경점 7가지를 짧은 before/after 코드와 함께 정리한다.

참고로 일부 항목은 출시 시점에 PEP draft 또는 accepted 상태로 최종 문법이 다듬어질 수 있다. 이 글은 2026년 5월 alpha 시점 기준이다.

핵심 3줄 요약

  • 타입 어노테이션 지연 평가가 기본이 되어 from __future__ import annotations를 빼도 된다.
  • free-threaded(no-GIL) 빌드가 안정 트랙에 진입하고 JIT이 기본 활성으로 켜진다.
  • pathlib.Path.copy/move, asyncio.run(loop_factory=...) 등 표준 라이브러리 편의 API가 늘어난다.

1. 타입 힌트 — 지연 평가가 기본값

PEP 649/749 흐름에 따라 어노테이션의 지연 평가가 표준 동작으로 자리잡았다. from __future__ import annotations를 매번 적어두던 관행이 사라지고, 자기 참조 타입을 별도 문자열로 감싸지 않아도 된다.

Before (3.14)

from __future__ import annotations

class Node:
    next: "Node | None" = None

After (3.15)

class Node:
    next: Node | None = None

런타임에서 어노테이션을 꺼낼 때는 inspect.get_annotations(cls, eval_str=True)를 사용한다.

2. t-string 템플릿 리터럴 안정화

PEP 750 기반의 t"..." 리터럴이 정식 도입됐다. f-string과 달리 즉시 문자열로 합쳐지지 않고 Template 객체를 돌려주기 때문에 SQL·HTML 같은 컨텍스트에서 안전한 escape 처리를 라이브러리에 위임할 수 있다.

name = "robert'); DROP TABLE--"
q = t"SELECT * FROM users WHERE name = {name}"
cursor.execute_template(q)  # 드라이버가 파라미터 바인딩

ORM·로깅 라이브러리에서 자체 인터프리터를 붙이기 좋아진 셈이다.

3. 자유 스레드 빌드(Free-threaded)의 안정 트랙 진입

3.13에서 실험적으로 제공된 no-GIL 빌드가 안정 트랙에 올라간다. python3.15t 바이너리로 배포되며, CPU 바운드 멀티스레드 코드가 실측 2~4배 빨라진다. 다만 C 확장 모듈은 Py_mod_gil 슬롯을 명시해야 안전하게 로드된다.

// C 확장 (모듈 init 부분)
PyModuleDef_Slot slots[] = {
    {Py_mod_gil, Py_MOD_GIL_NOT_USED},
    {0, NULL},
};

NumPy·Pillow 등 주요 라이브러리는 이미 대응을 마쳤다.

4. pathlib에 copy / move 정식 편입

Path.copy(), Path.move()가 정식 API로 들어왔다. shutil을 별도로 import하지 않아도 파일 복사가 한 줄로 끝난다.

Before

import shutil, pathlib
shutil.copy(pathlib.Path("a.txt"), pathlib.Path("b.txt"))

After

from pathlib import Path
Path("a.txt").copy("b.txt")

copy()는 메타데이터 보존 옵션 preserve_metadata=True를 받고, 권한·소유자까지 함께 옮긴다.

5. asyncio — loop_factory 인자 추가

TaskGroup 내부에서 한 태스크가 예외를 던지면 형제 태스크가 즉시 취소되는 동작은 동일하지만, 3.15부터 BaseExceptionGroup 합치기 규칙이 단순해진다. 또한 asyncio.run(coro, loop_factory=...)로 EventLoop 구현체를 주입할 수 있다.

async def main():
    async with asyncio.TaskGroup() as tg:
        tg.create_task(fetch("a"))
        tg.create_task(fetch("b"))

asyncio.run(main(), loop_factory=uvloop.new_event_loop)

uvloop·winloop 사용자가 보일러플레이트 없이 표준 진입점을 그대로 쓸 수 있다.

6. 인터프리터 성능 — JIT 기본 활성화

3.13에 등장한 copy-and-patch JIT이 Tier 2 옵티마이저와 결합되어 기본 빌드에서 JIT이 켜진다. 마이크로벤치마크 기준 5~15% 추가 가속이 보고됐고, PYTHONJIT=0 환경변수로 비활성화도 가능하다. 디버깅 시 sys._jit.is_enabled()로 상태를 확인한다.

7. 문법 디테일 — except 표현식과 match 가드 정돈

PEP 654 익셉션 그룹의 부수적 개선으로, except* (A, B) as eg:에서 eg.exceptions 대신 eg.split(A) 호출이 표준화됐다. 또한 match 문에서 가드 절(case x if cond)이 패턴 안의 캡처 변수를 더 빠르게 평가한다. 코드 호환성에는 영향이 없지만, 정적 분석기 출력이 정돈된다.

Python 3.14 vs 3.15 빠른 비교

항목 3.14 3.15
타입 어노테이션 평가 즉시 평가 (future 필요) 지연 평가 기본
t-string 리터럴 미지원 표준
Free-threaded 빌드 실험적 안정 트랙
pathlib copy / move 부재 내장
JIT 실험적 (opt-in) 기본 활성
asyncio loop_factory 부재 지원

마이그레이션 체크리스트

  • from __future__ import annotations 라인 정리 (제거 가능 여부 검토)
  • 런타임에 어노테이션을 읽는 라이브러리(Pydantic, dataclasses 등) 버전 확인
  • C 확장 모듈의 Py_mod_gil 슬롯 추가 여부 점검
  • shutil 의존을 pathlib.Path.copy로 치환 가능한 지점 그루핑
  • CI에서 python3.15, python3.15t 두 빌드 모두 테스트
  • JIT 비활성 옵션(PYTHONJIT=0) 회귀 테스트 1회 수행

FAQ

Q1. Python 3.15는 언제 출시되나요?

CPython 릴리스 캘린더에 따르면 3.15.0은 2026년 10월경 정식 출시가 예정돼 있고, 2026년 5월 기준으로 alpha 단계에 있다. 베타·RC는 7~9월에 순차 공개된다.

Q2. Python 3.14와 3.15의 차이는?

가장 체감되는 차이는 어노테이션 지연 평가가 기본이라는 점, JIT이 기본 활성이라는 점, free-threaded 빌드가 안정 트랙에 진입한 점이다. 표준 라이브러리에서도 pathlib.Path.copy() 같은 편의 함수가 늘었다.

Q3. 운영 서버를 바로 올려도 되나요?

일반 서비스는 3.15.1~3.15.2 패치가 나온 뒤 올리는 편이 안전하다. 다만 신규 프로젝트라면 alpha부터 CI 매트릭스에 포함해두면 추후 마이그레이션 비용을 줄일 수 있다.

Q4. 기존 코드가 깨지는 케이스가 있나요?

런타임에 __annotations__ 딕셔너리를 직접 들여다보는 코드는 문자열이 반환되므로 분기 처리가 필요하다. 또한 GIL을 가정한 C 확장은 free-threaded 빌드에서 동작이 달라질 수 있다.

참고 자료


작성자:  Python 2.7→3.x 마이그레이션과 사내 라이브러리 다수의 3.11·3.12·3.13 호환 작업을 진행했다. 위 내용은 PEP 트래커와 CPython main 브랜치 릴리스 노트, 3.15a 시점 베타 테스트 기록을 기반으로 정리했다.

 

반응형