# tdc114plus 개발 정책

작성일: 2026-07-02
최종 개정일: 2026-07-10
상태: v2.2

목적: `tdc114plus` 개발 시 Baron SSO 연동 원칙, Flutter 앱 구조, 문서 우선순위, 테스트 및 협업 기준을 고정한다.

상위 기준 문서:

- `docs/00_policy_tdc114plus_decoupled_api_migration_2026-07-07.md`

## 1. 서비스 및 인증 전제

- `tdc114plus` 신규 앱은 Baron SSO에 추가되는 별도 `RP(Relying Party)`다.
- 앱 인증은 Baron SSO가 제공하는 공식 인증 절차를 소비하는 방식으로 설계한다.
- 신규 앱의 기본 로그인 방식은 `Baron SSO Hosted Login + OIDC Authorization Code + PKCE`다.
- 신규 앱은 Baron SSO에 등록된 `PKCE 공개 클라이언트 RP`이며 Client Secret을 앱 코드, APK, 환경 파일에 저장하지 않는다.
- `private_key_jwt` 서명용 개인키도 공개 모바일 APK에 포함하지 않는다.
- Flutter 앱은 Baron headless API(`/api/v1/auth/headless/...`)를 직접 호출하지 않는다.
- 휴대폰번호 입력, 문자/메일 링크 발송, 링크 승인 처리는 Baron SSO Hosted Login 화면과 Baron SSO 서버 내부 책임으로 본다.
- RP의 OIDC issuer는 `https://sso.hmac.kr/oidc`, 인증 callback은 `https://114.hmac.kr/auth/callback`을 기준으로 한다.
- 앱은 authorization 요청 전 PKCE `code_verifier`, `state`, `nonce`를 생성/보관하고, callback에서 `state` 검증 후 `code_verifier`로 authorization code를 교환한다.
- 전체 Client ID `39d6190d-72f6-4a58-a84f-cdc5ece3e8af`는 공개 RP 식별자이므로 APK 기본 설정에 포함한다.
- 환경별 RP가 달라질 경우 `TDC114_OIDC_CLIENT_ID` Dart define으로 기본값을 재정의할 수 있다.
- 기본 로그인 순서는 `앱 -> Baron SSO 인증 URL 열기 -> Hosted Login 화면에서 휴대폰번호 입력 -> 문자/메일 링크 인증 -> https://114.hmac.kr/auth/callback -> 앱 복귀 -> code를 token으로 교환`이다.
- 로그인 성공 후 Baron SSO가 조직도 API 호출에 필요한 연동 키 묶음을 전달하는 것을 최종 계약으로 준비한다.
- 해당 Baron SSO 기능이 미개발인 동안에는 staging `org-context` 검증을 위해 로컬 비추적 env/Dart define에만 고정 키를 둘 수 있다.
- 이 임시 고정 키는 tracked 문서, tracked 소스, 운영 APK 기본값에 넣지 않는다.
- 기존 Baron SSO의 `선진행 후확인` 방식은 신규 앱의 기본 로그인 정책으로 사용하지 않는다.
- 기존 `phone-login`이 남아 있더라도 개발용 fallback 또는 제한적 호환 경로로만 본다.

## 2. Baron SSO 연동 원칙

- 신규 앱은 Baron SSO 백엔드 소스를 직접 수정해서 맞추는 방식으로 개발하지 않는다.
- 앱은 Swagger에 정의된 공식 Request/Response 계약을 기준으로만 통신 계층을 설계한다.
- 실제 배포 전까지 앱이 참고하고 검증할 Baron SSO API 문서는 staging `https://sadmin.hmac.kr/api/docs#/`를 기준으로 한다.
- 조직/직원 데이터 API는 staging `GET https://sadmin.hmac.kr/api/v1/integrations/org-context`를 우선 기준으로 검증한다.
- Baron SSO 내부 구현은 참고 대상일 뿐, 앱의 상위 기준은 공식 인터페이스 문서다.
- 기존 API 응답을 앱 요구사항에 맞게 임의로 바꾸는 것을 기본 전제로 삼지 않는다.
- Baron SSO 관련 명칭, 경로, DTO가 앱 코드에 과도하게 박혀 있으면 점진적으로 일반화한다.
- Baron SSO backend/orgFront 변경과 `tdc114plus` Flutter 앱 변경은 저장소와 커밋을 분리한다.

## 3. 인터페이스 중심 개발 원칙

