개발자

"더 간편한 닷넷 데이터 액세스" ED 코어 7에서 '로깅' 활용하기

Joydip Kanjilal | InfoWorld 2022.11.15
엔티티 프레임워크 코어(Entity Framework Core, EF 코어)는 현대적인 오픈소스 개체 데이터베이스 매퍼로, 닷넷 애플리케이션의 데이터 액세스를 간편하게 해준다. EF 코어를 사용하면 관계형 데이터베이스, 비 관계형 데이터베이스, 메모리 내 데이터를 포함한 다양한 소스의 데이터를 다룰 수 있다. 
 
ⓒ Getty Images Bank

EF 코어를 이용하면 데이터가 기반 데이터베이스에서 어떻게 지속되는지 이해할 필요 없이 CRUD(Create, Read, Update, Delete) 작업을 실행하는 코드를 쓸 수 있다. 또한, 데이터 스토어에서 엔티티를 불러오고 엔티티를 추가, 변경 또는 삭제하고 엔티티 그래프를 순회할 수 있다. 다르게 말하면, EF 코어는 기반 데이터베이스 공급자와 직접 상호작용하지 않고 닷넷 개체를 사용해 CRUD 작업을 수행하는 코드를 작성할 수 있게 해주므로 데이터 액세스가 간편해진다.

여기서는 ASP.NET 코어 7 애플리케이션으로 작업할 때 엔티티 프레임워크 코어를 사용해 데이터베이스 활동을 로깅하는 방법을 살펴본다. 여기서 살펴보는 코드 예제를 사용하려면 비주얼 스튜디오 2022 프리뷰가 필요하다. 아직 설치하지 않았다면 마이크로소프트 웹사이트에서 비주얼 스튜디오 2022 프리뷰를 다운로드하면 된다.
 

비주얼 스튜디오 2022 프리뷰에서 미니멀한 ASP.NET 코어 웹 API 프로젝트 만들기 

먼저 비주얼 스튜디오 2022에서 ASP.NET 코어 프로젝트를 만든다. 다음과 같이 비주얼 스튜디오 2022에서 새 ASP.NET 코어 웹 API 6 프로젝트를 만들 수 있다. 
 
  1. 비주얼 스튜디오 2022 프리뷰 IDE를 실행한다. 
  2. “새 프로젝트 만들기(Create new project)”를 클릭한다. 
  3. “새 프로젝트 만들기” 창의 템플릿 목록에서 “ASP.NET 코어 웹 API(ASP.NET Core Web API)”를 선택한다. 
  4. 다음(Next)을 클릭한다. 
  5. “새 프로젝트 구성(Configure your new project)” 창에서 새 프로젝트의 이름과 위치를 지정한다. 
  6. 원하는 경우 “솔루션과 프로젝트를 같은 디렉터리에 두기(Place solution and project in the same directory)” 확인란을 선택한다. 
  7. 다음을 클릭한다. 
  8. “추가 정보(Additional Information)” 창에서 사용할 프레임워크 버전으로 .NET 7.0 (프리뷰)를 선택한다. 
  9. 이 예제에서는 미니멀한 API를 사용하므로 “컨트롤러 사용(Use controllers)…” 확인란의 선택을 해제한다. “인증 유형(Authentication Type)”은 기본값인 “없음(None)” 그대로 둔다. 
  10. 예제에서 사용하지 않는 “도커 활성화(Enable Docker)”, “HTTPS 구성(Configure for HTTPS)”, “오픈 API 지원 활성화(Enable Open API Support)” 확인란을 선택 해제한다. 
  11. 만들기(Create)를 클릭한다. 

이렇게 하면 비주얼 스튜디오 2022에서 새 ASP.NET 코어 7 웹 API 프로젝트가 만들어진다. 이제 이 프로젝트를 사용해 EF 코어 7의 로깅 기능을 살펴보자
 

엔티티 프레임워크 코어의 로깅 옵션 

엔티티 프레임워크 코어에서 로깅은 데이터베이스 쿼리나 기타 작업을 추적하는 데 사용된다. 엔티티 프레임워크 코어는 Microsoft.Extensions.Logging 프레임워크를 사용해 이벤트를 로깅한다. 이 프레임워크는 로그 메시지를 기록하는 데 사용할 수 있는 다양한 로깅 공급자를 제공한다. 

기본적으로 엔티티 프레임워크 코어는 콘솔에 로그 메시지를 쓴다. 엔티티 프레임워크 코어는 Microsoft.Extensions.Logging 프레임워크를 사용하는 것 외에 N로그(Nlog), 세릴로그(Serilog)와 같은 서드파티 로깅 프레임워크도 지원한다. 이러한 프레임워크는 파일, 데이터베이스 또는 기타 대상에 로그 메시지를 쓰는 데 사용된다. 

