Skip to content
isdnetworks
Go back

설정 하나가 없어서 전체가 멈췄다

새로 만든 개발 서버에 소스를 올리고 화면을 열었더니 흰 화면이 나왔다. error_log 를 보니 문자 발송 설정을 못 찾는다는 오류였다. 문자 발송은 주문 완료 때만 쓰는데 첫 화면이 안 떴다.

Table of contents

Open Table of contents

부트스트랩에서 죽었다

시작할 때 설정 파일을 전부 읽는 구조였고 그 안에 die 가 있었다.

$config['sms_api_key'] = getenv('SMS_API_KEY');

if (!$config['sms_api_key']) {
    die('SMS_API_KEY 가 설정되지 않았습니다');
}

getenv('SMS_API_KEY') 는 값이 없으면 false 를 돌려준다. 빈 문자열로 넣어 둔 것과 구분이 안 되니 둘 다 여기서 걸린다. 첫 화면은 문자 발송과 아무 관계가 없는데 부트스트랩이 먼저 도니까 화면에 닿지도 못하고 끝난다.

필수와 선택을 나눴다

설정 값을 목록으로 뽑아서 둘로 갈랐다. 없으면 아무것도 못 하는 것은 DB_HOSTDB_USERsess_save_pathbase_url 이다. 없으면 그 기능만 못 하는 것은 SMS_API_KEYPAY_MIDMAP_KEY 와 메일 계정이다.

앞쪽은 죽는 것이 맞다. 접속 정보가 없으면 어떤 화면도 못 그린다. 뒤쪽은 다르다. 문자를 못 보내도 상품 목록은 나온다. die 를 앞쪽에만 남기고 뒤쪽은 값이 없을 때 그 기능만 끄게 했다.

public function send_order_sms($order)
{
    if (!$this->config->item('sms_enabled')) {
        log_message('info', '문자 발송 비활성 - 주문 ' . $order['no']);
        return false;
    }
    ...
}

config->item('sms_enabled') 이 거짓이면 false 를 돌려주고 주문 처리는 계속 간다. 문자가 안 나갔다는 사실은 log_message 에 남는다.

조용히 꺼지면 안 된다

여기서 걸리는 것이 있었다. 기능이 꺼진 것을 아무도 모르면 그것도 문제다. 운영에서 키가 빠져 있으면 주문은 들어오는데 문자가 안 나가고 오류도 없다. 고객이 물어볼 때까지 모른다.

그래서 꺼진 것을 두 자리에서 보이게 했다. 부트스트랩 끝에서 log_message 로 한 번 남기고 관리자 상태 화면에도 항목별로 표시했다.

[설정] sms_enabled = false
[설정] payment_enabled = true
[설정] map_enabled = false

기능을 끄는 것과 끈 것을 감추는 것은 다르다. 끄되 보이게 해야 했다.

환경마다 다른 것이 정상

개발 서버에 SMS_API_KEY 를 넣을 이유가 없다. 시험하다 실제 문자가 나가면 그게 더 곤란하다. ENVIRONMENT 마다 필요한 값이 다른 것이 정상이라는 것을 받아들이니 구조가 정해졌다.

개발운영
DB 접속필요필요
문자 키없음필요
결제 상점시험용실제
지도 키없음필요

운영에서 빠지면 안 되는 것은 배포 전에 확인하는 절차로 옮겼다. 애플리케이션이 die 하는 것이 아니라 deploy.sh 가 멈추게 하는 것이다.

$required_prod = ['DB_HOST', 'DB_USER', 'SMS_API_KEY', 'PAY_MID', 'MAP_KEY'];
$missing = [];

foreach ($required_prod as $k) {
    if (!getenv($k)) $missing[] = $k;
}

if ($missing) {
    echo "빠진 값: " . implode(', ', $missing) . "\n";
    exit(1);
}

빠진 것을 implode 로 한 줄에 모아 보이고 exit(1) 로 끝내면 deploy.sh 가 그 자리에서 멈춘다. 같은 검사인데 멈추는 지점이 다르다. 배포하는 사람이 보는 자리로 옮긴 것이다.

정리


Share this post on:

Previous Post
예약 작업이 두 번 돌았다
Next Post
트랜잭션이 이미 끝나 있었다