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}"
개선 효과
- 가독성: 변수가 직접 보여서 어떤 값이 들어가는지 명확함
- 타이핑 오류 감소: 변수 순서 틀릴 일이 없음
- 성능: 간단한 벤치마크 결과 .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,))
코드베이스 전체를 전환하는데 하루 정도 걸렸지만, 이후 유지보수가 확실히 편해졌다.