# Baron SSO API Design Policy ## 1. 개요 (Overview) 본 문서는 Baron SSO 시스템의 백엔드 API 설계 원칙과 규약을 정의합니다. 모든 API 개발은 이 문서를 따름으로써 시스템의 일관성, 가독성, 유지보수성을 확보해야 합니다. ## 2. API 버전 관리 및 URL 구조 (Versioning & URI) ### 2.1 URL 구조 모든 API는 아래의 기본 구조를 따릅니다. `[GET|POST|...] /api/{version}/{namespace}/{resource}[/{id}][/{action}]` * **Version**: `v1`, `v2` 등 메이저 버전 단위로 관리합니다. * **Namespace**: API의 사용 목적과 권한 범위를 구분합니다. * `/auth`: 인증, 로그인, 비밀번호 찾기 등 (Public/User context) * `/user`: 사용자 마이페이지, 프로필 수정 (Self-service, User context) * `/admin`: 시스템 관리자 기능 (Admin context, Tenant aware) * `/dev`: 개발자 포털 기능 (Developer context, RP management) * **Resource**: 리소스명은 **복수형(Plural)** 명사를 사용합니다. (예: `clients`, `audit-logs`) ### 2.2 명명 규칙 (Naming Conventions) * **URL Path**: **kebab-case** (소문자, 하이픈 사용) * `GET /api/v1/audit-logs` (O) * `GET /api/v1/auditLogs` (X) * **Query Parameters**: **snake_case** 또는 **camelCase**를 허용하되, **camelCase**를 권장합니다. * `GET /clients?clientId=...` * **JSON Fields**: **camelCase**를 엄격히 준수합니다. (프론트엔드 JS/TS/Dart 표준 준수) * `{ "clientId": "...", "createdAt": "..." }` (O) * `{ "client_id": "...", "created_at": "..." }` (X) * *예외:* DB 모델을 직접 반환해야 하는 불가피한 레거시(ClickHouse 로그 등)는 예외를 두되, 가급적 DTO 변환을 권장합니다. ## 3. HTTP 메서드 (HTTP Methods) 리소스에 대한 행위는 HTTP 메서드로 표현합니다. | 메서드 | 용도 | 멱등성(Idempotent) | 예시 | | :--- | :--- | :--- | :--- | | **GET** | 리소스 조회 | O | `GET /clients` (목록), `GET /clients/:id` (상세) | | **POST** | 리소스 생성, 또는 복잡한 액션 | X | `POST /clients` (생성), `POST /auth/login` (액션) | | **PUT** | 리소스 전체 수정 (대체) | O | `PUT /users/:id` | | **PATCH** | 리소스 일부 수정 | O (권장) | `PATCH /clients/:id/status` | | **DELETE**| 리소스 삭제 | O | `DELETE /clients/:id` | ## 4. 요청 및 응답 형식 (Request & Response) ### 4.1 목록 조회 (List Response) 목록 조회 시 반드시 페이지네이션 메타데이터를 포함해야 합니다. ```json { "items": [ { "id": "1", "name": "Resource A" }, { "id": "2", "name": "Resource B" } ], "limit": 50, "offset": 0, "total": 120 // 선택적 (성능 이슈 시 제외 가능) } ``` ### 4.2 단건 조회/생성/수정 (Single Resource Response) 데이터를 바로 반환하거나, 필요 시 래핑할 수 있습니다. 일관성을 위해 루트 객체로 반환하는 것을 권장합니다. ```json { "id": "1", "name": "Resource A", "status": "active" } ``` ### 4.3 에러 응답 (Error Response) 모든 에러는 일관된 포맷을 유지해야 합니다. 프로덕션 환경에서는 내부 스택 트레이스를 노출하지 않아야 합니다. **HTTP Status Code 활용:** * `400 Bad Request`: 입력값 검증 실패 * `401 Unauthorized`: 인증 토큰 없음/만료 * `403 Forbidden`: 권한 부족 (토큰은 있으나 접근 불가) * `404 Not Found`: 리소스 없음 * `409 Conflict`: 데이터 충돌 (중복 생성 등) * `429 Too Many Requests`: 레이트 리밋 초과 * `500 Internal Server Error`: 서버 내부 오류 (상세 내용 마스킹) * `503 Service Unavailable`: 외부 의존성(Hydra, DB 등) 연결 실패 **JSON Body:** ```json { "error": "사람이 읽을 수 있는 에러 메시지", "code": "MACHINE_READABLE_CODE", // 선택적 (예: USER_NOT_FOUND, HYDRA_CONN_ERR) "details": { ... } // 선택적 (Validation error 필드별 상세 등) } ``` ## 5. 헤더 및 보안 (Headers & Security) ### 5.1 인증 (Authentication) * **Authorization**: `Bearer {token}` 형식을 사용합니다. * Backend는 Gateway 또는 Middleware에서 토큰을 검증하고 `User Context`를 생성해야 합니다. ### 5.2 테넌트 격리 (Multi-tenancy) * **X-Tenant-ID**: 관리자 API(`admin`) 호출 시, 대상 테넌트를 식별하기 위해 필수적으로 사용합니다. * 슈퍼 어드민이 아닐 경우, 요청자의 권한과 헤더의 테넌트가 일치하는지 검증해야 합니다. ### 5.3 요청 추적 (Tracing) * **X-Request-ID**: 모든 요청/응답에 고유 ID를 포함하여 로그 추적성을 확보합니다. 클라이언트가 보내지 않으면 서버가 생성합니다. ## 6. 개발 가이드라인 (Implementation Guidelines) ### 6.1 DTO 사용 * DB 모델(Gorm, ClickHouse struct)을 그대로 API 응답으로 내보내지 마십시오. * 반드시 **Response DTO** 구조체를 별도로 정의하여 `json` 태그를 통해 명명 규칙(camelCase)을 적용하고, 민감한 정보(비밀번호 해시, 내부 ID 등)를 필터링해야 합니다. ### 6.2 핸들러 구조 * 핸들러는 `Service` 레이어를 호출하고, HTTP 요청/응답 처리(파싱, 상태 코드 매핑)에만 집중해야 합니다. * 비즈니스 로직은 `Handler`가 아닌 `Service` 또는 `Domain` 레이어에 위치해야 합니다. ### 6.3 로깅 정책 * 요청/응답 로그는 미들웨어 레벨에서 처리합니다. * 에러 발생 시 `slog.Error`를 통해 스택 트레이스와 컨텍스트를 남기고, 클라이언트에게는 정제된 메시지만 전달합니다.