C#

C# 기초부터 고급까지 Chapter 3.7. 커스텀 Attributes, AOP 기법 적용

Juan_ 2025. 5. 11. 16:29
728x90

📘 Chapter 3.7: 커스텀 Attributes, AOP 기법 적용


✅ 이 챕터에서 배울 것

  • Attribute가 뭔가?
  • 커스텀 Attribute 만들기
  • 리플렉션으로 Attribute 읽기
  • AOP 개념 및 대표 예제
  • 실무 적용 사례: 로깅, 검증, 권한 체크
  • PostSharp, Castle DynamicProxy, Source Generator 간단 소개

1️⃣ Attribute란?

"코드에 부착할 수 있는 주석 + 실행 메타 정보"

C#에선 [AttributeName] 형태로 클래스, 메서드, 속성 등에 붙일 수 있다.

✅ 예시

[Obsolete("이 메서드는 쓰지 마세요!")]
public void OldMethod() { }

✅ 컴파일러가 "이거 쓰지 마라~" 라고 경고 줌

💡 어디에 쓰이냐고?

용도사례
직렬화 제어[JsonIgnore], [XmlElement]
모델 검증[Required], [Range(0,100)]
로깅실행 전/후 자동 출력
권한 체크[Authorize(Roles="Admin")]

2️⃣ 커스텀 Attribute 만들기

[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class)]
public class LogAttribute : Attribute
{
    public string Message { get; }

    public LogAttribute(string message)
    {
        Message = message;
    }
}

✅ 사용 예

[Log("실행됨")]
public void MyMethod()
{
    Console.WriteLine("업무 코드 실행");
}

이제 메서드 위에 "로그 남겨라"는 메타 정보가 붙은 거다!


3️⃣ 리플렉션으로 Attribute 읽기

var method = typeof(MyClass).GetMethod("MyMethod");
var attr = method.GetCustomAttribute<LogAttribute>();

if (attr != null)
    Console.WriteLine($"📝 로그: {attr.Message}");

✅ 결과:

📝 로그: 실행됨

➡️ 실무에서는 DI 프레임워크 + 인터셉터 or 미들웨어에서 이걸 자동 호출해준다!


4️⃣ AOP (Aspect-Oriented Programming)

"핵심 코드와 공통 관심사(로깅, 트랜잭션 등) 분리"

✅ Before/After 스타일 예제

public class UserService
{
    [Log("사용자 추가 시작")]
    public void AddUser(string name)
    {
        Console.WriteLine($"👤 사용자 {name} 추가 완료");
    }
}

🔧 AOP 적용 흐름 (의사코드)

[Log] → AddUser()

실행 전: 로그 출력
→ AddUser() 실행
→ 실행 후: 결과 로깅

5️⃣ 실무 예시

🔒 권한 체크

[Authorize("Admin")]
public void DeleteUser(int id) { ... }

👉 미들웨어나 인터셉터가 이 Attribute를 감지해서 권한이 없으면 실행 막음

📝 로깅 자동화

[Log("Start method")]
public void ProcessOrder() { ... }

👉 AOP 엔진이 이걸 감지해서 호출 전/후에 로그 자동 출력


6️⃣ 주요 AOP 도구 소개

도구특징
PostSharp컴파일 타임 AOP, 강력하지만 상용
Castle DynamicProxy런타임 프록시 생성, DI와 잘 결합
Source Generator컴파일 타임에 자동 코드 생성 (최신 기술)

✅ Source Generator 간단 소개

ILogger<T> 같은 거 자동 생성할 때도 쓰임
→ Attribute 붙이면 컴파일 타임에 관련 클래스/코드 생성
[GenerateLogger]
public class OrderService { }

➡️ OrderServiceLogger 자동 생성됨


✅ 정리 요약

항목설명
Attribute코드에 메타 정보 부여
Custom Attribute직접 만든 주석으로 기능 확장 가능
AOP공통 관심사(로깅, 트랜잭션)를 코드 외부로 분리
리플렉션Attribute 기반 제어 시 핵심 도구
실무 활용권한 체크, 로깅, 성능 측정 등

📢 다음 챕터 예고 🎓

다음 챕터주제
Chapter 3.8Domain-Driven Design(DDD) 도입과 구조 설계
728x90