/
์ง€ํ‘œ ์ •์˜

์ด ๋ฌธ์„œ๋Š” SonarQube v6.4 ๊ธฐ๋ฐ˜์˜ ๋ฌธ์„œ๋กœ ์•„์นด์ด๋ธŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
์ตœ์‹  ๋ฌธ์„œ๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

์ง€ํ‘œ ์ •์˜

Table of Contents

SonarQube์—์„œ ์ œ๊ณตํ•˜๋Š” ๋ชจ๋“  ๋ฉ”ํŠธ๋ฆญ์„ ๋‹ค๋ฃจ์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ๋ถ„์ด ์‚ฌ์šฉํ•˜๋Š” SonarQube ์ธ์Šคํ„ด์Šค์—์„œ ์ œ๊ณตํ•˜๋Š” ์ „์ฒด ๋ฉ”ํŠธ๋ฆญ ๋ฆฌ์ŠคํŠธ๋ฅผ ํ™•์ธํ•˜๊ณ ์ž ํ•˜๋Š” ๊ฒฝ์šฐ metrics search web service๋ฅผ ์ฐธ์กฐํ•ฉ๋‹ˆ๋‹ค.

๋ณต์žก๋„(Complexity)

NameKeyDescription
Complexitycomplexity

์ฝ”๋“œ์ด ๊ฒฝ๋กœ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ณ„์‚ฐํ•œ ๋ณต์žก๋„์ž…๋‹ˆ๋‹ค. ์†Œํ”„ํŠธ์›จ์–ด ๊ธฐ๋Šฅ์˜ ๋กœ์ง ํ๋ฆ„์— ๋ถ„๊ธฐ๊ฐ€ ๋ฐœ์ƒํ•  ๋•Œ๋งˆ๋‹ค, ๋ณต์žก๋„ ๊ฐ’์€ 1์”ฉ ์ฆ๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

๊ฐ ํ•จ์ˆ˜์˜ ๋ณต์žก๋„๋Š” ์ตœ์†Œ 1์ž…๋‹ˆ๋‹ค. ๊ฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋ณ„๋กœ ํ‚ค์›Œ๋“œkeyword ๋ฐ ๊ธฐ๋Šฅfunctionality๊ฐ€ ์ƒ์ดํ•˜์—ฌ, ๋ณต์žก๋„ ๊ณ„์‚ฐ ์ •๋ณด๋Š” ์•ฝ๊ฐ„ ์ƒ์ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ž์„ธํžˆ ๋ณด๊ธฐ

Complexity /classclass_complexityclass ๋ณ„ ํ‰๊ท  ๋ณต์žก๋„
Complexity /filefile_complexityfile ๋ณ„ ํ‰๊ท  ๋ณต์žก๋„
Complexity /methodfunction_complexityfunction ๋ณ„ ํ‰๊ท  ๋ณต์žก๋„

๋ฌธ์„œํ™”(Documentation)

NameKeyDescription
Comment linescomment_lines

์‹ค์ œ ์ฃผ์„ ํ˜น์€ ์ฃผ์„ ์ฒ˜๋ฆฌ๋œ ์ฝ”๋“œ์˜ ๋ผ์ธ ์ˆ˜์ž…๋‹ˆ๋‹ค.

์˜๋ฏธ ์—†๋Š”non-significant ์ฝ”๋ฉ˜ํŠธ ๋ผ์ธ(๋นˆ ์ฝ”๋ฉ˜ํŠธ๋ผ์ธ, ํŠน์ˆ˜ ๋ฌธ์ž๋งŒ ์กด์žฌํ•œ ๋ผ์ธ ๋“ฑ)์€ ์ฃผ์„ ๋ผ์ธ ์ˆ˜๋ฅผ ์ฆ๊ฐ€์‹œํ‚ค์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ ์ฝ”๋“œ๋Š” 9 ์ฃผ์„ ๋ผ์ธ์„ ํฌํ•จํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค:

