복잡한 코드 없이 관리자가 수정 가능한 설정
앱은 끊임없는 문제에 직면합니다. 어떤 설정은 .env 파일에 있어야 하지만, 어떤 설정은 새로운 코드 배포 없이 관리자 패널을 통해 변경되어야 합니다. 사이트 이름, 시간대(timezone), 또는 회원가입 설정 등이 그 예입니다.
많은 개발자가 이러한 설정을 데이터베이스에 저장하지만, 이 과정에서 혼란이 발생합니다. 결국 데이터를 읽는 방식이 두 가지로 나뉘게 됩니다. 앱의 한 부분은 config()를 사용하고, 다른 부분은 데이터베이스 모델을 사용하는 식입니다. 이는 설정이 일관되지 않아 발생하는 버그로 이어집니다.
단일 읽기 경로를 사용하면 이를 방지할 수 있습니다. 데이터베이스를 부트(boot) 시점에 설정(config) 위에 덮어씌우는 레이어로 취급하세요.
구현 방법은 다음과 같습니다:
• 단일 진실 공급원(Single source of truth)을 사용하세요. 데이터베이스가 값을 보유하되, 애플리케이션은 오직 config()를 통해서만 읽어야 합니다.
• 타입이 지정된 클래스를 사용하세요. 느슨한 배열 대신 엄격한 타입을 가진 클래스를 사용하세요. 이는 오타와 조용한 오류(silent errors)를 방지합니다.
• 부트 과정 중에 설정을 로드하세요. 서비스 프로바이더(service provider)를 사용하여 데이터베이스 값을 가져온 뒤 이를 config 배열에 넣으세요.
다음 두 가지 기술적 함정을 주의하세요:
시간대(Timezone) 함정 Laravel은 부트 과정 초기에 시간대를 설정합니다. 나중에
config값을 변경하더라도 PHP는 여전히 이전 시간대를 사용합니다. 전역 PHP 설정을 새로운config값과 동기화하려면date_default_timezone_set()을 수동으로 호출해야 합니다.신규 설치(Fresh Install) 함정 새로 설치한 앱에는 데이터베이스 테이블이 없습니다. 설정 테이블이 없어서 부트 과정이 실패하면 앱이 시작되지 않습니다. 앱이 부트되지 않으면 마이그레이션(migration)을 실행할 수도 없습니다. 설정 로직을
try/catch블록으로 감싸세요. 이렇게 하면 마이그레이션을 실행하기 전까지 앱이.env기본값으로 대체(fallback)되어 작동할 수 있습니다.
보안을 위한 또 다른 팁:
회원가입과 같은 기능을 비활성화할 때, 단순히 UI에서 버튼만 숨기지 마세요. config에서 해당 기능을 완전히 제거해야 합니다. config에서 기능을 제거하면 라우트(route)도 사라집니다. 활성화된 엔드포인트가 있는 숨겨진 폼은 보안 위험 요소입니다. 라우트가 없으면 404를 반환합니다.
코드를 단순하게 유지하세요. 컨트롤러와 뷰는 설정이 파일에서 왔는지 데이터베이스에서 왔는지 알 필요가 없어야 합니다. 오직 config()만 바라봐야 합니다.
출처: https://dev.to/nasrulhazim/admin-editable-settings-without-giving-up-config-2cj0
