파이썬에서 변수 값을 문장에 넣을 때는 보통 f"안녕하세요, {name}님"처럼 f-string을 사용합니다. Python 3.14에는 앞의 f를 t로 바꾼 t-string이 새로 들어왔습니다. 모양은 비슷하지만 결과는 전혀 다릅니다.
f-string은 변수 값까지 합친 완성 문자열을 바로 만듭니다. t-string은 고정된 글자와 중괄호 안의 값을 따로 보관한 Template 객체를 만듭니다. 따라서 평범한 출력에는 여전히 f-string이 간단하고, 값을 합치기 전에 검사하거나 변환해야 할 때 t-string을 처리 함수와 함께 사용합니다.

직접 확인한 환경
- Windows
- Python 3.14.7 공식 Windows 임베디드 배포본
- 비교 실행 : Python 3.9.13
- 확인일 : 2026년 9월 2일
Python.org에 따르면 Python 3.14.7은 2026년 8월 5일 공개된 3.14 계열의 일곱 번째 유지보수 릴리스입니다. 이 글에서는 공식 64비트 임베디드 배포본의 SHA-256 값까지 확인한 뒤 예제 네 개를 직접 실행했습니다.
Python 3.14를 아직 준비하지 않았다면 Python Install Manager 사용법에서 설치와 버전 확인 흐름을 먼저 볼 수 있습니다.
t-string은 왜 필요한가
사용자가 입력한 이름을 문장에 넣는다고 해 보겠습니다.
name = "민수"
message = f"안녕하세요, {name}님"
f-string은 name의 값을 바로 문자열 안에 넣습니다.
입력 : "민수"
처리 : 고정 글자와 name 값을 즉시 합친다
출력 : "안녕하세요, 민수님"이라는 str 객체
화면에 문장을 출력하는 목적이라면 이 동작이 알맞습니다. 문제는 HTML, SQL, 로그처럼 동적 값을 합치기 전에 별도 규칙으로 검사하거나 변환해야 하는 경우입니다. f-string은 이미 하나의 문자열로 합쳐진 뒤라서 어느 부분이 개발자가 쓴 고정 글자이고 어느 부분이 외부에서 들어온 값인지 구분하기 어렵습니다.
t-string은 이 둘을 합치지 않고 나누어 보관합니다.
name = "민수"
template = t"안녕하세요, {name}님"
입력 : 고정 글자와 name 값
처리 : 고정 부분과 동적 부분을 구분해 보관한다
출력 : string.templatelib.Template 객체
불변 : name 변수의 값은 바뀌지 않는다
실패 : Python 3.13 이하에서는 t 접두사 문법을 인식하지 못한다
여기서 템플릿은 아직 최종 문장이 아니라, 어떤 글자와 값을 어떤 순서로 처리할지 담아 둔 재료라고 이해하면 됩니다.
첫 코드에서 f-string과 t-string 자료형을 비교합니다
첫 예제는 두 문법이 무엇을 만드는지 확인합니다.
name = "민수"
score = 92
f_message = f"{name}님의 점수는 {score}점입니다."
template = t"{name}님의 점수는 {score}점입니다."
print("f-string 자료형 :", type(f_message))
print("t-string 자료형 :", type(template))
print("고정 문자열 :", template.strings)
print("동적 값 :", template.values)
print("보간 정보 :", template.interpolations)
type()은 값의 자료형을 알려 주는 파이썬 기본 함수입니다. template.strings에는 개발자가 직접 쓴 고정 문자열이, template.values에는 중괄호 안 표현식을 계산한 값이 들어 있습니다.
실행 결과는 다음과 같습니다.
f-string 자료형 : <class 'str'>
t-string 자료형 : <class 'string.templatelib.Template'>
고정 문자열 : ('', '님의 점수는 ', '점입니다.')
동적 값 : ('민수', 92)
보간 정보 : (Interpolation('민수', 'name', None, ''), Interpolation(92, 'score', None, ''))

