작은 것, 큰 영향
Source: Dev.to
트레일링 콤마

나는 아주 명백한 주제인 트레일링 콤마에 대해 이야기하려고 합니다. 많은 분들이 이미 이를 사용하고 있으며, 함수나 클래스를 정의하거나 호출할 때 마지막 매개변수 뒤에 콤마를 붙이는 것이 자연스럽게 느껴집니다. 이것은 나의 자기 성찰이며, 이 순간을 스스로 정리하고 마무리하려는 시도입니다.
트레일링 콤마는 이제 기본 개념이 되었지만, 왜 등장했는지를 이해하려면 약간 뒤로 돌아볼 필요가 있습니다. 구문에서 구분 기호로 콤마를 허용한 최초의 프로그래밍 언어는 Perl의 첫 번째 버전(1987년 12월)이며, 이는 Larry Wall이 설계했습니다. 처음에는 문서에 언급되지 않았지만 구문 자체에 문제는 없었습니다. 명시적으로 문서화된 것은 Perl 4(1991)부터였습니다.
이후 트레일링 콤마 개념은 많은 언어에 등장했으며, 보통 제한된 범위에서 사용되었습니다(Python, Ruby, JavaScript, C#). 그러나 Git이 2005년에 등장하면서 상황이 급격히 변했습니다. 이 버전 관리 시스템의 인기가 높아지면서 트레일링 콤마는 단순한 구문 편의성을 넘어, 작은 diff와 병합 충돌 감소를 가능하게 하는 팀 협업 최적화 도구로 변모했습니다. 그 이후 대부분의 최신 언어는 트레일링 콤마를 폭넓게 지원하고 있습니다(Go, Rust, Swift, Kotlin, TypeScript) 혹은 제한적으로 지원하고 있습니다(C++, PHP).

흥미로운 사실은 Java에서 트레일링 콤마가 매우 제한적으로만 사용된다는 점입니다. Java 4부터는 enum에서 허용되었고, Java 8부터는 배열 초기화와 어노테이션 인수에서 허용됩니다. Kotlin에서는 버전 1.4(2020)부터 트레일링 콤마가 도입되었습니다.

Why use a trailing comma?
Trailing comma를 사용해야 하는 특별한 이유는 없습니다; 코드는 어느 쪽이든 컴파일되고 실행됩니다. 하지만 같은 코드베이스에서 팀으로 작업할 때, 특히 여러 사람이 동시에 같은 파일을 편집할 경우 문제가 발생합니다. 생성자에 새 매개변수를 추가하는 것과 같은 간단한 변경이라도 논리적으로 충돌이 없어야 할 위치에서 병합 충돌이 발생할 수 있습니다. 충돌이 발생하는 이유는 누락되었거나 추가된 콤마가 주변 라인을 변경하기 때문이며, 새 매개변수 자체는 기존 로직과 충돌하지 않음에도 불구하고 그렇습니다.
이러한 불필요한 충돌은 시간을 낭비합니다: 충돌을 해결하고, 파이프라인을 다시 실행하고, 로컬에서 브랜치를 전환하는 등(진행 상황을 스태시하고, 프로젝트를 동기화하는 등) 모든 과정에 추가적인 오버헤드가 발생합니다.
Trailing comma에 신경 쓰지 않는다면, 이 문제를 반복해서 겪게 될 가능성이 높습니다.
ktlint로 후행 콤마를 필수로 만들기
해결책은 간단합니다: ktlint를 설정하여 누락된 콤마를 오류로 처리하고 해당 문제가 있는 PR을 차단합니다.
.editorconfig 구성
이 규칙을 모든 팀원에게 적용하려면, 버전 관리 하에 저장된 .editorconfig 파일을 적절히 설정하십시오. 관련 플래그는 기본적으로 활성화되어 있지만, 명시적으로 설정할 수도 있습니다:
# .editorconfig
…
ij_kotlin_allow_trailing_comma = true
ij_kotlin_allow_trailing_comma_on_call_site = true
…
ij_kotlin_allow_trailing_comma— 선언(생성자 매개변수, 함수 매개변수 등)에서 후행 콤마를 제어합니다.ij_kotlin_allow_trailing_comma_on_call_site— 호출(생성자, 함수 등을 호출할 때)에서 후행 콤마를 제어합니다.
Kotlin 스타일 가이드는 선언에서 후행 콤마를 강력히 권장하지만, 호출 위치에서의 사용은 팀 컨벤션에 맡깁니다. 공식 Kotlin 코딩 규칙 – 후행 콤마를 참고하세요.
저는 일관성을 위해 그리고 병합 충돌을 방지하기 위해 두 경우 모두 후행 콤마를 선호합니다. ktlint를 설정한 후에는 단일 명령으로 전체 코드베이스를 포맷할 수 있습니다:
./gradlew ktlintFormat
이 명령은 적절한 위치에 누락된 후행 콤마를 추가하여, 단일하고 깔끔한 커밋으로 변경 사항을 커밋할 수 있게 합니다. 이를 즉시 수행하고 전체 팀에게 업데이트된 devel(또는 main) 브랜치에 리베이스하도록 권장합니다.
Kotlin에서 후행 콤마를 활성화하는 이유
develop 브랜치에서 새 브랜치를 시작하면, 브랜치가 오래될수록 나중에 병합 충돌이 발생할 수 있습니다. 후행 콤마는 이러한 충돌을 방지하고 코드 유지 보수를 쉽게 해줍니다.
Android Studio에서 후행 콤마 사용하기
- Settings → Editor → Code Style → Kotlin → Other를 엽니다.
- Use trailing comma를 체크합니다.
이제 Option + Command + L로 코드를 포맷할 때마다 Android Studio가 적절한 위치에 후행 콤마를 추가합니다.
- 기본적으로 후행 콤마는 declarations(선언)에서만 추가됩니다.
- call sites(호출 위치)에서도 사용하려면
.editorconfig파일에 다음 플래그를 추가합니다:
ij_kotlin_allow_trailing_comma_on_call_site = true
매개변수 정렬 시 실용적인 이점
많은 매개변수가 있고 이를 재배열해야 할 때(예: Option + Command + Arrow Up/Down 사용), 마지막 매개변수에 쉼표가 없으면 작업이 중단될 수 있습니다. 쉼표가 없으면 컴파일 오류가 발생하고, 쉼표가 있으면 정렬이 원활하게 작동합니다.

Additional advantages
- Consistency – 매개변수 목록의 각 줄이 비슷하게 보여서 향후 편집이나 복사‑붙여넣기가 더 쉬워집니다.
- Safety – 뒤에 붙는 콤마는 컴파일된 바이트코드에 영향을 주지 않으며, 순전히 소스 코드상의 편의일 뿐입니다.
- Merge‑conflict reduction – 협업자가 매개변수를 추가하거나 순서를 바꿀 때 차이가 적어집니다.
뒤에 붙는 콤마는 작고 안전한 개선점으로, Kotlin 코드를 더 편리하고 오류가 적게 만들 수 있습니다. 저는 이 질문을 스스로 닫았으며, Kotlin에서 뒤에 콤마를 사용해야 할 이유를 설명할 필요가 있을 때마다 이 글을 다시 참조할 것입니다.