/**ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย  +0 => ๋นˆ ์ฃผ์„ ๋ผ์ธ
ย *ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย  +0 => ๋นˆ ์ฃผ์„ ๋ผ์ธ
ย * This is my documentationย ย ย ย ย ย ย ย ย ย ย  +1 => ์˜๋ฏธ ์žˆ๋Š” ์ฃผ์„
ย * although I don'tย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย  +1 => ์˜๋ฏธ ์žˆ๋Š” ์ฃผ์„
ย * have muchย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย  +1 => ์˜๋ฏธ ์žˆ๋Š” ์ฃผ์„
ย * to sayย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย  +1 => ์˜๋ฏธ ์žˆ๋Š” ์ฃผ์„
ย *ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย  +0 => ๋นˆ ์ฃผ์„ ๋ผ์ธ
ย ***************************ย ย ย ย ย ย ย ย ย ย  +0 => ์˜๋ฏธ ์—†๋Š” ์ฃผ์„
ย *ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย  +0 => ๋นˆ ์ฃผ์„ ๋ผ์ธ
ย * blabla...ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย  +1 => ์˜๋ฏธ ์žˆ๋Š” ์ฃผ์„
ย */ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย  +0 => ๋นˆ ์ฃผ์„ ๋ผ์ธ
ย 
/**ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย  +0 => ๋นˆ ์ฃผ์„ ๋ผ์ธ
ย * public String foo() {ย ย ย ย ย ย ย ย ย ย ย ย ย ย  +1 => ์ฃผ์„ ์ฒ˜๋ฆฌ๋œ ์ฝ”๋“œ
ย *ย ย  System.out.println(message);ย ย ย ย ย  +1 => ์ฃผ์„ ์ฒ˜๋ฆฌ๋œ ์ฝ”๋“œ
ย *ย ย  return message;ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย  +1 => ์ฃผ์„ ์ฒ˜๋ฆฌ๋œ ์ฝ”๋“œ
ย * }ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย  +1 => ์ฃผ์„ ์ฒ˜๋ฆฌ๋œ ์ฝ”๋“œ
ย */ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย  +0 => empty comment line

๋” ์ž์„ธํžˆ ๋ณด๊ธฐ

Comments (%)comment_lines_density

์ฃผ์„ ๋ผ์ธ ๋ฐ€๋„ =ย ์ฃผ์„ ๋ผ์ธ ์ˆ˜ย / (์ฝ”๋“œ ๋ผ์ธ ์ˆ˜ย +ย ์ฃผ์„ ๋ผ์ธ ์ˆ˜) * 100

์œ„์˜ ์‹์— ๋”ฐ๋ผ:

  • 50%: ์ฝ”๋“œ ๋ผ์ธ ์ˆ˜์™€ ์ฃผ์„ ๋ผ์ธ ์ˆ˜๊ฐ€ ๋™์ผํ•จ
  • 100%: ์ฃผ์„ ๋ผ์ธ ๋งŒ ์กด์žฌํ•จ
Public documented API (%)public_documented_api_density๋ฌธ์„œํ™” ๋œ ๊ณต์šฉ API ๋ฐ€๋„ = (๊ณต์šฉ API ์ „์ฒด ์ˆ˜ - ๋ฌธ์„œํ™” ๋˜์ง€ ์•Š์€ ๊ณต์šฉ API ์ˆ˜) /ย ๊ณต์šฉ API ์ „์ฒด ์ˆ˜ย * 100
Public undocumented APIpublic_undocumented_api์ฃผ์„ ํ—ค๋”๊ฐ€ ์—†๋Š” ๊ณต์šฉ API ์ˆ˜
Commented-out LOCcommented_out_code_lines์ฃผ์„ ์ฒ˜๋ฆฌ ๋œ ๋ผ์ธ ์ˆ˜

์ฝ”๋“œ ์ค‘๋ณต(Duplications)

NameKeyDescription

Duplicated blocks

duplicated_blocks

์ค‘๋ณต๋œ ๋ผ์ธ ๋ธ”๋ก์˜ ์ˆ˜.

๋‹ค์Œ์˜ ๊ฒฝ์šฐ ์ค‘๋ณต๋œ ๋ธ”๋ก์œผ๋กœ ํŒ๋‹จํ•ฉ๋‹ˆ๋‹ค:

  • Java ํ”„๋กœ์ ํŠธ ์™ธ:
    • ์ตœ์†Œํ•œ 100๊ฐœ์˜ ํ† ํฐ์ด ์—ฐ์†์ ์œผ๋กœ ์ค‘๋ณต๋˜๋Š” ๊ฒฝ์šฐ
    • ์ด ํ† ํฐ๋“ค์€ ์ตœ์†Œํ•œ ๋‹ค์Œ ๋ฒ”์œ„์— ํผ์ ธ ์žˆ์–ด์•ผ ํ•จ:
      • COBOL: 30 ์ฝ”๋“œ ๋ผ์ธ
      • ABAP: 20 ์ฝ”๋“œ ๋ผ์ธ
      • ๊ทธ ์™ธ: 10 ์ฝ”๋“œ ๋ผ์ธ
  • Java ํ”„๋กœ์ ํŠธ:
    • ํ† ํฐ ํ˜น์€ ๋ผ์ธ ์ˆ˜์— ๊ด€๊ณ„ ์—†์ด, ์ตœ์†Œ 10๊ฐœ์˜ ๊ตฌ๋ถ„์ด ์—ฐ์†์ ์œผ๋กœ ์ค‘๋ณต๋˜๋Š” ๊ฒฝ์šฐ

์ฝ”๋“œ ์ค‘๋ณต ์‹๋ณ„์‹œ, ๋“ค์—ฌ์“ฐ๊ธฐ(indentation) ๋ฐ ์ŠคํŠธ๋ง ๋ฌธ์ž์—ด(string literal)๋Š” ๊ฒ€์‚ฌ ๋ฒ”์œ„์—์„œ ์ œ์™ธํ•ฉ๋‹ˆ๋‹ค.