strings에 값이 세 개이고 values에는 두 개가 있습니다. 동적 값 두 개의 앞, 사이, 뒤에 고정 문자열이 놓이기 때문에 고정 문자열 개수가 하나 더 많습니다.
strings[0] + values[0] + strings[1] + values[1] + strings[2]
빈 문자열 + "민수" + "님의 점수는 " + 92 + "점입니다."
중괄호로 값을 끼워 넣는 일을 보간이라고 합니다. interpolations의 각 Interpolation 객체에는 계산된 값뿐 아니라 원래 표현식인 name, score, 변환 방식, 서식 지정 정보가 따로 남습니다.
t-string은 바로 완성 문자열이 되지 않습니다
f-string 결과는 str이므로 그대로 출력하거나 파일에 쓸 수 있습니다. t-string 결과는 Template 객체입니다. print(template)을 실행하면 완성 문장 대신 객체의 구조가 표시됩니다.
name = "민수"
template = t"안녕하세요, {name}님"
print(template)
Template(strings=('안녕하세요, ', '님'), interpolations=(Interpolation('민수', 'name', None, ''),))
이 결과는 오류가 아닙니다. t-string의 목적이 값을 바로 합치는 것이 아니라 처리하기 전 상태를 유지하는 것이기 때문입니다. 최종 문자열이 필요하면 Template을 받아 원하는 규칙으로 조합하는 함수가 있어야 합니다.
공식 PEP 750도 단순한 문자열만 필요하고 별도의 안전 처리가 없다면 f-string이 알맞다고 설명합니다. t-string이 f-string을 없애거나 모든 문자열을 대체하는 문법은 아닙니다.
처리 함수가 Template을 최종 문자열로 바꿉니다
다음 render() 함수는 Template의 항목을 처음부터 하나씩 꺼냅니다. 고정 문자열이면 그대로 넣고, Interpolation이면 값과 서식을 처리한 뒤 넣습니다.
from string.templatelib import Interpolation, convert
def render(template):
parts = []
for part in template:
if isinstance(part, Interpolation):
value = convert(part.value, part.conversion)
parts.append(format(value, part.format_spec))
else:
parts.append(part)
return "".join(parts)
처음 보는 이름을 순서대로 읽어 보겠습니다.
Interpolation: 중괄호 안의 표현식과 계산된 값을 담는 자료형입니다.convert():!s,!r,!a같은 변환 표시를 f-string과 비슷하게 적용합니다.format()::,,.2f같은 서식 지정을 값에 적용합니다."".join(parts): 처리한 조각을 빈 문자열 사이에 두고 하나로 합칩니다.
이 함수에 상품명과 가격을 담은 t-string을 넣어 보겠습니다.
product = "키보드"
price = 45000
message = t"{product} 가격은 {price:,}원입니다."
print(render(message))
키보드 가격은 45,000원입니다.
{price:,}에서 :,는 천 단위 쉼표를 표시하는 서식입니다. f-string에서는 파이썬이 이 서식을 바로 적용하지만, t-string에서는 Interpolation.format_spec에 ,가 남고 처리 함수가 적용 여부를 결정합니다.
이 예제의 render()는 원리를 확인하기 위한 작은 함수입니다. 실제 서비스에서는 사용하는 HTML, SQL, 로그 라이브러리가 제공하는 처리 함수를 우선해야 합니다.
t-string이 값을 자동으로 안전하게 바꾸는 것은 아닙니다
t-string 소개에서 안전한 HTML이나 SQL 이야기가 자주 나오지만 한 가지를 꼭 구분해야 합니다.
t-string : 고정 문자열과 동적 값을 구분해 전달한다
처리 함수 : 동적 값을 어떤 규칙으로 검사하거나 변환할지 결정한다
t-string만 작성했다고 HTML 특수 문자가 자동으로 바뀌거나 SQL 인젝션이 막히는 것은 아닙니다. 안전성은 Template을 받는 처리 함수가 올바르게 구현됐을 때 생깁니다.
차이를 확인하기 위해 HTML 본문의 텍스트 한 곳만 다루는 작은 예제를 실행했습니다.
from html import escape
from string.templatelib import Interpolation
def html_text(template):
parts = []
for part in template:
if isinstance(part, Interpolation):
parts.append(escape(str(part.value), quote=True))
else:
parts.append(part)
return "".join(parts)
user_input = "<script>alert('x')</script>"
unsafe_html = f"<p>{user_input}</p>"
safe_html = html_text(t"<p>{user_input}</p>")
print("f-string 결과 :", unsafe_html)
print("처리 함수 결과 :", safe_html)
f-string 결과 : <p><script>alert('x')</script></p>
처리 함수 결과 : <p><script>alert('x')</script></p>

