Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Info

Entity-ORM이 발생시키는 SQL로그를 추적하는 방법을 살펴보자


어플리케이션 로그설정 클래스작성

Code Block
languagec#
themeEmacs
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Logging;  //Nuget을 통해 다운로드받는다.
using Microsoft.Extensions.Logging.Console;
using Microsoft.Extensions.Logging.Debug;


namespace accountapi.Config
{
    public class LogSettings
    {
        public static readonly LoggerFactory ConsoleLogger = new LoggerFactory(new[] {
            new ConsoleLoggerProvider((category, level) => category == DbLoggerCategory.Database.Command.Name
               && level == LogLevel.Debug, true) 
        });

        public static readonly LoggerFactory DebugLogger = new LoggerFactory(new[] {
            new DebugLoggerProvider((_, logLevel) => logLevel >= LogLevel.Debug)
        });
    }
}

...

Xunit에서 DebugLogger을 사용하는이유는, 테스트 대상이되는 외부APP에서 사용된 ConsoleLogger의경우 표시가되지

않기때문입니다.


DBContext에 로그연결하기

Code Block
languagec#
themeEmacs
var builder = new DbContextOptionsBuilder<AccountContent>()
    .UseLoggerFactory(LogSettings.DebugLogger)  //Entity ORM의 로그셋팅
    .UseMySql(AccountControlerTest.ConnectionString);
var context = new AccountContent(builder.Options);

DBContext에 로깅이 설정이되어 이제부터 SQL문 파악이 가능해집니다.

유닛테스트 실행

ORM을 통해 DB를 제어하는 몇가지 유닛테스트가 셋팅되어 있으며 테스트를 실행할시에는 유효검사가 성공하는 메시지만 볼수가 있습니다.

여기서 유닛 테스트시 사용되는 SQL문을 심도있게 분석하고자 한다면 선택한 테스트 디버그를 실행합니다.


유닛테스트 디버그

앞장에서 설명한 Entity-ORM에서 낙관성 동시성 제어를 사용하였고, 의도적으로 동시 수정을 하여

...

SQL문없이 몇줄의 OOP 코드로만  DB Concurrency Write문제를 유발시킬수 있다란것입니다.


유닛테스트 결과확인

유닛테스트는 대부분 유효검증을하는것만으로 충분하지만, 검증에 사용된 데이터를 직접 확인하고자 한다면

...

DB조회 / 출력 / 검증기능   3가지를 각각 한줄의 코드면 충분하다란것입니다. 


참고자료