애플리케이션에서 EF 코어와 SQL 서버를 사용하려면 Microsoft.EntityFrameworkCore.SqlServer 뉴겟(NuGet) 패키지를 프로젝트에 추가해야 한다. 솔루션 탐색기에서 프로젝트를 선택한 다음 “뉴겟 패키지 관리(Manage NuGet Packages)”를 우클릭한다. 뉴겟 패키지 관리자에서 Microsoft.EntityFrameworkCore.SqlServer를 검색해 패키지를 설치한다. 또는 뉴겟 패키지 관리자 콘솔에서 다음 명령을 입력해 패키지를 설치할 수도 있다. 
 
PM> Install-Package Microsoft.EntityFrameworkCore.SqlServer
 

닷넷 코어에서 Customer 클래스 만들기 

“Customer.cs” 파일에 이름이 Customer인 클래스를 만든 다음 이 파일에 다음 코드를 쓴다. 
 
public class Customer
{
    public int Id { get; set; }
    public string FirstName { get; set; } = string.Empty;
    public string LastName { get; set; } = string.Empty;
}
 

엔티티 프레임워크 코어에서 로깅 구성 

엔티티 프레임워크 코어에서 다음 2가지 방법 중 하나로 로깅을 활용할 수 있다. 
 
  • UseLoggerFactory 확장 메서드 사용 
  • ILoggerProvider 인터페이스 사용 

UseLoggerFactory 확장 메서드는 구성의 유연성을 높여주므로 EF 코어에서 로깅을 구성하기 위해 권장되는 방법이다. UseLoggerFactory 확장 메서드를 사용하려면 다음 코드를 DbContext 클래스에 추가하면 된다. 
 
using Microsoft.Extensions.Logging;
public class MyDbContext : DbContext
{
   public MyDbContext(DbContextOptions options)
        : base(options){ }
   protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
   {
       optionsBuilder.UseLoggerFactory(loggerFactory);
       base.OnConfiguring(optionsBuilder);
   }
   ILoggerFactory loggerFactory = new LoggerFactory();
}
 
또는 다음 코드와 같이 ILoggerProvider 인터페이스를 사용해 로깅을 구성할 수 있다. 
 
builder.Services.AddDbContext((provider, options) =>
{
    var loggerFactory = provider.GetRequiredService();
    options.UseLoggerFactory(loggerFactory);
});
 

콘솔로 EF 코어 로그 데이터 보내기 

다음 코드를 사용해 LoggerFactory를 사용하도록 DbContext 인스턴스를 구성할 수 있다. 
 
optionsBuilder.UseLoggerFactory(loggerFactory)
.EnableSensitiveDataLogging()
.UseSqlServer("Server=JOYDIP;Database=DemoDb;Trusted_Connection=True;");
 
EF 코어에서 콘솔로 데이터를 로깅하도록 하려면 다음 코드를 사용한다. 
 
optionsBuilder.UseSqlServer
("Server=JOYDIP;Database=DemoDb;Trusted_Connection=True;").
LogTo(Console.WriteLine).EnableDetailedErrors();
 

DbContext 클래스의 전체 소스 코드 

다음은 참조를 위한 DbContext 클래스의 전체 소스 코드다. 
 
public partial class DemoDbContext: DbContext
{
    public DemoDbContext()
    {}
    public DemoDbContext(DbContextOptions < DemoDbContext > options): base(options)
    {}
    public virtual DbSet < Customer > Customer
    {
        get;
        set;
    }
    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        optionsBuilder.UseSqlServer("Server=JOYDIP;Database=DemoDb;Trusted_Connection=True;").LogTo(Console.WriteLine).EnableDetailedErrors();
        base.OnConfiguring(optionsBuilder);
    }
    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity < Customer > (entity =>
        {
            entity.Property(e => e.FirstName).IsRequired().HasMaxLength(50);
            entity.Property(e => e.LastName).IsRequired().HasMaxLength(50);
        });
    }
}
 

EF 코어를 사용한 유연한 로깅 

로깅은 모든 애플리케이션에서 런타임에 발생할 수 있는 문제를 식별하고 분석하기 위해 중요한 구성요소다. EF 코어를 사용하면 내장된 로그 타겟에 데이터를 로깅하고 애플리케이션을 서드파티 로깅 프레임워크와 통합해 사전 구성된 로그 타겟에 데이터를 보낼 수도 있다. 
editor@itworld.co.kr

회사명 : 한국IDG | 제호: ITWorld | 주소 : 서울시 중구 세종대로 23, 4층 우)04512
| 등록번호 : 서울 아00743 등록발행일자 : 2009년 01월 19일

발행인 : 박형미 | 편집인 : 박재곤 | 청소년보호책임자 : 한정규
| 사업자 등록번호 : 214-87-22467 Tel : 02-558-6950

Copyright © 2024 International Data Group. All rights reserved.