84호. 유지보수 하기 좋은 라라벨 설정 파일 관리 방법 free

2019-10-31

지난번 글에 이어 이번 글도 설정 관련 글입니다.


라라벨 시프트를 만드는 제이슨 맥크레리가 최근에 Maintaining Laravel config files라는 글을 올렸습니다.


주장하는 바를 요약하면 다음과 같습니다.



  1. 주어진 설정 파일은 수정하지 말고 그대로 쓰자

  2. 추가할 항목이 있으면 별도의 파일을 만들어서 사용하자


읽고보니 납득이 되서 앞으로 저도 이 지침을 따라볼까 합니다.


설정 파일을 수정하지 말자


라라벨 시프트는 라라벨 버전 업데이트를 대신 해주는 서비스입니다. 업데이트 과정에서 충돌이 나는 경우(사용자가 수정한 부분이 라라벨에서도 수정되는 경우) 직접 코드를 병합하지 않고 사용자에게 알려주는 방식을 씁니다. 라라벨 코어는 사용자가 손댈일이 없으니 충돌날 일이 거의 없는데, 유독 설정 파일에서 충돌이 자주 발생했나 봅니다. 그래서 이 주제를 고민한 것으로 보이는대요. 설정 파일에 대해서는 라라벨의 기본 설정으로 덮어쓰게 하기로 결정했다고 합니다.


라라벨 6이 나온지 채 몇달이 안됐는데 벌써 설정 파일이 10회 이상 변하는 등 생각보다 더 자주 바뀌는데, 사용자들이 이를 꼼꼼히 반영하지 않는다고 합니다. 그래서 차라리 최신의 설정 파일을 제공하고 사용자들 자신이 수정한 부분들을 직접 적용하도록 하기로 했다는 것이죠.


설정 파일이 반환하는 배열의 구조가 달라지면 버그가 발생할 가능성이 높으니 최신 구조를 기본으로 삼는게 맞는 것 같습니다. 수동으로 업데이트 작업을 할 때도 변경된 부분만 고치는 것 보다는 새 설정 파일의 내용 전체를 복사해서 기존의 것을 대체한 후 내가 변경한 설정대로 다시 맞추는게 더 안전했던 것 같아요.


추가할 항목은 별도의 파일로


그런데 설정 파일을 수정하지 않으면 추가할 내용은 어디에 작성해야 할까요? 일반적으로 깃헙 등 외부 서비스와 연동에 필요한 정보는 config/services.php에 추가하곤 합니다. 하지만 기본 설정 파일을 수정하면 파일이 바뀔때마다 신경써줘야하니 애플리케이션에 필요한 설정은 별도의 파일로 관리하자는게 맥크레리의 제안입니다.


아래는 라라벨 시프트에서 사용하고 있는 config/shift.php 파일이라고 합니다.


return [

'executable' => env('SHIFT_SCRIPT_PATH', '/opt/shift/main.php'),

'webhook_executable' => env('WEBHOOK_SCRIPT_PATH', '/opt/shift/webhook.php'),

'support_email_address' => env('SHIFT_SUPPORT_EMAIL_ADDRESS'),

'latest_sku' => env('SHIFT_LATEST_SKU'),

'services' => [

'github' => [
'shift_username' => env('GITHUB_USERNAME'),
'client_id' => env('GITHUB_CLIENT_ID'),
'client_secret' => env('GITHUB_CLIENT_SECRET'),
'redirect' => env('GITHUB_CALLBACK_URL'),
],

'gitlab' => [
'shift_user_id' => env('GITLAB_USER_ID'),
'client_id' => env('GITLAB_APP_ID'),
'client_secret' => env('GITLAB_SECRET'),
'redirect' => env('GITLAB_CALLBACK_URL'),
],

'bitbucket' => [
'shift_username' => env('BITBUCKET_USERNAME'),
'client_id' => env('BITBUCKET_KEY'),
'client_secret' => env('BITBUCKET_SECRET'),
'redirect' => env('BITBUCKET_CALLBACK_URL'),
],

]
];

이런식으로 빼면 라라벨 업데이트로부터 자유로워집니다. 이 파일의 설정 값도 다른 설정 파일들과 마찬가지로 config('shift.services.github.client_id') 같은 식으로 접근해서 사용할 수 있습니다.


한계


databaselogging 드라이버 처럼 프레임워크와 맞물려 돌아가는 설정은 위의 기법을 적용할 수 없습니다. 오늘 소개한 기법으로 라라벨 설정 파일 업데이트로 부터 완전히 자유로워진다기보다는 관리 노력을 최소화할 수 있다 정도로 받아들이면 될 것 같습니다.


1일 1식 라라벨 84호

2019년 10월 31일


이현석

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