본문 바로가기
C#

🔍 C#에서 문자열 공백 제거(Trim)를 일괄 처리하는 가장 효율적인 방법은?

by 샤나엘 2025. 4. 24.
반응형

Whitespace

🔍 C#에서 문자열 공백 제거(Trim)를 일괄 처리하는 가장 효율적인 방법은?

대량의 고객 데이터를 처리할 때, 문자열 앞뒤에 불필요한 공백(Whitespace)이 포함되는 문제는 매우 흔합니다. 특히 C# 기반의 시스템에서는 모든 문자열 필드에 대해 Trim() 처리를 일관되게 적용하는 것이 중요합니다.

하지만 데이터 건수가 수천~수백만 건 이상일 경우, 잘못된 방식으로 처리하면 심각한 성능 저하를 초래할 수 있습니다. 이 글에서는 C#에서 문자열 공백을 효율적으로 제거하는 방법을 성능 관점에서 비교하고, 최적의 선택지를 제시합니다.


✅ 1. DTO의 Setter에서 Trim 처리 (간단하고 명시적인 방식)

public class CustomerDto
{
    private string _name;
    public string Name
    {
        get => _name;
        set => _name = value?.Trim();
    }
}
  • 장점: 명확하고 유지보수 쉬움
  • 단점: 필드가 많아질수록 반복적이고 수동 작업 필요

🚫 2. 리플렉션(Reflection)으로 모든 문자열 프로퍼티에 Trim 적용

public static void TrimAllStrings<T>(T obj)
{
    var props = typeof(T).GetProperties()
        .Where(p => p.PropertyType == typeof(string) && p.CanRead && p.CanWrite);
    
    foreach (var prop in props)
    {
        var value = (string)prop.GetValue(obj);
        if (value != null)
            prop.SetValue(obj, value.Trim());
    }
}
  • 장점: 한번의 공통 처리 가능
  • 단점: 리플렉션은 느리며, 대량 데이터 처리 시 성능 저하 발생

🚀 대용량 데이터에 적합한 Trim 최적화 방법

✅ AutoMapper를 활용한 AfterMap Trim 처리

AutoMapper를 사용하는 경우, 아래와 같이 모든 문자열 필드에 대해 매핑 후 Trim 처리를 자동화할 수 있습니다.

CreateMap<SourceDto, TargetDto>()
    .AfterMap((src, dest) =>
    {
        foreach (var prop in dest.GetType().GetProperties()
            .Where(p => p.PropertyType == typeof(string)))
        {
            var val = (string)prop.GetValue(dest);
            if (val != null)
                prop.SetValue(dest, val.Trim());
        }
    });
  • 장점: 성능이 뛰어나고, 재사용 및 유지보수에 용이
  • 적용 추천: 실시간 처리보다는 데이터 정제 파이프라인 또는 매핑 시점에서 활용

🛠 Source Generator 또는 T4 템플릿 자동화

컴파일 타임에 Trim() 처리를 자동 생성할 수 있는 방식으로, 런타임 성능을 완전히 유지하면서도 자동화된 코드를 생성할 수 있습니다.

  • 장점: 고성능 + 반복 최소화
  • 단점: 초기 세팅 복잡

⚠️ 주의: 리플렉션은 간편하지만 대량 처리에는 부적합

리플렉션은 코드 재사용성은 좋지만, 런타임 성능이 중요한 상황에서는 병목이 될 수 있습니다. 수만 건 이상의 데이터를 반복 처리하는 경우에는 성능 문제가 발생할 수 있으므로, AutoMapper + AfterMap 또는 코드 생성 기반 방식을 고려하는 것이 좋습니다.


✅ 결론: 대량 고객 데이터의 공백(Trim) 처리, 어떻게 해야 할까?

방법 권장 대상 성능 유지보수
Setter에서 Trim 소규모 DTO ★★★★☆ ★★★★★
리플렉션 방식 일회성 처리 ★★☆☆☆ ★★★☆☆
AutoMapper AfterMap 매핑 기반 처리 ★★★★☆ ★★★★☆
Source Generator 고성능 요구 환경 ★★★★★ ★★★☆☆

✨ 추천 조합

  • 실시간 처리 + 소규모 DTO → Setter 방식
  • 일괄 배치 정제 + 수천 건 이상 → AutoMapper + AfterMap
  • 대규모 시스템 / 고성능 필요 → Source Generator 기반 자동화

C#에서 고객 데이터를 다룰 때, 단순한 Trim 처리도 성능과 생산성을 고려해 최적의 방법을 선택하는 것이 중요합니다.

 


📌 Whitespace란?

Whitespace는 공백(space), 탭(tab), 줄바꿈(newline) 등 화면에 표시되지 않지만 코드나 문자열에서 중요한 역할을 하는 문자를 말합니다.


📘 주요 Whitespace 종류

종류 설명 ASCII
Space 일반적인 공백 문자 (' ') 32
Tab 탭 문자 (\t) 9
Newline 줄바꿈 (\n, \r\n) 10/13
Carriage Return 캐리지 리턴 (\r) 13

🧠 Whitespace의 중요성

  • 코드 가독성 향상 (들여쓰기, 정렬 등)
  • 문자열 비교나 입력 처리 시 주의 필요
  • 데이터 전처리에서 불필요한 공백 제거 필수 (예: Trim() 사용)

예시 (C# 코드)

string name = " Alice ";        // 앞뒤에 whitespace 존재
string trimmed = name.Trim();   // "Alice"
반응형

댓글