Duplicated filesduplicated_files์ค‘๋ณต๊ณผ ์—ฐ๊ด€๋œ ํŒŒ์ผ ์ˆ˜
Duplicated linesduplicated_lines์ค‘๋ณต๊ณผ ์—ฐ๊ด€๋œ ์ฝ”๋“œ ๋ผ์ธ ์ˆ˜
Duplicated lines (%)duplicated_lines_density

์ฝ”๋“œ ์ค‘๋ณต ๋ฐ€๋„ =ย ์ค‘๋ณต๋œ ๋ผ์ธ ์ˆ˜ย /ย ์ „์ฒด ๋ผ์ธ ์ˆ˜ย * 100

์ด์Šˆ(Issues)

NameKeyDescription

New issues

new_violations

์‹ ๊ทœ ์ด์Šˆ ์ˆ˜

New xxxxx issues

new_xxxxx_violations

xxxxx ์‹ฌ๊ฐ๋„์˜ ์‹ ๊ทœ ์ด์Šˆ ์ˆ˜

(xxxxx๋Š” blocker, critical, major, minor ํ˜น์€ info ์ž„)

Issues

violations

์ด์Šˆ ์ „์ฒด ์ˆ˜

xxxxx issues

xxxxx_violations

xxxxx ์‹ฌ๊ฐ๋„์˜ ์ด์Šˆ ์ „์ฒด ์ˆ˜

(xxxxx๋Š” blocker, critical, major, minor ํ˜น์€ info ์ž„)

False positive issuesfalse_positive_issuesfalse positive ์ด์Šˆ ์ˆ˜
Open issuesopen_issuesOpen ์ƒํƒœ์˜ ์ด์Šˆ ์ˆ˜
Confirmed issuesconfirmed_issuesConfirmed ์ƒํƒœ์˜ ์ด์Šˆ ์ˆ˜
Reopened issuesreopened_issuesReopened ์ƒํƒœ์˜ ์ด์Šˆ ์ˆ˜

์‹ฌ๊ฐ๋„(Severity)

Severity

Description

Blocker์šด์˜/๋ณด์•ˆ ๋ฆฌ์Šคํฌ(risk): ์ด ์ด์Šˆ๋Š” ์‹ค์ œ ํ™˜๊ฒฝ์—์„œ ์šด์šฉ๋˜๋Š” ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ „์ฒด๋ฅผ ๋ถˆ์•ˆ์ •ํ•˜๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ: ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ ํ˜ธ์ถœ, ์†Œ์ผ“ ๋‹ซ์ง€ ์•Š์Œ ๋“ฑ
Critical์šด์˜ ๋ณด์•ˆ ๋ฆฌ์Šคํฌ(risk): ์ด ์ด์Šˆ๋Š” ์‹ค์ œ ํ™˜๊ฒฝ์—์„œ ์šด์šฉ๋˜๋Š” ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ „์ฒด์˜ ๋ฌด๊ฒฐ์„ฑ(integrity)์— ์˜ํ–ฅ์„ ๋ฏธ์น  ์ˆ˜ ์žˆ๋Š” ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ํ–‰๋™์œผ๋กœ ์ด์–ด์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ: NullPointerException, ์ž˜๋ชป ์ฒ˜๋ฆฌํ•œ ์ต์…‰์…˜, ๋‹จ์œ„ ํ…Œ์ŠคํŠธ ๋ถ€์กฑ ๋“ฑ
Major์ด ์ด์Šˆ๋Š” ์ƒ์‚ฐ์„ฑ(productivity)์— ์ฃผ์š”ํ•œ(substantial) ์˜ํ–ฅ์„ ๋ฏธ์น  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ: ๋„ˆ๋ฌด ๋ณต์žกํ•œ ๋ฉ”์†Œ๋“œ, ํŒจํ‚ค์ง€ ์‚ฌ์ดํด ๋“ฑ
Minor์ด ์ด์Šˆ๋Š” ์ƒ์‚ฐ์„ฑ(productivity)์— ์ž ์žฌ์ ์ด๊ฑฐ๋‚˜ ๋ฏธ๋ฏธํ•œ ์˜ํ–ฅ์„ ๋ฏธ์น  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ: ๋„ค์ด๋ฐ ์ปจ๋ฒค์…˜, finalizer๊ฐ€ ์ƒ์œ„ ํด๋ž˜์Šค์˜ finalizer๋ฅผ ํ˜ธ์ถœํ•˜๊ธฐ๋งŒ ํ•˜๊ณ  ์•„๋ฌด ๋™์ž‘๋„ ํ•˜์ง€ ์•Š๋Š” ๋“ฑ
Info์ด ์ด์Šˆ๋Š” ์•Œ๋ ค์ง€์ง€ ์•Š์•˜๊ฑฐ๋‚˜ ์ž˜ ์ •์˜๋˜์ง€ ์•Š์€ ๋ณด์•ˆ ๋ฆฌ์Šคํฌ ํ˜น์€ ์ƒ์‚ฐ์„ฑ์— ๋Œ€ํ•œ ์˜ํ–ฅ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

