
## 상태

[완료]

## 목표

Go core service의 HTTP server, DTO 변환, runner/job handler, 시간 의존성을 모듈 경계별로 분리해 유지보수성과 테스트 가능성을 높인다.

## 범위

- `services/core/internal/httpserver/server.go`의 라우팅, handler, DTO 변환 책임을 작은 파일 또는 내부 모듈로 분리한다.
- runner registry, job/execution, log/artifact handler가 독립적으로 읽히도록 경계를 만든다.
- `cicdstate.Store`의 clock 주입과 entity timestamp 생성 경로를 일관되게 만든다.

## 범위 제외

- OTO Server API endpoint 의미 변경
- 저장소 backend 교체
- 인증/권한 정책 추가

## 구현 잠금

- 상태: 해제
- 결정 필요: 없음

## 작업 컨텍스트

- `services/core/internal/httpserver/server.go`는 route 등록, 수동 subrouter, 여러 handler와 DTO 변환이 한 파일에 집중되어 있다.
- `services/core/internal/cicdstate/store.go`는 `Store`에 clock을 주입하지만 일부 entity 생성 메서드는 직접 `time.Now()`를 호출한다.
- 표준선: behavior는 유지하고 파일/책임 경계와 clock 주입 일관성만 정리한다.

## 기능

### Epic: [http] server module boundary

- [x] [routes] route 등록과 subrouter 구성을 handler 구현에서 분리한다.
- [x] [handlers] runner, job/execution, log/artifact handler 책임을 기능별 파일 또는 내부 모듈로 나눈다.
- [x] [dto] HTTP DTO 변환과 domain state 조작 경계를 명확히 한다.
- [x] [clock] timestamp 생성이 `Store`의 clock 주입 경로를 일관되게 사용하도록 정리한다. 검증: `make core-test`가 통과한다.

## 완료 리뷰

- 상태: 승인됨
- 요청일: 2026-06-08
- 승인일: 2026-06-09
- 완료 근거: route 등록, handler 파일 분리, DTO 변환 경계가 `services/core/internal/httpserver/` 아래 책임별 파일로 정리되어 있다.
- 완료 근거: runner 계열 HTTP 응답 조립이 `dto.go` helper 경로를 사용하도록 정리되어 handler 내부의 직접 JSON map 응답 조립이 제거되었다.
- 완료 근거: runner job claim의 execution id 생성이 `cicdstate.Store`의 clock 경로를 사용하고, `CreateExecution`이 중복 execution id를 거부하도록 정리되었다.
- 완료 근거: `make core-test`가 통과했다.
- 사용자 최종 확인: 2026-06-09 완료 및 다음 마일스톤 전환 승인.
