본문 바로가기
Skills/ASP.NET

.NET에서 사용되는 주요 풀링(Pooling) 기법 정리

by Homil-Rye 2025. 6. 22.
728x90
반응형

 

 

 

.NET 프레임워크에서는 성능과 리소스 효율성을 위해 다양한 풀링(Pooling) 기법이 사용된다. 풀링은 공통적으로 "객체를 필요할 때마다 새로 생성하지 않고, 재사용 가능한 객체를 미리 만들어두거나 다시 활용하는 방식"이다. 이 글에서는 ASP.NET을 포함해 .NET 환경에서 자주 사용되는 주요 풀링 기법을 정리한다.

 


 

1. HttpApplication Pooling

 

개념

 

ASP.NET은 웹 요청이 들어올 때마다 HttpApplication 인스턴스를 새로 생성하지 않고, 일정 수의 인스턴스를 미리 생성해 풀(pool)에 보관하고 요청 처리 시 재사용한다.

목적

  • 요청마다 객체를 생성하는 비용을 줄임
  • GC(가비지 컬렉션) 부담 완화
  • 스레드 연결 및 이벤트 핸들링 최적화

관련 클래스

  • HttpApplicationFactory
  • HttpApplication (요청 수명주기 이벤트 포함)

 

2. Thread Pooling

 

개념

 

.NET의 ThreadPool은 작업(예: 비동기 처리, 타이머, 병렬 처리 등)을 수행할 때 매번 스레드를 생성하지 않고, 미리 생성된 워커 스레드 풀에서 스레드를 할당하여 실행한다.

목적

  • 스레드 생성/종료 오버헤드를 줄임
  • 효율적인 CPU 사용
  • 대규모 요청 동시성 처리 가능

사용 방식

  • ThreadPool.QueueUserWorkItem(...)
  • Task.Run(...) 또는 async/await는 내부적으로 ThreadPool을 활용

관련 클래스

  • System.Threading.ThreadPool
  • System.Threading.Tasks.Task

 

3. Connection Pooling (DB 연결 풀)

 

개념

데이터베이스에 접속할 때마다 새 연결을 만드는 대신, 동일한 연결 문자열을 사용하는 연결을 풀에서 재사용한다.

목적

  • DB 연결 생성/해제 비용 감소
  • 트랜잭션 처리 성능 향상
  • 대량 접속 시 서버 부하 감소

사용 방식

  • 대부분의 ADO.NET Provider에서 자동 지원
  • 커넥션 문자열과 풀 설정
  • Server=myServer;Database=myDb;User Id=...;Password=...;Max Pool Size=100;

관련 클래스

  • System.Data.SqlClient.SqlConnection
  • System.Data.Common.DbConnection

 

4. Object Pooling (사용자 정의 객체 풀)

 

개념

 

개발자가 직접 생성 비용이 비싼 객체를 재사용하기 위해 풀을 구성하는 방식이다.

예: 문자열 버퍼, XML 파서, 커스텀 컨트롤러 등

목적

  • GC 부담 완화
  • 반복 사용되는 비싼 리소스의 재사용
  • 고성능 실시간 시스템에 유리

구현 방식

  • 직접 Queue<T>, Stack<T>, ConcurrentBag<T> 등을 이용해 객체를 관리
  • .NET Core 이후로는 Microsoft.Extensions.ObjectPool 패키지 지원

예시

var pool = new DefaultObjectPool<MyExpensiveObject>(new DefaultPooledObjectPolicy<MyExpensiveObject>());
var obj = pool.Get();
// 사용 후
pool.Return(obj);
 

5. Socket/Buffer Pooling (네트워크 기반)

 

개념

 

SocketAsyncEventArgs 등 네트워크 I/O 객체와 버퍼(byte[])를 풀로 관리하여 고성능 네트워크 서버를 구현한다.

목적

  • 비동기 I/O 성능 향상
  • GC 빈도 최소화
  • 네트워크 서버에서 병목 제거

관련 기술

  • SocketAsyncEventArgs
  • ArrayPool<T> (System.Buffers)

 

풀링이 필요한 이유

 

풀링은 단순히 "재사용" 그 이상의 가치를 제공한다. 고성능 시스템에서 다음과 같은 장점이 있다.

  • 리소스 생성 비용 절감: 스레드, DB 커넥션, 객체 등 생성 비용이 큰 자원을 절약
  • GC 부담 완화: 객체를 자주 생성하지 않아 메모리 파편화 방지
  • 성능 일관성 확보: 병목 구간 없이 안정적인 처리 가능
  • 확장성 확보: 동시 요청 수가 늘어나도 부드러운 확장 가능

 

마무리

풀링은 .NET 프레임워크의 보이지 않는 곳에서 핵심 역할을 수행한다.

 

특히 웹 애플리케이션이나 고성능 서버 개발 시에는 이러한 내부 동작을 이해하고 적절히 활용할 줄 아는 것이 중요하다.

 

실제 프로젝트에서 풀링 관련 성능 병목이 발생하거나 조정이 필요할 경우, 해당 풀의 설정값(Max Pool Size, Min Threads 등)을 직접 조정하거나, 사용자 정의 풀 구현을 고려해보는 것이 좋다.

728x90
반응형