์œ ์ง€๋ณด์ˆ˜์„ฑ(Maintainability)

NameKeyDescription
Code Smellscode_smells์ฝ”๋“œ ์•…์ทจ์˜ ์ˆ˜.
New Code Smellsnew_code_smells์‹ ๊ทœ ์ฝ”๋“œ ์•…์ทจ์˜ ์ˆ˜.
Maintainability Ratingย (formerly SQALE Rating)sqale_rating

๊ธฐ์ˆ  ๋ถ€์ฑ„ ๋น„์œจ(Technical Debt Ratio) ๊ฐ’์— ๋”ฐ๋ฅธ ํ”„๋กœ์ ํŠธ ๋“ฑ๊ธ‰. ๊ธฐ๋ณธ ์œ ์ง€๋ณด์ˆ˜์„ฑ ๋“ฑ๊ธ‰(Maintainability Rating)์€ ๊ทธ๋ฆฌ๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

A=0~0.05, B=0.06~0.1, C=0.11~0.20, D=0.21~0.5, E=0.51~1

์œ ์ง€๋ณด์ˆ˜์„ฑ ๋“ฑ๊ธ‰์€ ํ•„์š”ํ•œ ๊ฐœ์„  ๋น„์šฉ(remediation cost)์œผ๋กœ ๋Œ€์‹  ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

  • 5% ์ดํ•˜์˜ ๋น„์šฉ์„ ํˆฌ์ž…ํ•ด์•ผ ํ•  ๊ฒฝ์šฐ, A๋“ฑ๊ธ‰์— ํ•ด๋‹นํ•ฉ๋‹ˆ๋‹ค.
  • 6~10%์˜ ๋น„์šฉ์„ ํˆฌ์ž…ํ•ด์•ผ ํ•  ๊ฒฝ์šฐ, B๋“ฑ๊ธ‰์— ํ•ด๋‹นํ•ฉ๋‹ˆ๋‹ค.
  • 11~20%์˜ ๋น„์šฉ์„ ํˆฌ์ž…ํ•ด์•ผ ํ•  ๊ฒฝ์šฐ, C๋“ฑ๊ธ‰์— ํ•ด๋‹นํ•ฉ๋‹ˆ๋‹ค.
  • 21~50%์˜ ๋น„์šฉ์„ ํˆฌ์ž…ํ•ด์•ผ ํ•  ๊ฒฝ์šฐ, D๋“ฑ๊ธ‰์— ํ•ด๋‹คํ•ฉ๋‹ˆ๋‹ค.
  • 50% ์ดˆ๊ณผ ๋น„์šฉ์„ ํˆฌ์ž…ํ•ด์•ผ ํ•  ๊ฒฝ์šฐ, E๋“ฑ๊ธ‰์— ํ•ด๋‹นํ•ฉ๋‹ˆ๋‹ค.
Technical Debtsqale_index๋ชจ๋“  ์œ ์ง€๋ณด์ˆ˜์„ฑ ๊ด€๋ จ ์ด์Šˆ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ๊ณต์ˆ˜๋ฅผ ์˜๋ฏธํ•˜๋ฉฐ, ์ธก์ • ๊ฐ’์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋ถ„ ๋‹จ์œ„๋กœ ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.
Technical Debt on new codenew_technical_debt์‹ ๊ทœ ์ฝ”๋“œ์˜ ๊ธฐ์ˆ  ๋ถ€์ฑ„(Technical Debt).
Technical Debt Ratiosqale_debt_ratio

์†Œํ”„ํŠธ์›จ์–ด ๊ฐœ๋ฐœ ๋น„์šฉ๊ณผ ์ˆ˜์ • ๋น„์šฉ์˜ ๋น„์œจ๋กœ, ๊ธฐ์ˆ  ๋ถ€์ฑ„ ๋น„์œจ(Technical Debt Ratio)์€ ๋‹ค์Œ ์‹์— ๋”ฐ๋ผ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค:

๊ฐœ์„  ๋น„์šฉ(Remediation cost) / ๊ฐœ๋ฐœ ๋น„์šฉ(Development cost)

์œ„ ๊ณต์‹์€ ์•„๋ž˜์™€ ๊ฐ™์ด ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

๊ฐœ์„  ๋น„์šฉ(Remediation cost) / (์ฝ”๋“œ 1 ๋ผ์ธ ๊ฐœ๋ฐœ ๋น„์šฉ * ์ฝ”๋“œ ๋ผ์ธ ์ˆ˜)

์ฝ”๋“œ 1 ๋ผ์ธ ๊ฐœ๋ฐœ ๋น„์šฉ์€ 0.06์ผ(day)์ž…๋‹ˆ๋‹ค.

Technical Debt Ratio on new codenew_sqale_debt_ratio

