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*&quot;[^&quot;]*&quot;|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์ž

โš ๏ธ **GitHub.com Fallback** โš ๏ธ