개발하다 보면 주문번호, 영수증번호, 송장번호 같은 ID를 생성할 때 항상 같은 자릿수로 맞춰야 한다. 예를 들어 1번 주문을 "000001"로 표시하고, 10000번 주문을 "010000"으로 만들어야 하는데, 이걸 제대로 모르면 문자열 함수들을 잔뜩 조합해서 복잡하게 처리한다. 다만 대부분의 개발자들은 PHP가 이걸 위해 만든 str_pad() 함수의 정확한 동작 원리를 모른 채 인터넷에서 복사한 코드를 그냥 붙여 넣는다. 이번에는 str_pad()가 정확히 뭔지, 왜 필요한지, 어떻게 써야 하는지 완벽하게 정리해서 소개하겠다.

 

1단계: str_pad() 함수의 기본 개념 이해하기
str_pad()는 문자열의 길이를 지정된 크기만큼 늘리되, 부족한 부분을 특정 문자로 채워주는 함수다. 마치 양쪽 끝을 패딩하듯이 문자를 집어넣는 방식이라고 생각하면 된다.

 

기본 문법:

str_pad(string $string, int $length, string $pad_string = " ", int $pad_type = STR_PAD_RIGHT): string

파라미터 설명:

  • $string: 원본 문자열
  • $length: 최종 문자열이 되어야 할 길이(자릿수)
  • $pad_string: 채울 문자 또는 문자열 (기본값: 공백)
  • $pad_type: 패딩 방식 (STR_PAD_RIGHT=오른쪽, STR_PAD_LEFT=왼쪽, STR_PAD_BOTH=양쪽)

실제로는 숫자 앞에 0을 붙이는 경우가 대부분이므로, STR_PAD_LEFT와 '0'이 가장 자주 쓰인다.

 

2단계: 실전 코드 - 세 가지 패딩 방식

 

✓ 왼쪽에 0 붙이기 (가장 많이 쓰는 패턴)
<?php
$order_id = 42;
$formatted = str_pad($order_id, 6, '0', STR_PAD_LEFT);
echo $formatted; // 출력: "000042"

$order_id = 100000;
$formatted = str_pad($order_id, 6, '0', STR_PAD_LEFT);
echo $formatted; // 출력: "100000" (이미 6자리 이상이면 그대로)
?>

동작 원리: 원본 문자열이 지정된 길이보다 짧으면, 왼쪽(앞)에 '0'을 붙여서 총 6자리로 만든다. 이미 6자리 이상이면 아무것도 추가하지 않는다.

 

✓ 오른쪽에 0 붙이기
<?php
$phone = "01012345";
$formatted = str_pad($phone, 11, '0', STR_PAD_RIGHT);
echo $formatted; // 출력: "01012345000"
?>

동작 원리: 오른쪽(뒤)에 문자를 추가한다. 전화번호를 정렬할 때 가끔 쓰인다.

 

✓ 양쪽에 문자 붙이기
<?php
$text = "INFO";
$formatted = str_pad($text, 10, '*', STR_PAD_BOTH);
echo $formatted; // 출력: "***INFO***" (양쪽에 각각 3개씩)
?>

동작 원리: 길이가 짝수가 될 때까지 양쪽에 균등하게 문자를 추가한다. 디버깅 메시지 강조할 때 유용하다.

 

3단계: 실무 예제 - 주문번호/영수증번호 생성

 

주문 시스템에서 자동 번호 부여
<?php
// 데이터베이스에서 AUTO_INCREMENT로 생성된 ID
$order_id = 5; // 5번째 주문
$date = date('Ymd'); // 20250115
$formatted_id = str_pad($order_id, 6, '0', STR_PAD_LEFT);
$order_number = $date . '-' . $formatted_id;

echo $order_number; // 출력: "20250115-000005"
?>

 

영수증 번호 생성 (다중 채우기 문자)
<?php
// 2자리 문자를 채울 때 (예: "--" 반복)
$receipt_id = 3;
$receipt_number = str_pad($receipt_id, 6, '-', STR_PAD_LEFT);
echo $receipt_number; // 출력: "-----3"

