Study/Design Pattern

[Design pattern - 실무편] Log manager (로그 매니저)에서 책임 체인 패턴 사용하기

v명월v 2019. 6. 17. 22:54

안녕하세요. 명월입니다.


이 글은 책임 체인 패턴을 실무에서 어떻게 사용하는 지 설명하는 글입니다.


책임 체인 패턴의 대한 설명은 아래에 소개했었습니다.

[Design pattern] 책임 체인 패턴 (Chain responsibility pattern) - https://nowonbun.tistory.com/456


책임 체인 패턴은 거의 로그에 관계된 로직에서 많이 사용됩니다. 그 외에도 사용하려면 사용할 수는 있습니다만 제 경험으로는 그 외는 거의 없네요.

사양으로 로그 데이터는 파일(Log4g 라이브러리를 사용해서..)로 많이 남겨둡니다. 데이터 베이스 상에도 로그를 남겨두기는 합니다만 보통 trigger를 사용해서 남기는 형태가 많기 때문에 따로 프로그램에서 데이터 베이스로 로그를 Insert하는 경우는 많지는 않습니다.

많지 않을 뿐이지 없는 것은 아니니깐 구현을 하겠습니다.

// 로그 클래스의 인터페이스
public interface ILogger
{
  ILogger Info(object log);
  ILogger Debug(object log);
}
// 파일로 남기는 로그 클래스
class FileLogger : ILogger
{
  // Info의 경우는 파일에 로그를 남긴다.
  public ILogger Info(object log)
  {
    Console.WriteLine("[File Info] " + log);
    return this;
  }
  // Debug의 경우는 파일에 로그를 남긴다.
  public ILogger Debug(object log)
  {
    Console.WriteLine("[File Debug] " + log);
    return this;
  }
}
// 데이터 베이스로 남기는 로그 클래스
class DBLogger : ILogger
{
  // Info의 경우는 데이터 베이스에 로그를 남긴다.
  public ILogger Info(object log)
  {
    Console.WriteLine("[DB Info] " + log);
    return this;
  }
  // Debug의 경우는 데이터 베이스에 로그를 남기지 않는다.
  public ILogger Debug(object log)
  {
    return this;
  }
}
// 합성 패턴과 체인 책임 패턴
class LoggerManager : List<ILogger>, ILogger
{
  // Info 함수가 호출되면 List에 있는 Logger에 Info함수를 호출한다.
  public ILogger Info(object log)
  {
    foreach (var logger in this)
    {
      logger.Info(log);
    }
    return this;
  }
  // Debug 함수가 호출되면 List에 있는 Logger에 Info함수를 호출한다.
  public ILogger Debug(object log)
  {
    foreach (var logger in this)
    {
      logger.Debug(log);
    }
    return this;
  }
}
class Program
{
  static void Main(string[] args)
  {
    // 로그 매니져를 선언한다.
    var loggerManager = new LoggerManager();
    // 파일 로그 매니저를 등록한다.
    loggerManager.Add(new FileLogger());
    // 디비 로그 매니저를 등록한다.
    loggerManager.Add(new DBLogger());

    // Info 함수를 호출할 경우는
    // File log와 db log 전부 남긴다.
    loggerManager.Info("Info Example");

    Console.WriteLine();
    // Debug 함수를 호출할 경우는
    // File log만 남긴다.
    loggerManager.Debug("Debug Example");

    Console.WriteLine("Press any key...");
    Console.ReadKey();
  }
}

위 예제는 합성 패턴과 책임 체인 패턴을 응용했습니다.

먼저 Info 레벨의 로그를 호출 할 경우에는 데이터 베이스와 File에 전부 로그를 등록합니다. 그러나 Debug의 경우는 데이터 베이스에 남길 필요가 없기 때문에 File에만 남기는 형태입니다.

실무에서는 Info, Error 등급의 에러는 디비에 남기는 경우가 많습니다. 에러가 발생했을 경우 좀 더 신속하게 찾기 위함이죠.. 그러나 Debug나 Warning 등급은 프로그램 상에 크게 영향이 가는 부분이 아니기 때문에 File에만 남기고 문제가 생길시에 찾는 방법으로 만드는 경우가 많습니다.

실제 업무에서는 위와 같은 형태로 로그 매니져를 구현하는 경우가 많습니다.


여기까지 로그 관리에서 체인 책임 패턴을 사용하는 방법에 대한 설명이었습니다.


궁금한 점이나 잘못된 점이 있으면 댓글 부탁드립니다.