소나큐브는 지속적으로 코드의 품질을 높이고 유지 보수하는데 도움을 주는 정적 분석 애플리케이션입니다. 분석 기능이 탁월하고 개선사항도 자세하게 안내해 줍니다. 간단하게는 코딩 컨벤션부터 코드의 잠재적인 위험 사항까지 안내해주어 올바른 코딩 습관과 코드의 품질향상에 많은 도움을 줍니다.

Sonarqube features

  • Linux, Window, Mac 등 다양한 환경에서 모두 구동이 가능합니다. 
  • 20개가 넘는 프로그램 언어에 대한 코드 분석을 지원합니다. 
  • 개발된 코드의 품질을 어드민을 통해 확인해 볼 수 있고 지속적으로 관리가 가능합니다. 
  • 품질 게이트를 통해 표준화된 코드 품질 요구사항을 설정할 수 있습니다. 
  • Jenkins 같은 CI엔진과 통합되어 분석이 가능합니다. 
  • IDE와 연동되는 다수의 Plugin을 통해 분석이 가능합니다. 

다운로드 및 설치

https://www.sonarqube.org/downloads/ 에서 다운로드하고 압축을 해제합니다.


소나큐브 서버 실행

실습은 윈도우 환경하에서 진행합니다. 서버 실행 후에는 어떤 플랫폼이든 사용에 별 다른 점은 없습니다.

# On Windows, execute:
C:\sonarqube\bin\windows-x86-xx\StartSonar.bat
 
# On other operating system, execute:
/etc/sonarqube/bin/[OS]/sonar.sh console

소나큐브 웹 어드민

http://localhost:9000
기본 아이디/암호는 admin/admin 입니다.

튜토리얼에서 token 생성을 권유하는데 향 후 IDE에서의 연동을 위해 토큰을 생성하여 복사해 놓습니다.

튜토리얼에서 language와 build 툴을 선택하면 친절하게 어떻게 연동해야 하는지도 설명해줍니다. 

Finish tutorial을 하면 분석을 진행한 내용이 없어 빈 대시보드가 나옵니다.

기능 업데이트

소나큐브는 언어마다 분석을 위해 Code Analyzer를 설치해야 합니다. Analyzer의 품질 프로파일은 주기적으로 업데이트되기 때문에 설치 후 오랫동안 업데이트 안 했다면 업데이트가 필요합니다.

상단 메뉴 Administration를 누르고 Marketplace로 이동합니다. 
검색창에 java라고 입력합니다. 아래쪽에 SonarJava 업데이트 내용이 있습니다. update 합니다. 정적 분석이 필요한 다른 언어들도 검색하여 추가합니다. 메뉴 언어 한글화를 위해 Korean Pack도 설치합니다. 


설치되면 화면 위쪽에 서버 Restart를 해야 한다고 나옵니다.
설치할 라이브러리가 많을 경우 한 번에 설치하고 Restart 하는 것을 추천합니다. 

지원언어 현황은 다음 링크를 확인하면 됩니다.
끝에 *표시가 있는 것은 Commercial Edition에서만 사용 가능한 언어입니다.

https://docs.sonarqube.org/display/PLUG/Plugin+Library

유저 관리

Security – Users 항목을 들어가면 현재 사용 중인 유저 리스트가 나옵니다. 현재는 로컬 PC에 서버를 띄웠으므로 Administrator 외에 다른 유저는 보이지 않습니다. 하지만 서버에 설치하고 팀 단위나 그룹 단위로 사용할 경우에는 Create User를 선택하여 유저를 생성하면 됩니다.

그룹관리

Security – Groups 항목을 들어가면 그룹 권한을 볼 수 있습니다. 유저가 생성되면 기본으로 sonar-users 가 디폴트로 세팅됩니다. 그룹 단위로 권한을 나누거나 프로젝트가 달라질 경우 Group항목을 사용하여 권한을 관리하면 됩니다. 

Intellij와의 연동

Intellij에는 소나 큐브 플러그인이 있습니다. 아래와 같이 SonarLint를 설치합니다. 그런데 SonaLint만 설치해도 소나큐브 서버 없이 정적 분석이 가능합니다.ㅜㅜ 하지만 소나 큐브 서버와 연동해 놓으면 서버의 Code analyzer가 업데이트되었을 때 최신 Ruleset이 로컬에도 동기화되므로 서버와 연동해 놓는 것이 좋습니다.

2개의 플러그인을 설치 후 intellij를 리스타트 하면 Settings 하단에 Sonarqube 관련 메뉴가 노출 됩니다.
SonarLint General Setting을 진행합니다. 소나 큐브 URL을 입력하고 Next를 누릅니다.

