웅글웅글
article thumbnail

프로젝트를 진행하면서 코드 컨밴션을 맞추는 이유는 코드의 가독성과 이해도를 높인다고 생각한다. 또 유지보수성도 높아지기 때문에 코드 컨밴션을 맞추는 것은 중요하다.

 

그래서 나는 프로젝트에 코드 컨밴선을 맞추게 도와주는 린트(Lint)를 적용하기로 했다. 먼저 Java 코드의 코드 컨밴션을 맞춰주는 린트인 check-style과 sonarlint를 찾아보았다.

 

CheckStyle VS SonarLint

SonarLint

  •  IDE 플러그인으로만 사용 가능
  • 코드 스멜, 보안 취약점 검사 가능
  • SonarQube와 연동하여 더 많은 기능 사용 가능

CheckStyle

  • 코드 스타일, 코드 컨밴션 검사 가능
  • 빌드 시 컨밴션도 검사 가능
  • 컨밴션이 맞지 않을 시 PR의 머지를 강제로 막을 수 있다.
  • xml의 파일로 설정하기 때문에 커스텀이 간편하다.

SonarLint은 코드 스멜, 보안 취약점 검사 등 제공하는 기능이 CheckStyle보다 많지만 코드 컨밴션을 강제화할 수 없다는 점과 팀원이 각각 다 설정을 해줘야하기 때문에 한 번만 설정하면 되는 CheckStyle을 사용하기로 했다. 또 간단하게 코드 컨밴션을 맞추는 용도로는 CheckStyle이 낫다고 판단했다.

 

CheckStyle 적용하기

먼저 CheckStyle을 적용하기 위해서는 build.gradle 파일에 설정을 해줘야 한다.

 

plugins {
    id 'java'
    id 'org.springframework.boot' version '3.4.3'
    id 'io.spring.dependency-management' version '1.1.7'
    id 'checkstyle'
}

//checkStyle
compileJava.options.encoding = 'UTF-8'
compileTestJava.options.encoding = 'UTF-8'

tasks.withType(Checkstyle) {
    reports {
        xml.required = true
        html.required = true
    }
}

checkstyle {
    maxWarnings = 0
    configFile = file("checkstyle/naver-checkstyle-rules.xml")
    configProperties = ["suppressionFile": "checkstyle/naver-checkstyle-suppressions.xml"]
}

 

코드를 설명하자면 먼저 플러그인에 check style을 추가하고 아래에 인코딩 방법을 UTF-8로 설정한다. 그리고 빌드가 되었을 때 컨밴션 결과를 xml 파일과 html 파일로 제공한다. 마지막으로 maxWarnings은 최대 경고 개수인데 0개로 설정해서 1개의 코드 컨밴션만 어긋나도 빌드가 실패된다. 아래는 컨밴션 설정 파일을들을 지정하는 부분이다.

 

컨밴션은 구글에서 제공하는 것도 있고 네이버에서 제공하는 것도 있는데 나는 네이버에서 제공하는 코드 컨밴션을 사용할 것이다. https://github.com/naver/hackday-conventions-java

여기서 파일들을 다운받고 프로젝트에 넣어주면 된다.

 

GitHub - naver/hackday-conventions-java: 캠퍼스 핵데이 Java 코딩 컨벤션

캠퍼스 핵데이 Java 코딩 컨벤션. Contribute to naver/hackday-conventions-java development by creating an account on GitHub.

github.com

이렇게 설정을 한 뒤 빌드를 실행하면 나오는 결과 리포트는 아래와 같다.

 

이제 간단하게 단축키나 저장할 시에 자동으로 코드 컨밴션을 맞춰주도록 설정하겠다.

코드 컨밴션 자동으로 맞추기

먼저 Intellij의 설정을 통해 단축키와 저장 시에 컨밴션을 자동으로 맞춰줄 수 있다.

단축키

  1. Intellij에서 File -> Setting에 들어간다.
  2. Editor -> Code Style 목록에 들어간다.
  3. Scheme에 있는 톱니바퀴를 누른다.
  4. Import Scheme -> Intellij IDEA code style XML을 누른다.
  5. 자신이 설치한 CheckStyle 파일을 선택한다.

 

이렇게 설정을 하고 나면 포매터 설정이 끝이 난다. 이제 간단하게 코드 컨밴션을 맞추고 싶을 때 Ctrl + Alt + L 을 누르면 쉽게 코드 컨밴션을 맞출 수 있다. 맥은 Command + Alt + L을 누르면 된다. 이제 저장할 때마다 자동으로 코드 컨밴션을 맞춰주도록 설정해보겠다.

저장 시

  1. File -> Setting에 들어간다.
  2. Tools -> Actions on Save에 들어간다
  3. Reformat code(코드 포맷)와 Optimize imports(사용하지 않는 import 제거)를 체크해준다.

 

이렇게 설정해주면 저장 시에 우리가 설정한 Check Style로 코드가 포맷팅 되고 사용하지 않는 import문 또한 제거된다.

이제 플러그인을 추가해서 코드 컨밴션이 맞지 않는 부분을 표시해보도록 하겠다.

플러그인 적용

먼저 File -> Setting -> Plugins에 들어가서 CheckStyle-IDEA를 설치하고 IDEA 를 재실행한다.

이제 File -> Setting -> Tools -> Check Style로 들어가서 아래에 빨간색으로 되어 있는 부분들을 체크한다.

 

 

Scap Scope는 All sources로 설정하고 Configuration File은 + 버튼을 눌러 설정할 파일을 아래와 같이 넣어주면 된다.

 

 

이렇게 File에 naver-checkstyle-rules.xml 파일을 넣고 Next를 누르면 suppressionFile의 값을 넣는 부분이 나오는데 이곳에 naver-checkstyle-suppressions.xml을 적어주고 추가해서 적용하면 된다. 이렇게 설정해서 실제로 확인해보면 아래와 같이 CheckStyle 탭이 생겨 어디서 코드 컨밴션이 맞지 않는지 알려주고 경고해준다.

 

 

이제 Github Action을 사용하여 CI를 만들어 PR을 머지할 때 코드 컨밴션이 맞지 않으면 머지를 못하도록 설정해보겠다.

Github Action으로 PR Merge 막기

Github Action에 CI를 작성하여 빌드 시 check style을 검사하도록 작성하였다.

name: Java CI with Gradle

on:
  pull_request:
    branches: [ "main" ]

permissions:
  contents: read

jobs:
  build and lint:
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v3
      - name: Set up JDK 23
        uses: actions/setup-java@v3
        with:
          java-version: '23'
          distribution: 'temurin'

      - name: Grant execute permission for gradlew
        run: chmod +x gradlew
        working-directory: ${{ secrets.WORKING_DIRECTORY }}

      - name: Build with Gradle
        run: ./gradlew clean build
        working-directory: ${{ secrets.WORKING_DIRECTORY }}

 

나는 프론트와 백을 하나의 레파지토리에서 관리하기 때문에 Working Dierectory를 지정해서 따로 백엔드 패키지에 연결해 주었다. 나는 build할 때 Check style도 같이 검사하기 때문에 CI에 빌드 테스트만 넣어지만, 만약 분리한다면 lint 검사도 하는 로직을 추가해야 한다.

 

정리

Check Style을 사용하니 PR을 강제화할 수 있어 팀원들 간의 코드 컨밴션을 맞출 수 있어서 좋았고, 지금은 간단하게 코드 컨밴션을 맞추기 위해 Check Style을 사용했지만, 나중에는 코드 스멜이나 좀 더 다양한 기능을 가진 sonar lint도 사용해 볼 예정이다.