본문 바로가기
ETC

[정적 코드 분석] sonarQube 사용해보기

by 킹명주 2023. 8. 1.

"구글 엔지니어는 이렇게 일한다" 라는 책을 읽고 있는데, 정적 분석에 대한 중요성을 강조하고 있었다. 그래서 호기심이 생겨 정적 분석을 해보고 싶었는데,, 현재 우리 팀에서는 사용하고 있지 않다.. ㅜㅜ  그래도 포기할 수 없어서 팀 몰래 코드 정적 분석 툴을 도입해보고자 한다!!! (로컬에서 나만 사용할 예정~~)


정적 분석이 뭐야?

 

정적 분석이란 소프트웨어 개발 단계에서 소스 코드를 실행하지 않고도 코드의 구조, 문법, 품질 등을 분석하는 것을 의미한다!! 그렇다면 굳이 소스 코드를 돌려보지 않고 분석을 하는 이유는 무엇일까?

 

1. 버그와 결함의 조기 발견이 가능하다.

코드를 실행하기 전 상태이기 때문에 버그를 조기에 발견하여 수정할 수 있고, 이후 소프트웨어 개발 과정에서 발생할 수 있는 비용과 시간을 줄일 수 있다!!


2. 보안 취약점 탐지

버퍼 오버플로우 등과 같은 보안 취약점을 사전에 탐지하여 보안에 취약한 소프트웨어를 미리 방지할 수 있다.

3. 코드 품질 향상

4. 생산성 향상

개발자가 직접 테스트하지 않아도 자동으로 문제를 감지하므로 생산성을 향상시킬 수 있다.

5. 코드 유지보수 용이성

코드의 가독성과 구조를 향상시킴으로써 유지보수를 쉽게 만든다.

 

이 외에도 더 많은 장점이 있지만~~ 필자가 생각하는 가장 큰 장점을 5가지 정도 나열해보았다.

 


sonarQube 설치 (MAC)

 

mac에서 소나큐브를 설치해보자!! 우선 필요한 것은 homebrew이다. homebrew를 통해 간단하게 설치가 가능하다.

 

brew install sonarqube

설치 완료

설치를 완료했다면 위 결과처럼 스타트하려면 뭐시기 해라 라는 안내문구를 받을 수 있다!! 그러면 이제 실행시켜보자~~

 

brew services start sonarqube

sonarQube를 실행하게 되면
==>
Successfully started `sonarqube` (label: homebrew.mxcl.sonarqube)

이러한 문구가 출력되고, http://localhost:9000 으로 접속이 가능하다.

이런식으로 로그인창이 출력된다면 설치와 실행 모두 성공한 것이다!! 초기 아이디와 비밀번호는 admin / admin이다. 이제 로그인을 진행해보자~~

초기에 로그인을 하게 되면 비밀번호를 업데이트 하라는 창이 나오고 비밀번호 변경 후 계속해서 진행해주면 된다.

해당 화면까지 오면 소나큐브 설치 및 설정 끄읕~~

 


sonarQube 연결

 

본격적으로 sonarQube와 내가 로컬에서 작성한 스프링 프로젝트를 연결하여 코드 품질을 테스트해보겠다!! (벌써 재밌음,,)

우선 우리는 로컬에서 먼저 테스트를 할 예정이기 때문에 Manually를 클릭해준다. 

이름을 설정하면 자동으로 project key까지 입력이 된다. 필자는 이름을 kingmj로 설정했다.

로컬에서 진행할 예정이기 때문에, Locally를 선택해준다. 그리고 가장 첫번째로 token을 설정하게 되는데, 그냥 sonarQube에서 추천해주는 토큰을 그대로 사용했다.

그리고 2번째의 경우 Maven 프로젝트인지, Gradle 프로젝트인지 선택할 수 있는데, Gradle Project로 테스트해보기 위해 Gradle을 선택했더니 아래와 같이 상세하게 어떻게 사용하는지 나와있다. 가장먼저 sonarQube plugin을 build.gradle에 넣어보자.

소나큐브 너 좀 괜찮을지도?

그리고 이제 프로젝트가 있는 곳으로 이동하여 sonaQube에서 하라는 명령어를 그대로 붙여넣어줬다.

성공

성공했다는 안내문구를 확인했다면 localhost:9000 주소에 들어가서 확인해보자!!

오~ 뭔가 분석해준 것 같다. 각각의 요소를 살펴보고 어떠한 요소에서 문제가 되었는지 살표보자.

  • Bugs : 소프트웨어의 예기치 않은 동작을 유발할 수 있으며, 프로그램의 안정성과 신뢰성을 저하시킬 수 있는 요소
  • Vulnerabilities : 보안 취약점을 찾아내어 개발자가 적절한 보안 대책을 적용하도록 돕는다.
  • Security Hotspots : 프로젝트 내에서 보안 위협으로 간주되는 부분
  • Code Smells : 코드의 구조와 품질을 저하시키는 디자인 패턴이나 구현 방식 등으로 유지보수를 어려ㅑㅂ게 만들고 버그 발생 가능성을 높일 수 있다.
  • Duplication (중복 코드)
  • Debt : 모든 유지 관리 문제, Code Smells를 수정하는 데 필요한 예상 시간이다.

더 자세한 내용은 https://docs.sonarsource.com/sonarqube/latest/user-guide/concepts/ 공식문서를 참고하면 된다!!

 

그렇다면 이제 본격적으로 어떤 code smell이 있고 bug가 있는지 살펴보자.

 

    @Override
    @Transactional
    public void writeBoard(BoardDTO.Request boardRequest) {

        boardRepository.save(Board.builder()
                                  .title(boardRequest.getTitle())
                                  .contents(boardRequest.getContents())
                                  .writer(boardRequest.getWriter())
                                  .build());
        // this
        writeLog(boardRequest);

    }
    
    @Override
    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public void writeLog(BoardDTO.Request boardRequest){

        alarmRepository.save(Alarm.builder()
                                  //.alarmType(AlarmType.POST_BOARD)
                                  .contents(convertToAlarmMessage(boardRequest))
                                  .build());

    }

코드를 보았을 때, writeBoard와 writeLog의 @Transcational annotation의 propagation이 충돌하는 문제인 것을 확인했다. 그래서 이를 해결하기 위해 여러가지 방법이 있지만, 간단하게 writeLog라는 class를 분리하여 다시 sonarQube를 돌려보았다.

훗,,

버그에 1 표시가 사라진 것을 확인할 수 있다.

 


결론

 

오늘은 간단하게 sonarQube 설치방법과 사용을 해보았다. 정말 간단하게 사용했지만, 디테일하게 가져간다면 공부할 부분이 많다. 다음에는 code smell 해결방법, jacoco 연결, test code 작성과 같은 주제를 소개하고자 하는데, 그 때에도 sonarQube를 같이 사용할 예정이다.

 

'ETC' 카테고리의 다른 글

소프트웨어 마에스트로 13기 회고  (11) 2023.01.30
킹명주의 일기장을 개발했다리..  (2) 2022.12.28