Java 프로젝트를 초기 구성하기 위해서 IntelliJ에서 제공하는 새 프로젝트를 활용합니다. 하지만 많은 템플릿 중에서도 개인적으로 Gradle을 기반으로 Checkstyle, PMD, FindBugs(SpotBugs)를 함께 사용합니다.

  • 코딩 스타일 통일
  • 정적 분석으로 빨리 문제점 인지하기

이 두가지 목적을 위해서 플러그인을 함께 사용합니다. 그리고 Gradle or Maven은 특별히 구분하지 않지만 다양한 시도가 가능한 Gradle을 조금 더 좋아합니다. 하지만 아직도 Groovy 문법은 어색하고 모르겠습니다. T-T

프로젝트를 시작할 때 처음으로 챙겨야 할 가장 중요한 요소는 코딩 스타일이라고 생각합니다. 단순히 스타일 체크도 있지만 설계에 관련된 개념도 함께 포함됩니다. 클래스는 Immutable 하게 생성한다를 위해

  • ‘생성자에서만 파라미터를 받아서 설정한다’ 라던지
  • ‘변하지 않는 변수에는 모두 final을 붙인다’ 라던지

그래서 코딩 스타일의 통일이 가장 중요하다고 생각합니다. 이러한 룰은 함께 일하는 개발자들과 함께 말로 통일할 수 있지만 실수할 수도 있기 때문에 도구 기반의 활용이 필요합니다. Java에서는 이런 도구로 Checkstyle, PMD, Findbugs을 활용합니다.

Gradle Java 프로젝트

Gradle 기반으로 프로젝트를 구성하면 다음과 같은 파일 구조를 가집니다.

Gradle 프로젝트 구성

build.gradle, settings.gradle 두 개의 파일이 있습니다. build.gradle은 Maven Repository 의존성 관리 및 빌드 관리를 설정합니다. settings.gradle 파일은 한 프로젝트 내에서 모듈을 분리하는 경우 사용합니다.

위 캡쳐 그림의 구조에서 gradle, src 등의 구조는 일반적인데 config는 checkstyle 설정을 위한 디렉토리입니다. Gradle Checkstyle Pluginconfig/checkstyle/checkstyle.xml의 설정을 이용하여 코드 스타일 체크합니다. 그 외 PMD 혹은 FindBugs 설정 파일도 config 폴더에 저장하여 관리합니다.

정적 분석

checkstyle

Checkstyle은 코딩 스타일 규칙을 정의하여 체크합니다. IntelliJ IDEA 플러그인도 있어서 쉽게 코딩 스타일 오류를 찾고 수정할 수 있습니다. Checkstyle을 처음 사용할 때 가장 좋은 것은 많은 사람들이 사용하는 스타일 규칙입니다. Java는 Google Checkstyle이 합리적으로 선언되고 대중적인 스타일이라고 생각합니다.

하지만 개인적으로 Google Checkstyle에서 마음에 안 드는 2가지를 수정해서 사용합니다.

  1. Indent: 2 -> 4 spaces
  2. Import Order: THIRD_PARTY_PACKAGE###STANDARD_JAVA_PACKAGE###STATIC

Indent는 C# 및 golang을 사용하며 4칸 공백이 명확하게 구분이 잘 되서 선호합니다. 그리고 Java 개발 시 IntelliJ IDEA를 사용하는데 Google Checkstyle Import 구문 순서와 차이가 있어서 IntelliJ IDEA 스타일이 더 마음에 들어서 THIRD_PARTY_PACKAGE###STANDARD_JAVA_PACKAGE###STATIC을 적용합니다.

수정한 부분만 표시하면 다음과 같습니다.

// Indent
<module name="Indentation">
    <property name="basicOffset" value="4"/>
    <property name="braceAdjustment" value="0"/>
    <property name="caseIndent" value="4"/>
    <property name="throwsIndent" value="8"/>
    <property name="lineWrappingIndentation" value="8"/>
    <property name="arrayInitIndent" value="4"/>
</module>

...(생략)...

// Import Order
<module name="CustomImportOrder">
    <property name="sortImportsInGroupAlphabetically" value="true"/>
    <property name="separateLineBetweenGroups" value="true"/>
    <property name="customImportOrderRules" value="THIRD_PARTY_PACKAGE###STANDARD_JAVA_PACKAGE###STATIC"/>
</module>

Google Checkstyle도 계속 업데이트 되기 때문에 참고하여 자신에게 적합한 스타일로 바꿔 사용하면 좋습니다.

pmd

PMD는 코드 분석을 제공하는 도구입니다. 문법적으로 오류 가능성이 높은 항목들을 Rule 기반으로 체크해서 알려줍니다.

.../src/main/java/net/sourceforge/pmd/RuleSet.java:123  These nested if statements could be combined
.../src/main/java/net/sourceforge/pmd/RuleSet.java:231  Useless parentheses.

이러한 문법적으로 발생 가능한 오류를 체크해주기 때문에 개발자에게 한 번 더 자신이 작성한 코드의 위험성을 인지하게 도와줍니다.

findbugs

FindBugs는 정적 분석을 제공하는 도구입니다.

FindBugs

참고: JDK7에 대한 FindBugs 결과 http://findbugs.cs.umd.edu/demo/jdk7/index.html

Scaffolding 이란, 참 편하긴 한데… Java는 어수선?

웹 프론트엔드 개발을 위해서 react.js, vue.js 등을 공부하면서 Scaffolding 이란 개념을 처음 알게되었습니다.

Scaffolding이란 일반적인, 혹은 특정한 기술들을 묶어서 사용하기 쉽게 제공해주는 기본 틀과 같은 개념입니다. Scaffolding이 제공된다는 의미는 일반적으로 사람들이 많이 사용(혹은 협의된) 구조이기 때문에 처음 프로젝트를 사용하는 구성원이 쉽게 프로젝트에 적응 가능합니다.

기본적은 구조는 Spring starter와 같이 제공되지만 정적 분석 도구 등의 코드 퀄리티 관련된 구조는 많이 부족하다고 생각됩니다. 이러한 구조 혹은 플러그인들의 사용법이 다양하게 공유되어 코드 품질을 올릴 수 있는 기회가 생기면 좋을 것 같습니다.