본문 바로가기
Tool

정적분석툴 SonarQube A-Z 조사

by 발개발자 2023. 8. 26.
반응형

두둥.. 회사 프로젝트에서 정적분석툴을 연동해서 통합적으로 코드 품질을 관리하고자 하는 니즈가 생겼다.

그래서 정적분석툴에 대해 조사해보니, 소나큐브가 압도적으로 레퍼런스도 많고 지속적인 버전관리도 되고 있어 강력한 후보군으로 추천하고 싶어졌다.

 

이제 정적분석툴은 뭐고 소나큐브는 무슨맛인지  한번 알아보자...!

 

  SonarQube 소개

SonarQube는 오픈 소스 기반의 정적 코드 분석 도구라고 한다.

코드의 품질을 분석하고 개선하는 데 도움을 주는 도구로, 다양한 프로그래밍 언어와 프로젝트 유형을 지원하며 코드 복잡성, 중복 코드, 버그, 취약점 등과 같은 다양한 측면의 코드 품질을 검사하여 표시하고, 개발자들이 품질을 개선할 수 있는 지표와 피드백을 제공한다.

또한, CI/CD 파이프라인에 통합하여 지속적인 품질 관리를 할 수 있도록 지원한다고 한다.

 

꽤나 좋아보인다..!

 

 

 

  SonarQube 주요기능

SonarQube의 매력을 한번 알아보자.

 

 

정적 코드 분석

코드 품질을 분석하고, 버그, 취약점, 코딩 규칙 위반 등을 식별한다.

  • 지원 언어

무료로 지원하는 언어도 많다 'ㅡ'

 

 

대시보드 및 보고서

프로젝트의 품질을 시각적으로 표시하여, 개발자와 팀에게 품질 정보를 제공한다.

 

 

규칙 설정

사용자 정의 규칙을 설정하거나, 표준 규칙을 적용하여 코드 품질 검사의 범위와 수준을 제어할 수 있다.

 

 

 

CI/CD 통합

CI/CD 파이프라인과 통합하여 코드 분석을 자동화하고, 결과를 실시간으로 제공한다.

GitHub Actions로 연동을 테스트해봤는데 무리없이 잘되는것을 확인할 수 있었다.

 

 

 

  SonarQube 동작방식

SonarQube는 크게 3개의 요소로 구성되어 작동한다.

 

Sonar Scanner

Scanner Scanner는 코드를 스캔하여 SonarQube Server로 전달해주는 역할을 한다.

gradle, maven, jenkins, .net, ant, Azure Devops에 대해선 구현되어 있는 플러그인을 제공해준다.

 

SonarQube Server

SonarQube Server는 코드를 분석하여 저장, 보고서 생성, 대시보드 표시 등을 수행한다.

스캐너로부터 API 요청을 받으면, 결과를 기반으로 다양한 리포트와 분석 지표를 제공해준다.

 

DataBase Server

Database Server는 분석결과를 저장할 데이터베이스이다.

Postgresql, Oracle, MS SQL을 지원하며, 서버를 따로 연결하지 않는다면 내부 H2 DB를 사용하며, 공식문서에서 H2 DB는 테스트용으로만 권장한다.

 

 

 

 

  SonarQube 분석 항목

SonarQube가 어떤 녀석인지 알아봤으니, 예제를 통해 어떤 기준으로 코드들을 검출하는지 살펴보자..!

 

 

코드 스멜 (Code Smells)

긴 매개변수 목록, 중복 코드, 복잡한 조건문 등 유지보수성에 낮은 코드에 대해 검사한다.

SonarQube에서 기본적으로 Java에 대한 코드 스멜에 대한 규칙은 약 400개 정도를 가지고 있다.

 

! 코드 스멜 규칙

 


! 코드 스멜 탐지 예제


 

버그 (Bugs)

널 포인터 참조, 배열 경계를 초과하는 접근, 잘못된 예외 처리 등 안정성을 위배하는 잘못된 코드에 대해 검사한다.

SonarQube에서 기본적으로 Java에 대한 버그에 대한 규칙은 약 150개 정도를 가지고 있다.

 

! 버그 규칙

 


 

! 버그탐지 예제


 

보안 핫스팟 (Security HotSpot)

코드에서 보안에 관한 주의가 필요한 위치를 나타낸다.

Hard-coded passwords, Hard-coded secrets, 암호화되지 않은 연결 등 개발자가 검토해야 하는 보안에 민감한 코드를 검사하며, SonarQube에서 기본적으로 Java에 대한 보안 핫스팟에 대한 규칙은 37개를 가지고 있다.

 

! 보안 핫스팟 규칙

 


 

! 보안 핫스팟 탐지예제


 

취약점 (Vulnerability)

취약점은 보안 위협으로 간주되는 실제 보안 결함을 나타낸다.

SQL Injection, 크로스 사이트 스크링팅(XSS), 인증 우회 등 악의적인 공격자에 의해 이용될 가능성이 있는 취약점을 검사한다. 취약점은 즉시 대응해야 하며, 가능한 빠르게 수정되어야 하는 보안적으로 심각한 이슈로 분류된다.

 