- 프론트엔드와 백엔드는 API 계약을 먼저 고정한 뒤 병행 개발한다.
- Flutter 앱은 `request/response DTO`, `API client`, `repository interface`, `UI`를 분리한다.
- UI는 repository interface만 의존해야 하며, HTTP 세부사항을 직접 다루지 않는다.
- 화면 코드가 JSON 응답 구조를 직접 해석하는 형태는 금지한다.
- 백엔드 구현이 완료되지 않았더라도 mock 데이터와 mock repository로 화면 개발이 가능해야 한다.
- API 계약이 바뀌면 문서, DTO, service, repository, test를 함께 갱신한다.

## 4. Flutter 공통 구현 원칙

- 공통 Flutter 코드는 처음부터 Android/iOS 모두를 고려해 작성한다.
- 화면, 상태관리, API client, repository, model은 플랫폼 공통 코드로 우선 설계한다.
- 플랫폼별 차이가 있는 기능은 공통 interface를 먼저 만들고 Android/iOS 구현체를 분리한다.
- 인증 UI와 상태관리는 `SSO 로그인 시작 -> 외부 Hosted Login -> App Link callback -> state 검증 -> token 교환 -> 세션 저장` 흐름을 기준으로 설계한다.
- Flutter 앱은 승인 링크 자체를 생성하거나 RP 비밀값, `client_assertion`, 개인키를 보관하지 않는다.
- 화면 UX, 기본값, 조직 탐색 규칙은 `docs/00_policy_tdc114plus_screen_feature_2026-07-07.md`를 기준으로 삼는다.
- 공지사항, 전자결재, 수신전화식별, 수신팝업은 1차 범위에서 보류한다.
- 1차 범위는 직원검색, 전화번호검색, 가족사 필터, 조직도, 직원목록, 전화걸기, 문자보내기, 즐겨찾기에 집중한다.

## 5. 플랫폼별 구현 원칙

- 플랫폼별 네이티브 기능은 Android에서 먼저 PoC를 완성한 뒤 iOS로 확장한다.
- iOS를 지나치게 늦게 검증하지 않는다.
- 푸시, 생체 인증, 보안 저장소, bridge는 공통 인터페이스와 플랫폼 구현체를 분리한다.
- 운영 배포 전에는 Android/iOS 모두 동일한 보안 기준을 통과해야 한다.

## 6. 개발 방식

- 작업은 `계약 확인 -> DTO 정리 -> repository 정리 -> mock 유지 -> UI 연결 -> 실제 API 검증` 순서로 진행한다.
- 한 번에 전체 기능을 갈아엎지 않고 feature 단위로 점진 개편한다.
- mock 데이터는 임시 코드가 아니라 병행 개발을 위한 공식 수단으로 유지한다.
- 실제 API 연결 전에도 widget test와 unit test가 가능한 구조를 우선 만든다.
- 구현체 이름이 강하게 박힌 타입명은 점진적으로 일반화한다.

## 7. 검증 원칙

Flutter 앱 변경 시 최소 검증:

```bash
./scripts/flutter-docker.sh analyze
./scripts/flutter-docker.sh test
```

상세 테스트 기준은 아래 문서를 따른다.

- `docs/00_policy_tdc114plus_testing_2026-07-02.md`

실제 API 연동 검증은 아래 기준을 따른다.

- Swagger 계약과 DTO 필드 일치 확인
- Hosted Login authorization URL 생성, App Link callback 수신, `state` 검증, PKCE token 교환, 세션 저장, 로그인 후 첫 화면 진입 확인
- mock 경로와 real API 경로가 동일한 UI 흐름을 유지하는지 확인

## 8. 질문 및 확인 원칙

작업 진행 중 판단이 필요하면 아래 순서로 진행한다.

1. 관련 정책 문서를 먼저 확인한다.
2. 문서 기준으로 처리 가능한 것은 바로 진행한다.
3. 정책 간 충돌, 해석 불명확, 보안 영향, 배포 영향이 있는 경우에만 질문한다.
4. 질문 시에는 확인한 문서, 판단 포인트, 선택지, 권장안을 함께 정리한다.
5. 새로운 결정이 내려지면 관련 문서와 타임테이블을 함께 갱신한다.

## 9. 문서 우선순위

개발 중 판단 기준은 아래 순서로 적용한다.

1. `docs/00_policy_tdc114plus_decoupled_api_migration_2026-07-07.md`
2. `docs/00_policy_tdc114plus_development_2026-07-02.md`
3. `docs/00_contract_tdc114plus_api_2026-07-02.md`
4. `docs/00_policy_tdc114plus_screen_feature_2026-07-07.md`
5. `docs/00_policy_tdc114plus_testing_2026-07-02.md`
6. `docs/00_guide_tdc114plus_work_progress_timetable_2026-07-02.md`
7. `docs/guide_baron_sso_reference_source_2026-07-02.md`
8. `docs/references/baron-safe-policies/`

참고 문서는 배경자료이며, 직접 정책보다 우선하지 않는다.
