Python 3.6 f-string으로 문자열 포매팅 개선하기

배경

회사 내부 데이터 파이프라인 코드를 Python 2.7에서 3.6으로 마이그레이션하면서 f-string을 적용해봤다. 기존 코드는 % 포매팅과 .format()이 혼재되어 있었고, 특히 로깅 부분에서 가독성이 떨어졌다.

기존 코드

logger.info("Processing user: %s, status: %s, count: %d" % (user_id, status, count))
query = "SELECT * FROM users WHERE id = {} AND active = {}".format(user_id, is_active)

f-string 적용 후

logger.info(f"Processing user: {user_id}, status: {status}, count: {count}")
query = f"SELECT * FROM users WHERE id = {user_id} AND active = {is_active}"

개선 효과

  1. 가독성: 변수가 직접 보여서 어떤 값이 들어가는지 명확함
  2. 타이핑 오류 감소: 변수 순서 틀릴 일이 없음
  3. 성능: 간단한 벤치마크 결과 .format()보다 약간 빠름

특히 복잡한 딕셔너리 접근이나 메서드 호출도 중괄호 안에서 바로 가능했다.

log = f"User {user['name']} logged in at {datetime.now().isoformat()}"

주의사항

SQL 쿼리에 직접 사용할 때는 여전히 parameterized query를 써야 한다. f-string은 어디까지나 문자열 포매팅이지 SQL 인젝션 방어 수단이 아니다.

# 위험
query = f"SELECT * FROM users WHERE name = '{user_input}'"

# 안전
query = "SELECT * FROM users WHERE name = %s"
cursor.execute(query, (user_input,))

코드베이스 전체를 전환하는데 하루 정도 걸렸지만, 이후 유지보수가 확실히 편해졌다.