๋ฆญ ํ”ผ๋ฆฌ์–ด๋“œ(leak period)์— ๋ณ€๊ฒฝ๋œ ์ฝ”๋“œ๋ฅผ ๊ฐœ๋ฐœํ•˜๋Š” ๋น„์šฉ๊ณผ ํ•ด๋‹น ์ฝ”๋“œ์— ๊ด€๋ จ๋œ ์ด์Šˆ ์ฒ˜๋ฆฌ ๋น„์šฉ์˜ ๋น„์œจ์ž…๋‹ˆ๋‹ค.

ํ’ˆ์งˆ ๊ฒŒ์ดํŠธ(Quality Gates)

NameKeyDescription
Quality Gate Statusalert_statusํ”„๋กœ์ ํŠธ์— ๊ด€๋ จ๋œ ํ’ˆ์งˆ ๊ฒŒ์ดํŠธ(Quality Gate)์˜ ์ƒํƒœ. ERROR, WARN ๋ฐ OK ๊ฐ’์„ ๊ฐ€์ง‘๋‹ˆ๋‹ค.
Quality Gates Detailsquality_gate_details๋ชจ๋“  ํ’ˆ์งˆ ๊ฒŒ์ดํŠธ์˜ ์ž„๊ณ„ ์กฐ๊ฑด(condition)์— ๋Œ€ํ•ด, ๊ฐ ์กฐ๊ฑด์˜ ์„ฑ๊ณต ๋ฐ ์‹คํŒจ ์ƒํƒœ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์‹ ๋ขฐ์„ฑ(Reliability)

NameKeyDescription
Bugsbugs๋ฒ„๊ทธ ์ˆ˜.
New Bugsnew_bugs์‹ ๊ทœ ๋ฒ„๊ทธ ์ˆ˜.
Reliability Ratingreliability_rating

A = ๋ฒ„๊ทธ ์ˆ˜ 0๊ฐœ
B = ๋งˆ์ด๋„ˆ(Minor) ๋ฒ„๊ทธ ์ตœ์†Œ 1๊ฐœ
C = ๋ฉ”์ด์ €(Major) ๋ฒ„๊ทธ ์ตœ์†Œ 1๊ฐœ
D = ํฌ๋ฆฌํ‹ฐ์ปฌ(Critical) ๋ฒ„๊ทธ ์ตœ์†Œ 1๊ฐœ
E = ๋ธ”๋กœ์ปค(Blocker) ๋ฒ„๊ทธ ์ตœ์†Œ 1๊ฐœ

Reliability remediation effortreliability_remediation_effort๋ชจ๋“  ๋ฒ„๊ทธ ์ด์Šˆ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ๊ณต์ˆ˜๋ฅผ ์˜๋ฏธํ•˜๋ฉฐ, ์ธก์ • ๊ฐ’์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋ถ„ ๋‹จ์œ„๋กœ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.
Reliability remediation effort on new codenew_reliability_remediation_effort๋ฆญ ํ”ผ๋ฆฌ์–ด๋“œ(leak period)์—์„œ ๋ณ€๊ฒฝ๋œ ์ฝ”๋“œ์— ๋Œ€ํ•œ ์‹ ๋ขฐ์„ฑ ๊ฐœ์„  ๊ณต์ˆ˜(Reliability remediation effort)์™€ ๋™์ผํ•ฉ๋‹ˆ๋‹ค.

๋ณด์•ˆ์„ฑ(Security)

NameKeyDescription
Vulnerabilitiesvulnerabilities์ทจ์•ฝ์ (vulnerabilities) ์ˆ˜.
New Vulnerabilitiesnew_vulnerabilities์‹ ๊ทœ ์ทจ์•ฝ์  ์ˆ˜.
Security Ratingsecurity_rating

A = ์ทจ์•ฝ์  0๊ฐœ
B = ๋งˆ์ด๋„ˆ(Minor) ์ทจ์•ฝ์  ์ตœ์†Œ 1๊ฐœ
C = ๋ฉ”์ด์ €(Major) ์ทจ์•ฝ์  ์ตœ์†Œ 1๊ฐœ
D = ํฌ๋ฆฌํ‹ฐ์ปฌ(Critical) ์ทจ์•ฝ์  ์ตœ์†Œ 1๊ฐœ
E = ๋ธ”๋กœ์ปค(Blocker) ์ทจ์•ฝ์  ์ตœ์†Œ 1๊ฐœ

Securityย remediation effortsecurity_remediation_effort๋ชจ๋“  ์ทจ์•ฝ์  ์ด์Šˆ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ๊ณต์ˆ˜๋ฅผ ์˜๋ฏธํ•˜๋ฉฐ, ์ธก์ • ๊ฐ’์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋ถ„ ๋‹จ์œ„๋กœ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.
Securityย remediation effort on new codenew_security_remediation_effort๋ฆญ ํ”ผ๋ฆฌ์–ด๋“œ(leak period)์—์„œ ๋ณ€๊ฒฝ๋œ ์ฝ”๋“œ์— ๋Œ€ํ•œ ๋ณด์•ˆ์„ฑ ๊ฐœ์„  ๊ณต์ˆ˜(Security remediation effort)์™€ ๋™์ผํ•ฉ๋‹ˆ๋‹ค.

