Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
76 changes: 76 additions & 0 deletions .github/workflows/checkstyle.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
name: Checkstyle

on:
pull_request:
branches:
- main
- develop
push:
branches:
- main
- develop

jobs:
checkstyle:
name: Code Style Check
runs-on: ubuntu-latest

steps:
- name: Checkout code
uses: actions/checkout@v4
with:
submodules: recursive
token: ${{ secrets.SUBMODULE_TOKEN }}

- name: Set up JDK 17
uses: actions/setup-java@v4
with:
java-version: '17'
distribution: 'temurin'

- name: Cache Gradle packages
uses: actions/cache@v3
with:
path: |
~/.gradle/caches
~/.gradle/wrapper
key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }}
restore-keys: |
${{ runner.os }}-gradle-

- name: Grant execute permission for gradlew
run: chmod +x gradlew

- name: Run Checkstyle
run: ./gradlew checkstyleMain --no-daemon

- name: Upload Checkstyle Report
if: failure()
uses: actions/upload-artifact@v4
with:
name: checkstyle-report
path: |
build/reports/checkstyle/main.html
build/reports/checkstyle/main.xml
retention-days: 7

- name: Comment PR with Checkstyle Results
if: github.event_name == 'pull_request' && failure()
uses: actions/github-script@v7
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
script: |
const fs = require('fs');
const path = require('path');

let comment = '## ⚠️ Checkstyle 위반 사항 발견\n\n';
comment += 'Checkstyle 검사에서 코딩 컨벤션 위반이 발견되었습니다.\n\n';
comment += '### 📋 상세 리포트\n';
comment += '- [Main 소스 리포트 다운로드](../actions/runs/${{ github.run_id }})\n';

github.rest.issues.createComment({
issue_number: context.issue.number,
owner: context.repo.owner,
repo: context.repo.repo,
body: comment
});
21 changes: 21 additions & 0 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ plugins {
id 'java'
id 'org.springframework.boot' version '3.5.8'
id 'io.spring.dependency-management' version '1.1.7'
id 'checkstyle'
}

