점점 발전하는 프로젝트로
처음에는 단위테스트 코드도 짜지 않았지만
given-when-then
부터 Mokito, BDD
까지 테스트 코드를 짜며 원하는 로직을 검증했다.
개발자는 역시 직접 눈으로 확인해야 적성이 풀리는 직업이다.
하지만 그것만으로는 아쉽다.
혹시 NPE
에 노출되어있는 것은 아닐까?
의도된 비즈니스 로직은 수행을 정확히 하되 만약 내가 짠 시나리오가 아니여서 에러가 나올순 없는걸까?
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등 발생할 수 있는 오류를 예방하자.
나머지 사안도 확인하고 리팩토링을 진행하여 커버리지를 높여야겠다. 리팩토링 포인트 발견
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