외부 라이브러리가 포함된 Swagger 문서

· 2분 읽기

여러 라이브러리를 사용하여 향후 사례를 위해 코드를 분할하는 것은 좋은 일입니다. 개인적으로 나는 로직을 분할하여 다른 프로젝트나 프로젝트의 일부에서 재사용할 수 있다면 이 작업을 좋아합니다.

적어도 나에게는 Entity Framework을 포함하는 데이터 모델을 분할하여 Console application, Blazor application 또는 API에서 참조하고 사용할 수 있도록 해야 합니다.

제가 작업을 수행하는 방법에 대한 예를 살펴보겠습니다. 이것은 몇 가지 애플리케이션이 있는 프로젝트의 스크린샷과 모든 모델이 있는 공유 라이브러리입니다.

이것은 각 속성과 클래스에 대한 summary 문서가 포함된 API 프로젝트에서 이동한 클래스의 예입니다.

namespace CustomLibrariesDocumentation.Models
{
    /// <summary>
    /// WeatherForecast class
    /// </summary>
    public class WeatherForecast
    {
        /// <summary>
        /// Gets or sets the Date
        /// </summary>
        public DateOnly Date { get; set; }

        /// <summary>
        /// Gets or sets the TemperatureC
        /// </summary>
        public int TemperatureC { get; set; }

        /// <summary>
        /// Gets or sets the TemperatureF
        /// </summary>
        public int TemperatureF => 32 + (int)(TemperatureC / 0.5556);

        /// <summary>
        /// Gets or sets the Summary
        /// </summary>
        public string? Summary { get; set; }
    }
}

Console application를 참조하고 모델을 사용하기 시작하면 문서를 볼 수 있습니다. 이는 Visual Studio의 표준 기능이므로 여기에서 볼 수 있듯이 잘 작동합니다.

그러나 API를 참조하고 Swagger로 이동하면 요약 문서가 없습니다.

이 문제를 어떻게 해결하나요?

먼저, 라이브러리에서 XML 주석을 활성화해야 합니다. 이를 위해서는 프로젝트 설정을 업데이트하고 ``:

그러면 여기에서 볼 수 있듯이 빌드 폴더에 파일 확장자 xml로 끝나는 일부 파일이 생성됩니다.

이제 이 작업이 완료되었으므로 Program.cs에 몇 가지 항목을 추가해야 해당 파일을 읽을 수 있습니다. 이는 기본적으로 해당 프로젝트의 XML 정의만 로드하기 때문입니다.

이는 AddSwaggerGen 내부에 있는 IncludeXmlComments라는 메서드를 사용합니다.

아이디어는 xml 파일이 모두 있으면 해당 파일을 Swagger에 강제로 로드한다는 것입니다.

builder.Services.AddSwaggerGen(s =>
{
    // Comments
    var allXmlFiles = Directory.GetFiles(AppContext.BaseDirectory, "*.xml");

    foreach (string xmlFiles in allXmlFiles)
    {
        s.IncludeXmlComments(xmlFiles);
    }
});

간단히 말해, 빌드 디렉터리에서 xml 파일을 가져와 IncludeXmlComments 메서드를 사용하여 추가합니다.

이제 API를 다시 로드하고 문서를 볼 수 있는지 확인합니다.

그리고 우리가 문서를 볼 수 있다는 것을 알 수 있습니다!

도움이 되셨길 바라며, 궁금한 점이 있으시면 언제든지 연락주세요!