소나큐브 웹에서 생성한 토큰 값을 입력합니다. 생각이 나지 않으면 웹에 로그인 후 내계정 – 보안 – 신규 토큰 생성하기 에서 다시 생성 가능합니다.

만약 아래와 같은 오류가 발생하면 소나큐브 웹 마켓 플레이스에서 아래 언어의 Analyzer를 업데이트합니다.

Update Binding을 눌러 서버와 동기화를 합니다.

정적 파일 분석

IDE 하단에 SonarLint 탭을 활성화시킨 후 아무 파일이나 클릭하면 분석이 진행되고 결과가 표시됩니다. 이슈사항이 있을 경우엔 관련 내용이 리스팅 됩니다. 오른쪽 하단에는 이슈 내용과 어떻게 변경해야 하는지 가이드를 나옵니다. 이슈 해결 후엔 재 분석을 위해 왼쪽의 재생 버튼을 누르면 됩니다.

메뉴의 Analyze에서 세 가지 옵션을 선택해서 실행할 수 있습니다.
Analyze with SonarLint는 바로 위에서 설명한 단일 파일 분석과 동일한 내용입니다.
Analyze VCS Changed Files with SonarLint는 VCS(Git..)에서 수정된 파일에 대해서만 분석합니다.
Analyze All Files with SonarLint는 프로젝트 전체의 파일을 분석합니다.

Perform SonarLint analysis를 체크해 놓으면 파일 커밋 시마다 분석할 수 있습니다.

SonarQube 서버에서 정적 분석 하기

위에서 설치한 sonarqube 서버에서 정적 분석을 하도록 다음과 같이 세팅합니다. sonarqube 서버에서 정적 분석을 할 경우 로컬에서 했을때보다 훨씬 더 많은 정보를 체계적으로 웹 UI를 통해 제공받을 수 있습니다.

build.gradle에 아래 내용을 추가합니다.

plugins {
  id "org.sonarqube" version "2.7"
}

gradle task를 실행합니다.

# Linux, Mac
$ ./gradlew sonarqube \
  -Dsonar.host.url=http://localhost:9000 \
  -Dsonar.login=39d725ea5759fa9046efa376da604f7c6f8498c5

# Window
$ gradlew.bat sonarqube -Dsonar.host.url=http://localhost:9000 -Dsonar.login=39d725ea5759fa9046efa376da604f7c6f8498c5

소나큐브 웹 어드민에 분석 내용이 노출됩니다. 그동안 개선하지 않았다면 엄청난 레거시 코드들의 상태를 볼 수 있습니다. 등급으로 나타내 주므로 심각성을 확인할 수 있습니다. 소나 큐브는 다음 7가지 품질 요소를 기준으로 소프트웨어 품질을 구분하고 관리합니다.

코드 악취(Maintainability)
심각한 이슈는 아니지만 베스트 프렉티스에서 사소한 이슈들로 모듈성(modularity), 이해가능성(understandability), 변경 가능성 (changeability), 테스트 용의성(testability), 재사용성(reusability) 등이 포함됩니다.

버그(Reliability)
일반적으로 잠재적인 버그 혹은 실행시간에 예상되는 동작을 하지 않는 코드를 나타냅니다.

취약점(Vulnerabilities)
해커들에게 잠재적인 약점이 될 수 있는 보안상의 이슈를 말한다. SQL 인젝션, 크로스 사이트 스크립팅과 같은 보안 취약성을 찾아냅니다.

중복(Duplications)
코드 중복은 코드의 품질을 저해시키는 가장 큰 요인 중 하나입니다.

단위 테스트(Unit Tests)
단위 테스트 커버리지를 통해 단위 테스트의 수행 정도와 수행한 테스트의 성공/실패 정보를 제공합니다.

복잡도(Complexity)
순환 복잡도(Cyclomatic Complexity) 측정, 코드의 논리적인 흐름상에 존재하는 인지 복잡도(Cognitive Complexity) 측정합니다.

사이즈(Size)
소스코드 사이즈와 관련된 다양한 지표를 제공합니다. ( 코드 라인수 전체 라인수 구문, 함수 클래스 파일 디렉터리 주석 수 코멘트 비율 )

프로젝트 이름을 클릭하면 아래 상세 내용을 확인할 수 있습니다.

해당 항목들을 클릭하면 관련 내용이 리스팅 됩니다.

리스트 내용을 클릭하면 상세 내역을 확인할 수 있습니다.

여기까지 간략하게 소나큐브의 사용법에 대해서 알아보았습니다. 현재 진행 중인 프로젝트에서 정적 분석 도구를 사용하고 있지 않다면, 소나큐브 도입을 추천드립니다. 소스 코드의 품질과 안정성이 전보다 훨씬 좋아질 것입니다.