83호. 설정을 캐시했더니 잘 되던 라라벨 애플리케이션이 안 돌아간다! free

2019-10-30

어제 라라벨 오픈 채팅방에 env()가 모두 null을 반환한다며 도움을 요청한 글이 있었습니다.



결론은 config:cache 커맨드를 사용하면 설정 파일 이외의 모든 곳에서 호출한 env()가 null을 반환하도록 되어있는게 원인이었습니다.


.env 파일도 있고 config 파일도 있고, 설정과 관련해서 약간 햇갈려하시는 분들을 위해 간단히 정리해보갰습니다.


구동환경 설정과 애플리케이션 설정


라라벨은 /config 디렉터리에 애플리케이션 설정 파일을 모아서 관리합니다.


애플리케이션 설정값은 config() 글로벌 헬퍼로 접근할 수 있습니다. 파일명부터 시작해서 점(.) 문법을 이용해서 값에 접근합니다.


/config/cache.php 파일을 예로 살펴봅시다.


<?php

use Illuminate\Support\Str;

return [

'default' => env('CACHE_DRIVER', 'file'),

'stores' => [

'apc' => [
'driver' => 'apc',
],

config('cache.default')/config/cache.php 파일에서 반환하는 배열에서 키 값이 default에 해당하는 값을 반환합니다. 여기서는 env('CACHE_DRIVER', 'file')이 반환되겠네요. 점을 계속 이어서 더 깊은 단계의 값에 접근 가능합니다. config('cache.stores.apc.driver')apc를 반환합니다.


설정 값이 애플리케이션 구동 환경에 따라 달라져야 할 때가 많습니다. 특별한 상황이 아닌 한 개발할 때 실서버 데이터베이스를 사용하는 분은 없겠죠? 이렇듯 구동 환경에 따라 달라지는 설정 값은 .env 파일로 빼서 따로 관리합니다. .env 파일은 구동 환경에 따라 별개로 관리해야하므로 당연하게도 git 등으로 공유하지 않습니다. .env 파일에 저장된 값은 env() 글로벌 헬퍼로 접근합니다.


설정 캐시


php artisan config:cache로 설정을 캐시하면 애플리케이션 구동 속도를 높일 수 있습니다. 다음의 두 가지를 유의하셔야 합니다.



  • 설정 캐시는 배포 루틴에 포함시키고, 개발환경에서는 하지 말 것

  • env()는 설정 파일(/config/*.php) 내에서만 사용


캐시가 자동으로 수행되도록 루틴에 포함시키지 않으면 빼먹을 가능성이 있습니다. 개발 중에는 수시로 설정 값이 바뀔 수 있으니 개발 환경에서는 캐시를 하지 않습니다. 이건 개발환경에서 opcache를 끄는 것과 마찬가지라고 생각하면 됩니다. 설정이 캐시되고나면 설정 파일 이외의 곳에 쓰인 모든 env()는 null을 반환하기 때문에 설정 파일이 아닌 곳에서 env()를 썼다면 에러가 발생합니다. 만약 이미 설정 파일 외부에서 env()를 사용했다면 config()로 바꾸세요.


마치며


만약 라라벨로 처음 개발을 배웠고 아직 배포 경험이 없이 본인의 컴퓨터에서만 혼자 작업하고 있는 분이라면 구동환경이라는 것 자체에 대해 생각해 본 적이 없을 수도 있습니다. 아는 사람들에게는 너무 당연한 내용일 수 있지만 모르는 사람에겐 감이 잘 안오는 내용일 수도 있다고 생각합니다.


설정값을 캐시한 적이 한 번도 없는 분들은 애플리케이션이 잘 동작하니까 별 생각 없이 애플리케이션 코드 여기저기에 env()를 쓰시고는 잊어버리신 분들도 혹시 계실지 모르겠습니다. 이런 경우 캐시를 하는 순간 오동작하니 혹시 캐시를 하실 계획이시면 env()가 설정 파일이 아닌 곳에 쓰이진 않았는지 한 번 검토해보시는 것도 안전한 배포를 위해 필요한 절차가 아닌가 싶습니다.


1일 1식 라라벨 83호

2019년 10월 30일


이현석

메쉬 코리아 개발자. 바쁜 팀장님 대신 알려주는 신입 PHP 개발자 안내서를 쓰고, 클린 아키텍처 인 PHP를 번역했습니다. 2020년에 출간될 Laravel Up & Running 2nd Edition을 번역하고 있습니다.