들어가며
C# 개발을 하다 보면 문자열(String)의 유효성을 검사해야 하는 경우가 매우 많습니다. 특히 사용자 입력, API 응답, 데이터베이스 조회 결과 등을 처리할 때 문자열이 null인지, 빈 문자열인지, 아니면 공백만 있는지 확인해야 합니다.
"문자열 검증은 안정적인 프로그램의 기본이다"
적절한 문자열 검증 없이는 NullReferenceException이나 예상치 못한 동작이 발생할 수 있습니다.
현재 작성하신 코드를 보면 다음과 같이 null 체크와 길이 체크를 분리해서 하고 계십니다:
if (dto.ItemNo != null)
if (dto.ItemNo.Length > 0)
dataPack.AddProperty("@item_no", DbType.String, dto.ItemNo);
이 방식도 동작하지만, C#에서는 더 간결하고 안전한 방법들을 제공합니다.
문자열 상태의 종류
C#에서 문자열은 다음과 같은 상태를 가질 수 있습니다:
| 상태 | 예시 | 설명 |
| null | string str = null; | 참조가 없는 상태 |
| 빈 문자열 | string str = ""; | 길이가 0인 문자열 |
| 공백 문자열 | string str = " "; | 공백, 탭, 개행만 있는 문자열 |
| 정상 문자열 | string str = "ITEM001"; | 실제 내용이 있는 문자열 |
String.IsNullOrEmpty() 메서드
기본 개념
String.IsNullOrEmpty()는 문자열이 null이거나 빈 문자열("")인지 확인하는 메서드입니다.
// 기존 방식 (권장하지 않음)
if (dto.ItemNo != null)
if (dto.ItemNo.Length > 0)
dataPack.AddProperty("@item_no", DbType.String, dto.ItemNo);
// 개선된 방식 (권장)
if (!string.IsNullOrEmpty(dto.ItemNo))
{
dataPack.AddProperty("@item_no", DbType.String, dto.ItemNo);
}
내부 동작 원리
// IsNullOrEmpty의 내부 구현 (참고용)
public static bool IsNullOrEmpty(string value)
{
return value == null || value.Length == 0;
}
사용 예시
string itemNo = GetItemNo(); // 어딘가에서 받아온 아이템 번호
if (!string.IsNullOrEmpty(itemNo))
{
Console.WriteLine($"아이템 번호: {itemNo}");
}
else
{
Console.WriteLine("아이템 번호가 입력되지 않았습니다.");
}
String.IsNullOrWhiteSpace() 메서드
기본 개념
String.IsNullOrWhiteSpace()는 문자열이 null이거나 빈 문자열이거나 공백 문자만 포함하는지 확인하는 메서드입니다.
string itemInput = " "; // 공백만 있는 입력
// IsNullOrEmpty는 false를 반환 (공백 문자가 있으므로)
bool isEmpty = string.IsNullOrEmpty(itemInput); // false
// IsNullOrWhiteSpace는 true를 반환 (의미있는 내용이 없으므로)
bool isWhiteSpace = string.IsNullOrWhiteSpace(itemInput); // true
내부 동작 원리
// IsNullOrWhiteSpace의 내부 구현 (참고용)
public static bool IsNullOrWhiteSpace(string value)
{
if (value == null) return true;
for (int i = 0; i < value.Length; i++)
{
if (!char.IsWhiteSpace(value[i]))
return false;
}
return true;
}
실무에서의 선택 기준
IsNullOrEmpty 사용 시기
// 1. 정확히 빈 문자열만 걸러내고 싶을 때
string itemCode = GetItemCode();
if (!string.IsNullOrEmpty(itemCode))
{
// 아이템 코드는 공백도 유효할 수 있음 (예: "ITEM 001")
ProcessItemCode(itemCode);
}
// 2. 성능이 중요한 경우 (약간 더 빠름)
IsNullOrWhiteSpace 사용 시기 (더 일반적)
// 1. 사용자 입력 처리 (가장 일반적)
string itemDescription = GetItemDescription();
if (!string.IsNullOrWhiteSpace(itemDescription))
{
SaveDescription(itemDescription.Trim()); // Trim()과 함께 사용
}
// 2. 설정값 검증
string itemCategoryName = GetCategoryName();
if (string.IsNullOrWhiteSpace(itemCategoryName))
{
throw new InvalidOperationException("카테고리명이 설정되지 않았습니다.");
}
// 3. 대부분의 비즈니스 로직에서
개선된 코드 예시
Before (현재 방식)
if (dto.ItemNo != null)
if (dto.ItemNo.Length > 0)
dataPack.AddProperty("@item_no", DbType.String, dto.ItemNo);
After (권장 방식)
// 방법 1: IsNullOrWhiteSpace 사용 (가장 권장)
if (!string.IsNullOrWhiteSpace(dto.ItemNo))
{
dataPack.AddProperty("@item_no", DbType.String, dto.ItemNo.Trim());
}
// 방법 2: IsNullOrEmpty 사용 (공백이 유효한 경우)
if (!string.IsNullOrEmpty(dto.ItemNo))
{
dataPack.AddProperty("@item_no", DbType.String, dto.ItemNo);
}
자주 사용하는 패턴들
1. 조건부 할당 패턴
// 기본값 설정과 함께
string displayItemNo = string.IsNullOrWhiteSpace(dto.ItemNo)
? "미정"
: dto.ItemNo.Trim();
2. 여러 필드 검증 패턴
// 여러 필드를 한번에 검증
if (!string.IsNullOrWhiteSpace(dto.ItemNo) &&
!string.IsNullOrWhiteSpace(dto.ItemName))
{
// 둘 다 유효한 경우에만 처리
ProcessItemData(dto);
}
3. 예외 처리 패턴
// Guard Clause 패턴
if (string.IsNullOrWhiteSpace(dto.ItemNo))
{
throw new ArgumentException("ItemNo는 필수 입력값입니다.");
}
// 정상 로직 계속...
dataPack.AddProperty("@item_no", DbType.String, dto.ItemNo.Trim());
성능 비교
메서드 속도 메모리 사용 권장도
| manual null check | 가장 빠름 | 적음 | 낮음 (코드 복잡) |
| IsNullOrEmpty | 빠름 | 적음 | 보통 |
| IsNullOrWhiteSpace | 보통 | 보통 | 높음 (실무 적합) |
Visual Studio 단축키 & 팁
1. 코드 스니펫 활용
// "ife" 입력 후 Tab 두 번
if (!string.IsNullOrEmpty())
{
}
2. 리팩토링 단축키
- Ctrl + R, R: 변수명 일괄 변경
- Ctrl + .: Quick Actions (using 추가 등)
3. 디버깅 팁
- 중단점에서 dto.ItemNo?.Length 확인으로 null safe하게 길이 체크
Q: 왜 IsNullOrWhiteSpace를 더 권장하나요?
A: 실무에서는 사용자가 실수로 공백만 입력하는 경우가 많습니다.
이런 입력도 "의미 없는 데이터"로 처리하는 것이 일반적이기 때문입니다.
Q: 성능 차이가 크나요?
A: 일반적인 웹 애플리케이션에서는 무시할 수 있는 수준입니다. 가독성과 안정성이 더 중요합니다.
Q: Trim()을 언제 사용해야 하나요?
A: 데이터베이스에 저장하거나 비교 연산을 할 때는 앞뒤 공백을 제거하는 것이 좋습니다.
마무리
C#에서 문자열 검증은 다음 순서로 고려하세요:
- 대부분의 경우: string.IsNullOrWhiteSpace() 사용
- 공백이 의미있는 경우: string.IsNullOrEmpty() 사용
- 저장 전: .Trim() 메서드로 공백 제거
- 성능이 극도로 중요한 경우: 수동 null 체크 고려
요약 표
| IsNullOrEmpty | null 또는 ""를 체크 | 빈 문자열만 걸러낼 때 | 아이템 코드, ID 값 |
| IsNullOrWhiteSpace | null, "", 공백을 체크 | 사용자 입력 처리 시 | 아이템명, 설명, 검색어 |
| 수동 체크 | null과 Length를 따로 체크 | 레거시 코드나 특수한 경우 | 성능이 극도로 중요한 경우 |