본문 바로가기
👾 Server/🏭 배포

[의사 결정] SonarCloud를 사용하여 사이드 프로젝트에 정적 분석을 하기까지

by kukim 2022. 8. 7.

잘못된 내용이나 의견 있다면 편하게 말씀해주세요 🙏🏻

상황, 사건의 개요

상황

5명이 모여 사이드 프로젝트를 하고 있습니다.

팀원이 함께 코드를 작성하니 문제들이 발생했습니다.

 

문제

1. 작은 실수(오타, 제거하지 못한 인라인 주석...)는 반드시 존재한다.

2. 페어 프로그래밍을 했음에도 코드 스타일, 컨밴션 통일이 잘 안 된다.

3. 코드 리뷰에서 발견하지 작은 실수들이 모여 Code Smells이 더 짙어진다.

4. 작성한 코드에 대한 예상치 못한 보안 문제나 더 좋은 패턴이 존재한다.

발견하기 힘든 대문자로 시작하는 변수명
통일되지 않은 메서드 이름
가독성이 떨어지는 or 연산자
잘못된 콤마(,) 위치
예상하지 못한 문제, stack overflow가 발생할 수 있는 정규 표현식

 


재발 방지를 위한 조치 항목

정적 코드 분석 도구사용해보는 것은 어떨까?
자동화할 수 있는 것은 자동화해보자!

정적 코드 분석이란? 

정적 코드 분석(static code analysis)은 말 그대로 정적으로 코드를 분석한다. 다시 말해 프로그램을 실행 없이 분석하는 것을 말한다.정적 분석 도구에 따라 코드 스타일, 사용하지 않는 변수 제거, 중복 코드 방지 등 Code Smells를 발견할 수 있다.

다양한 도구들

정적 코드 분석 도구로는 SonarSource 사의 (SonarQube, SonarCloud), PMD, CheckStyle, FindBugs 등이 있다.

도구 SonarQube SonarCloud PMD, 기능 CheckStyle, 기능 CodeQL
주요 기능 - Bugs
- Code Smells
- Vulnerabilities(취약성)
- 테스트 커버리즈 최소 조건
- 중복 코드 
- PMD, CheckStyle의 기능 손쉽게 확장 가능
- 엔터프라이
- Bugs
- Code Smells
- Vulnerabilities(취약성)
- 테스트 커버리즈 최소 조건
- 중복 코드 
- Possible bugs(사용하지 않는 변수나 try-catch 문 확인 등)
- 멀티 스레딩 체크
- 취약성
- 성능
 - 중복 코드
- 특정 코딩 컨벤션 사용 가능
- Google Java Style, Sun Code Convention 또는 커스텀 가능
- 코드 취약점
- 쿼리 기반으로 룰을 설정, 검색할 수 있음
장점 - 다양한 언어/기능 지원
- 엔터프라이즈 기능으로 다양한 정적 분석 결과를 확인할 수 있음
- SaaS 형태 (웹에서 손쉽게 분석 결과 모아서 볼 수 있음)
- GitHub public 저장소 대상 무료
- xml 룰 기반 설정(커스텀 룰 생성 가능)
- IDE 상에 설치/사용 가능
- 레포트 제공
- xml 룰 기반 설정 가능(커스텀 룰 생성 가능)
- IDE상에 설치/사용 가능
- 레포트 제공
- 코드 취약성 전용 정적 분석
- GitHub에 연결하기 간편
- 무료
단점 - 설치형, 별도 서버 운영/관리 필요 - SonarQube의 확장 플러그인 지원이 안되기 때문에 PMD, CheckStyle 정적 분석 결과를 직접 impot 해야함 - 한정된 언어 지원(6개) - Java만 지원 - 한정된 기능

 

+a) TMI : SonarQube는 3.x 버전까지 PMD, CheckStyle, FindBugs 기능을 플러그인으로 포함하고 있었다. 4.x 버전 이후 자체 기술을 사용하고 있다고 한다. (reference)

 


의사 결정

제약사항

- 코든 컨밴션, 코드 스멜, 취약성 검증, 최소한의 테스트 커버리지 제약 조건 기능 포함

- 운영/관리가 최소화