SonarQube에서 기본적으로 Java에 대한 보안 취약점 대한 규칙은 33개를 가지고 있다.

 

단, SonarQube에서 SQL Injection이나 XSS관련 취약점 규칙은 SonarQube Develop Edition(유료)이상에서 지원된다.

 

! 취약점 규칙

 


 

! 취약점 탐지 예제

 


 

 

코드 커버리지 (Code Coverage)

Test Coverage를 Reporting해주는 Jacoco와 연동이 필요하며,

테스트 케이스를 통해 테스트되지 않은 코드 블록들을 검사한다. 

커버리지 퍼센테이지를 보여주며, 클래스별로 자세하게 확인할 수도 있다.

 


 

! 코드 커버리지 예제


 

  SonarQube 추가 활용 방안

위에 기본 제공되는 기능으로 뭔가 갈증이 날까봐 여기 포카리스웨트를 준비해놨다.

이 방안으로 SoarQube 하나로 통합적인 코드 품질관리가 어느정도 가능하다고 생각한다. 후후

어떤식으로 활용할 수 있는지 한번 살펴보자.

 

 

사용자 규칙 추가

SonarQube에서 사용자가 별도의 규칙을 만들어서 해당 규칙을 통해 코드를 검사할 수 있다.

알맞은 Rule Template에서 Cutom Rules를 추가한 후, 활성화를 시켜준다.

예를 들어, Custom Rules로 Select * 에 대한 Query를 Code Smell로 탐지하길 원할 경우 아래와 같이 진행할 수 있다.

 

 

위와 같이 팀에서 별도의 규칙을 만들어서 코드의 품질을 더 디테일하게 관리할 수 있다.

 

 

 

Code Convention

SonarQube에서 CheckStyle Plugin을 추가하면 Convention에 대한 다양한 규칙을 쉽게 만들 수 있다.

예를 들어, 많은 개발자들이 디폴트로 사용하는 Google의 Code Convention을 사용하고자 한다면 google_checks.xml 파일을 import해서 규칙을 추가해주면 된다. 이렇게 하면 Convention을 위반할 경우 CodeSmell로 포착되게 된다..

참고로, checks.xml에 있는 규칙 템플릿이 다 활성화가 되어있어야 create가 된다.

즉 xml을 보면서 SonarQube에서 해당 Rule Template을 검색하고 Rule Template에 deafult Rule이 없는 경우, 별도의 default rule들을 만들어놔야 하는 별도의 작업이 필요하다.

조금 성가시지만 팀의 컨벤션을 통합하고자한다면, 20분이면 충분히 작업을 완료할 수 있다..!

 

Google Check Style Link

https://github.com/checkstyle/checkstyle/blob/master/src/main/resources/google_checks.xml

 

 

Pull Request Decoration

PR decoration이란, Github에 PR을 요청했을 때 SonarQube를 통해 코드를 정적분석 한 후 PR의 Comment에 정적분석 결과와 리포트 링크를 남겨주는 기능이다. Github을 사용할 경우 SonarQube에서 사전연동을 해놓고 Github Actions를 통해 구현이 가능하다. 이 부분이 가장 매력적으로 보였다. 구현하는 방법은 별도의 포스팅을 할 예정이다..!

참고로, SonarCloud에서는 별도의 작업없이 이 기능을 무료로 제공하니 public project일 경우 SonarCloud를 사용하자..!

 

 

 

 

 

  SonarLint vs SonarQube vs SonarCloud

Sonar 부라더들이 꽤나 많은데 이것들이 각각 어떻게 다른지 아래표에 간단하게 기입해놨으니 필요하다면 확인하면 좋을 것 같다.

 

 

 

  우리팀에선 어떤 툴을 활용해야할까?

그렇다면 SonarLint, SonarQube, SonarCloud 각각 어떤 상황일 때 어떤툴을 선택해야할까?

 

 

Public한 프로젝트일 경우

아묻따 SonarCloud를 추천한다..! ㅎㅎ..

별도의 서버 구축이 필요 없으며, public 프로젝트일 경우 무료로 사용 가능하다.

또한 하나의 관리자 계정만으로 프로젝트의 정적분석 세팅이 손쉽게 완료되며,

PR Decoration이 자동으로 지원되기 때문에 가장 효율적이다.

 

Private한 프로젝트일 경우

고민이 좀 되지만, SonarQube를 추천한다.

서버 구축과 초기 세팅이 필요하지만, 팀만의 Rule, Code Convention, Code Quality 등 높은 확장성을 통해

모든 것이 통합적으로 관리가 가능한 큰 이점이 있다.

SonarCloud의 경우 Private일 경우, 월 비용이 발생하고 위에 써놓은 SonarQube만의 플러그인을 통한 확장성을 가져갈 수 없기 때문에 SonarQube에 좀 더 큰 점수를 주고 싶다.

 

Github와 연동할 수 없는 경우

IDE환경에서 SonarLint + Check Style Plugin을 추가하는 조합을 추천한다.

개발자 개인의 환경에서 해당 플러그인을 통해 Code Quality와 Convention을 확보할 수 있다.

 

반응형

댓글