### 17.3 P3 — `markCommitted` 는 던지고 `markFailed` 는 조용히 넘어간다

```java
markCommitted → findById(...).orElseThrow(IllegalStateException…)   // 청구 없으면 실패
markFailed    → findById(...).ifPresent(entity -> …)                // 청구 없으면 무동작
```

커밋 쪽의 근거는 자바독에 있다 — 청구 없이 커밋하면 변경은 내구적이고 보호받지 못한다.

실패 쪽에는 근거가 없다. 청구가 사라진 뒤 도착한 종결 실패가 아무 흔적도 남기지 않는다. 회수가 청구를 지운 뒤 원래 소유자가 실패를 기록하려는 경우가 그 형태다. 의도라면 그 이유를 자바독에 적어야 하고, 아니라면 커밋 쪽과 같게 다뤄야 한다.

### 확인된 설계(문제 아님)

- **유니크 제약을 애플리케이션 검사 대신 쓰기로 한 판단과 그 근거.**
- **커밋 행이 결과를 갖는다는 규칙을 record 와 DB 양쪽에 둔 것** — 마이그레이션·백필·지원 스크립트는 record 를 지나지 않는다.
