검수요청.png검수요청.png

피엠디

위키원
theraker (토론 | 기여)님의 2021년 1월 27일 (수) 09:57 판 (PMD에서 제공하는 자바 규칙 집합)
이동: 둘러보기, 검색
피엠디(PMD)
피엠디(PMD)

피엠디(PMD)는 자바 프로그램의 소스코드를 분석하여 프로그램의 부적절한 부분을 찾아내고 성능을 높이도록 도와 주는 공개 소프트웨어 점검 도구이다.

개요

피엠디는 자바 프로그램의 소스코드를 분석하여 프로그램의 부적절한 부분을 찾아내고 성능을 높이도록 도와 주는 공개 소프트웨어 점검 도구로, 사용하지 않는 변수, 아무런 처리도 하지 않은 캐치 블록(catch-block), 불필요한 오브젝터 생성 등을 찾아내며, 시스템 개발 공정의 구현 및 테스트 단계에서 정적 분석에 활용할 수 있다.

특징

피엠디는 프로그래머가 실수 혹은 무지각으로 인한 잠재되어 있는 에러 혹은 위험요소를 사전에 탐지하여 사후 생길 위험을 제거해 주는 강력한 소스 코드 분석기라고 할 수 있다. 단독 형태로도 사용할 수 있으며, 이클립스나 인텔리J와 같은 유명 자바 IDE에 플러그인 형태로 배포되어 사용할 수도 있다. 피엠디는ㄴ 작성한 코드에 대한 위반사항을 찾고, 위반 사항을 명시한 리포트 파일(pmd.xml, cpd.xml file)에 대한 수정이 쉽다. 그리고 한 번 클릭으로 수많은 규칙에 대한 수정이 가능하다. 관련 도구로는 이클립스 메트릭스/체크클립스/체크스타일/파인드벅스/자밋/시메인이 있으며, 제작사는 메이븐이다.

점검 기준

PMD는 자바 코드를 점검하여 다음 세 가지 기준에서 위반 여부를 확인한다.

  • 표준 코드 기준(compliance with coding standards) : 클래스, 메소드, 파라미터, 변수 이름과 클래스 및 메서드 길이, 주석 및 JAVADocs의 존재 및 서식을 점검한다.
  • 코드 안티패턴(coding antipatterns) : 비어 있는 try/catch/finally/switch 블럭, 사용되지 않은 지역 번수, 파라미터, Private 메소드, 비어 있는 if/while 구문, 너무 복잡한 표현-불필요한 if 구문, 무한 루프에 빠질 수 있는 for 루프, 높은 복잡성 지표를 가진 클래스를 확인한다.
  • CPD(Cut and Paste Detector) : 의심스러운 코드 복사를 찾는 도구로, CPD는 최소 크기의 코드 블락에 의해 매개변수화될 수 있다.

기본 규칙

  • 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 : 패키지 정의를 가지지 않은 클래스나 인터페이스를 탐지하라는 의미이다.

PMD에서 제공하는 자바 규칙 집합

규칙집합명 규칙 수 설명
Android 3 AndroidSDK와 관련된 우수사례(best practice)에 관한 룰 메소드 시작에서 super가 호출되어야 함
Basic 25 누구에게나 적용될 수 있는 모범사례(good practice)에 관한 룰 catchblock이 비어 있는 경우
Braces 4 괄호에 관련된 룰 if 문장은 괄호를 사용해야 함
Clone Implementation 5 clone() 메소드를 의심스럽게 사용하는 경우를 찾는 룰 불필요한 생성자
Code size 13 Code size와 관련된 문제를 찾는 룰 메소드의 길이가 너무 긴 경우
Controversial 21 논란의 소지가 있는 룰 인자도, 바디도 없는 생성자
Comments 4 주석과 관련된 룰 중요 정보를 담은 주석
Coupling 5 객체와 패키지 사이에 강한 또는 적절하지 않는 결합(coupling)이 있는 인스턴스를 찾는 룰 지나치게 많은 임포트
Design 57 의심스러운 설계를 찾는 룰 싱글톤 패턴의 고려(static 메소드들만 있는 클래스)
Empty code 11 비어 있는 구문과 관련된 룰 비어 있는 CatchBlock
Finalizer 6 Finalizer에서 발생할 수 있는 문제를 다루는 룰 Finalize() 메소드가 비어 있는 경우
ImportStatements 6 클래스의 import 문장과 관련된 문제를 다루는 룰 중복된 import 문장
J2EE 9 J2EE에 관한 룰 적절한 클래스 로더 사용하기
Jakarta Commons Logging 4 JakartaCommonLogging 프레임워크의 의심스러운 사용을 찾는 룰 스택트레이스의 모든 내용을 출력하기 위해서는 로깅 문자에서 2개의 인자를 사용해야 함
Javabeans 2 Bean 룰을 따르지 않는 인스턴스를 찾는 룰 클래스가 bean이거나 직/간접적으로 참조되면 직렬화되어야 한다.
Java Logging 4 Logger의 의심스러운 사용을 찾는 룰 메소드 시작에서 super가 호출되어야 함
JUnit 12 JUnit 테스트를 수행하다 발생할 수 있는 문제를 찾는 룰 JUnit 테스트에서 suit() 메소드는 public이고 static이어야 함
Migrating 14 하나의 JDK 버전에서 다른 버전으로 업그레이드할 때 관련된 룰 Vector 대신 ArrayList의 사용
Naming 21 이름이 너무 길거나 짧은지 등 이름에 관련된 룰 필드, 로컬변수, 파라미터 이름이 너무 짧은 경우를 찾음
Optimizations 10 수행 성능을 향상시키는 우수사례를 적용하기 위한 룰 한 번만 할당되는 로컬변수는 final로 선언함
Security Code Guidelines 2 Sun의 보안가이드 라인을 체크하기 위한 룰 메소드가 내부 배열을 반환하면 보안상 문제가 발생할 수 있음
Strict Exceptions 10 예외를 발생시키고 잡기 위한 가이드라인에 관련된 룰 Throwable을 catch하는 것을 피함(너무 다양한 예외)
Strings and StringBuffer 15 String과 StringBuffer를 사용할 때 발생할 수 있는 문제점을 찾는 룰 동일한 문자열은 상수로 선언하는 것이 바람직함
Type Resolution 4 String과 반대되는 자바클래스 파일을 찾기 위한 룰 HashSet과 같은 타입을 사용하지 말 것
Unnecessary 8 불필요한 코드에 대한 규칙 포함여부를 찾는 룰 불필요한 리턴 구문 사용하지 말 것
UnusedCode 5 사용되지 않는 코드를 찾는 룰 로컬변수가 선언되었으니 사용되지 않음

기능

사례

동향

각주

참고자료

같이 보기

  • [[]]

  질문.png 이 문서는 로고 수정이 필요합니다.  

  검수요청.png검수요청.png 이 피엠디 문서는 보안에 관한 글로서 검토가 필요합니다. 위키 문서는 누구든지 자유롭게 편집할 수 있습니다. [편집]을 눌러 문서 내용을 검토·수정해 주세요.