문자열 자동 연결, 편해 보여도 버그의 온상입니다

Tasker_Jang·2026년 4월 19일
post-thumbnail

🤔 이게 왜 문제인가

파이썬에는 C에서 물려받은 이상한 기능이 하나 있습니다. 문자열 리터럴 두 개가 나란히 붙어 있으면 자동으로 하나로 합쳐지는 것. "hello" "world"라고 쓰면 + 없이도 "helloworld"가 됩니다. 얼핏 보면 편리해 보이지만, 이게 리스트 안에서 쉼표 하나를 빼먹는 실수와 만나면 조용한 대참사가 벌어져요.

타입 에러도 없고, 문법 에러도 없고, 그냥 원소 개수가 슬쩍 줄어서 돌아갑니다. 찾기도 힘들어요.

💣 흔한 실수

# 리스트에 쉼표 하나 빼먹었을 뿐인데…
users = [
    "alice",
    "bob",
    "charlie"    # ← 쉼표 빠짐
    "david",
    "eve",
]

print(len(users))  # 4 (5가 아님!)
print(users)       # ['alice', 'bob', 'charliedavid', 'eve'] 😱

"charlie""david" 사이에 쉼표가 없어서 암시적으로 연결됐고, 결국 "charliedavid"라는 이상한 원소가 태어났습니다. 리스트 길이는 5가 아니라 4. 이걸 DB에 넣거나 API에 보내면 charliedavid라는 유령 사용자가 생기는 거예요. 에러도 없이 조용히.

# 여러 줄 문자열을 암시적으로 이어 쓰기
message = (
    "안녕하세요, "
    "오늘 날씨가 "
    "정말 좋네요."
)
# 동작은 함. 하지만 의도가 명확하지 않음 — 한 줄이어야 했나? 실수인가?

이 예는 "합쳐지길 원해서 그렇게 쓴 것"이지만, 보는 사람은 의도인지 실수인지 구분하기 어렵습니다. 코드 리뷰할 때 매번 멈칫하게 만들죠.

✅ 파이썬다운 방법

# 리스트는 끝 원소에도 쉼표를 찍는 습관(trailing comma)
users = [
    "alice",
    "bob",
    "charlie",    # ← 쉼표! 줄 추가/삭제할 때도 diff가 깔끔
    "david",
    "eve",
]


# 긴 문자열을 잇고 싶으면 + 로 명시적으로
message = (
    "안녕하세요, "
    + "오늘 날씨가 "
    + "정말 좋네요."
)


# 여러 조각을 조립한다면 join이 가장 파이썬답고 빠름
parts = ["안녕하세요", "오늘 날씨가", "정말 좋네요"]
message = " ".join(parts)

명시적 + 연산자를 쓰면 "이건 의도적으로 합친 거야"가 드러나고, 리스트에서는 마지막 원소 뒤에도 쉼표를 찍어두는 trailing comma 스타일이 쉼표 실수를 원천 차단합니다. 여기에 더해, 문자열 조각을 여러 개 합칠 일이 있으면 +보다 " ".join()이 훨씬 효율적이에요. +는 매번 새 문자열을 만들지만 join은 한 번에 처리하거든요.

린터(ruff, pylint)들도 이 암시적 연결 패턴을 감지하는 규칙을 제공합니다. ruffISC001, ISC002 같은 규칙을 켜두면 실수가 생기자마자 에디터에 빨간 줄이 뜹니다.

📎 기억할 것

  • "foo" "bar"처럼 문자열 리터럴이 나란히 있으면 파이썬이 자동으로 합쳐줍니다(암시적 연결).
  • 리스트에서 쉼표 하나를 빼먹으면 두 원소가 조용히 합쳐져서 길이가 줄고 원소 내용도 망가지는 버그가 생깁니다.
  • 의도적으로 합치려는 거라면 +를 명시적으로 쓰거나, 조각이 여럿이면 " ".join(parts)를 쓰세요.
  • 리스트·딕셔너리의 마지막 원소 뒤에도 쉼표를 찍는 습관(trailing comma)이 이런 실수를 예방합니다.
  • ruff 같은 린터가 이 패턴을 잡아주니 규칙을 켜두면 사람 실수를 기계가 막아줍니다.

🛠 실무에서 어디 쓸까

설정 파일이나 상수 목록에서 특히 조심해야 합니다. 허용된 도메인 리스트, 이메일 수신자 리스트, CSV 컬럼 헤더처럼 문자열이 나열된 리스트가 가장 위험해요. 여기서 쉼표 하나 빠지면 "admin@company.com""user@company.com""admin@company.comuser@company.com"이라는 존재하지 않는 주소로 합쳐져서, 메일 발송 코드가 조용히 실패합니다. 에러 로그에도 "주소 형식 오류"라고만 뜨고, 원인을 찾는 데 몇 시간을 쓰게 돼요.

팀 프로젝트에서는 ruffISC 규칙을 활성화하고 trailing comma를 강제하는 포매터(black, ruff format) 설정을 pyproject.toml에 박아두세요. 사람이 주의하는 것보다 도구가 자동으로 잡아주는 게 훨씬 안전합니다.

profile
ML Engineer 🧠 | AI 모델 개발과 최적화 경험을 기록하며 성장하는 개발자 🚀 The light that burns twice as bright burns half as long ✨

0개의 댓글