Language/C#(10)
-
MemoryCache
개요 프로젝트의 성능을 향상 시키기 위해서 캐싱을 많이 사용합니다. 캐싱으로 유명한 Redis를 사용 할 수도 있지만, 작은 프로젝트에서는 Redis를 따로 사용하지 못하는 경우도 있습니다. 그래서 C#에서는 캐시를 구현 할 수 있는 MemoryCache 클래스를 제공합니다. 이 클래스는 객체의 삽입, 갱신, 삭제와 같은 작업을 메모리상에서 처리하기 때문에 데이터베이스에 부담을 줄이고 좀 더 개발하기 편하게 해줍니다. IMemoryCache IMemoryCache는 Microsoft.Extensions.Caching.Memory 패키지에서 사용 할 수 있습니다. 간단하게 Visual Studio를 사용해서 .NET 7 ASP.NET Core 웹 API 프로젝트를 생성해서 진행하도록 하겠습니다. 프로젝트를..
2023.06.19 -
Task vs. ValueTask
개요 C# 프로그래밍에 익숙해지다 보면 비동기 프로그래밍에 관심을 갖게 됩니다. 비동기 프로그래밍은 사용자 경험을 향상시키고, 자원을 최적화하며, 성능을 높여주기 때문에 무척 중요한 개념입니다. 이 글에서는 C#에서 사용되는 주요 비동기 작업 유형인 Task와 ValueTask에 대해 알아보겠습니다. 이 두 가지 유형의 차이점을 이해하면 비동기 작업을 더 효율적으로 설계하고 구현할 수 있습니다. 기본 개념 Task는 비동작 작업을 나타내는 참조 형식입니다. 비동기 작업을 표현하기 위해 Task를 사용하면 코드의 가독성과 유지 관리가 향상 됩니다. ValueTask는 비동기 작업을 나타내는 값 형식입니다. Task와 달리, 메모리 할당 및 GC에 더 효율적입니다. 여기서 중요한 것은 참조 형식이냐? 값 형..
2023.06.17 -
dotnet cli nuget 저장소 지정
개요 요즘 Visual Studio보다 Visual Studio Code를 더 많이 사용 중입니다. 오늘 nuget을 다운받으려고 하는데, 패키지를 자꾸 찾을 수 없어 해결 방법에 대해 글을 쓰려합니다. 문제점 BenchmarkDotNet이라는 Nuget 패키지를 설치하고 싶었습니다. 그래서 dotnet add package BenchmarkDotNet 명령을 입력 했는데 아래와 같이 에러가 발생하였습니다. > dotnet add package BenchmarkDotNet 복원할 프로젝트를 확인하는 중... info : X.509 certificate chain validation will use the default trust store selected by .NET. info : X.509 certi..
2023.06.16 -
.NET AOP DynamicProxy
최근 ASP.NET으로 백엔드를 개발 중입니다. Transaction 관리 부분을 어떻게 하면 좀 더 쉽게 만들 수 있을까 고민하던 중 DynamicProxy를 알게 되어 정리하려 합니다. 현재 상황 지금 만들고 있는 백엔드는 계층형 아키텍처를 사용 중이며, EF Core를 사용하면, 쉽게 트랜젝션이 관리 된다고 하던데 저희는 Oracle과 Dapper를 사용하기 때문에 트랜젝션을 Business 계층에서 관리하려 합니다. public class UserService : IUserService { private IUserRepo userRepo; private ICircleRepo circleRepo; public UserService(IUserRepo userRepo, ICircleRepo circle..
2023.06.05 -
StringBuilder vs String Join
회사에서 StringBuilder가 쓰여진 부분을 List로 모은 다음, 마지막 Join을 통해 성능 개선을 했다고 발표 한 자료가 있었습니다. 하지만 제가 알기로는 StringBuilder가 가장 빠르다고 알고 있는데, List와 Join을 통해 성능 개선을 했다고 해서 궁금해서 Benchmark를 돌려보기로 하였습니다. 집에서 사용하는 OS가 리눅스라 VS Code와 dotnet CLI를 통해 예제를 실행하도록 하겠습니다. Spec. CPU : Intel Core i5-4690 .NET Version : .NET 7.0.3 OS : Linuxmin 21 BenchmarkDotnet Version : v.0.13.5 프로젝트 준비 프로젝트 생성 먼저 아래와 같이 프로젝트를 생성합니다. $ mkdir S..
2023.06.04 -
상속에서 Dispose 패턴
소개 C#에서는 가비즈 컬렉터(GC)가 메모리를 자동으로 관리합니다. 필요없는 클래스의 인스턴스를 메모리에서 바로 지우는 것이나라, 조건을 만족할 때까지 기다렸다가 지우기 때문에 클래스를 지웠다고 해도 메모리가 바로 해제 되지 않는다. 일반적인 메모리라면 GC에 맡겨도 상관 없지만, 관리되지 않는(Unmanaged, Native)리소스는 즉각 해제해야 하는 경우가 생기는데, 그럴때 필요한 것이 Dispose다. IDisposable 인터페이스 C#에서는 개발자가 명시적으로 메모리를 해제하기 위해서는 IDisposable 인터페이스를 상속 받아 구현한다. IDisposable에서는 Dispose() 하나의 메서드만 제공한다. public interface IDisposable { void Dispose()..
2023.05.31