코드 Formatter의 필요성은 소프트웨어 개발의 여러 측면에서 중요합니다. 주요 이점은 다음과 같습니다.
Spotless는 개발자들 사이에서 널리 사용되는 코드 포맷팅 도구입니다. 주로 Java, Kotlin, Groovy와 같은 프로그래밍 언어를 지원하며, Gradle 및 Maven 빌드 시스템과 통합되어 사용됩니다. Spotless는 코드의 일관성과 가독성을 높이기 위해 다양한 포맷팅 옵션과 규칙을 제공합니다.
이 도구의 주요 특징은 다음과 같습니다
Briefing 프로젝트에서 Spotless 플러그인을 적용한 과정입니다. build.gradle을 수정합니다.
1. Spotless 플러그인 추가
plugins {
id 'java'
id 'org.springframework.boot' version '3.1.2'
id 'io.spring.dependency-management' version '1.1.2'
id 'com.diffplug.spotless' version '6.23.3' // Spotless 플러그인
}
2. Spotless 포맷팅 설정 구성
spotless {
java {
// Google Java 포맷 적용
/*
googleJavaFormat() : 탭은 2개의 공백
googleJavaFormat().aosp() : 탭은 4개의 공백
[참고] https://github.com/google/google-java-format/issues/525
*/
googleJavaFormat().aosp()
// 아래 순서로 import문 정렬
importOrder('java', 'javax', 'jakarta', 'org', 'com')
// 사용하지 않는 import 제거
removeUnusedImports()
// 각 라인 끝에 있는 공백을 제거
trimTrailingWhitespace()
// 파일 끝에 새로운 라인 추가
endWithNewline()
}
}
googleJavaFormat()importOrder('java', 'javax', 'jakarta', 'org', 'com')import 문의 정렬 순서를 지정합니다. 이 설정은 import 문을 'java', 'javax', 'jakarta', 'org', 'com' 순으로 정렬합니다.removeUnusedImports()import 문을 제거합니다. 이는 코드를 깔끔하게 유지하는 데 도움이 됩니다.trimTrailingWhitespace()endWithNewline()3. 컴파일 전에 코드 포맷팅 자동 적용
/*
compileJava 태스크가 실행되기 전에 spotlessApply 태스크가 먼저 실행되도록 구성
개발자가 별도로 코드 포맷팅을 신경 쓸 필요 없이, 코드가 항상 일관된 스타일을 유지하도록 설정
*/
tasks.named('compileJava') {
dependsOn 'spotlessApply'
}
spotlessApply 완료 → compileJava 태스크 실행./gradlew spotlessCheck : 컨벤션을 지키고 있는지 검사./gradlew spotlessApply : 파일에 코드 컨밴션을 적용4. build.gradle 전체 코드
plugins {
id 'java'
id 'org.springframework.boot' version '3.1.2'
id 'io.spring.dependency-management' version '1.1.2'
id 'com.diffplug.spotless' version '6.23.3' // Spotless 플러그인
}
group = 'briefing.info'
version = '0.0.1-SNAPSHOT'
java {
sourceCompatibility = '17'
}
configurations {
compileOnly {
extendsFrom annotationProcessor
}
}
repositories {
mavenCentral()
}
dependencies {
// ...여러 의존성들
}
def querydslSrcDir = 'src/main/generated'
clean {
delete file(querydslSrcDir)
}
tasks.withType(JavaCompile) {
options.generatedSourceOutputDirectory = file(querydslSrcDir)
}
tasks.named('test') {
useJUnitPlatform()
}
/*
compileJava 태스크가 실행되기 전에 spotlessApply 태스크가 먼저 실행되도록 구성
개발자가 별도로 코드 포맷팅을 신경 쓸 필요 없이, 코드가 항상 일관된 스타일을 유지하도록 설정
*/
tasks.named('compileJava') {
dependsOn 'spotlessApply'
}
jar {
enabled = false
}
spotless {
java {
// Google Java 포맷 적용
/*
googleJavaFormat() : 탭은 2개의 공백
googleJavaFormat().aosp() : 탭은 4개의 공백
[참고] https://github.com/google/google-java-format/issues/525
*/
googleJavaFormat().aosp()
// 아래 순서로 import문 정렬
importOrder('java', 'javax', 'jakarta', 'org', 'com')
// 사용하지 않는 import 제거
removeUnusedImports()
// 각 라인 끝에 있는 공백을 제거
trimTrailingWhitespace()
// 파일 끝에 새로운 라인 추가
endWithNewline()
}
}
컴파일 전에 자동으로 코드 포맷팅을 수행하게끔 설정해두니 편리합니다. 회사에서 Typescript를 사용할 때는 아래 코드처럼 pre-commit 훅을 설정하여 커밋하기 전에 eslint와 prettier를 실행시켰었는데 포맷팅을 조금 더 강제할 필요가 있어지면 Briefing에도 적용해봐야겠습니다!
"lint-staged": {
"**/*.{ts,tsx}": [
"eslint . --fix",
"prettier --write ."
]
},
"husky": {
"hooks": {
"pre-commit": "lint-staged"
}
},