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.8 | Domain-Driven Design(DDD) 도입과 구조 설계 |
728x90
'C#' 카테고리의 다른 글
C# 기초부터 고급까지 Chapter 3.9. CQRS + MediatR 패턴 실전 예제 (0) | 2025.05.13 |
---|---|
C# 기초부터 고급까지 Chapter 3.8. Domain-Driven Design(DDD) 도입과 구조 설계 (1) | 2025.05.12 |
C# 기초부터 고급까지 Chapter 3.6. .NET 메모리 관리 이해 – GC 동작 원리 (2) | 2025.05.10 |
C# 기초부터 고급까지 Chapter 3.5. 코드 분석 및 성능 측정 도구 사용 (BenchmarkDotNet 등) (2) | 2025.05.07 |
C# 기초부터 고급까지 Chapter 3.4. 고급 LINQ 커스터마이징 & 쿼리 최적화 (2) | 2025.05.06 |