코틀린 코드 스타일로 마이그레이션하기
코틀린 코드 스타일로 마이그레이션하기
Kotlin 1.4.0부터 IntelliJ IDEA의 모든 프로젝트에서 공식 코드 스타일 포맷팅이 기본값으로 활성화돼요.
코틀린 코딩 규약과 IntelliJ IDEA 포맷터
코틀린 코딩 규약(Coding conventions)은 관용적인(idiomatic) 코틀린을 쓰는 데 영향을 주는 여러 측면을 다뤄요. 그중에는 코틀린 코드 가독성을 높이기 위한 포맷팅 권장 사항도 포함되어 있어요.
IntelliJ IDEA에 내장된 코드 포맷터는 예전에 지금 권장되는 것과 다른 결과를 만들어 내는 기본 설정을 갖고 있었어요.
우리는 IntelliJ IDEA의 기본값을 바꿔서 이런 불일치를 없애고, 포맷팅을 코틀린 코딩 규약에 맞추고 싶어요. 그래서 다음과 같은 마이그레이션 계획이 시행됐어요.
- Kotlin 1.3.0부터 공식 코드 스타일 포맷팅이 기본값으로 활성화되고, 새 프로젝트에만 적용돼요(예전 포맷팅은 수동으로 활성화할 수 있어요).
- 기존 프로젝트의 작성자는 코틀린 코딩 규약으로 마이그레이션할지 선택할 수 있어요.
- 기존 프로젝트의 작성자는 프로젝트에서 예전 코드 스타일을 쓰겠다고 명시적으로 선언할 수 있어요(이렇게 하면 앞으로 기본값이 바뀌어도 그 프로젝트는 영향을 받지 않아요).
- Kotlin 1.4.0부터 코틀린 코딩 규약과 일관되도록 모든 프로젝트에서 기본 포맷팅이 활성화돼요.
본문
"코틀린 코딩 규약"과 "IntelliJ IDEA 기본 코드 스타일"의 차이
가장 눈에 띄는 변화는 연속 들여쓰기(continuation indentation) 정책이에요. 다중 라인 표현식이 이전 줄에서 끝나지 않았다는 걸 보여주기 위해 이중 들여쓰기를 쓰는 건 멋진 아이디어예요. 단순하고 일반적인 규칙이지만, 이렇게 포맷하면 몇몇 코틀린 구조물은 조금 어색해 보여요. 코틀린 코딩 규약에서는 예전에 긴 연속 들여쓰기가 강제되던 경우에 단일 들여쓰기를 쓰라고 권장해요.

실제로는 꽤 많은 코드가 영향을 받아서, 이건 주요 코드 스타일 업데이트로 볼 수 있어요.
새 코드 스타일로의 마이그레이션 논의
새 코드 스타일 도입은 예전 방식으로 포맷된 코드가 없는 새 프로젝트에서 시작하면 아주 자연스러운 과정일 수 있어요. 그래서 1.3.0 버전부터 코틀린 IntelliJ 플러그인은 기본으로 활성화된 코딩 규약 문서의 포맷팅으로 새 프로젝트를 만들어요.
기존 프로젝트의 포맷팅을 바꾸는 일은 훨씬 까다로운 작업이라, 팀과 함정들을 먼저 논의하고 시작하는 게 좋아요.
기존 프로젝트에서 코드 스타일을 바꿀 때 가장 큰 단점은, VCS의 blame/annotate 기능이 무관한 커밋을 가리키는 일이 더 잦아진다는 점이에요. 각 VCS마다 이 문제를 다루는 방법이 있고(IntelliJ IDEA에서는 "Annotate Previous Revision"을 쓸 수 있어요), 새 스타일이 그 모든 노력만큼 가치가 있는지 결정하는 게 중요해요. 리포맷 커밋을 실질적인 변경과 분리하는 관행은 나중에 조사할 때 큰 도움이 돼요.
또한 팀 규모가 클수록 마이그레이션이 더 어려울 수 있어요. 여러 서브시스템의 많은 파일을 커밋하면 개인 브랜치에서 병합 충돌이 생길 수 있거든요. 각 충돌 해결은 대개 사소하지만, 지금 진행 중인 큰 기능 브랜치가 있는지 아는 것이 현명해요.
일반적으로 소규모 프로젝트는 모든 파일을 한 번에 변환하는 걸 권장해요.
중·대규모 프로젝트라면 결정이 어려울 수 있어요. 당장 많은 파일을 업데이트할 준비가 안 됐다면, 모듈 단위로 마이그레이션하거나 수정된 파일에 대해서만 점진적으로 진행하기로 정할 수도 있어요.
새 코드 스타일로의 마이그레이션
Settings/Preferences | Editor | Code Style | Kotlin 대화상자에서 코틀린 코딩 규약 코드 스타일로 전환할 수 있어요. 스킴을 Project로 바꾸고 Set from... | Kotlin style guide를 활성화하세요.
이 변경 사항을 모든 프로젝트 개발자와 공유하려면 .idea/codeStyle 폴더를 VCS에 커밋해야 해요.
프로젝트 구성에 외부 빌드 시스템을 사용하고, .idea/codeStyle 폴더를 공유하지 않기로 했다면 추가 속성으로 코틀린 코딩 규약을 강제할 수 있어요.
Gradle에서
프로젝트 루트의 gradle.properties 파일에 kotlin.code.style=official 속성을 추가하고 그 파일을 VCS에 커밋하세요.
Maven에서
루트 pom.xml 프로젝트 파일에 kotlin.code.style official 속성을 추가하세요.
<properties>
<kotlin.code.style>official</kotlin.code.style>
</properties>
kotlin.code.style 옵션을 설정하면 프로젝트를 임포트하는 동안 코드 스타일 스킴이 수정되고, 코드 스타일 설정이 바뀔 수 있어요.
코드 스타일 설정을 업데이트한 뒤에는 프로젝트 뷰에서 원하는 범위에 Reformat Code를 활성화하세요.

점진적인 마이그레이션을 위해 File is not formatted according to project settings 인스펙션을 활성화할 수 있어요. 이 인스펙션은 재포맷해야 할 부분을 강조 표시해 줘요. Apply only to modified files 옵션을 활성화하면 수정된 파일의 포맷팅 문제만 보여줘요. 그런 파일들은 어차피 곧 커밋될 가능성이 높아요.
프로젝트에 예전 코드 스타일 저장하기
프로젝트의 올바른 코드 스타일로 IntelliJ IDEA 코드 스타일을 명시적으로 설정하는 건 언제나 가능해요.
- Settings/Preferences | Editor | Code Style | Kotlin에서 Project 스킴으로 전환하세요.
- Load/Save 탭을 열고 Use defaults from에서 Kotlin obsolete IntelliJ IDEA codestyle을 선택하세요.
변경 사항을 프로젝트 개발자들과 공유하려면 .idea/codeStyle 폴더를 VCS에 커밋해야 해요. 또는 Gradle이나 Maven으로 구성된 프로젝트에서는 kotlin.code.style=obsolete를 사용할 수 있어요.