반응형
🔍 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"
반응형
'C#' 카테고리의 다른 글
C# 문자열 "20250422"을 DateTime으로 변환하고, 다시 문자열로 바꾸는 방법 (0) | 2025.04.22 |
---|---|
DataGridView Cell색깔 변경 - C# (0) | 2021.10.27 |
[C# 문제] 더하기 사이클 (While문을 사용한 문제) (0) | 2021.10.19 |
[C# 문제] 소수 구하기 (0) | 2021.10.08 |
[C# 문제] 윤년구하기 (0) | 2021.10.06 |
댓글