๐ ์?
โผ ํํ๋ก์ ํธ๋ฅผ ์งํํ๋ฉด์, ์ฝ๋ฉ ์ปจ๋ฒค์ ์ ๊ตฌ์ฑํ๊ณ ์ ์งํค๋ ๊ฒ์ด ํ์ ์ ๊ธฐ๋ณธ์ด๋ผ๊ณ ์๊ฐํ๋ค.
โผ ์ฝ๋ ๋ฆฌ๋ทฐ ์, ํต์ผ๋ ์ฝ๋ ๊ตฌ์ฑ์ ๊ฐ๋ ์ฑ๊ณผ ๋ก์ง ์ดํด์ ๋์์ด ๋ ๊ฒ ๊ฐ์์ lint ์ค์ ์ ์์๋ณด๊ฒ ๋์๋ค.
๐ฌ sonarlint vs checkstyle
sonarlint๋ IDE ํ๋ฌ๊ทธ์ธ์ผ๋ก ์ฝ๋ฉ ์ปจ๋ฒค์ ์ ์ ๊ณตํด ์ฃผ๊ธฐ ๋๋ฌธ์, ๊ฐ์ธ์ด ์ค์ ํ์ผ์ ์ค์ ํด์ฃผ์ด์ผ ํ๊ณ , ์ด๋ฌํ ์ค์ ํ์ผ์ ํ์๋ค๊ณผ ๊ณต์ ํ๋ฉด์ ์ฌ์ฉํด์ผ ํ๋ค. ๋ํ, ํด๋น ๋ฐฉ์์ ์ฝ๋ฉ ์ปจ๋ฒค์ ์ ์ด๊ธ๋ ์ํ๋ก pull-request๋ฅผ ๋ฑ๋กํด๋ ์๋์ผ๋ก merge๋ฅผ ๊ฐ์ ํ ์ ์๋ ๋ฐฉ๋ฒ์ด ์๋ค.
๋ฐ๋ฉด, checkstyle์ gradle build๋ฅผ ์งํํ ๋, ๋ฑ๋กํ ์ฝ๋ฉ ์ปจ๋ฒค์ ์ ๋ง๊ฒ ์ฝ๋ฉ ์ปจ๋ฒค์ ์ ์ฒดํฌํ ์ ์์ผ๋ฉฐ, ํ๋ก์ ํธ์ ํ์ผ์ ๋ฑ๋ก๋กํ๊ธฐ๋ง ํ๋ฉด ์ฝ๋ฉ ์ปจ๋ฒค์ ๊ณต์ ๊ฐ ์๋ฃ๋๋ค. ๋ํ, ์ฝ๋ฉ ์ปจ๋ฒค์ ์ ์ด๊ธ๋ฌ์ ๊ฒฝ์ฐ pull-request์ merge๋ฅผ ์๋์ผ๋ก ๊ฐ์ ํ ์ ์๋ค.
๐ฅ ์ฌ์ด ์ฝ๋ฉ ์ปจ๋ฒค์ ๊ณต์ ์ ์ฝ๋ฉ ์ปจ๋ฒค์ ์ ๋ง๊ฒ ์ฝ๋๋ฅผ ์์ฑํด์ผ pull-request์ merge๋ฅผ ์งํํ ์ ์๋๋ก ๊ฐ์ ํ ์ ์์ด checkstyle์ ํ๋ก์ ํธ์ ์ ์ฉํด๋ณด๊ณ ์ ํ๋ค.
๐ .editorconfig ํ์ผ ์ค์
โผ editorconfig๋ ์ฌ๋ฌ ๊ฐ๋ฐ์๊ฐ ํ๋์ ํ๋ก์ ํธ์์ ์์ ์ ์งํํ ๋, ๋์ผํ ์ฝ๋ ์คํ์ผ์ ์ ์งํ ์ ์๋๋ก ๋์์ค๋ค.
โผ ํ๋ก์ ํธ ์ต์๋จ์ .editorconfig๋ผ๋ ์ด๋ฆ์ผ๋ก ์ ์ฅํ๋ฉด ๋๊ณ , IntelliJ๋ ๋ณ๋์ ํ๋ฌ๊ทธ์ธ ์ค์น๊ฐ ํ์ ์์ผ๋ฉฐ, ์ดํด๋ฆฝ์ค๋ ํ๋ฌ๊ทธ์ธ ์ค์น๊ฐ ์ถ๊ฐ๋ก ์๊ตฌ๋๋ค.
๐ฅ ๊ฐ์ธ IDE์ ์ค์ ์ด ์ ๊ฐ๊ฐ์ผ๋ก ๋์ด ์์ด๋, .editorconfig ํ์ผ์ด ์กด์ฌํ๋ฉด ํด๋น ์ค์ ์ด ์ ์ฉ๋์ด ์ฝ๋ ์์ฑ์ด ์ด๋ฃจ์ด์ง๋ค.
โ ๋ค์์ ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉ๋๋ ํ์ผ ์ค์ ์ด๋ค.
root = true
[*]
# [encoding-utf8]
charset = utf-8
# [newline-lf]
end_of_line = lf
# [newline-eof]
insert_final_newline = true
[*.bat]
end_of_line = crlf
[*.java]
# [indentation-tab]
indent_style = tab
# [4-spaces-tab]
indent_size = 4
tab_width = 4
# [no-trailing-spaces]
trim_trailing_whitespace = true
[line-length-120]
max_line_length = 120
โ ๋น๋ ์, editorconfig ์ฒดํฌ
plugins {
id 'org.ec4j.editorconfig' version '0.0.3'
}
editorconfig {
excludes = ['build']
}
check.dependsOn editorconfigCheck // checkstyle์ด ์ค์ ๋์ด ์์ ์, editorconfigCheck ํ checkstyle ์งํ
โผ .editorconfig ํ์ผ๋ง ์กด์ฌํ๋ค๋ฉด, IDE์ ์ฝ๋ ์คํ์ผ ์ค์ ์ด .editorconfig ํ์ผ์ ๋ฐ๋ผ์ ์ ์ฉ๋๋ค. gradle build ์, ๋ณ๋ค๋ฅธ ์ฒดํฌ๋ ํ์ง ์๋๋ค.
โผ ์ ์ฝ๋๋ฅผ build.gradle์ ์ธํ ํ๋ฉด, gradle build ์ editorconfig ๊ท์น์ ๊ฒ์ฌํ๊ณ , checkstyle ๊ท์น์ ๊ฒ์ฌํ๋ค.
๐ Spring ํ๋ก์ ํธ์ Checkstyle ์ ์ฉํ๊ธฐ
โ build.gradle ์ค์ ์ถ๊ฐ
plugins {
id 'java'
id 'checkstyle'
}
checkstyle {
maxWarnings = 0
configFile = file("${rootDir}/config/naver-checkstyle-rules.xml")
configProperties = ["suppressionFile": "${rootDir}/config/naver-checkstyle-suppressions.xml"]
toolVersion = "8.42"
}
compileJava.options.encoding = 'UTF-8'
compileTestJava.options.encoding = 'UTF-8'
โ configFile, configProperties ํ์ผ ๋ค์ด ๋ฐ์ ํ๋ก์ ํธ์ ์ถ๊ฐ
https://github.com/naver/hackday-conventions-java/tree/master/rule-config
โผ ์ ๋งํฌ์์ naver-checkstyle-rules.xml ํ์ผ๊ณผ naver-checkstyle-suppressions.xml ํ์ผ์ ๋ค์ด๋ก๋ํ๋ค.
โผ ์ ๋งํฌ์์ ๋ค์ด ๋ฐ์ ์ฝ๋ฉ ์ปจ๋ฒค์ ์ ๋ค์ด๋ฒ ์บ ํผ์ค ํต๋ฐ์ด Java ์ฝ๋ฉ ์ปจ๋ฒค์ ์ ๋ฐ๋ฅธ๋ค.
โผ ์์ ๊ฐ์ด ๋ฃจํธ ํ๋ก์ ํธ/config ํด๋ ์๋ ๋ค์ด๋ก๋ํ xml ํ์ผ์ ๋ฃ๋๋ค.
โผ ์ธํ ๋ฆฌ์ ์ด CheckStyle-IDEA ํ๋ฌ๊ทธ์ธ์ ์ค์นํ๋ค.
โผ Settings -> Checkstyle๋ก ์ด๋ํ์ฌ ์์ ๊ฐ์ด ์ค์ ํ๋ค.
โผ Checkstyle version์ ์ต์ ๋ฒ์ ์ด๋ฉฐ, test ํฌํจํ์ฌ ๋ชจ๋ ํ์ผ์ ์ฒดํฌํ๊ณ ์ฒดํฌ ์คํ์ผ ์๋ฐ ์ warning์ผ๋ก ๋์ด ์ค๋ค.
โผ ์ ์ค์ ๊ณผ ์ด์ด์, Configuration File์ + ๋ฒํผ์ ๋๋ฅธ ๋ค, Description ์ค์ , ์ด์ ์ ๋ฐ์๋ naver-checkstyle-rules.xml ํ์ผ์ ์ค์ ํ๋ค.
โผ Next๋ฅผ ๋๋ฅด๋ฉด ์์ ๊ฐ์ ์ฐฝ์ด ๋จ๊ณ , ํ๋กํผํฐ ์ค์ ์ Value ๋ถ๋ถ์ ์ด์ ์ ๋ฐ์๋ naver-checkstyle-suppressions.xml๋ก ์์ฑํ๋ค. ํด๋น ๋ถ๋ถ์ ์์ฑํ์ง ์์ผ๋ฉด, naver-checkstyle-rules.xml ํ์ผ์ ๋ณ์ ๊ฐ์ผ๋ก ๋ค์ด๊ฐ์ง ์์ ์๋ฌ๊ฐ ๋ฐ์ํ๋ค.
โผ ๋ง๋ค์ด์ง Configuration์ Activeํ๊ณ ์๋ฃํ๋ค.
โผ ์ธํ ๋ฆฌ์ ์ด ํ๋จ์ ๋ณด๋ฉด CheckStyle ํญ์ด ์๊ณ , ํด๋น ๋ถ๋ถ์ ํด๋ฆญํ๋ฉด ์์ ๊ฐ์ด ๋์จ๋ค.
โผ Rules๋ฅผ ์ด์ ์ ์ค์ ํ๋ ํ์ผ๋ก ๋ง์ถฐ์ฃผ๊ณ , ์ผ์ชฝ์ Start ์์ด์ฝ์ ํด๋ฆญํ๋ฉด CheckStyle์ด ์งํ๋๋ค.
๐ฌ ์์ ์ธํ ๋ฆฌ์ ์ด ์ค์ ์ ์ํด๋ ํฐ๋ฏธ๋์์ ./gradlew clean build ์ CheckStyle์ด ์งํ๋๊ณ ์๋ชป๋ ๋ถ๋ถ์ด ์์ผ๋ฉด build๊ฐ ์คํจ๋๋ค.
โ ์ธํ ๋ฆฌ์ ์ด์์ ํ์ผ Save ์, ์ปจ๋ฒค์ ์ ๋ง๊ฒ ์ฝ๋ ๋ณ๊ฒฝํ๊ธฐ
โผ Editor -> Code Style -> Java์์ IntelliJ IDEA code style XML์ ํด๋ฆญํ๋ค.
โผ ์ ๊นํ๋ธ ๋งํฌ์์ naver-intellij-formatter.xml ํ์ผ์ ๋ค์ด๋ก๋ํ ๋ค ์ค์ ํ๋ค.
โผ Save Actions ํ๋ฌ๊ทธ์ธ์ ์ค์นํ๋ค.
โผ Settings -> Other Settings -> Save Actions์์ ์์ ๊ฐ์ด ์ฒดํฌํ๋ค.
โผ ์ด๋ ๊ฒ ์ค์ ํ๋ฉด, ์ฝ๋ ์์ฑ ํ Save ์ ์ปจ๋ฒค์ ์ ๋ง๊ฒ ์ฝ๋๊ฐ ๋ณ๊ฒฝ๋๋ค.
โ ํ๋ก์ ํธ์์ ์ปจ๋ฒค์ ์ ๋ง๊ฒ ํ ๋ฒ์ ์ฝ๋ ๋ณ๊ฒฝ์ํค๊ธฐ
โผ ๋ฃจํธ ํ๋ก์ ํธ ์ฐํด๋ฆญ ํ, Reformat Code๋ฅผ ์ ํํ๋ค.
โผ Optimize imports๋ฅผ ์ ํํ๊ณ Run์ ๋๋ฅด๋ฉด ์ปจ๋ฒค์ ์ ๋ง๊ฒ ํ๋ก์ ํธ ๋ด, ๋ชจ๋ ์ฝ๋๊ฐ ๋ณ๊ฒฝ๋๋ค.
๐ .gitattributes ํ์ผ ์ค์
* text=auto
*.png binary
*.jpg binary
*.jpeg binary
*.gif binary
*.bat text merge=union eol=crlf
โผ .gitattributes ์ค์ ์ ํตํด git ์ ์ฅ ์, ํ ์คํธ ๋ฐ ์ง์ ํ์ผ์ ํ์์ ์๋ง๊ฒ ์๋์ผ๋ก ๋ณ๊ฒฝํ์.
๐ฌ LF์ CRLF ์ฐจ์ด์
โผ LF(Line Feed)๋ ์ค ๋ฐ๊ฟ์ ์์ด, ์ปค์์ ์์น ์ด๋์ ์ ์ธํ๊ณ , ์ค ๋ฐ๊ฟ๋ง ๋๋ ๋ฌธ์์ด๋ค.
โผ CRLF(Carriage Return Line Feed)๋ ์ปค์์ ์์น ์ด๋๊ณผ ์ค ๋ฐ๊ฟ์ด ํฉ์ณ์ ธ์ ์ํ๋๋ ๋ฌธ์์ด๋ค.
๐ฅ CRLF๋ Windows์์ LF๋ Unix ๊ณ์ด์์ ๊ธฐ๋ณธ ๊ฐํ ๋ฌธ์๋ก ์ฌ์ฉํ๋ค.
โจ Reference
https://creampuffy.tistory.com/128
'Backend > Spring' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Kotest๋ฅผ ํตํ DCI ํจํด ์ ์ฉ (0) | 2023.05.27 |
---|---|
spring์์ flyway ์ฌ์ฉํ๊ธฐ (0) | 2023.05.26 |
DDD(Domain Driven Design)๋? (1) | 2023.04.03 |
[Spring] Rest-Docs ์ฐ๊ฒฐ (0) | 2023.01.13 |
[Spring] ์๋ฆผ ๊ธฐ๋ฅ์ SSE ์ ์ฉํ๊ธฐ (0) | 2022.11.25 |