리팩토링 일지- SonarQube 활용

Coodori·2024년 2월 13일
0

CherishU

목록 보기
28/29

동적 코드 테스트만이 코드 품질을 올려주는 것은 아니다.

점점 발전하는 프로젝트로
처음에는 단위테스트 코드도 짜지 않았지만
given-when-then 부터 Mokito, BDD까지 테스트 코드를 짜며 원하는 로직을 검증했다.

개발자는 역시 직접 눈으로 확인해야 적성이 풀리는 직업이다.

하지만 그것만으로는 아쉽다.

혹시 NPE에 노출되어있는 것은 아닐까?

의도된 비즈니스 로직은 수행을 정확히 하되 만약 내가 짠 시나리오가 아니여서 에러가 나올순 없는걸까?

SonarQube를 활용해서 정적 코드 분석도 해보자

SonarQube는 중복코드, 코딩 표준, 유닛테스트, 코드 커버리지, 코드 복잡도,주석, 버그 보안 취역점 보고서를 제공해준다.
Gradle과 연동

잠재적으로 버그가 발생할 수 있는 코드, 안티패턴, 성능문제, 오타, 보안취약점등을 정적으로 잡아준다.(Code-Smell)

docker compose를 저번 redis, postgresql 에 이어 함께 적어보자

version: '3.9'

services:
  postgresql:
    # 사용할 이미지
    image: postgres
    # 컨테이너 실행 시 재시작
    restart: always
    # 컨테이너명 설정
    container_name: postgresql
    # 접근 포트 설정 (컨테이너 외부:컨테이너 내부)
    ports:
      - "5432:5432"
    # 환경 변수 설정
    environment: 
      # PostgreSQL 계정 및 패스워드 설정 옵션
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: bong1234
      POSTGRES_DB: sonar
    # 볼륨 설정
    volumes:
      - postgresql:/var/lib/postgresql
      - postgresql_data:/var/lib/postgresql/data

  redis:
    image: redis:latest
    container_name: redis
    hostname: redis
    ports:
      - 6379:6379
    labels:
      - "name=redis"
      - "mode=standalone"
      
### 추가된 부분
  sonarqube: 
    image: sonarqube:9.9.1-community
    hostname: sonarqube
    container_name: sonarqube
    depends_on: 
      - postgresql
    environment: 
      SONAR_JDBC_URL: jdbc:postgresql://postgresql:5432/sonar // # DB사용
      SONAR_JDBC_USERNAME: postgres
      SONAR_JDBC_PASSWORD: bong1234
    volumes:
      - sonarqube_data:/opt/sonarqube/data
      - sonarqube_extensions:/opt/sonarqube/extensions
      - sonarqube_logs:/opt/sonarqube/logs

    ports:
      - "9000:9000"

volumes:
  sonarqube_data:
  sonarqube_extensions:
  sonarqube_logs:
  postgresql:
  postgresql_data:

DB를 활용하고 마치 우리의 어플리케이션을 DB와 연결할때와 같은 설정 정보를 넣는다.

포트는 9000번

나머지는 저번 Docker compose와 유사하다.

docker compose up으로 실행시키자

정상적으로 실행이 되었다.

오타때문에 오류가 자주 났었다 확인을 잘해보자

localhost:9000

초기 아이디 비번은 모두 admin
재설정하면된다.

초기화면에는 아무것도 없을 것이다.
나는 이미 하고서 글을 쓰기에 backend가 있다.

Admininstration -> Security -> User 에 가서 토큰을 발행할 것이다.

해당 토큰 버튼을 클릭하면 팝업창이 하나가 나온다.

토큰명과 기간을 넣고 발행을 시켜준다. 토큰은 저장해두도록하자.

그 후 프로젝트의 gradle에 가서

plugins {
    id 'java'
    id 'org.springframework.boot' version '3.0.4'
    id 'io.spring.dependency-management' version '1.1.0'
    id "org.sonarqube" version "4.4.1.3373" ###### 추가
}

