본문 바로가기
반응형

c#153

C# 업 캐스팅(Upcasting)에 대해서 알아보자 아래와 같은 코드를 본 적이 있는가?List list = new List { 1, 2, 3 };// IEnumerable에 바로 할당 가능IEnumerable enumerable = list;C#에서 List를 IEnumerable로 바로 받을 수 있다. 이를 업 캐스팅이라고 한다.이는 완전히 정상적이며 아주 흔하게 사용되는 패턴이다.위와 같은 코드가 가능한 이유는, List가 IEnumerable를 구현하고 있기 때문이다.업 캐스팅(Upcasting)이란?상속/구현 관계에서 자식을 부모로 형 변환하는 것명시적 형변환 없이 자연스럽게 가능 (암시적 형변환)void PrintNumbers(IEnumerable numbers){ foreach (var number in numbers) { .. 2025. 5. 19.
C# 얕은 복사, 깊은 복사에 대해서 알아보자 얕은 복사(Shallow Copy) 예시 코드Key와 Value가 그대로 복사됨Value가 만약 참조 타입이면, 복사본과 원본이 같은 인스턴스를 가리킴Dictionary Currencies = new(){ { "USD", new Currency("Dollar", 1.0m) }, { "EUR", new Currency("Euro", 0.9m) }};var shallowCopy = Currencies.ToDictionary(kvp => kvp.Key, kvp => kvp.Value);깊은 복사(Deep Copy) 예시 코드Dictionary Currencies = new(){ { "USD", new Currency("Dollar", 1.0m) }, { "EUR", new Currency.. 2025. 5. 19.
C# EF Core 사용시 DB 상태를 간단하게 체크하는 방법 Database.CanConnectAsync()DB 연결만 확인간단하게 구현이 가능EF Core 내부 방식 사용반환값 > true or false단순 연결 시도로 아주 빠른 성능실패 시 false 반환 (예외 없음)권한 확인 안 됨ExecuteSqlRawAsync("SELECT 1")DB 연결 + 쿼리 수행 가능 여부쿼리 작성 필요SQL 문법에 의존반환값 > 영향받은 행 수 (int 값)SQL 실행을 포함하기 때문에 약간 무거움예외 발생 가능 (try/catch 필요)권한 확인 가능 (SELECT, INSERT 권한 확인 가)CanConnectAsync()가 더 적합한 경우단순히 DB 연결이 가능한가? 만 확인하고 싶을 때앱 시작 시 헬스 체크 또는 초기 상태 점검용운영 중에 주기적 연결 테스트할 때 (.. 2025. 5. 19.
UseForwardedHeaders를 이용해서 클라이언트 실제 IP 얻기 C#에서 클라이언트 실제 IP 얻기UseForwardedHeaders() 메서드는 서버가 Resverse Proxy(역방향 프록시) 뒤에 위치할 때 클라이언트의 실제 IP 주소나 요청 프로토콜(HTTP, HTTPS) 정보를 올바르게 인식하기 위해 설정한다. 프록시(예: Nginx, Envoy, AWS ALB)를 사용할 경우,ASP.NET Core 앱은 기본적으로 프록시의 IP나 프로토콜만 인식실제 클라이언트의 IP 주소나 HTTPS 여부를 알고 싶을 땐 HTTP 헤더 (X-Forwarded-For, X-Forwarded-Proto)를 해석해야 한다.이걸 가능하게 해주는 것이 바로 app.UserForwardedHeaders(...)이다.예제 코드app.UseForwardedHeaders(new Forwa.. 2025. 5. 19.
C# Serilog에서 Sub-Logger를 이용해서 별도의 하위 로거 설정하기 Serilog 하위 로거(Sub-Logger) 생성하기Serilog의 고급 사용 패턴 중 하나로, 중첩된 로그 파이프라인을 정의하여 구현한다.Logger()는 Serilog에서 하위 로거를 구성할 수 있는 메서드로 Logger(lc => ...) 내부에는 또 다른 LoggerConfiguration이 들어가며, 그 안에서 독립적으로 WriteTo, Filter, Enrich 등을 설정할 수 있다.기본 예제Log.Logger = new LoggerConfiguration() .WriteTo.Console() .WriteTo.File("logs/log.txt") .WriteTo.Debug() .CreateLogger();하위 로거 생성 예제configuration.WriteTo.Asyn.. 2025. 5. 16.
비동기 메서드의 형식을 맞추기 위해서 필요한 Task.CompletedTask Task.CompletedTask란?Task.CompletedTask는 비동기 작업(Task)의 완료 상태를 나타낼 때 사용한다. 즉, Task.CompletedTask를 선언하면 이미 성공적으로 완료된 Task 인스턴스를 반환한다.Task task = Task.CompletedTask;위에 예제처럼 사용시 성공적으로 완료된 Task를 반환받는다. 즉, 아무 일도 하지 않고 즉시 완료된 Task를 얻는다.그렇다면 이런 기능은 어디에 사용해야 하는 걸까?비동기 메서드에서 특별히 수행할 작업이 없을 때해당 메서드는 아무 일도 하지 않지만 Task를 반환해야 하기 때문에 Task.CompletedTask를 사용했다.await도 없고 비동기 작업도 없기 때문에 본래라면 같이 써야 하는 async 키워드도 불필요.. 2025. 5. 15.