로그 기록 시 함수명 자동 기록

로그 기록 시 함수명 자동 기록

[CallerMemberName] 특성(attribute)은 C#에서 메서드나 속성의 호출자 정보를 자동으로 매개변수로 전달받을 수 있게 해주는 특성 중 하나입니다. 이 특성을 사용하면 호출된 메서드의 이름을 호출 시점에 자동으로 가져올 수 있어, 메서드 호출 시 명시적으로 메서드 이름을 전달할 필요가 없습니다. 주로 로그 작성, 디버깅 또는 알림 시스템에서 호출자의 메서드 이름을 자동으로 기록할 때 유용하게 사용됩니다.

Caller Information 특성들

C#에는 CallerMemberName 외에도 비슷한 방식으로 호출 정보를 자동으로 전달받을 수 있는 몇 가지 특성이 있습니다:

  • [CallerMemberName]: 호출자의 메서드 이름을 전달받습니다.
  • [CallerFilePath]: 호출된 코드가 있는 소스 파일의 전체 경로를 전달받습니다.
  • [CallerLineNumber]: 호출된 코드가 있는 소스 파일의 줄 번호를 전달받습니다.

[CallerMemberName]의 동작 방식

[CallerMemberName]을 사용하는 메서드의 매개변수에 이 특성을 지정하면, C# 컴파일러는 호출한 메서드의 이름을 자동으로 해당 매개변수에 전달합니다. 이는 컴파일 타임에 결정되므로 성능에 미치는 영향이 거의 없습니다.

간단한 예시:

using System;
using System.Runtime.CompilerServices;
public class Logger
{
    public void Log(string message, [CallerMemberName] string callerName = "")
    {
        Console.WriteLine($"Caller: {callerName}, Message: {message}");
    }
}
public class Program
{
    public static void Main()
    {
        var logger = new Logger();
        logger.Log("This is a log message.");
    }
}

실행 결과:

Caller: Main, Message: This is a log message.

위 코드에서 Log 메서드를 호출할 때 callerName 매개변수에 별도의 값을 전달하지 않았지만, Main 메서드가 callerName에 자동으로 전달됩니다.

실제 응용 시나리오

  1. 로깅: 메서드가 호출될 때마다 호출자의 메서드 이름을 자동으로 기록할 수 있습니다. 디버깅 시 어떤 메서드가 로그를 남겼는지 추적할 수 있어 매우 유용합니다.
  2. 알림 및 이벤트 시스템: 호출한 메서드의 이름을 알림 메시지로 전달하거나 이벤트 처리 시 사용할 수 있습니다.
  3. 디버깅: 코드가 어느 위치에서 호출되었는지 추적할 때, [CallerMemberName]을 사용하면 소스 코드에 디버깅 정보를 남기지 않아도 됩니다.

주요 장점

  • 명시적 코드 없이 호출자 정보 획득: [CallerMemberName]을 사용하면, 호출 메서드의 이름을 전달할 필요 없이 자동으로 받을 수 있어 코드가 더 간결해집니다.
  • 성능 오버헤드 최소화: StackTraceReflection을 사용하는 방식과 달리, 컴파일 타임에 호출자 정보를 결정하므로 성능 부담이 거의 없습니다.
  • 유지보수성 향상: 메서드 이름이 바뀌더라도 호출 메서드가 자동으로 기록되기 때문에 수동으로 코드를 수정할 필요가 없습니다.

제약 사항

  • 생성자, 소멸자, 속성 접근자 등에는 사용 불가: 생성자나 소멸자의 이름은 자동으로 얻어올 수 없습니다.
  • 명시적 호출 불가: 매개변수로 호출자 정보를 명시적으로 전달하고 싶을 때는 해당 매개변수를 지정해야 합니다. [CallerMemberName] 특성은 호출할 때 자동으로 사용되는 용도로만 활용됩니다.

매개변수 위치

[CallerMemberName] 특성은 해당 매개변수가 **선택적 매개변수(optional parameter)**로 선언된 경우에만 사용할 수 있습니다. 기본값을 지정해야 하며, 그렇지 않으면 컴파일 오류가 발생합니다.

public void Log(string message, [CallerMemberName] string callerName = "")
{
    // 호출자의 메서드 이름이 callerName에 자동으로 전달됩니다.
}

사용 사례 예시

로깅 시스템:

public class MyLogger
{
    public void LogDebug(string message, [CallerMemberName] string caller = "")
    {
        Console.WriteLine($"DEBUG: {caller} - {message}");
    }
}
public class ExampleClass
{
    private MyLogger _logger = new MyLogger();
    
    public void DoSomething()
    {
        _logger.LogDebug("Something happened!");
    }
}

실행 결과:

DEBUG: DoSomething - Something happened!

DoSomething 메서드가 호출되었을 때 자동으로 메서드 이름을 로그에 남겨서 더 편리하게 추적할 수 있습니다.

결론

[CallerMemberName]은 메서드 호출자 이름을 자동으로 가져오고 싶을 때 사용하기에 매우 편리한 특성입니다. 성능 오버헤드가 없고 코드 가독성을 향상시킬 수 있어 주로 로깅, 디버깅 및 이벤트 시스템에서 자주 사용됩니다.