style guide - sshome-25/safeRent-Backend GitHub Wiki
<?xml version="1.0"?>
<!DOCTYPE module PUBLIC
"-//Checkstyle//DTD Checkstyle Configuration 1.3//EN"
"https://checkstyle.org/dtds/configuration_1_3.dtd">
<module name="Checker">
<property name="charset" value="UTF-8"/>
<property name="severity" value="warning"/>
<property name="fileExtensions" value="java, properties, xml"/>
<!-- ๋ชจ๋ ์ ๋ณด ํ์ผ ์ ์ธ -->
<module name="BeforeExecutionExclusionFileFilter">
<property name="fileNamePattern" value="module\-info\.java$"/>
</module>
<!-- ํญ ๋ฌธ์ ์ฌ์ฉ ๊ธ์ง -->
<module name="FileTabCharacter">
<property name="eachLine" value="true"/>
</module>
<!-- ๋ผ์ธ ๊ธธ์ด ์ ํ -->
<module name="LineLength">
<property name="fileExtensions" value="java"/>
<property name="max" value="100"/>
<property name="ignorePattern" value="^package.*|^import.*|href\s*=\s*"[^"]*"|http://|https://|ftp://"/>
</module>
<module name="TreeWalker">
<!-- ๊ธฐ๋ณธ ์ฝ๋ ์คํ์ผ ๊ฒ์ฌ -->
<module name="AvoidStarImport"/>
<module name="NeedBraces"/>
<module name="LeftCurly"/>
<module name="RightCurly"/>
<module name="OneStatementPerLine"/>
<!-- ๋ช
๋ช
๊ท์น -->
<module name="PackageName">
<property name="format" value="^[a-z]+(\.[a-z][a-z0-9]*)*$"/>
</module>
<module name="TypeName"/>
<module name="MemberName">
<property name="format" value="^[a-z][a-zA-Z0-9]*$"/>
</module>
<module name="ParameterName">
<property name="format" value="^[a-z][a-zA-Z0-9]*$"/>
</module>
<module name="LocalVariableName">
<property name="format" value="^[a-z][a-zA-Z0-9]*$"/>
</module>
<!-- ์ฝ๋ ํ์ ๊ท์น -->
<module name="WhitespaceAround">
<property name="allowEmptyConstructors" value="true"/>
<property name="allowEmptyMethods" value="true"/>
<property name="allowEmptyTypes" value="true"/>
<property name="allowEmptyLoops" value="true"/>
<property name="tokens" value="ASSIGN, BAND, BAND_ASSIGN, BOR, BOR_ASSIGN, BSR, BSR_ASSIGN, BXOR,
BXOR_ASSIGN, COLON, DIV, DIV_ASSIGN, DO_WHILE, EQUAL, GE, GT, LAMBDA, LAND,
LCURLY, LE, LITERAL_CATCH, LITERAL_DO, LITERAL_ELSE, LITERAL_FINALLY,
LITERAL_FOR, LITERAL_IF, LITERAL_RETURN, LITERAL_SWITCH, LITERAL_SYNCHRONIZED,
LITERAL_TRY, LITERAL_WHILE, LOR, LT, MINUS, MINUS_ASSIGN, MOD, MOD_ASSIGN,
NOT_EQUAL, PLUS, PLUS_ASSIGN, QUESTION, RCURLY, SL, SLIST, SL_ASSIGN, SR,
SR_ASSIGN, STAR, STAR_ASSIGN, LITERAL_ASSERT"/>
</module>
<module name="WhitespaceAfter"/>
<module name="EmptyBlock">
<property name="option" value="TEXT"/>
</module>
<module name="EmptyLineSeparator">
<property name="allowNoEmptyLineBetweenFields" value="true"/>
</module>
<module name="MultipleVariableDeclarations"/>
<module name="ArrayTypeStyle"/>
<!-- ์ฝ๋ ํ์ง ๊ท์น -->
<module name="MissingSwitchDefault"/>
<module name="FallThrough"/>
<module name="UpperEll"/>
<module name="ModifierOrder"/>
<module name="EmptyCatchBlock">
<property name="exceptionVariableName" value="expected"/>
</module>
<!-- Import ๊ด๋ จ ๊ท์น -->
<module name="RedundantImport"/>
<module name="UnusedImports"/>
<module name="IllegalImport"/>
<!-- Google ์คํ์ผ ๊ฐ์ด๋์์ ์ถ๊ฐ์ ์ธ ์ค์ ๊ท์น -->
<!-- ํด๋์ค ๋ฐ ์ธํฐํ์ด์ค ์ค๊ณ -->
<module name="OneTopLevelClass"/> <!-- ํ์ผ๋น ํ๋์ ์ต์์ ํด๋์ค๋ง ํ์ฉ -->
<module name="InterfaceTypeParameterName"/> <!-- ์ธํฐํ์ด์ค ํ์
ํ๋ผ๋ฏธํฐ ์ด๋ฆ ๊ท์น -->
<module name="NoFinalizer"/> <!-- finalizer ๋ฉ์๋ ์ฌ์ฉ ๊ธ์ง -->
<!-- ํฌ๋งทํ
-->
<module name="GenericWhitespace"/> <!-- ์ ๋ค๋ฆญ ๊ด๋ จ ๊ณต๋ฐฑ ๊ท์น -->
<module name="Indentation"> <!-- ๋ค์ฌ์ฐ๊ธฐ ๊ท์น -->
<property name="basicOffset" value="2"/>
<property name="braceAdjustment" value="0"/>
<property name="caseIndent" value="2"/>
<property name="throwsIndent" value="4"/>
<property name="lineWrappingIndentation" value="4"/>
<property name="arrayInitIndent" value="2"/>
</module>
<module name="NoLineWrap"/> <!-- ํจํค์ง, import ๋ฌธ์ ์ค๋ฐ๊ฟ ๊ธ์ง -->
<module name="OperatorWrap"> <!-- ์ฐ์ฐ์ ์ค๋ฐ๊ฟ ๊ท์น -->
<property name="option" value="NL"/>
<property name="tokens" value="BAND, BOR, BSR, BXOR, DIV, EQUAL, GE, GT, LAND, LE, LITERAL_INSTANCEOF, LOR,
LT, MINUS, MOD, NOT_EQUAL, PLUS, QUESTION, SL, SR, STAR"/>
</module>
<!-- ์๋ฐ๋
(Javadoc) -->
<module name="NonEmptyAtclauseDescription"/> <!-- Javadoc @์ ์ด ๋น์ด์์ง ์์์ผ ํจ -->
<!-- ๋ธ๋ก ๊ด๋ จ -->
<module name="AvoidNestedBlocks"/> <!-- ์ค์ฒฉ ๋ธ๋ก ํํผ -->
<!-- ์ฝ๋ฉ -->
<module name="EqualsHashCode"/> <!-- equals์ hashCode ํจ๊ป ์ ์ -->
<module name="SimplifyBooleanExpression"/> <!-- ๋ถํ์ํ๊ฒ ๋ณต์กํ boolean ํํ์ ๊ฐ์ํ -->
<module name="SimplifyBooleanReturn"/> <!-- boolean ๋ฐํ ๊ฐ์ํ -->
<!-- ๊ธฐํ ์ค์ ๊ฒ์ฌ -->
<module name="OuterTypeFilename"/> <!-- ํ์ผ ์ด๋ฆ๊ณผ ํด๋์ค ์ด๋ฆ ์ผ์น ํ์ธ -->
<module name="IllegalTokenText"> <!-- ํน์ ๋ฌธ์์ด ๋ฆฌํฐ๋ด ์ ํ -->
<property name="tokens" value="STRING_LITERAL, CHAR_LITERAL"/>
<property name="format" value="\\u00(09|0(a|A)|0(c|C)|0(d|D)|22|27|5(C|c))|\\(0(10|11|12|14|15|42|47)|134)"/>
<property name="message" value="ํน์ ์ด์ค์ผ์ดํ ์ํ์ค ๋์ ์ ๋์ฝ๋ ๊ฐ์ด๋ 8์ง์ ๊ฐ์ ์ฌ์ฉํ์ธ์."/>
</module>
<module name="AvoidEscapedUnicodeCharacters"> <!-- ์ ๋์ฝ๋ ์ด์ค์ผ์ดํ ์ ํ -->
<property name="allowEscapesForControlCharacters" value="true"/>
<property name="allowByTailComment" value="true"/>
<property name="allowNonPrintableEscapes" value="true"/>
</module>
<!-- ์ฝ์ด ์ ํ -->
<module name="AbbreviationAsWordInName">
<property name="ignoreFinal" value="false"/>
<property name="allowedAbbreviationLength" value="1"/>
</module>
<!-- case ๊ตฌ๋ฌธ ๊ณต๋ฐฑ ์ ํ -->
<module name="NoWhitespaceBeforeCaseDefaultColon"/>
<!-- ๋ณ์ ์ ์ธ๊ณผ ์ฌ์ฉ ๊ฑฐ๋ฆฌ ์ ํ -->
<module name="VariableDeclarationUsageDistance"/>
<!-- import ์์ -->
<module name="CustomImportOrder">
<property name="sortImportsInGroupAlphabetically" value="true"/>
<property name="separateLineBetweenGroups" value="true"/>
<property name="customImportOrderRules" value="STATIC###THIRD_PARTY_PACKAGE"/>
</module>
<!-- ๋ฉ์๋ ํ๋ผ๋ฏธํฐ ํจ๋ฉ -->
<module name="MethodParamPad"/>
<!-- ํน์ ๋ฌธ์ ์์ ๊ณต๋ฐฑ ์ ํ -->
<module name="NoWhitespaceBefore">
<property name="tokens" value="COMMA, SEMI, POST_INC, POST_DEC, DOT"/>
<property name="allowLineBreaks" value="true"/>
</module>
<!-- ๊ดํธ ํจ๋ฉ -->
<module name="ParenPad"/>
<!-- ๊ตฌ๋ถ์ ์ค๋ฐ๊ฟ -->
<module name="SeparatorWrap">
<property name="tokens" value="DOT"/>
<property name="option" value="nl"/>
</module>
<module name="SeparatorWrap">
<property name="tokens" value="COMMA"/>
<property name="option" value="EOL"/>
</module>
<!-- ์ ๋
ธํ
์ด์
์์น -->
<module name="AnnotationLocation">
<property name="tokens" value="CLASS_DEF, INTERFACE_DEF, ENUM_DEF, METHOD_DEF, CTOR_DEF"/>
</module>
<!-- ์ฃผ์ ๋ค์ฌ์ฐ๊ธฐ -->
<module name="CommentsIndentation"/>
</module>
</module>
Google ์คํ์ผ ๊ฐ์ด๋ Checkstyle ๊ท์น ์ ๋ฆฌ ๊ธฐ๋ณธ ํฌ๋งทํ (Basic Formatting)
๋ค์ฌ์ฐ๊ธฐ (Indentation)
๊ธฐ๋ณธ ๋ค์ฌ์ฐ๊ธฐ: 2์นธ ์ฐ์ ์ค: 4์นธ ๋ค์ฌ์ฐ๊ธฐ ๋ฐฐ์ด ์ด๊ธฐํ: 2์นธ ๋ค์ฌ์ฐ๊ธฐ switch ๋ฌธ: case๋ 2์นธ ๋ค์ฌ์ฐ๊ธฐ
์ค๊ดํธ (Braces)
ํ์ ์ฌ์ฉ: if, else, for, while ๋ฑ ๋ชจ๋ ์ ์ด๋ฌธ ์ผ์ชฝ ์ค๊ดํธ ์์น: ๊ฐ์ ์ค์ ๋ฐฐ์น (K&R ์คํ์ผ) ์ค๋ฅธ์ชฝ ์ค๊ดํธ ์์น: ์ฝ๋ ๋ธ๋ก๊ณผ ๊ฐ์ ๋ค์ฌ์ฐ๊ธฐ ๋ ๋ฒจ
๊ณต๋ฐฑ (Whitespace)
์ฐ์ฐ์ ์ฃผ์: ๊ณต๋ฐฑ ํ์ ํค์๋์ ๊ดํธ ์ฌ์ด: ๊ณต๋ฐฑ ํ์ ๋ฉ์๋ ์ด๋ฆ๊ณผ ๊ดํธ ์ฌ์ด: ๊ณต๋ฐฑ ์์ ๊ดํธ ์: ๊ณต๋ฐฑ ์์ ์ปด๋ง, ์ธ๋ฏธ์ฝ๋ก ๋ค: ๊ณต๋ฐฑ ํ์ ์ฝ๋ก ์ฃผ์: ๊ณต๋ฐฑ ํ์
์ค ๋ฐ๊ฟ (Line Wrapping)
์ต๋ ์ค ๊ธธ์ด: 100์ ์ฐ์ฐ์ ์ค ๋ฐ๊ฟ: ์ฐ์ฐ์ ์์์ ์ค ๋ฐ๊ฟ ํจํค์ง, import ๋ฌธ: ์ค ๋ฐ๊ฟ ๊ธ์ง
๋ช ๋ช ๊ท์น (Naming Conventions)
ํจํค์ง ์ด๋ฆ (Package Names)
๋ชจ๋ ์๋ฌธ์, ์ซ์ ํ์ฉ ์ธ๋์ค์ฝ์ด ์ฌ์ฉ ๊ธ์ง ํ์: ^[a-z]+(.[a-z][a-z0-9])$
ํด๋์ค ์ด๋ฆ (Type Names)
UpperCamelCase ์ฌ์ฉ ๋ช ์ฌ ๋๋ ๋ช ์ฌ๊ตฌ ์ฝ์ด๋ ๋ชจ๋ ๋๋ฌธ์ ๋๋ ์ฒซ ๊ธ์๋ง ๋๋ฌธ์
๋ฉ์๋ ์ด๋ฆ (Method Names)
lowerCamelCase ์ฌ์ฉ ๋์ฌ ๋๋ ๋์ฌ๊ตฌ
์์ ์ด๋ฆ (Constant Names)
UPPER_SNAKE_CASE ์ฌ์ฉ ๋ชจ๋ ๋๋ฌธ์, ๋จ์ด ์ฌ์ด์ ์ธ๋์ค์ฝ์ด
๋ณ์ ์ด๋ฆ (Variable Names)
๋ฉค๋ฒ ๋ณ์: lowerCamelCase ์ฌ์ฉ ์ง์ญ ๋ณ์: lowerCamelCase ์ฌ์ฉ ํ๋ผ๋ฏธํฐ: lowerCamelCase ์ฌ์ฉ ํ ๊ธ์ ์ด๋ฆ ์ง์ (for ๋ฃจํ์ i, j ๋ฑ์ ์์ธ)
ํ์ ๋งค๊ฐ๋ณ์ ์ด๋ฆ (Type Parameter Names)
๋จ์ผ ๋๋ฌธ์ ๋๋ T๋ก ๋๋๋ ๋๋ฌธ์ ํ์: (^[A-Z][0-9]?)$|([A-Z][a-zA-Z0-9]*[T]$)
ํ๋ก๊ทธ๋๋ฐ ๊ดํ (Programming Practices)
์ํฌํธ (Imports)
์์ผ๋์นด๋ ์ํฌํธ ๊ธ์ง (import java.util.*) ์ค๋ณต/์ฌ์ฉํ์ง ์๋ ์ํฌํธ ๊ธ์ง ์์: ์ ์ ์ํฌํธ โ ์ 3์ ํจํค์ง ์ํฌํธ ์ํ๋ฒณ ์์ผ๋ก ์ ๋ ฌ
๋ณ์ ์ ์ธ (Variable Declarations)
ํ ์ค์ ํ๋์ ๋ณ์๋ง ์ ์ธ ์ฌ์ฉ ์์ ์ ๊ฐ๊น๊ฒ ์ ์ธ
๋ฐฐ์ด (Arrays)
Java ์คํ์ผ ์ ์ธ: String[] args (C ์คํ์ผ String args[] ๊ธ์ง)
์ค์์น ๋ฌธ (Switch Statements)
ํญ์ default ์ผ์ด์ค ํฌํจ Fall-through ์ฌ์ฉ ์ ์ฃผ์์ผ๋ก ๋ช ์
์์ ์ (Modifiers)
ํ์ค ์์ ์ค์: public, protected, private, abstract, static, final, transient, volatile, synchronized, native
๊ธฐํ ์ฝ๋ฉ ๊ท์น
equals์ hashCode ํจ๊ป ์ ์ finalizer ๋ฉ์๋ ์ฌ์ฉ ๊ธ์ง boolean ํํ์ ๊ฐ์ํ ์ค์ฒฉ ๋ธ๋ก ์ต์ํ
์๋ฐ๋ (Javadoc)
์ฌ์ฉ ์์น
๊ณต๊ฐ ํด๋์ค, ์ธํฐํ์ด์ค, ๋ฉ์๋์ ํ์ ๊ฐ๋จํ getter/setter๋ ์ ํ์
ํ์
ํ๊ทธ ์ค๋ช ์ด ๋น์ด์์ง ์์์ผ ํจ ์ฒซ ๋ฌธ์ฅ์ ์์ฝ ๋ฌธ์ฅ์ผ๋ก ์ฌ์ฉ
๊ธฐํ (Miscellaneous)
ํ์ผ ๊ด๋ จ
ํ์ผ ์ด๋ฆ๊ณผ ์ต์์ ํด๋์ค ์ด๋ฆ ์ผ์น ํ ํ์ผ์ ํ๋์ ์ต์์ ํด๋์ค/์ธํฐํ์ด์ค๋ง ์ ์ ํญ ๋ฌธ์ ์ฌ์ฉ ๊ธ์ง (๊ณต๋ฐฑ ์ฌ์ฉ)
ํน์ ๋ฌธ์
์ ๋์ฝ๋ ์ด์ค์ผ์ดํ๋ ํ์ํ ๊ฒฝ์ฐ๋ง ์ฌ์ฉ ํน์ ์ด์ค์ผ์ดํ ์ํ์ค ๋์ ์ ๋์ฝ๋ ๊ฐ์ด๋ 8์ง์ ๊ฐ ์ฌ์ฉ ์ง์
์ฝ์ด ์ ํ
ํด๋์ค, ๋ฉ์๋ ๋ฑ์ ์ด๋ฆ์์ ์ฝ์ด ์ฌ์ฉ ์ต์ํ ํ์ฉ๋ ์ฝ์ด ๊ธธ์ด: 1์