PHP 예제로 살펴보는 즉시실행함수의 필요성과 구현방법


웹 애플리케이션 개발 시 전역변수의 남용은 변수명 충돌(Name Collision)을 유발하고 오동작의 원인이 됩니다. 이번 글에서는 전역변수의 위험성을 살펴보고, 이를 방지하기 위한 즉시실행함수(IIFE, Immediately-Invoked Function Expression)의 개념과 PHP에서의 실제 구현 방법을 상세히 정리합니다.

📌 목차

  • 1. 전역변수의 사용과 변수명 충돌 위험성
  • 2. 실무 예제: 문제발생 원인 분석
  • 3. 변수명 충돌을 방지하는 즉시실행함수(IIFE) 패턴
  • 4. 요약 및 정리

1. 전역변수의 사용과 변수명 충돌 위험성

PHP와 자바스크립트는 전역 영역(Global Scope)에 로직을 직관적으로 작성할 수 있어 입문이 비교적 쉬운 언어입니다. 그러나 애플리케이션의 규모가 커지고 소스코드가 길어지면 전역 영역에서 선언된 변수들이 예기치 못한 곳에서 덮어씌워지는 변수명 충돌(Name Collision) 현상이 빈번하게 발생할 수 있습니다.

전역변수가 다른 로직이나 반복문에 의해 변조되면 프로그램이 의도하지 않은 결과값을 출력하거나 디버깅이 매우 까다로워집니다. 따라서 변수의 영향 범위를 제한하는 스코프(Scope) 관리가 필수적입니다.

2. 실무 예제: 문제발생 원인 분석

아래 예제는 부서명($name)과 부서원 목록($workers)을 바탕으로 입사연도별 부서원을 정리한 후 표(Table) 형태로 출력하는 PHP 소스코드입니다.

문제 발생 코드

<?php
// 부서명
$name = 'R&D 본부';

// 부서원 (사번과 이름)
$workers = array(
    '201100027' => '성동일 차장',
    '201500165' => '박보검 대리',
    '201500202' => '이혜리 주임'
);

// 입사연도별 부서원 정리 (문제 발생 구간)
$data = array();
foreach($workers as $no => $name)
{
    $data[substr($no, 0, 4)][] = $name;
}

// 테이블 출력
echo '<table>';
echo '<thead><th>입사년도</th><th>부서원</th></thead>';
echo '<tbody>';
foreach($data as $year => $names)
{
    echo '<tr>';
    echo '<th>' . $year . '년</th>';
    echo '<td>' . implode(', ', $names) . '</td>';
    echo '</tr>';
}
echo '</tbody>';
echo '<tfoot>';
echo '<th>' . $name . ' 총원</th><td>' . count($workers) . '명</td>';
echo '</tfoot>';
echo '</table>';
?>

원인 분석

위 코드를 실행해 보면 하단 푸터 영역에 원래 의도했던 "R&D 본부 총원" 대신 "이혜리 주임 총원"이 출력됩니다. 그 원인은 foreach($workers as $no => $name) 반복문에서 기존 전역변수인 $name을 임시 반복 변수로 덮어썼기 때문입니다.

수천 줄에 달하는 대규모 프로젝트에서 이러한 변수 오염이 발생하면 원인을 찾기 위해 전체 코드베이스를 뒤져야 하는 심각한 유지보수 난관에 봉착하게 됩니다.

3. 변수명 충돌을 방지하는 즉시실행함수(IIFE) 패턴

PHP 7.0 이상부터는 익명함수 정의와 동시에 즉시 호출하는 **IIFE(Immediately-Invoked Function Expression)** 패턴을 공식적으로 활용할 수 있습니다. 익명함수 내부에서 선언 및 사용되는 변수는 모두 해당 함수 내의 **지역변수(Local Variable)**로 격리되므로 전역 스코프를 오염시키지 않습니다.

IIFE 패턴 적용 개선 코드

<?php
// 부서명
$name = 'R&D 본부';

// 부서원 (사번과 이름)
$workers = array(
    201100027 => '성동일 차장',
    201500165 => '박보검 대리',
    201500202 => '이혜리 주임'
);

// 입사연도별 부서원 정리 (★즉시실행함수 IIFE 패턴 적용)
$data = (function($arr) {
    $res = array();
    foreach($arr as $no => $name)
    {
        $res[substr($no, 0, 4)][] = $name;
    }

    return $res;
})($workers);

// 테이블 출력
echo '<table>';
echo '<thead><th>입사년도</th><th>부서원</th></thead>';
echo '<tbody>';
foreach($data as $year => $names)
{
    echo '<tr>';
    echo '<th>' . $year . '년</th>';
    echo '<td>' . implode(', ', $names) . '</td>';
    echo '</tr>';
}
echo '</tbody>';
echo '<tfoot>';
echo '<th>' . $name . ' 총원</th><td>' . count($workers) . '명</td>';
echo '</tfoot>';
echo '</table>';
?>

작동 원리 및 개선점

개선된 코드에서는 익명함수를 (function($arr) { ... }) 구문으로 감싸고 외부에서 인자로 $workers를 전달하여 즉시 실행하였습니다.

반복문 내부에서 사용된 $no와 $name 변수는 익명함수 스코프 내의 지역변수로 처리되므로, 함수 실행이 완료되는 즉시 소멸하며 전역변수 $name을 손상시키지 않습니다.

4. 요약 및 정리

즉시실행함수(IIFE) 패턴을 사용하면 변수의 유효 범위를 엄격하게 제한하여 변수명 충돌 문제와 사이드 이펙트를 예방할 수 있습니다. PHP 7 이상 환경에서 모듈화된 독립적 로직을 처리할 때 IIFE 패턴을 적극 활용하는 것을 권장합니다.