문제 개요
오류 상황과 영향 범위 (예: 특정 코드 실행 시 발생, 특정 라이브러리 버전 호환 문제 등) 발생 배경 (예: 코드 테스트 중, 배포 중 문제 발견 등)
TDD 방식으로 개발을 진행하였으나 테스트가 코드를 전체적으로 커버하는지 확인할 수 있는 근거로써 구체적인 지표의 필요성을 느꼈다. 멘토님의 피드백에서도 테스트 범위를 시각적으로 파악할 수 있는 리포트의 중요성이 언급되었고 이에 따라 커버리지 툴 도입을 결정했다.
해결 및 고민 과정
처음 문제를 접했을 때 고려했던 대안들과 선택하지 않은 이유 실험적으로 적용한 방법이 실패한 사례와 그 이유 여러 해결책 중 최적의 방안을 선택한 과정
테스트 커버리지 툴 선정을 위해 검색한 결과, 테스트 커버리지를 확인하는 방법은 여럿이 존재했다. 그 중 다음과 같은 툴이 후보에 올랐다.
- IntelliJ 내장 커버리지 기능
- Cobertura
- Clover
- JaCoCo
이 중에서 JaCoCo를 선택했는데, 이유는 다음과 같다.
- 활발한 업데이트
- 문서화 및 참고할만한 커뮤니티 레퍼런스의 수
- 자바 생태계에서 많이 쓰이며 Gradle 연동이 쉬운지 여부
- 추후 CI 환경에 추가를 고려한 확장성
최종 해결책 및 구현
문제 해결을 위한 단계별 조치 방법과 코드 예시 (예: 특정 애노테이션 추가, 라이브러리 버전 조정, 설정 변경 등) 참고 자료 (관련 공식 문서, 개발자 커뮤니티 게시물 등)
JaCoCo를 적용할 때 큰 문제는 없었다.
plugins {
id 'jacoco'
}
jacocoTestReport {
// 테스트 후 리포트가 생성되도록 설정
dependsOn test
reports {
//CI 등 분석 도구용 xml 리포트 생성
xml.required = true
csv.required = false
//시각적 확인용 html 리포트 생성
html.required = true
html.outputLocation = layout.buildDirectory.dir('jacocoHtml')
}
}
tasks.named('test') {
finalizedBy jacocoTestReport
}
build.gradle에 테스트 후 xml, html 리포트가 작성되도록 설정을 추가하고 cli 명령어를 입력했다. xml은 추후 CI 도구나 분석 툴에 사용하기 위해서 만들도록 설정하였고, html은 시각적으로 확인하게 추가하였다.
이후 다음 명령어로 리포트를 생성하고, build/jacocoHtml/index.html 에서 확인할 수 있었다.
./gradlew jacocoTestReport
결과 및 성능 분석
개선 후 응답 속도, DB 부하 감소 수치 등 구체적인 데이터 포함 문제 해결 전/후 성능 비교 그래프나 로그 분석 내용 포함 이슈 트래킹 및 자동화 방안 추가 (내부 개발자가 반복적인 문제 해결을 효율적으로 관리할 수 있도록 가이드 제공)
5월 19일 11시 기준 테스트 커버리지는 다음과 같다.
구분 수치 커버리지
라인 커버리지 (Instructions) | 9,527 중 2,663 미커버 | ✅ 72% |
분기 커버리지 (Branches) | 488 중 250 미커버 | ⚠️ 48% |
메서드 | 총 416개 중 15개 미커버 | ✅ 대부분 커버됨 |
추가 개선점
유사한 문제를 방지하기 위한 주의할 점 (예: 애노테이션 명시 여부, 프레임워크 업데이트 주기 확인 등) 문제 해결 과정에서 배운 점 및 중요한 교훈 공유 보안 고려 사항 추가 (해결 과정에서 발생할 수 있는 보안 리스크 및 예방 조치 포함)
- 라인 커버리지는 72%로 70%를 넘기는 비교적 양호한 커버리지를 보였지만, 분기 커버리지는 48%로 조건 분기문과 예외 처리 로직에 대한 테스트의 개선 여지가 보였다.
- 테스트가 부족한 모듈들은 추후 테스트를 추가해 코드 커버리지를 늘리는 방향으로 개선이 필요해 보인다.
- 추후 CI 파이프라인에 커버리지를 확인하고 일정 기준 미달 시 경고하거나 실패하도록 설정해 코드의 품질을 높일 예정이다.
'kkokkio - 프로젝트 > 트러블슈팅' 카테고리의 다른 글
JWT는 강제로 만료할 수 없는데 우리는 어떻게 블랙리스트를 관리하는가 (0) | 2025.06.16 |
---|---|
accessToken의 만료 여부를 어떻게 확인 할 수 있을까 (0) | 2025.06.16 |
도커에서 Doppler 적용기 (1) | 2025.06.02 |
SpringDocs에서 SwaggerConfig보다 yaml이 우선되는가? (0) | 2025.06.02 |
prompt 시행착오 - 말 안 듣는 인공지능 요약시키기 (0) | 2025.06.02 |