최근 개발 중인 프로그램의 소스 코드에는 파일 및 디렉토리 등의 제어를 위한 file.php 헬퍼(helper)가 있다. 헬퍼는 프로그래머가 자주 사용되는 함수를 미리 코딩해 놓은 것으로, 예전부터 자주 사용하던 개발 방식임에도 불구하고 보편화된 호칭이 없다가 코드이그나이터(CodeIgnitor)와 같은 프레임워크에서 헬퍼라고 지칭하면서 보편적 용어로 자리잡게 되었다.
그러므로 프로그램을 만든 경력이 오래된 개발자는 자신이 가지고 있는 헬퍼의 수가 적지 않다. 그 모든 소스가 자신이 개발한 것이 아니더라도 말이다. 최근들어 프레임워크가 보편화되고 사용하는 사람이 늘고 있음에도 불구하고 대부분의 PHP 개발자는 자신만의 헬퍼를 한 두개 이상은 가지고 있다. 왜냐하면 그것이 바로 자신의 도구이며, 도구 없이 집을 지을 수 없기 때문이다. 더욱이 도구의 종류가 많고 도구에 익숙하다면 집을 지을 때 여러가지 방안도 마련해 볼 수 있고, 경우에 따라서는 매우 쉽게 일을 마무리 할 수 있기 때문이다.
그 이외에도 프로그래머가 가지고 있는 헬퍼의 함수 중에는 언어에서 제공하는 기본 함수의 오동작으로 어쩔 수 없이 만들어서 사용하는 함수도 존재한다. 필자도 이와 비슷한 문제로 mkdirs 함수를 만들어 사용하고 있고 PHP에서 기본으로 제공하는 mkdir 함수를 대체하여 사용하고 있다.
PHP에서 제공되는 mkdir 함수는 로칼 시스템에 디렉토리를 생성하는 함수로 리눅스 시스템에서 제공되는 mkdir 명령과 매우 흡사하다. 심지어 명령어 옵션도 매우 비슷한데, 만들고자 하는 디렉토리의 퍼미션 설정과 부모 디렉토리가 존재하지 않는 경우에 대한 생성 여부 옵션이 그것으로 아래의 예제는 리눅스 시스템에서 사용되는 mkdir 명령과 PHP 소스 코드에서 사용되는 mkdir 함수의 대표적인 경우이다.
$ mkdir -m0777 -p /iam/smile
<?
mkdir ( 'iam/smile' , 0777 , TRUE ) ;
?>
위 두 예제는 iam 디렉토리 밑에 smile 디렉토리를 생성하는 것으로, iam 디렉토리가 존재하지 않는다면 생성한 후에 smile 디렉토리를 생성하라는 뜻을 가진 리눅스 명령어와 PHP 함수를 이용한 프로그램 코드다.
그러나 아쉽게도 두 명령의 실행 결과는 동일하지 않으며, 보편적 예상과도 일치하지 않는다. 아래는 리눅스 시스템(Linuxmint)에서 직접 명령을 실행한 결과다.
`mkdir -m0777 -p ./iam/smile` 명령을 실행한 결과 iam 디렉토리와 smile 디렉토리가 생성되었지만, iam 디렉토리의 퍼미션은 777이 아닌 755다. 혹시라도 디렉토리가 존재하고 있으면 퍼미션이 변경되는지 확인하고자 `mkdir -m0777 -p ./iam/serv` 명령을 추가로 실행해 보았으나 iam 디렉토리의 퍼미션은 여전히 0755이다.
그렇다면 PHP의 mkdir 함수는 어떠한 결과를 보여줄까?
아래는 동일한 리눅스 시스템에서 간단하게 작성된 PHP 프로그램을 실행한 결과다.
PHP 프로그램을 실행하여 생성된 iam , smile 디렉토리의 퍼미션은 모두 0755다. 어째서 이런 결과가 나타나는 것일까?
이와 같이 mkdir 명령어 및 함수의 실행 결과로 생성되는 각각의 디렉토리 퍼미션이 다른 이유는 명령이 실행되는 계정에 umask가 설정되어 있고, 실행 환경에 따라 umask 설정 값이 달라지기 때문이다.
리눅스 시스템에서 보편적인 사용자 계정의 umask 설정 기본 값은 0022이며, 필자가 테스트를 진행했던 계정의 umask 값도 0022이다. 그러므로 ./iam/smile 디렉토리 생성 명령이 실행 될 때 존재하지 않았던 iam 디렉토리가 생성되면서 umask 값이 적용되어 퍼미션이 0755가 되는 것이다. 아래는 umask 값을 0000으로 변경하고 mkdir 명령을 실행한 결과다.
umask 설정 값을 변경하고 mkdir 명령으로 생성된 iam2, smile2 디렉토리 모두 퍼미션이 0777이다. 이제서야 보편적인 예상에 부합되는 결과를 얻을 수 있다.
아래는 리눅스 시스템과 마찬가지로 PHP에서 umask 설정 값을 변경하고 실행한 결과다.
이와 같이 mkdir 함수는 리눅스 시스템에 매우 의존적인 함수이며 umask 함수까지 함께 사용해야 하는 문제점이 다소 존재한다. 심지어 mkdir 함수를 위의 예제처럼 부모 디렉토리 생성 옵션을 추가한 상태로 윈도우즈 시스템에서 실행하면 경고(Warning)에러가 발생된다.
아래는 그러한 경험을 직접 했던 어느 외국 개발자가 알려주는 팁에 대한 글이다.
.
그러므로 프로그래머는 프로그램이 동작 되는 시스템에 따라 디렉토리를 생성하는 방법을 달리해야 한다. 그러나 이미 잘 알려진 바대로 대부분의 프로그래머는 프로그램 코드를 줄이는 것에 대해 욕심을 가지고 있으며 복잡함 보다는 간략하고 직관적인 것을 좋아한다. 그래서 시스템에 따라 달리 처리해야 하는 mkdir 함수를 대신하여 자체적으로 제작한 함수를 사용하는 개발자가 다 수 존재하며 필자 또한 그중에 한 명이다.
사실, 최선의 방법은 mkdir 함수 자체가 수정되어 시스템에 따라 구분 없이 정상적으로 동작 되는 것이 가장 효율적이나, 아쉽게도 PHP언어에 내장된 함수의 수정은 그렇게 손쉽지 않고 그렇다고 느긋하게 수정되기를 기다릴 수 없으므로 자체적으로 제작한 함수, 즉 헬퍼를 사용하게 되는 결과가 나타난다.