- 구축과 결과 확인이 쉬워야 한다.

- 정적 분석 결과 자동으로 PR에 반영(댓글로 결과 알려주기)이 필요하다.

- GitHub Actions 연동이 쉬워야 한다.

 

제약사항을 고려했을 때 직접 서버를 운영/관리하지 않고 GitHub Actions와 연동이 쉽고 정적 분석 결과를 PR에 알려주고 웹에서 손쉽게 볼 수 있는 SonarCloud를 사용하기로 결정했다. 추가로 BE 팀은 CheckStyle와 PMD를 추가하여 테스트 시점에 정적 분석하여 해당 결과를 SonarCloud에 import 시키기로 하였다.


sonarcloud 사용하며 짧은 사용기

기존에 정적 분석 도구 구축 경험이 없었지만 어렵지 않게 SonarCloud 기본 설정을 하였다.

(이틀에 걸쳐 약 8~9시간 소요 : 자료 조사, SonarCloud 적용, 문서 작성)

 

구축에 시간이 걸린다는 문제가 있지만

결과적으로 구축 자동으로 정적 분석하고 피드백받을 수 있는 장점이 크다고 느껴졌다. 👍

정적 분석 리포트를 보니 수많은 Code Smeels이 나왔다. 할 일이 더 늘어난 기분은 착각이겠지...

 

장점

- GitHub Actions에 적용하기 쉽다.

- PR 마다 전체 소스코드를 정적 분석하는 것이 아닌 이전 commit과 비교하여 차이만 분석하여 해당 PR 분석 결과만 보기 좋다.

- 전체 저장소에 대한 정적 분석도 가능하다.

- 무료로 SonarCloud 웹사이트에 호스팅 되어 정적 분석 결과를 볼 수 있다. (사이드 프로젝트 SonarCloud 결과)

- 자동으로 해당 PR에 정적 분석 결과 댓글을 달아준다

- jacoco를 결과를 함께 보내면 테스트 커버리지까지 확인할 수 있다.

- 테스트 커버리지를 넘지 못하면 PR 안되도록 설정할 수 있다.

- 생각하지 못한 Bugs나 예상하지 못한 Security Review를 확인해준다.

 

boolean return 타입 메서드 이름은 is나 has로 시작
Code Smeels 예
정적 분석 결과를 PR에 자동으로 댓글을 달아준다.
전체 저장소 분석 결과
예상하지 못한 Security Hotspots : 정규 표현식의 위험성

단점

- GitHub public repo 기준 무료이다. -> 무료이기에 해당 저장소의 정적 분석 결과가 전체에 공개된다. (public repo라서 상관없다고 위안을 삼고 있다.) -> 치명적인 보안 문제 분석 결과가 공유된다.

- 직접 CheckStyle, PMD를 분석하여 import 시켜야 한다.

 

 

앞으로 할 일

- CheckStyle, PMD 추가

- 한 저장소에서 FE/BE 팀 모두에게 SonarCloud 적용


마무리

팀 프로젝트에서 팀원 간에 코딩 컨밴션, 스타일이 통일되지 못하거나 기능엔 문제없지만 보기 안 좋은 코드 실수를 발견하지 못하고 코드 리뷰하는 경우가 있었다.

정적 코드 분석 도구를 사용하여 PR 초기에 오타나 code smells를 자동으로 체크하고 좀 더 본질적인 코드(로직)에 집중하도록 결정하였다. 다양한 도구 중 SonarCloud를 선택하였다. 만족스러웠다.

 

다음 글에서는 SonarCloud 사용하여 Spring & JUnit 프로젝트에 설정하는 방법을 알아보고자 한다.

 

⛓ Reference

- sonarqube

- sonarcloud

- PMD

- CheckStyle

- Is SonarQube Replacement for Checkstyle, PMD, FindBugs?

- 사이드 프로젝트 BE 팀 branch

- 사이드 프로젝트 sonarcloud 결과

- 배달의 민족 - 팀 문화의 탐색 중 정적 분석을 하자

- 내 코드를 자동으로 리뷰해준다면? - popit

- SonarCloud를 통한 Node.js & Jser 프로젝트 정적 분석하기

댓글