ย 

ย 

Metric

Key

Description

Classesclassesํด๋ž˜์Šค ์ˆ˜(์ค‘์ฒฉ๋œ ํด๋ž˜์Šค(classes), ์ธํ„ฐํŽ˜์ด์Šค(interfaces), ์ด๋„˜(enums) ๋ฐ ์• ๋„ˆํ…Œ์ด์…˜(annotations) ํฌํ•จ).
Directoriesdirectories๋””๋ ‰ํ† ๋ฆฌ ์ˆ˜.
FilesfilesํŒŒ์ผ ์ˆ˜.
Lineslines๋ฌผ๋ฆฌ์ ์ธ ๋ผ์ธ ์ˆ˜(์บ๋ฆฌ์ง€ ๋ฆฌํ„ด(carriage returns) ์ˆ˜).
Lines of codencloc

๊ณต๋ฐฑ(whitespace), ํƒญ๋ฌธ์ž(tabulation) ํ˜น์€ ์ฃผ์„์˜ ์ผ๋ถ€๊ฐ€ ์•„๋‹Œ ๋ฌธ์ž๋ฅผ ์ตœ์†Œํ•œ ํ•œ ๋ฌธ์ž ์ด์ƒ ํฌํ•จํ•œ ๋ฌผ๋ฆฌ์ ์ธ ๋ผ์ธ ์ˆ˜.

More details

Lines of code per languagencloc_language_distribution์–ธ์–ด๋ณ„ ๋น„ ์ฃผ์„ ์ฝ”๋“œ ๋ผ์ธ ๋ถ„ํฌ
Methodsfunctions

ํ•จ์ˆ˜ ์ˆ˜. ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์— ๋”ฐ๋ผ ํ•จ์ˆ˜(function), ๋ฉ”์†Œ๋“œ(method) ํ˜น์€ ํŒจ๋Ÿฌ๊ทธ๋ž˜ํ”„(paragraph) ๊ฐ’์ผ ์ˆ˜ ์žˆ์Œ.

More details

Projectsprojects๋ทฐ์˜ ํ”„๋กœ์ ํŠธ ์ˆ˜.
Public APIpublic_api

ํผ๋ธ”๋ฆญ ํด๋ž˜์Šค(publicย Classes) + ํผ๋ธ”๋ฆญ ํ•จ์ˆ˜(publicย Functions) ์ˆ˜ + ํผ๋ธ”๋ฆญ ํ”„๋กœํผํ‹ฐ(public Properties) ์ˆ˜

More details

Statementsstatements

๊ตฌ๋ฌธ(statement) ์ˆ˜.

More details

ํ…Œ์ŠคํŠธ(Tests)

Metric

Key

Description

Condition coveragebranch_coverage

์กฐ๊ฑด ์ปค๋ฒ„๋ฆฌ์ง€(Condition coverage)๋Š” ๋ถˆ๋ฆฌ์–ธ ํ‘œํ˜„์‹์„ ๊ฐ€์ง„ ๋ชจ๋“  ์ฝ”๋“œ ๋ผ์ธ์— ๋Œ€ํ•ด, '๊ฐ ๋ถˆ๋ฆฌ์–ธ ํ‘œํ˜„์ด ์ฐธ๊ณผ ๊ฑฐ์ง“์œผ๋กœ ํ‰๊ฐ€๋˜์—ˆ๋Š”๊ฐ€?'๋ฅผ ํŒ๋‹จํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๋™์•ˆ ํ๋ฆ„ ์ œ์–ด(flow control)์ œ์–ด ๊ตฌ์กฐ์— ์กด์žฌ ๊ฐ€๋Šฅํ•œ ์กฐ๊ฑด์˜ ๋ชจ๋“  ๊ฒฝ์šฐ๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

Condition coverage = (CT + CF) / (2*B)
ย 
์œ„ ๊ณต์‹์—์„œ,
ย 
CT = ์ตœ์†Œ 1ํšŒ ์ด์ƒ "true"๋กœ ํ‰๊ฐ€๋œ ์กฐ๊ฑด
CF = ์ตœ์†Œ 1ํšŒ ์ด์ƒ "false"๋กœ ํ‰๊ฐ€๋œ ์กฐ๊ฑด
B = ์กฐ๊ฑด์˜ ์ด ํ•ฉ

Condition coverage on new codenew_branch_coverage

์กฐ๊ฑด ์ปค๋ฒ„๋ฆฌ์ง€(Condition coverage)์™€ ๋™์ผํ•˜๋‚˜, ์‹ ๊ทœ ํ˜น์€ ์—…๋ฐ์ดํŠธ ํ•œ ์ฝ”๋“œ๋กœ ๋ฒ”์œ„๋ฅผ ํ•œ์ •ํ•ฉ๋‹ˆ๋‹ค.

