Skip to content
isdnetworks
Go back

기준 자료가 없으니 화면이 통째로 비었다

시험 서버에서 상품 목록이 통째로 비어 나왔다. 데이터는 있었다.

Table of contents

Open Table of contents

증상 — 데이터는 있는데 화면이 비었다

상품 표부터 셌다.

SELECT COUNT(*) FROM product;
41,882

product 에 4만 건이 있는데 화면에는 하나도 안 나온다.

목록을 만드는 쿼리를 봤다.

SELECT p.* FROM product p
JOIN display_group d ON p.display_group_no = d.no
WHERE d.use_yn = 'Y';

display_group 을 조인하고 있어서 그 표를 셌다.

SELECT COUNT(*) FROM display_group;
0

display_group 이 비어 있으니 JOIN 에서 4만 건이 전부 걸러진다.

원인 — 기준 자료가 안 옮겨져 있었다

display_group 은 운영에서 관리자가 만드는 자료였다.

복사한 것    product, category, member
안 한 것     display_group, code_*, config_*

시험 서버를 만들 때 product 는 복사했는데 이쪽은 하지 않았다.

빠진 것이 하나가 아니었고 code_*config_* 도 같이 비어 있었다. 상품 목록과 기획전과 추천 영역이 같은 이유로 다 안 나오고 있었다.

건수가 많은 표를 옮기는 데 신경을 쓰다가 몇십 건짜리 표가 눈에 안 들어온 것이다. 양이 적은 자료가 없으면 양이 많은 자료가 안 보인다.

무엇이 기준 자료인지 갈랐다

자료를 성격으로 나눠 봤다.

거래 자료   주문, 결제, 배송  → 시험 서버에 없어도 된다
회원 자료   회원, 주소        → 가짜로 만든다
상품 자료   상품, 재고        → 일부만 복사
기준 자료   분류, 코드, 설정, 전시 그룹 → 전부 있어야 한다

display_group 같은 기준 자료는 양이 적고 없으면 아무것도 안 된다.

어느 표가 거기 속하는지는 크기로 찾을 수 있었다.

SELECT table_name, table_rows FROM information_schema.tables
WHERE table_schema = 'shop' ORDER BY table_rows;

table_rows 가 적은 것부터 훑으니 위쪽이 대부분 기준 자료였다.

categorycode_order_typeconfig 가 전부 몇십 건짜리다. 크기로 보면 사소해 보이는 표들이 실제로는 나머지를 떠받치고 있었다.

조치 — 환경 만드는 절차를 스크립트로

옮기는 일을 매번 손으로 하니 빠지는 표가 계속 생겼다.

#!/bin/sh
# 1. 기준 자료 (전부)
for t in category code_order_type code_pay_method display_group config; do
    mysqldump -h real shop "$t" | mysql -h test shop
done

# 2. 상품 (최근 1,000건)
mysqldump -h real shop product --where="no > (SELECT MAX(no)-1000 FROM product)" | mysql -h test shop

# 3. 회원 (가짜)
php scripts/make-test-members.php 100

# 4. 주문 (안 옮긴다)

mysqldump 를 무엇에 어떻게 거는지가 이 파일 하나에 남는다.

기준 자료는 전부 옮기고 product 는 최근 1,000건만 가져오며 주문은 아예 안 옮긴다. 회원은 make-test-members.php 로 만들어 넣는데 옮기면 시험 서버에 실제 사람 정보가 생긴다.

절차가 코드로 남으니 다음에 시험 서버를 다시 만들 때 같은 조사를 반복하지 않는다. 빠진 표가 또 나오면 그때 이 목록에 한 줄을 더하면 된다.

대응 — 비었을 때 알 수 있게

기준 자료가 비면 화면이 조용히 빈다.

$groups = $this->displayGroup->getActive();
if (empty($groups)) {
    log_message('error', '전시 그룹이 하나도 없습니다. 기준 자료를 확인하십시오.');
    if (ENVIRONMENT !== 'production') {
        show_error('기준 자료(display_group)가 비어 있습니다.');
    }
}

개발 환경에서는 show_error 로 이유를 화면에 띄웠다.

조건에 맞는 것이 0건인 것과 기준 자료가 없는 것은 다른 상태인데 화면에서는 똑같이 보인다. 둘을 갈라 놓으니 어디를 봐야 하는지가 그 자리에서 정해졌다.

운영에서는 로그만 남겼다. 안쪽 사정을 화면에 띄우는 것은 개발 환경에서만 할 일이다.

검증 — 뜰 때 최소 건수 확인

화면을 열어야 아는 것은 늦다.

public function checkBaseData(): array {
    $required = [
        'category'         => 1,
        'code_order_type'  => 5,
        'display_group'    => 1,
        'config'           => 10,
    ];
    $missing = [];
    foreach ($required as $table => $min) {
        $n = $this->db->count_all($table);
        if ($n < $min) { $missing[$table] = "{$n}건 (최소 {$min})"; }
    }
    return $missing;
}

required 에 표마다 최소 건수를 적어 두고 시작할 때 센다.

이것을 넣고 나서 운영에서 한 번 걸렸다.

code_pay_method: 3건 (최소 5)

code_pay_method 의 코드 두 개가 관리 화면에서 실수로 지워져 있었다.

지우기 전에 쓰이는지 확인하는 것이 없어서 그것도 같이 넣었다.

if ($this->orders->existsByPayMethod($code)) {
    throw new InUse('이 결제수단을 쓰는 주문이 있어 삭제할 수 없습니다.');
}

시험 서버에서 겪은 일을 막으려고 넣은 것이 운영에서 먼저 걸린 셈이다. 기준 자료가 비는 경로는 안 옮기는 것만이 아니라 지우는 쪽에도 있었다.

정리


Share this post on:

Previous Post
목록 하나에 조회가 수백 번 붙었다
Next Post
인증 해제 조건 넷