// 하지만 단일 문자만 권장됨
// 여러 문자를 넣으면 예상 결과와 다를 수 있음
$receipt_id = 3;
$receipt_number = str_pad($receipt_id, 6, '0', STR_PAD_LEFT);
echo $receipt_number; // 출력: "000003" (권장)
?>

 

배열로 여러 ID 한 번에 포매팅
<?php
$order_ids = [1, 15, 100, 5432];
$formatted_ids = array_map(function($id) {
    return str_pad($id, 6, '0', STR_PAD_LEFT);
}, $order_ids);

print_r($formatted_ids);
// 출력:
// Array
// (
//     [0] => 000001
//     [1] => 000015
//     [2] => 000100
//     [3] => 005432
// )
?>

 

4단계: 주의사항과 흔한 실수

 

✗ 잘못된 방법: sprintf() 대신 문자열 연결
<?php
// 이렇게 하면 안 됨 - 복잡하고 유지보수 어려움
$order_id = 42;
$formatted = '';
for ($i = 0; $i < 6 - strlen($order_id); $i++) {
    $formatted .= '0';
}
$formatted .= $order_id;
echo $formatted; // 출력: "000042" (작동하지만 비효율적)
?>

문제점: 루프를 돌려서 문자를 하나씩 붙이는 방식은 느리고, 코드 가독성도 떨어진다.

 

✓ 올바른 방법 1: str_pad()
<?php
$order_id = 42;
$formatted = str_pad($order_id, 6, '0', STR_PAD_LEFT);
echo $formatted; // 출력: "000042"
?>

장점: 한 줄에 간결하게 처리되고, PHP가 최적화한 C 함수로 실행되어 빠르다.

 

✓ 올바른 방법 2: sprintf()
<?php
$order_id = 42;
$formatted = sprintf('%06d', $order_id); // 6자리 정수, 앞에 0으로 채우기
echo $formatted; // 출력: "000042"
?>

장점: 숫자 형식 지정에는 sprintf()도 좋다. '%06d'는 "6자리 정수, 부족분은 0으로"라는 뜻이다.

 

주의: 자릿수보다 큰 수가 들어올 때
<?php
$order_id = 1234567; // 이미 7자리
$formatted = str_pad($order_id, 6, '0', STR_PAD_LEFT);
echo $formatted; // 출력: "1234567" (자리가 넘으면 원본 유지)

// 강제로 자릿수를 맞추고 싶다면 substr() 병합
$formatted = substr(str_pad($order_id, 6, '0', STR_PAD_LEFT), -6);
echo $formatted; // 출력: "234567" (오른쪽에서 6자리만 추출)
?>

중요: str_pad()는 문자열을 늘리기만 하고 자르지는 않는다. 자릿수를 초과하면 원본이 그대로 반환된다.

 

5단계: 실무 팁 - 함수로 만들어 재사용하기
<?php
// 재사용 가능한 서포트 함수
function format_order_number($order_id, $length = 6) {
    return str_pad($order_id, $length, '0', STR_PAD_LEFT);
}

function format_receipt_number($receipt_id, $date = null) {
    $date = $date ?? date('Ymd');
    $formatted_id = str_pad($receipt_id, 6, '0', STR_PAD_LEFT);
    return $date . '-' . $formatted_id;
}

// 사용
echo format_order_number(42); // 출력: "000042"
echo format_receipt_number(15); // 출력: "20250115-000015"
echo format_receipt_number(15, '20240101'); // 출력: "20240101-000015"
?>

 

정리: str_pad()는 숫자 포매팅의 필수 도구

str_pad()는 주문번호, 영수증번호, 송장번호 같은 ID를 일관된 형식으로 만드는 데 매우 유용하다. 한 줄의 간단한 함수 호출로 복잡한 문자열 조작 코드를 제거할 수 있다는 점을 잊지 말자. 이 글의 실무 예제 섹션을 참고해서 자신의 프로젝트에 str_pad()를 직접 적용하면, 데이터 포매팅 코드의 가독성과 유지보수성을 크게 향상시킬 수 있을 것이다.