규칙은 린터가 판정합니다.
101개 아키텍처 규칙을 자체 린터가 정적 검사합니다. 점수를 "준수 인증"으로 쓰지 않습니다.
ENGINEERING
큰 시스템은 좋은 의도로 유지되지 않습니다. 아키텍처 규칙은 린터로 검사하고, 설정 드리프트는 push에서 거부하고, 장애마다 "확인된 사실"과 "가설"을 구분해 기록합니다.
DISCIPLINE
101개 아키텍처 규칙을 자체 린터가 정적 검사합니다. 점수를 "준수 인증"으로 쓰지 않습니다.
기준 저장소 16개의 커밋 해시와 발췌를 매니페스트로 관리하고, 문서와 코드의 충돌 19건을 근거와 함께 보존합니다.
클러스터 설정 38개를 SSOT에서 생성합니다. 손편집으로 어긋나면 push가 거부됩니다. 거부되는지는 실측했습니다.
문제해결 기록 38건은 현상, 확인된 원인, 조치, 검증, 남은 범위를 분리해 적고, 검증하지 않은 범위를 성공으로 쓰지 않습니다.
CASES
문제는 쉬운 말로, 해결은 기술 용어로 적었습니다. 현상 · 원인 · 해결 · 검증 전체 기록은 펼쳐서 볼 수 있습니다.
문제한 가지 요청이 거절당했을 뿐인데, 같은 서버로 가는 정상 요청들까지 한꺼번에 실패하기 시작했습니다.
해결공통 서비스 클라이언트의 서킷브레이커 실패 분류(record predicate)를 수정해 4xx는 호출자 오류로 제외하고, 5xx와 timeout만 회로 개방 집계에 포함했습니다.
invalid_scope로 400을 받았는데, 구버전 공통 클라이언트는 4xx를 장애로 집계해 같은 인증 서버를 향한 서킷브레이커를 열었습니다. 무관한 정상 호출까지 함께 차단됐습니다.문제설정 파일을 손으로 고쳤는데, 자동 생성이 돌 때마다 그 수정이 흔적 없이 지워졌고 같은 사고가 세 번 반복됐습니다.
해결SSOT 환경 매트릭스에서 클러스터 설정을 생성하고 생성물에 표식을 박았습니다. SSOT와 생성물을 한 줄씩 대조하는 게이트를 pre-push 훅과 CI가 같은 스크립트로 실행해, 드리프트가 있으면 push를 거부합니다.
문제발주가 실패했을 때 재시도해야 할 것과 하면 안 되는 것이 같은 상태로 저장되어, 운영자가 잘못 누를 수 있었습니다.
해결상태 기계를 재설계해 자동 집계는 FAILED, 운영자의 명시적 확정만 DELIVERY_FAILED(terminal)로 분리했습니다. 확정 액션은 멱등이고, 종단 상태에서의 RETRY / APPROVE는 409로 거절하며, 늦게 도착한 패키징 결과가 종단 상태를 되돌리지 못하게 가드했습니다.
문제오늘 날짜가 붙은 새 이미지를 배포했는데 내용은 지난번 그대로였습니다.
해결이미지 태그를 날짜와 커밋 해시로 고정하고 빌드에 커밋 지정을 필수화했습니다. 배포 스크립트에 plan(배포본과 main 사이 DB 변경 요구 집계), dry-run, rollback, history를 한 체계로 묶고, 클러스터 작업은 스크립트로만 하도록 정했습니다.
문제서버는 모두 켜져 있고 상태 점검도 통과하는데, 목록 화면이 가끔 열리지 않았습니다.
해결HTTP health 대신 컨테이너 재시작 횟수와 커널 OOM 기록으로 원인을 검증 환경 VM의 메모리 부족으로 특정했습니다. 메모리를 증설하고, 응답이 느린 단 한 경로에만 timeout을 조정했으며, 원인이 아니었던 임시 변경은 되돌렸습니다.
문제파일 하나가 다섯 단계를 거쳐야 하는데, 처음부터 큐 기반 분산 처리로 가면 중간 실패를 추적하고 복구하는 일이 먼저 복잡해질 상황이었습니다.
해결상위 흐름은 문서 1건 = 작업 1건으로 고정하고 fan-out / fan-in을 설계하되, 1단계는 DB 상태 기반 오케스트레이터와 단일 워커 직렬 실행으로 운영했습니다. 작업은 claim / lease / attempt 모델로 at-least-once 재시도와 멱등성을 보장하고, 메시지 큐는 병목 구간에만 점진 도입합니다.
여기 적힌 숫자와 사례는 모두 하늘랩 내부 기록에서 가져왔습니다. 고객사 비공개 정보, 제품 버전, 내부 식별자는 제외했습니다.