group = 'gg.agit'
Expand Down Expand Up @@ -64,3 +65,23 @@ clean {
tasks.named('test') {
useJUnitPlatform()
}

checkstyle {
toolVersion = '10.12.5'
configFile = file("${rootDir}/config/checkstyle/checkstyle.xml")
configProperties = ['suppressionFile': "${rootDir}/config/checkstyle/suppressions.xml"]
maxWarnings = 0
ignoreFailures = false
}

checkstyleMain {
source = 'src/main/java'
}

checkstyleTest {
source = 'src/test/java'
}

tasks.named('build') {
dependsOn 'checkstyleMain'
}
242 changes: 242 additions & 0 deletions config/checkstyle/checkstyle.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,242 @@
<?xml version="1.0"?>
<!DOCTYPE module PUBLIC
"-//Checkstyle//DTD Checkstyle Configuration 1.3//EN"
"https://checkstyle.org/dtds/configuration_1_3.dtd">

<!--
BCSDLab Backend Coding Convention v1.0
Referenced by Naver coding convention for Java (version 1.2)
https://naver.github.io/hackday-conventions-java/
-->

<module name="Checker">
<property name="charset" value="UTF-8"/>
<property name="severity" value="error"/>
<property name="fileExtensions" value="java"/>

<!-- 파일당 최대 줄 길이 -->
<module name="LineLength">
<property name="max" value="120"/>
<property name="ignorePattern" value="^package.*|^import.*|a href|href|http://|https://|ftp://"/>
</module>

<!-- 파일 끝에 새 줄 -->
<module name="NewlineAtEndOfFile">
<property name="lineSeparator" value="lf"/>
</module>

<!-- 탭 문자 금지 (스페이스 4칸 사용) -->
<module name="FileTabCharacter">
<property name="eachLine" value="true"/>
</module>

<module name="TreeWalker">

<!-- ========================================== -->
<!-- 1. 네이밍 규칙 -->
<!-- ========================================== -->

<!-- 패키지명: 소문자만 사용 -->
<module name="PackageName">
<property name="format" value="^[a-z]+(\.[a-z][a-z0-9]*)*$"/>
<message key="name.invalidPattern"
value="패키지명 ''{0}''은 소문자만 사용해야 합니다."/>
</module>

<!-- 클래스/인터페이스명: PascalCase -->
<module name="TypeName">
<property name="format" value="^[A-Z][a-zA-Z0-9]*$"/>
<message key="name.invalidPattern"
value="타입명 ''{0}''은 PascalCase를 따라야 합니다."/>
</module>

<!-- 메소드명: camelCase, 'check' 시작 금지 -->
<module name="MethodName">
<property name="format" value="^(?!check)[a-z][a-zA-Z0-9]*$"/>
<message key="name.invalidPattern"
value="메소드명 ''{0}''은 camelCase를 따라야 하며, 'check'로 시작할 수 없습니다. is/has/exists/validate/require를 사용하세요."/>
</module>

<!-- 멤버 변수명: camelCase -->
<module name="MemberName">
<property name="format" value="^[a-z][a-zA-Z0-9]*$"/>
<message key="name.invalidPattern"
value="멤버 변수명 ''{0}''은 camelCase를 따라야 합니다."/>
</module>

<!-- 파라미터명: camelCase -->
<module name="ParameterName">
<property name="format" value="^[a-z][a-zA-Z0-9]*$"/>
<message key="name.invalidPattern"
value="파라미터명 ''{0}''은 camelCase를 따라야 합니다."/>
</module>

<!-- 지역 변수명: camelCase -->
<module name="LocalVariableName">
<property name="format" value="^[a-z][a-zA-Z0-9]*$"/>
<message key="name.invalidPattern"
value="지역 변수명 ''{0}''은 camelCase를 따라야 합니다."/>
</module>

<!-- 상수명: UPPER_SNAKE_CASE -->
<module name="ConstantName">
<property name="format" value="^[A-Z][A-Z0-9]*(_[A-Z0-9]+)*$"/>
<message key="name.invalidPattern"
value="상수명 ''{0}''은 UPPER_SNAKE_CASE를 따라야 합니다."/>
</module>

<!-- ========================================== -->
<!-- 2. Import 규칙 -->
<!-- ========================================== -->

<!-- * import 금지 -->
<module name="AvoidStarImport">
<property name="allowStaticMemberImports" value="true"/>
</module>

<!-- 사용하지 않는 import 금지 -->
<module name="UnusedImports"/>

<!-- 중복 import 금지 -->
<module name="RedundantImport"/>

<!-- ========================================== -->
<!-- 3. 코드 포맷팅 -->
<!-- ========================================== -->

<!-- 들여쓰기: 4칸 -->
<module name="Indentation">
<property name="basicOffset" value="4"/>
<property name="braceAdjustment" value="0"/>
<property name="caseIndent" value="4"/>
<property name="throwsIndent" value="4"/>
<property name="lineWrappingIndentation" value="4"/>
<property name="arrayInitIndent" value="4"/>
</module>

<!-- 빈 줄 관리 -->
<module name="EmptyLineSeparator">
<!-- 필드 사이에 빈 줄 없어도 허용 -->
<property name="allowNoEmptyLineBetweenFields" value="true"/>

<!-- 연속된 빈 줄 금지 -->
<property name="allowMultipleEmptyLines" value="false"/>
<property name="allowMultipleEmptyLinesInsideClassMembers" value="false"/>

<!-- 빈 줄 체크 대상 (VARIABLE_DEF 제외) -->
<property name="tokens" value="PACKAGE_DEF, IMPORT, STATIC_IMPORT,
CLASS_DEF, INTERFACE_DEF, ENUM_DEF,
STATIC_INIT, INSTANCE_INIT,
METHOD_DEF, CTOR_DEF, RECORD_DEF"/>
</module>

<!-- 중괄호 위치 -->
<module name="LeftCurly">
<property name="option" value="eol"/>
</module>

<module name="RightCurly">
<property name="option" value="same"/>
</module>

<!-- 중괄호 필수 (if, else, for, do, while) -->
<module name="NeedBraces">
<property name="allowSingleLineStatement" value="false"/>
</module>

<!-- 공백 규칙 -->
<module name="WhitespaceAround">
<property name="allowEmptyConstructors" value="true"/>
<property name="allowEmptyMethods" value="true"/>
<property name="allowEmptyTypes" value="true"/>
<property name="allowEmptyLoops" value="true"/>
</module>

<module name="WhitespaceAfter">
<property name="tokens" value="COMMA, SEMI"/>
</module>

<!-- Type cast 후 공백 없음 -->
<module name="TypecastParenPad">
<property name="option" value="nospace"/>
</module>

<module name="NoWhitespaceAfter">
<property name="tokens" value="TYPECAST"/>
</module>

<!-- 괄호 내부 공백 없음 -->
<module name="ParenPad">
<property name="option" value="nospace"/>
</module>

<!-- 한 줄에 하나의 statement -->
<module name="OneStatementPerLine"/>

<!-- 한 파일에 하나의 최상위 클래스 -->
<module name="OneTopLevelClass"/>

<!-- ========================================== -->
<!-- 4. 코딩 스타일 -->
<!-- ========================================== -->

<!-- 빈 블록 체크 -->
<module name="EmptyBlock">
<property name="option" value="text"/>
</module>

<!-- 빈 catch 블록 금지 -->
<module name="EmptyCatchBlock">
<property name="exceptionVariableName" value="expected|ignore"/>
</module>

<!-- 배열 선언 스타일: Java 스타일 (String[] args) -->
<module name="ArrayTypeStyle"/>

<!-- 긴 상수는 L 대문자 사용 -->
<module name="UpperEll"/>

<!-- modifier 순서 -->
<module name="ModifierOrder"/>

<!-- 불필요한 괄호 제거 -->
<module name="UnnecessaryParentheses"/>

<!-- equals() 좌변에 상수 사용 금지 (Yoda 조건 금지) -->
<module name="EqualsAvoidNull"/>

<!-- String 비교는 equals 사용 -->
<module name="StringLiteralEquality"/>

<!-- 중복 코드 체크 -->
<module name="SimplifyBooleanExpression"/>
<module name="SimplifyBooleanReturn"/>

<!-- finalize() 메소드 금지 -->
<module name="NoFinalizer"/>

<!-- ========================================== -->
<!-- 5. 어노테이션 -->
<!-- ========================================== -->

<!-- 어노테이션 위치 -->
<module name="AnnotationLocation">
<property name="allowSamelineMultipleAnnotations" value="false"/>
<property name="allowSamelineSingleParameterlessAnnotation" value="false"/>
<property name="allowSamelineParameterizedAnnotation" value="false"/>
</module>

<!-- ========================================== -->
<!-- 6. 기타 -->
<!-- ========================================== -->

<!-- 매직 넘버 금지 -->
<module name="MagicNumber">
<property name="ignoreNumbers" value="-1, 0, 1, 2"/>
<property name="ignoreHashCodeMethod" value="true"/>
<property name="ignoreAnnotation" value="true"/>
<property name="ignoreFieldDeclaration" value="true"/>
</module>

</module>
</module>
13 changes: 13 additions & 0 deletions config/checkstyle/suppressions.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
<?xml version="1.0"?>
<!DOCTYPE suppressions PUBLIC
"-//Checkstyle//DTD SuppressionFilter Configuration 1.2//EN"
"https://checkstyle.org/dtds/suppressions_1_2.dtd">

<suppressions>
<!-- QueryDSL 생성 파일 제외 -->
<suppress files="[\\/]generated[\\/]" checks=".*"/>
<suppress files="Q.*\.java" checks=".*"/>

<!-- 테스트 코드는 매직 넘버 허용 -->
<suppress files="[\\/]test[\\/]" checks="MagicNumber"/>
</suppressions>
Original file line number Diff line number Diff line change
Expand Up @@ -11,4 +11,4 @@ public record CreateChatRoomRequest(
Integer clubId
) {

}
}
4 changes: 2 additions & 2 deletions src/main/java/gg/agit/konect/domain/chat/model/ChatRoom.java
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ private ChatRoom(Integer id, User sender, User receiver) {
}

public static ChatRoom of(User sender, User receiver) {
return ChatRoom.builder()
return ChatRoom.builder()
.sender(sender)
.receiver(receiver)
.build();
Expand Down Expand Up @@ -84,7 +84,7 @@ public LocalDateTime getLastMessageTime() {
}

public Integer getUnreadCount(Integer userId) {
return (int) chatMessages.stream()
return (int)chatMessages.stream()
.filter(message -> message.getReceiver().getId().equals(userId))
.filter(message -> !message.getIsRead())
.count();
Expand Down
Loading
Loading