"작업은 행 id만이 아니라 입력 글과 옵션에 속해."
먼저 지킬 것
엔트리 id만으로 입력을 식별할 수 없어. 같은 엔트리가 id를 지킨 채 원문을 수정할 수 있거든. 어제 문장에서 태어난 작업이 foreign key가 같다는 이유로 오늘 문장을 꾸미면 안 돼.
상태로 약속해
worker가 시작할 때 정확한 원문과 목표 언어를 잡아 둬. 쓰기 직전에 엔트리를 다시 읽고 현재 원문을 그 birth snapshot과 비교해. 별도 버전 열이 아니라 원문 자체가 버전 경계야.
조용한 실패
updated_at만 쓰면 관계없는 metadata 변경과 시계 정밀도 때문에 약해져. 정확한 글을 비교하면 주장을 바로 표현하고, 필사용 문장에 의미가 있을 수 있는 공백도 그대로 보존해.
다섯 순간을 따라가
생성 직전, 저장 직후, worker가 집어 든 순간, 결과가 돌아온 순간, 다음 날 다시 읽는 순간을 차례로 봐. 각 순간에 엔트리 상태와 작업 상태, 잡아 둔 원문, 사용자가 보는 문구를 적어. 성공한 요청만 맞고 재시도나 취소에서 달라지면 원문 주권은 조건부였던 거야.
수행해
번역 worker의 birth snapshot에 들어갈 필드를 정확히 고르고 각 필드가 필요한 이유를 설명해. 원문 수정, 엔트리 삭제, worker 재시작, 외부 서비스 실패도 같은 표에 넣어. 결과를 버리는 일이 데이터 손실이 아니라 무결성 보존이 되는 순간을 표시해.
마지막 질문
화면이 원문을 계속 보여주고 작업 상태를 솔직히 말하는가? 그렇다면 장식은 원문을 돕고 있어. spinner나 빈칸으로 실패를 숨기거나 늦은 결과가 최신 글을 덮으면 장식이 왕좌를 훔친 거야.
이 레슨의 착지 조건
현재 Inkwell은 worker가 읽은 정확한 원문을 잡고 쓰기 전에 새로 읽은 엔트리와 비교해. 원문 글자 자체가 버전 경계라서 관계없는 theme이나 조회 횟수는 결과를 stale로 만들지 않고, 의미 있는 공백도 지워지지 않아.
응답 속도와 정확성은 반대편에 있지 않아. 원문을 먼저 commit하고 늦은 작업이 착지 전에 현재 상태를 다시 읽게 하면 둘 다 지킬 수 있어.