f-string 결과에는 입력한 태그 모양이 그대로 들어갑니다. html_text()는 동적 값에만 html.escape()를 적용해 <, >, 작은따옴표를 HTML 문자 참조로 바꿉니다. 고정 문자열인 <p>와 </p>는 그대로 둡니다.
다만 이 함수는 HTML 요소 안의 단순 텍스트 한 곳을 설명하기 위한 예제입니다. 태그 속성, URL, CSS, JavaScript처럼 위치에 따라 필요한 처리 규칙이 다르므로 실제 웹 페이지를 이 짧은 함수 하나로 만들면 안 됩니다. t-string은 안전 처리를 가능하게 하는 구조이지, 그 자체가 완성된 보안 도구는 아닙니다.
SQL도 같은 기준으로 봐야 합니다. t-string을 직접 문자열로 합치는 처리기를 만들어 SQL에 넣지 말고, 데이터베이스 라이브러리의 매개변수 바인딩 기능을 사용해야 합니다.
Python 3.13 이하에서는 SyntaxError가 발생합니다
t-string은 Python 3.14에서 추가된 문법입니다. 같은 파일을 Python 3.9.13으로 실행해 다음 오류를 직접 확인했습니다.
name = "민수"
message = t"안녕하세요, {name}님"
print(type(message))
File "04_requires_python_314.py", line 2
message = t"안녕하세요, {name}님"
^
SyntaxError: invalid syntax

이 오류가 나오면 코드 철자보다 실행 중인 Python 버전을 먼저 확인합니다.
python --version
Python 3.14 이상이 아니라면 t-string을 사용할 수 없습니다. 여러 버전이 설치된 Windows에서는 python 명령이 예상과 다른 버전을 가리킬 수 있으므로 다음 코드로 실제 실행 파일도 확인할 수 있습니다.
python -c "import sys; print(sys.version); print(sys.executable)"
기존 프로젝트가 Python 3.13 이하도 지원해야 한다면 t-string 문법을 넣는 순간 파일 자체를 해석하지 못합니다. 일부 실행 경로에서만 쓰더라도 구버전 파이썬이 파일을 읽으면 SyntaxError가 나므로, 지원 버전을 3.14 이상으로 올리거나 f-string과 기존 처리 라이브러리를 유지해야 합니다.
f-string과 t-string은 이렇게 선택합니다
| 확인할 점 | f-string | t-string |
|---|---|---|
| 처음 만들어지는 값 | 완성된 str |
Template 객체 |
| 동적 값 구분 | 이미 문자열에 합쳐짐 | Interpolation으로 분리됨 |
| 바로 출력 | 가능 | 처리 함수가 먼저 필요 |
| 서식 적용 | 파이썬이 즉시 적용 | 처리 함수가 결정 |
| 사용할 수 있는 버전 | Python 3.6 이상 | Python 3.14 이상 |
| 알맞은 상황 | 일반 출력과 간단한 문자열 조합 | 검사, 변환, 구조화된 로그 같은 사용자 정의 처리 |
처음 배울 때는 t가 f의 최신 대체 문법이라고 외우지 않는 것이 좋습니다. 결과 자료형부터 구분하면 선택이 쉬워집니다.
지금 필요한 결과가 완성 문자열인가? → f-string
값을 합치기 전에 처리 함수가 각 동적 값을 알아야 하는가? → t-string 검토
검증된 처리 함수나 라이브러리가 없는가? → 직접 만든 짧은 처리기를 보안 기능으로 사용하지 않기
Python print 사용법에서 f-string의 기본 출력 방식을 먼저 익힌 뒤 이 차이를 보면 더 자연스럽습니다. 자료형이 아직 낯설다면 파이썬 자료형 기초에서 str이 무엇인지 이어서 확인할 수 있습니다.
참고한 공식 문서
'IT프로그래밍 > 파이썬' 카테고리의 다른 글
| 파이썬 import 사용법 : 직접 만든 모듈에서 함수 불러오기 (0) | 2026.09.07 |
|---|---|
| 파이썬 ModuleNotFoundError 해결 : pip와 실행 Python 경로 맞추기 (0) | 2026.09.04 |
| 파이썬 sorted와 sort 차이 : key와 lambda로 원하는 기준 정렬하기 (0) | 2026.09.01 |
| 파이썬 enumerate와 zip 사용법 : 번호와 두 리스트를 함께 꺼내기 (0) | 2026.08.26 |
| 파이썬 리스트 컴프리헨션 : for문 한 줄의 순서와 if 위치 (0) | 2026.08.21 |
| 파이썬 파일 읽기 쓰기 : with open으로 주문장을 남기는 방법 (0) | 2026.08.20 |
| 파이썬 try except 사용법 : ValueError와 KeyError 예외 처리 (0) | 2026.08.20 |
| 파이썬 set 사용법 : 리스트 중복 제거와 순서 유지 방법 (0) | 2026.08.18 |
댓글