## 관련 명세 - `docs/s1-api-spec.md` 11번 `PUT /api/v1/templates/{templateId}` (NEW-07, MYT-07, MYT-09, 정책표 4) - `TEMPLATE200_3` 수정 내용이 저장되었습니다. - `TEMPLATE400_1~7` 형식 오류, `TEMPLATE404_1`·`TEMPLATE404_2`, `TEMPLATE409_1` 이미 사용 중인 단축어예요. ## 작업 내용 #49의 `getActiveTemplate`을 재사용해 세 필드 전체 수정을 만든다. - `TemplateCommandService`: 수정 메서드, 입력 `TemplateUpdateCommand`, 결과 `TemplateUpdateResult` - `TemplateController`: `PUT /{templateId}`, 요청 `TemplateUpdateRequest`, 응답 `TemplateUpdateResponse`, 성공 코드 `TEMPLATE200_3` - `TemplateRepository`: 자기 자신을 뺀 활성 단축어 중복 조회. 13번 `excludeTemplateId`도 같은 메서드를 쓴다 - 저장은 기존 `save()`로 한다. 저장 시 유니크 위반은 `TEMPLATE409_1`로 바꾼다 - 현재 시각은 `Clock` 빈에서 얻는다 ### 동작 규칙 | 경우 | 결과 | | --- | --- | | 정리 후 세 값이 기존과 같음 | 아무것도 바뀌지 않음. `edited_at`·`updated_at` 유지 | | 단축어 대소문자만 변경 | 수정으로 처리 | | 자기 자신의 단축어 그대로 | 중복 아님 | | 내 다른 활성 템플릿과 비교 키가 같음 | `TEMPLATE409_1` | | 휴지통 템플릿이 쓰던 단축어 | 사용 가능 | | 없는 ID, 다른 회원 템플릿 (휴지통 포함) | `TEMPLATE404_1` | | 내 템플릿인데 휴지통에 있음 | `TEMPLATE404_2` | 수정은 개수가 바뀌지 않으므로 `lockUser`를 부르지 않는다. 동시 수정은 나중 저장이 덮어쓴다. ## 완료 조건 - [ ] 성공 응답과 DB 값, `editedAt` 갱신, `lastUsedAt` 유지, 캐시 금지 헤더 - [ ] 같은 값 저장 시 `editedAt`·`updated_at` 유지, 대소문자만 바꾸면 수정 - [ ] 자기 단축어 성공, 내 다른 활성 템플릿 409_1(자모 분리형·대소문자 포함), 휴지통 단축어 성공 - [ ] 실제 유니크 위반이 `TEMPLATE409_1`로 바뀌고 수정이 남지 않음 - [ ] 404 구분, 검증 순서(이름 → 단축어 → 내용), 토큰 없음 `COMMON401_1` - [ ] 수정한 본문도 암호화해 저장 - [ ] `./gradlew build` 통과 ## 참고 - #49(PR #50) 위에 쌓는 작업이라 PR 기준 브랜치는 `feat/49-template-detail`이다 - 명세 11번 에러표의 404_1 설명에 "휴지통에 있는 템플릿"이 남아 있어 비고와 어긋난다. 비고를 따르고, 명세 수정은 이 이슈 범위가 아니다 - 12·13·14번 자체는 구현하지 않는다
Activity
refactor: 템플릿 서비스 의존성 필드 순서 정리 (#52)
refactor: 템플릿 서비스 필드 들여쓰기를 탭으로 수정 (#52)
refactor: 수정 중 휴지통 이동 경쟁을 허용하는 이유를 주석으로 남김 (#52)