######## 추가
sonar{
    properties{
        property("sonar.projectKey", "kcredit-log-integration")
        property("sonar.host.url", "http://localhost:9000")
        property("sonar.login", "squ_1bcbf25a88b9f815f770043aee1567462858c872") #### 토큰 나온것
    }
}

을 한뒤 리로드를 해주고 (맨 위 새로고침 모양)

verification의 sonar을 클릭하면된다.
혹은 Setting -> plugins -> sonarlint를 활용하면 된다.

> Task :sonar
Unresolved imports/types have been detected during analysis. Enable DEBUG mode to see them.
Use of preview features have been detected during analysis. Enable DEBUG mode to see them.
Use of preview features have been detected during analysis. Enable DEBUG mode to see them.
Missing blame information for the following files:
  * src/test/java/cherish/backend/item/service/ItemLikeServiceTest.java
  * src/main/java/cherish/backend/member/service/MemberService.java
  * src/main/java/cherish/backend/item/repository/ItemRepositoryImpl.java
  * src/main/java/cherish/backend/common/service/RedisService.java
This may lead to missing/broken features in SonarQube

그 후 localhost:9000에 들어가서 등록된 것을 확인하고

이슈에 들어가서 문제를 확인하거나
새롭게 빌드했을때 발견한 문제와 전체적인 문제를 요약해주는 탭을 보며 수정을 진행하면 된다.

이런거 보여주는게 신기하긴하다....

예시

나의 문제점 같은 경우

private String get(String key) {

        return redisTemplate.opsForValue().get(key);
}

를 사용하여 get을 하였을때 NPE가 나올 수 있는 정적 코드 문제점이 있었다.

SonarQube가 해당 문제점을 발견하였고 문제점을 해결하여

 private String get(String key) {
        
        if (hasKey(key)){
            return redisTemplate.opsForValue().get(key);
        }
        else
            throw new IllegalArgumentException("해당 값이 없습니다.");
    }

로 변경 조치했다.

또한

쓰지 않는 import 도 찾아주었다.

해당 라인을 삭제했더니
업로드중..

issue에서 사라졌다.

하지만 의도사항에 따라서 너무 조언을 따라하는 것도 안좋을듯하고 개발자가 놓친 실수을 잡는 데 사용하는 것이 좋을듯하다.

의도된 disable()도 잡아주었다.

결론

4177줄 기준 SonarQube 수행시간이 한번 돌릴때 30초씩 걸렸다.
IDE의 플러그인을 활용하여 가끔씩 한번 돌려주면 좋을 듯하다.

정적 코드분석은 개발자의 실수를 잡고 발생 할 수 있는 오류를 미리 탐지해준다.
동적 테스트 코드는 우리가 원하는 비즈니스로직이 플로우대로 흘러가는 것을 정확히 확인 해야하므로 서로의 역할이 다르니 둘다 활용하는 것이 좋을 듯하다.

고로 비즈니스 로직을 짤때는 동적 테스트 코드로 검증을 하고 최종적으로 SonarQube를 돌려서 프로젝트 전체의 누락사항을 방지하고 미리 NPE등 발생할 수 있는 오류를 예방하자.

나머지 사안도 확인하고 리팩토링을 진행하여 커버리지를 높여야겠다. 리팩토링 포인트 발견

Ref

https://velog.io/@ch4570/%EB%82%B4%EA%B0%80-%EC%A7%A0-%EC%BD%94%EB%93%9C%EC%97%90%EC%84%9C-%EC%8D%A9%EC%9D%80%EB%82%B4%EA%B0%80-%EB%82%9C%EB%8B%A4%EA%B3%A0
https://www.sonarsource.com/products/sonarqube/?gads_campaign=SQ-Hroi2-PMax&gads_ad_group=Global&gads_keyword=&gad_source=1&gclid=Cj0KCQiAoKeuBhCoARIsAB4WxtdGM66z-lNVOCjA7yURL5viBRibTzFII_rrhYtwwJbc5Yn465y8aYgaAs-aEALw_wcB
https://nobase-dev.tistory.com/275

profile
https://coodori.notion.site/0b6587977c104158be520995523b7640

0개의 댓글