.NET/C#

[C#] 인터페이스(Interface)와 상속(Inheriting) - 7. Code분석(StyleCop)

클리엘 2022. 6. 24. 11:58
728x90

10. code 분석하기

 

.NET analyzers 중 하나인 StyleCop은 작성된 코드의 잠재적인 문제점을 분석하고 이들에 대한 수정안을 파악하는 데 사용되는 분석도구입니다.

 

StyleCop을 사용해 보기 위해 .NET 6 버전을 기준으로 ConsoleApp 프로젝트를 생성한 다음 아래와 같이 Top-level programming 아닌 이번 방식의 Main() 메서드를 Program.cs에 작성합니다.

using System;

namespace myapp
{
    class Program
    {
        private static void Main(string[] args)
        {
        }
    }
}

그리고 Nuget을 통해 StyleCop.Analyzers 패키지를 추가합니다.

dotnet add package StyleCop.Analyzers

그리고 StyleCop을 위한 설정 파일이 필요한데 'stylecop.json'이라는 이름으로 프로젝트에 파일을 추가한 뒤 아래와 같은 내용으로 수정합니다.

{
    "$schema": "https://raw.githubusercontent.com/DotNetAnalyzers/StyleCopAnalyzers/master/StyleCop.Analyzers/StyleCop.Analyzers/Settings/stylecop.schema.json",
    "settings": {
    }
}

참고로 $schema부분은 stylecop.json파일을 수정할 때 IntelliSense기능을 지원하도록 하기 위함입니다.

 

이제 프로젝트 파일(*. csproj)을 열어 위에서 생성한 stylecop.json파일을 어떻게 다룰 것인지를 아래와 같이 지정합니다.

<ItemGroup>
  <None Remove="stylecop.json" />
</ItemGroup>
<ItemGroup>
  <AdditionalFiles Include="stylecop.json" />
</ItemGroup>

첫 번째 ItemGroup부분은 프로젝트가 배포되는 경우에는 stylecop.json이 추가되지 않도록 조치하기 위함이며 두 번째 ItemGroup은 'development'환경에서 해당 파일을 추가시키기 위함입니다.

 

위와 같이 설정한 상태에서 프로젝트를 빌드하면 아래와 비슷한 경고 메시지를 하나 이상 보게 됩니다.

SA1200 Using directive should appear within a namespace declaration

● 경고 숨기기

 

해당 경고는 지시에 따라 수정하면 되지만 그럴 수 없거나 현재로 존치시켜야 하는 경우에는 경고를 인의적으로 숨길 수 있습니다.

 

그 첫 번째 방법으로는 attribute를 사용하는 것입니다. 예를 들어 SA1200에 관한 경고를 무시하려고 하면 프로젝트에 GlobalSuppressions.cs와 같은 파일을 생성하여 아래와 같이 attribute를 추가해 주거나

using System.Diagnostics.CodeAnalysis;

[assembly: SuppressMessage("StyleCop.CSharp.OrderingRules", "SA1200:UsingDirectivesMustBePlacedWithinNamespace", Justification = "Reviewed.")]

특정 지시자를 경고에 해당하는 구문에 붙여줄 수 있습니다.

#pragma warning disable SA1200 // Using directives should be placed correctly
using System;
#pragma warning restore SA1200 // Using directives should be placed correctly

좀 더 전역적으로는 위에서 추가한 stylecop.json 파일에 해당 설정을 추가하는 방법이 있습니다.

{
    "$schema": "https://raw.githubusercontent.com/DotNetAnalyzers/StyleCopAnalyzers/master/StyleCop.Analyzers/StyleCop.Analyzers/Settings/stylecop.schema.json",
    "settings": {
        "orderingRules": {
            "usingDirectivesPlacement": "outsideNamespace"
        }
    }
}

참고로 위 설정을 'preserve'로 바꾸면 네임스페이스를 위한 using을 namespace안과 밖 모든 곳에서 사용할 수 있게 됩니다.

728x90