Condition coverage hitsbranch_coverage_hits_data์ปค๋ฒ„ ๋œ ์กฐ๊ฑด ๋ฆฌ์ŠคํŠธ.
Conditions by lineconditions_by_line์ฝ”๋“œ ๋ผ์ธ ๋‹น ์กฐ๊ฑด ์ˆ˜.
Covered conditions by linecovered_conditions_by_line์ฝ”๋“œ ๋ผ์ธ ๋‹น ์ปค๋ฒ„๋œ ์กฐ๊ฑด ์ˆ˜.
Coveragecoverage

๋ผ์ธ ์ปค๋ฒ„๋ฆฌ์ง€(Line coverage)์™€ ์กฐ๊ฑด ์ปค๋ฒ„๋ฆฌ์ง€(Condition coverage)๋ฅผ ์กฐํ•ฉํ•œ ์ง€ํ‘œ. ์ด ์ง€ํ‘œ๋Š” '๋‹จ์œ„ ํ…Œ์ŠคํŠธ๋กœ ์–ผ๋งˆ๋‚˜ ๋งŽ์€ ์ฝ”๋“œ๋ฅผ ์ปค๋ฒ„ํ–ˆ๋Š”๊ฐ€?'์— ๋Œ€ํ•œ ๋‹ต์„ ์–ป๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

Coverage = (CT + CF + LC)/(2*B + EL)
ย 
์œ„ ๊ณต์‹์—์„œ,
ย 
CT = ์ตœ์†Œ 1ํšŒ ์ด์ƒ 'true'๋กœ ํ‰๊ฐ€๋œ ์กฐ๊ฑด
CF = ์ตœ์†Œ 1ํšŒ ์ด์ƒ 'false'๋กœ ํ‰๊ฐ€๋œ ์กฐ๊ฑด
LC = covered lines = lines_to_cover - uncovered_lines
ย 
B = ์กฐ๊ฑด์˜ ์ด ์ˆ˜
EL = ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ์ด ์ฝ”๋“œ ๋ผ์ธ ์ˆ˜ (lines_to_cover)

Coverage on new codenew_coverage

์ปค๋ฒ„๋ฆฌ์ง€(Coverage)์™€ ๋™์ผํ•˜๋‚˜, ์‹ ๊ทœ ๋ฐ ์—…๋ฐ์ดํŠธ ๋œ ์ฝ”๋“œ๋กœ ๋ฒ”์œ„๋ฅผ ํ•œ์ •ํ•ฉ๋‹ˆ๋‹ค.

Line coverageline_coverage

๋ผ์ธ ์ปค๋ฒ„๋ฆฌ์ง€(Line coverage)๋Š” ์ฃผ์–ด์ง„ ์ฝ”๋“œ ๋ผ์ธ์— ๋Œ€ํ•ด '๋‹จ์œ„ ํ…Œ์ŠคํŠธ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๋™์•ˆ, ์ด ์ฝ”๋“œ ๋ผ์ธ์ด ์‹คํ–‰๋˜์—ˆ๋Š”๊ฐ€?'๋ฅผ ํŒ๋‹จํ•˜๋ฉฐ, ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๊ฐ€ ์ปค๋ฒ„ํ•œ ๋ผ์ธ์˜ ๋น„์œจ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค:

Line coverage = LC / EL
ย 
์œ„ ๊ณต์‹์—์„œ,
ย 
LC = covered lines (lines_to_cover - uncovered_lines)
EL = ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ์ด ์ฝ”๋“œ ๋ผ์ธ ์ˆ˜ (lines_to_cover)

