PMD / CheckStyle / Findbugs

2020. 3. 27. 11:19코드 품질 관리

정적 분석

정적 분석은 소프트웨어를 분석하는 방법의 하나로 소프트웨어를 실행하지 않고 코드 레벨에서 분석하는 방법입니다.

PMD란

PMD의 개념

PMD는 Java의 잘못된 코드를 검사해주는 정적 소스 코드 분석 도구입니다. PMD에는 기본 제공 규칙 세트가 포함되어 있으며 사용자 지정 규칙을 작성할 수 있습니다. 그리고 PMD는 단독 형태로도 사용할 수 있으며, 이클립스나 IntelliJ와 같은 IDE에 플러그인 형태로 배포되어 사용할 수도 있습니다.

PMD 점검 기준

기준

설명

표준 코드 기준(Compliance with coding standards)

- 명명 규칙: 클래스, 메소드, 파라미터, 변수 이름

- 클래스 및 메서드 길이

- 주석 및 JavaDocs의 존재 및 서식

코드 안티 패턴(Coding Antipatterns)

- 비어 있는 try/catch/finally/switch 블록

- 사용되지 않은 지역 변수, 파라미터, Private 메소드

- 비어 있는 if/while 구문

- 너무 복잡한 표현

Ex) 불필요한 if 구문, 무한 루프에 빠질 수 있는 for 루프

- 높은 복잡성 지표를 가진 클래스

CPD(Cut And Paste Detector)

- 의심스러운 코드 복사를 찾는 도구

- CPD는 최소 크기의 코드 블락에 의해 매개변수화 될 수 있음

PMD 기본 제공 규칙 세트 예시

규칙

설명

Empty Finalizer

만약 finalize 메서드가 비어 있다면, 이것은 존재할 필요가 없다.

Empty Finally Block

비어 있는 마지막 블락을 피하라.

Unnecessary Return

불필요한 return 구문을 피하라.

Only One Return

메소드는 오직 하나의 Return을 가져야 한다. 그리고 Return은 메서드의 마지막 구문이어야 한다.

Cyclomatic Complexity

복잡성은 메서드내에서 결정 포인트 수와 메서드 엔트리에 대한 결정 포인트 수에 의해 결정되어야 한다. 결정 포인트란 if, while, for, case labels 이다. 일반적으로 1 - 4개면 낮은 복잡성이며 5 - 7개이면 중간 복잡도이며, 8 - 10이면 높은 복잡도에 해당되며 11개 이상이면 아주 높은 복잡도를 가지는 것이다.

Too Many Fields

너무 많은 필드(멤버)를 가진 클래스는 더 적은 필드(멤버)를 가진 클래스로 재설계 되어야 한다.

Long Variable

너무 긴 이름으로 선언되어진 필드, 지역 변수를 탐지하라.

No Package

패키지 정의를 가지지 않은 클래스나 인터페이스를 탐지하라

CheckStyle이란

CheckStyle의 개념

Java의 소스 코드가 기술형식 코딩 규약에 준하고 있는지를 체크하는 정적 해석 툴입니다. CheckStyle은 코딩 컨벤션 룰셋외에도 별도의 룰셋을 정의하여 사용할 수 있습니다. 그리고 CheckStyle은 코딩 컨벤션을 정의하는 xml 기반의 룰셋을 사용하여 코드를 검사합니다.

FindBugs란

FindBugs의 개념

FindBugs는 컴파일된 바이트코드 위에서 작동하는 정적 분석도구입니다. PMD와 CheckStyle과 달리 컴파일된 바이트코드 위에서 작동하기 때문에 PMD에서 발견되지 않은 다른 문제들을 찾을 수 있습니다. (ex: subtypes에서 equals 메소드 실패 등) FindBugs는 바이트 코드 스캐닝 체크 기능을 이용해 커스텀 룰을 작성할 수 있습니다. 그러나 간단한 룰을 작성하는데도 많은 시간과 많은 검증을 필요로 하기 때문에 커스텀 룰의 작성은 반드시 필요한 부분이 아니면 추천하지 않습니다.

각 분석 도구의 차이

CheckStyle

CheckStyle은 개발된 코드가 얼마나 코딩 규약(Code Convention)을 잘 따르고 있는지 분석해주는 도구입니다. 실제 버그를 찾는 것이 아니라, 마치 한 사람이 코딩한 것 같은 느낌을 만들어 주는 툴입니다.

PMD

PMD는 미사용 변수, 비어 있는 코드 블락과 같은 결함을 유발할 수 있는 코드를 검사합니다. 부수적 기능으로 CPD가 있는데 이는 중복된 코드를 검출해주는 정적 분석 도구입니다. 정리하자면 PMD는 실제 결함을 찾기 보다는 잠재적인 결함을 찾아주는 역할을 합니다.

FindBugs

FindBugs는 위의 두 가지 방법과 달리 코드가 아닌 컴파일된 바이트 코드를 이용해 분석을 합니다. FindBugs에서 발견하는 결함은 한 번 컴파일한 이후에 찾은 결함이므로 실제 결함을 찾아주는 정확성이 높은 편입니다. 그리고 바이트 코드를 이용하므로 코드를 읽는 속도가 빠릅니다. 하지만 바이트 코드를 읽기 위해서는 컴파일을 해야하기 때문에 빌드 과정이 필수로 들어갑니다.

728x90

'코드 품질 관리' 카테고리의 다른 글

TDD  (0) 2020.04.01
System Test  (0) 2020.03.29
Integration Test  (0) 2020.03.29
Code Coverage  (0) 2020.03.28
Unit Test  (0) 2020.03.27