Line coverage on new codenew_line_coverage๋ผ์ธ ์ปค๋ฒ„๋ฆฌ์ง€(Line coverage)์™€ ๋™์ผํ•˜๋‚˜, ์‹ ๊ทœ ๋ฐ ์—…๋ฐ์ดํŠธ ๋œ ์ฝ”๋“œ๋กœ ๋ฒ”์œ„๋ฅผ ํ•œ์ •ํ•ฉ๋‹ˆ๋‹ค.
Line coverage hitscoverage_line_hits_data์ปค๋ฒ„๋œ ๋ผ์ธ ๋ชฉ๋ก.
Lines to coverlines_to_cover๋‹จ์œ„ ํ…Œ์ŠคํŠธ์— ์˜ํ•ด ์ปค๋ฒ„๋œ ์ฝ”๋“œ ๋ผ์ธ ์ˆ˜(์˜ˆ: ๋นˆ ๋ผ์ธ ํ˜น์€ ์ „์ฒด ์ฃผ์„ ๋ผ์ธ์€ ์ปค๋ฒ„ํ•ด์•ผ ํ•  ๋ผ์ธ์œผ๋กœ ๊ณ„์‚ฐํ•˜์ง€ ์•Š์Œ).
Lines to cover on new codenew_lines_to_cover์ปค๋ฒ„ํ•ด์•ผ ํ•  ๋ผ์ธ์˜ ์ˆ˜(Lines to cover)์™€ ๋™์ผํ•˜๋‚˜, ์‹ ๊ทœ ๋ฐ ์—…๋ฐ์ดํŠธ ๋œ ์ฝ”๋“œ๋กœ ๋ฒ”์œ„๋ฅผ ํ•œ์ •ํ•ฉ๋‹ˆ๋‹ค.
Skipped unit testsskipped_tests์Šคํ‚ตํ•œ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ ์ˆ˜.
Uncovered conditionsuncovered_conditions๋‹จ์œ„ ํ…Œ์ŠคํŠธ๋กœ ์ปค๋ฒ„๋˜์ง€ ์•Š์€ ์กฐ๊ฑด์˜ ์ˆ˜.
Uncoveredย conditionsย on new codenew_uncovered_conditions์ปค๋ฒ„๋˜์ง€ ์•Š์€ ์กฐ๊ฑด์˜ ์ˆ˜(Uncovered conditions)์™€ ๋™์ผํ•˜๋‚˜, ์‹ ๊ทœ ๋ฐ ์—…๋ฐ์ดํŠธ ๋œ ์ฝ”๋“œ๋กœ ๋ฒ”์œ„๋ฅผ ํ•œ์ •ํ•จ.
Uncovered linesuncovered_lines๋‹จ์œ„ ํ…Œ์ŠคํŠธ๋กœ ์ปค๋ฒ„๋˜์ง€ ์•Š์€ ์ฝ”๋“œ ๋ผ์ธ ์ˆ˜.
Uncovered lines on new codenew_uncovered_lines์ปค๋ฒ„๋˜์ง€ ์•Š์€ ๋ผ์ธ ์ˆ˜(Uncovered lines)์™€ ๋™์ผํ•˜๋‚˜, ์‹ ๊ทœ ๋ฐ ์—…๋ฐ์ดํŠธ ๋œ ์ฝ”๋“œ๋กœ ๋ฒ”์œ„๋ฅผ ํ•œ์ •ํ•จ.
Unit teststests๋‹จ์œ„ ํ…Œ์ŠคํŠธ ์ˆ˜.
Unit tests durationtest_execution_time๋ชจ๋“  ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•œ ์‹œ๊ฐ„.
Unit test errorstest_errors์‹คํŒจํ•œ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ ์ˆ˜.
Unit test failurestest_failures์˜ˆ์ƒํ•˜์ง€ ์•Š์€ ์ต์…‰์…˜์œผ๋กœ ์‹คํŒจํ•œ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ ์ˆ˜.
Unit test success density (%)test_success_densityํ…Œ์ŠคํŠธ ์„ฑ๊ณต ๋ฐ€๋„(Test success density) = (Unit testsย - (Unit test errorsย +ย Unit test failures)) /ย Unit testsย * 100

ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ ์ปค๋ฒ„๋ฆฌ์ง€(Integration tests coverage) ๋ฐ ์ „์ฒด ํ…Œ์ŠคํŠธ ์ปค๋ฒ„๋ฆฌ์ง€(Overall tests coverage = Units tests + Integration tests) ์ง€ํ‘œ์— ๋Œ€ํ•ด์„œ๋„ ๋™์ผํ•œ ๋ฉ”ํŠธ๋ฆญ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

๋‹จ, ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ์™€ ์ „์ฒด ํ…Œ์ŠคํŠธ์— ๋Œ€ํ•œ ํ…Œ์ŠคํŠธ ์‹คํ–‰ ๋ฉ”ํŠธ๋ฆญ์€ ์ œ๊ณตํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

Related content

ยฉ 2017-2018 Moses Kim.

๋ณ„๋„์˜ ์–ธ๊ธ‰์ด ์—†๋Š” ํ•œ, ์ด ์ŠคํŽ˜์ด์Šค์˜ ์ปจํ…์ธ ๋Š” ํฌ๋ฆฌ์—์ดํ‹ฐ๋ธŒ ์ปค๋จผ์ฆˆ ์ €์ž‘์žํ‘œ์‹œ-๋น„์˜๋ฆฌ-๋™์ผ์กฐ๊ฑด๋ณ€๊ฒฝํ—ˆ๋ฝ 4.0 ๊ตญ์ œ ๋ผ์ด์„ ์Šค์— ๋”ฐ๋ผ ์ด์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
SONARQUBE๋Š” SonarSource SA์˜ ํŠธ๋ ˆ์ด๋“œ ๋งˆํฌ์ž…๋‹ˆ๋‹ค. ๋ชจ๋“  ํŠธ๋ ˆ์ดํŠธ ๋งˆํฌ ๋ฐ ์ €์ž‘๊ถŒ์€ ๊ฐ ์†Œ์œ ์ž์˜ ์†Œ์œ ๋ฌผ์ž…๋‹ˆ๋‹ค.

::: SonarQube ๊ด€๋ จ ๋ฌธ์˜ : ์ด๋ฉ”์ผ :::