> For the complete documentation index, see [llms.txt](https://genos-docs.gitbook.io/default/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://genos-docs.gitbook.io/default/v1.8.8/basic-tutorials/guides/development/code_serving/promotion_code_serving.md).

# 코드 서빙 이관

코드 서빙 이관은 개발망(GenOS)에서 작성·검증한 코드 서빙을 외부 Git 저장소를 매개로 운영망에 반영하는 기능입니다. 개발망과 운영망은 보안상 분리되어 있어 코드를 직접 옮길 수 없으므로, 신청자가 지정한 외부 Git 저장소로 **푸시(Push)** 하고 운영망이 동일 저장소에서 **풀(Pull)** 하는 방식으로 코드를 이동합니다. 연결된 코드 서빙을 하나의 토폴로지로 묶어 한 번에 신청할 수 있으며, 신청 → 승인/반려 결재 → 승인 시 자동 푸시 → 이력 조회·재이관의 흐름으로 동작합니다.

코드 서빙의 생성·배포·활용 방법은 [코드 서빙 생성](/default/v1.8.8/basic-tutorials/guides/development/code_serving/create_code_serving.md), [코드 서빙 배포](/default/v1.8.8/basic-tutorials/guides/development/code_serving/deploy_code_serving.md), [코드 서빙 활용](/default/v1.8.8/basic-tutorials/guides/development/code_serving/usage_code_serving.md) 문서를 함께 참고해 주세요.

## 진입 경로

| 기능          | 경로                                              |
| ----------- | ----------------------------------------------- |
| 연결 관계 확인·지정 | `[서빙 > 코드 서빙]` → 대상 상세 → `[연결 관계]` 탭            |
| 이관 신청       | 상세 → `[이관]` 버튼 (연결 관계 탭에서 접근)                   |
| 이관 결재       | `[운영 > 승인]` 메뉴 → 승인 유형 필터=`이관` → `[검토]`         |
| 이관 이력·재이관   | 상세 → `코드 서빙 운영 이력` → `[이관]` 탭 → `[이관 신청 이력 상세]` |

## 주요 개념

| 개념                          | 설명                                                                                               |
| --------------------------- | ------------------------------------------------------------------------------------------------ |
| 코드 서빙 이관                    | 개발망에서 검증한 코드 서빙을 외부 Git 저장소를 매개로 운영망에 반영하는 절차입니다.                                                |
| 연결 관계                       | 하나의 코드 서빙이 다른 코드 서빙을 호출하며 동작하는 의존 관계입니다. 이관 신청 시 함께 묶을 대상 판단 기준으로만 사용되며, 연결 자체는 운영망으로 이관되지 않습니다. |
| 토폴로지                        | 본 코드 서빙(ROOT)을 중심으로 연결된 코드 서빙을 노드/엣지로 표현한 네트워크 그래프입니다. 연결 관계·이관 영향·이관 범위 화면이 같은 그래프를 공유합니다.      |
| 나가는 호출                      | 본 코드 서빙이 호출하는 코드 서빙입니다(실선). 함께 이관할 대상으로 연결·묶을 수 있습니다.                                            |
| 들어오는 호출                     | 본 코드 서빙을 호출하는 리소스입니다(점선). 조회 전용이며 이관 대상이 아닙니다.                                                   |
| ROOT                        | 이관·연결 관계의 기준이 되는 본 코드 서빙입니다. 이관 신청 시 항상 포함되며 선택을 해제할 수 없습니다.                                     |
| 외부 Git                      | 개발망·운영망 양쪽에서 접근 가능한 Git 저장소(GitHub / GitLab / Gitea / Bitbucket 등)로, 코드 이동의 매개입니다.               |
| PAT (Personal Access Token) | 외부 Git 저장소에 푸시하기 위한 인증 토큰입니다. **저장하지 않으며 이관마다 재입력**합니다.                                          |
| 부분 성공                       | 재이관 시 일부 대상만 실패하고 나머지는 정상 이관되는 상태입니다.                                                            |

## 사전 준비

이관 진행 전 아래가 갖춰져 있어야 합니다.

**외부 Git 저장소 준비**

* 개발망·운영망 양쪽에서 접근 가능한 외부 Git 저장소(GitHub / GitLab / Gitea / Bitbucket 등)
* 해당 저장소에 푸시 권한이 있는 계정 ID
* 계정의 Personal Access Token(PAT)

**코드 서빙 생성 시 외부 Git 연결**

코드 서빙 생성 시 `[저장소 유형]`을 **외부 Git**으로 선택하고 외부 Git URL·ID·PAT을 등록합니다. 이미 내부 Gitea로 생성된 코드 서빙은 상세 `[수정]`에서 외부 Git 정보를 추가할 수 있습니다.

**운영망 코드 서빙 사전 생성**

운영망에 진입해 동일한 외부 Git 저장소를 바라보는 코드 서빙을 먼저 생성해 둡니다. **신청 시점에 운영망에 대상 코드 서빙이 없으면 신청은 접수되지만 운영망 반영이 누락됩니다.** 연결된 코드 서빙을 함께 이관할 경우, 함께 이관할 모든 코드 서빙에 대해 운영망 코드 서빙을 각각 미리 생성해야 합니다.

**연결 관계 지정 (연결 이관 시)**

연결된 코드 서빙을 묶어 이관하려면 먼저 상세 `[연결 관계]` 탭에서 함께 이관할 코드 서빙을 연결해 둡니다.

<figure><img src="/files/pt1yzVGwqkypqwhyhaKQ" alt=""><figcaption><p>코드 서빙 상세 - 연결 관계 탭 전체 화면</p></figcaption></figure>

## 연결 관계 확인·지정

하나의 코드 서빙은 다른 코드 서빙을 호출하며 동작할 수 있습니다. 이관 전에 연결 관계를 확인하고, 함께 운영망으로 옮길 의존 코드 서빙을 미리 연결해 두면 한 번에 묶어 이관할 수 있습니다.

### 연결 관계 탭 진입과 그래프 보는 법

사이드바 `[서빙 > 코드 서빙]` → 대상 상세 → `[연결 관계]` 탭으로 진입합니다. 본 코드 서빙(ROOT)을 중심으로 연결된 코드 서빙이 네트워크 그래프(토폴로지)로 표시됩니다.

* **실선**: 나가는 호출 (본 코드 서빙 → 호출하는 코드 서빙)
* **점선**: 들어오는 호출 (본 코드 서빙을 호출하는 리소스 → 본 코드 서빙)
* **노드 색상**
  * 파란색: 읽기·쓰기 권한이 모두 있는 코드 서빙
  * 노란색(크림 옐로 + 갈색 외곽선): 쓰기 권한이 없는 코드 서빙
  * 회색: 들어오는 호출자(상위 1단계)
* 노드 클릭 시 하위 연결이 펼쳐지거나 접힙니다. 접힌 노드에는 하위 연결 수가 숫자로 표시됩니다.
* 우상단 `[전체 펼침/전체 접힘]`으로 모든 하위 노드를 일괄 토글합니다.
* 우측 그래프 컨트롤(확대/축소/초기화)로 배율·위치를 조정합니다. 초기화 시 전체 그래프가 화면에 맞춰 정렬됩니다. 확대·축소는 Ctrl/Cmd 키를 누른 상태의 휠로만 동작하며, 키를 누르지 않은 휠은 페이지 스크롤로 동작합니다.

<figure><img src="/files/bEmgeZw86h1quPwyhEPR" alt=""><figcaption><p>연결 관계 토폴로지 그래프 - 실선(나가는 호출)과 점선(들어오는 호출)</p></figcaption></figure>

<figure><img src="/files/rmQCQ00RwA6wezPLmEW7" alt=""><figcaption><p>노드 색상 범례 - 쓰기 권한 유무와 호출 방향 안내</p></figcaption></figure>

<figure><img src="/files/RCWvup7mWM1FyKgrje3j" alt=""><figcaption><p>토폴로지 컨트롤 - 전체 펼침·접힘, 확대·축소·초기화</p></figcaption></figure>

### 나가는 호출 연결 추가

함께 이관할 의존 코드 서빙을 연결합니다. 해당 코드 서빙에 읽기·쓰기 권한이 있어야 `[연결 추가]` 버튼이 표시됩니다.

1. `[나가는 호출]` 영역의 `[연결 추가]` 버튼을 클릭합니다.
2. 모달에서 연결할 코드 서빙을 검색(제목 / ID)하여 다중 선택합니다. 본 코드 서빙(ROOT)과 이미 연결된 건은 선택 목록에서 제외됩니다.
3. `[연결 추가]`를 클릭하면 "연결이 추가되었습니다." 토스트와 함께 목록·그래프가 즉시 갱신됩니다.

여러 건을 한 번에 연결할 때 일부만 실패할 수 있습니다. 이 경우 실패한 항목과 사유가 안내되므로, 해당 항목만 다시 시도해 주세요.

<figure><img src="/files/2oppEexWeWZZIDzMbPII" alt=""><figcaption><p>나가는 호출 목록의 연결 추가 버튼</p></figcaption></figure>

### 연결 제거

`[나가는 호출]` 목록에서 제거할 연결을 체크한 뒤 `[연결 제거]`를 클릭합니다. 확인 다이얼로그에서 안내 문구(`연결을 제거하겠습니다`)를 정확히 입력해야 진행됩니다.

* **연결 제거는 되돌릴 수 없습니다.**
* 성공 시 "N개 항목 연결이 제거되었습니다." 토스트와 함께 목록·그래프가 갱신됩니다.
* 여러 건을 한 번에 제거할 때도 일부만 실패할 수 있습니다. 이 경우 실패한 항목과 사유가 안내되므로, 해당 항목만 다시 시도해 주세요.
* 연결 제거는 배포 여부와 무관하게 동작합니다.

<figure><img src="/files/QPBMFmGZiZCU22Tpbduj" alt=""><figcaption><p>제거 대상 체크 후 연결 제거 버튼 클릭</p></figcaption></figure>

### 들어오는 호출 (조회 전용)

`[들어오는 호출]` 영역은 본 코드 서빙을 호출하는 리소스 목록을 보여 줍니다.

* 이 영역은 **읽기 전용**이며 함께 이관되지 않습니다.
* 연결 편집은 호출하는 쪽(상위 코드 서빙) 상세에서 관리합니다.

> **연결 관계는 함께 이관되지 않습니다.** 이관 시에는 코드만 운영망으로 넘어가며, 연결 관계는 환경 간 충돌 위험·보안 정책상 대상 망에서 다시 지정해야 합니다. 여기서 지정한 연결은 "이관 신청 시 어떤 코드 서빙을 함께 묶을지" 판단 기준으로만 사용됩니다.

<figure><img src="/files/1nEyXnWLmQaSyy5qlMlq" alt=""><figcaption><p>들어오는 호출 목록 - 조회 전용</p></figcaption></figure>

## 이관 신청

연결된 코드 서빙을 토폴로지에서 선택해 한 번에 묶어 이관할 수 있습니다. 본 코드 서빙(ROOT) 1개만 선택하면 단건 이관입니다.

### 메뉴 진입과 \[이관] 버튼

사이드바 `[서빙 > 코드 서빙]` → 이관하려는 코드 서빙 상세로 이동한 뒤 `[이관]` 버튼을 클릭하면 `[이관 신청]` 모달이 표시됩니다. 모달에는 ROOT와 연결된 코드 서빙이 **토폴로지 그래프** 및 **이관 대상 트리**로 함께 표시됩니다.

<figure><img src="/files/pGRBW35W1823wWS4H2fT" alt=""><figcaption><p>코드 서빙 상세 우상단의 이관 버튼</p></figcaption></figure>

> **표시 조건**: 운영망이 아니어야 하고, 코드 서빙 쓰기 권한이 있어야 하며, 커밋이 1개 이상 있어야 합니다. 진행 중인 신청(대기·진행중)이 있으면 `[이관]` 대신 `[이관 취소]`가 헤더에 단독 노출됩니다.

### 이관 대상 선택

토폴로지(또는 좌측 이관 대상 트리)에서 함께 이관할 코드 서빙 노드를 체크합니다.

* 본 코드 서빙(ROOT)은 **항상 포함**되며 선택을 해제할 수 없습니다.
* `[전체 해제]` 토글로 ROOT 제외 전체 선택을 한 번에 해제/선택합니다. 전체 해제 후 필요한 노드만 다시 선택하거나 ROOT 단독으로 이관할 수 있습니다.
* 하단 이관 요약 바가 선택에 따라 실시간 갱신됩니다.
* 함께 선택할 수 없는 경우:
  * **쓰기 권한이 없는 코드 서빙**: 이관 체크박스가 제공되지 않습니다. 영향도 파악을 위해 그래프에는 표시되며, 그 하위 자손도 선택할 수 없습니다.
  * **이미 이관 진행 중인 코드 서빙**: 체크박스가 비활성화되고 노드에 `[이관 진행중]` 라벨이 표시됩니다(한 신청에 같은 코드 서빙이 중복 묶이는 것을 방지). 하위 자손도 함께 선택할 수 없습니다.

<figure><img src="/files/U40QuxosBWPvbISV8NhS" alt=""><figcaption><p>이관 신청 모달 - 공통 정보(이관 사유·태그)와 이관 영향 토폴로지</p></figcaption></figure>

<figure><img src="/files/9ma5OEcLguzf33753NJI" alt=""><figcaption><p>이관 신청 모달 토폴로지 - 노드 체크로 이관 대상 선택</p></figcaption></figure>

### 이관 정보 입력 (대상별)

좌측 트리에서 코드 서빙을 클릭하면 우측에 해당 코드 서빙 전용 입력 폼이 열립니다. 이관 대상으로 선택한 코드 서빙마다 각각 입력·검증합니다.

* **브랜치 \***: 운영망에 반영할 커밋을 선택할 소스 브랜치.
* **커밋 해시 \***: 위 브랜치에서 운영망에 반영할 커밋 해시 선택·입력. (브랜치 변경 시 커밋 해시 선택이 초기화됩니다.)
* **외부 Git 연동 정보**
  * **URL \***: 운영망이 풀(Pull)해 갈 외부 Git 저장소 주소.
  * **브랜치(선택)**: 푸시할 대상 브랜치명. 미입력 시 저장소 기본 브랜치로 푸시.
  * **ID \***: 저장소 쓰기 권한이 있는 외부 Git 계정 ID. GitHub/GitLab은 임의 값 허용, Gitea/Bitbucket은 정확한 ID가 필요합니다.
  * **크레덴셜(PAT) \***: 계정 PAT. **마스킹 처리되며 PAT은 이관 시마다 입력**해야 합니다.
* 모달 상단에서 **이관 사유**(필수, 최대 255자)와 **태그**(최대 3개, 각 16자, 한/영/숫자/공백)를 입력합니다. 이관 사유·태그는 신청 건 전체에 적용됩니다.

인증 정보(ID·PAT)는 대상별로 개별 입력할 수 있으며, 비우면 상단 공통값이 사용됩니다.

<figure><img src="/files/4zUL8gwj1kWQQOSmME6h" alt=""><figcaption><p>이관 대상 트리와 대상별 입력 폼, 하단 이관 요약 바</p></figcaption></figure>

<figure><img src="/files/SEQaTCVl6nBE4ivautHw" alt=""><figcaption><p>대상별 입력 폼 - 브랜치·커밋 해시·외부 Git 정보</p></figcaption></figure>

### 대상별 \[검증]

각 코드 서빙의 필수값(커밋 해시·외부 Git URL·ID·PAT)을 입력한 뒤 `[검증]`을 클릭해 푸시 가능 여부를 확인합니다.

* **성공**: 트리의 상태 뱃지가 "검증 필요" → "검증 완료"로 바뀌고 "검증이 완료되었습니다." 토스트가 표시됩니다. 이관 요약 바에 반영됩니다.
* **실패**: 실패 사유가 입력 폼에 바로 안내됩니다. 해당 노드는 선택이 해제되고 비활성화되며, 하위 자손도 함께 선택할 수 없게 됩니다.
  * **인증 실패·만료로 안내되는 경우**: 외부 Git 계정 ID와 PAT을 다시 확인해 주세요. PAT이 만료되었거나 저장소 쓰기 권한이 없는 토큰일 수 있습니다.
  * **저장소에 커밋이 없다고 안내되는 경우**: 외부 Git URL이 올바른지 확인하고, 빈 저장소라면 초기 커밋을 만든 뒤 다시 검증해 주세요.
* 검증 완료 후 **커밋 해시·외부 Git URL·브랜치·ID·PAT 중 하나라도 변경하면** 해당 코드 서빙은 다시 "검증 필요"로 돌아가 재검증해야 합니다.

<figure><img src="/files/ZSvkybT0irEM90gKiwCU" alt=""><figcaption><p>외부 Git 연동 정보 입력과 검증 버튼</p></figcaption></figure>

### 이관 요약 확인과 신청

모달 하단 이관 요약 바에서 현재 신청 범위·진행 현황을 확인합니다.

* N개 함께 이관 (선택된 총수)
* N개 검증 완료
* N개 검증 필요

`[이관 신청]` 버튼을 클릭해 신청합니다.

* 선택한 모든 코드 서빙의 검증이 완료되어야 신청할 수 있습니다.
* 이관 사유가 비어 있으면 버튼이 비활성화됩니다. 중복된 외부 Git URL+브랜치 조합이 있어도 비활성화됩니다.
* 신청 완료 시 우측 상단 토스트와 함께 승인 권한자에게 알림이 발송됩니다.

신청 후 `[이관]` 버튼은 `[이관 취소]`로 전환되며, 결재 전까지 이 버튼으로 신청을 취소할 수 있습니다.

> **신청 취소는 묶음 전체 단위입니다.** 부분 취소는 지원하지 않습니다. 함께 신청한 코드 서빙(예: A·B·C) 중 어느 상세에서 `[이관 취소]`를 눌러도 신청 건 전체가 함께 취소됩니다. 취소는 대기 상태에서만 가능하며, 결재 진행(승인/반려) 후에는 취소할 수 없습니다.

> **PAT은 저장되지 않습니다.** 보안 정책에 따라 PAT은 이관 신청 시점에만 사용되며 검증·푸시 후 즉시 폐기됩니다. 다음 이관에 다시 입력해야 합니다.

## 이관 결재

이 절은 승인 권한이 있는 관리자에게 해당합니다. 승인 권한을 가진 사용자가 신청된 이관 건을 검토·결재합니다.

### 메뉴 진입과 필터링

사이드바 `[운영 > 승인]`으로 이동해 승인 목록에서 결재 대기 이관 건을 확인합니다. 상단 `[승인 유형]` 필터에서 `이관`을 선택하면 이관 건만 필터링됩니다.

<figure><img src="/files/hzVUrst6Hxyu85tPQ4XM" alt=""><figcaption><p>승인 목록의 승인 유형(이관) 필터</p></figcaption></figure>

### 검토와 신청 정보 확인

행 우측 `[검토]`를 클릭하면 이관 신청 상세 모달이 노출됩니다. 다음 정보를 확인할 수 있습니다.

* 신청 ID · 승인 상태
* 이관 사유 · 태그
* 외부 Git 인증 정보
* **이관 범위 그래프**: 이번 신청에 함께 포함된 코드 서빙 범위 토폴로지(조회 전용). 신청 대상이 아닌 연결 조상은 '이관 대상 아님'으로 흐리게 표기됩니다.
* **이관 대상 트리 + 대상 상세**: 코드 서빙별 커밋 해시·외부 Git URL·브랜치를 트리 선택에 따라 확인합니다.
* 요청자 · 요청 일시

<figure><img src="/files/IAr8TlNg9vcB1XsSYolM" alt=""><figcaption><p>이관 신청 검토 모달 - 신청 정보와 승인·반려 버튼</p></figcaption></figure>

### 승인 또는 반려

* **\[승인]**: 확인 후 함께 이관된 코드 서빙이 각자의 외부 Git 저장소로 **자동 푸시**되며, 신청자에게 승인 알림·완료 알림이 발송됩니다.
* **\[반려]**: 반려 사유 입력 후 처리합니다. 신청자에게 반려 알림(사유 포함)이 발송됩니다.

승인 권한이 없으면 검토 모달은 열리되 `[승인]`/`[반려]` 버튼이 비활성화됩니다(검토 전용).

## 이관 이력 및 재이관

상세 `코드 서빙 운영 이력` > `[이관]` 탭에서 신청한 이관 건 이력을 확인합니다. `[이관 신청 이력 상세]`를 클릭하면 신청 시점의 이관 범위 그래프·이관 대상 트리(코드 서빙별 이관 정보)를 조회할 수 있습니다.

* **이력 노출 범위**: 실제로 이관 신청·처리된 코드 서빙(예: A·B·C)의 상세에만 함께 노출됩니다. 들어오는 호출처럼 영향만 받는 코드 서빙에는 노출되지 않습니다.
* **신청 시점 기준 표시**: 신청 당시의 범위·정보·권한을 그대로 기록·표시합니다. 신청 이후 연결 관계가 변경되어도 제출된 신청 건에는 반영되지 않습니다.

<figure><img src="/files/gdaNE0Ogx2fWYZe013Km" alt=""><figcaption><p>코드 서빙 운영 이력의 이관 탭 신청 이력 목록</p></figcaption></figure>

### 재이관

승인된 이관 건은 상세에서 `[재이관]`으로 동일 범위를 다시 이관할 수 있습니다. **재이관은 신청 시 저장된 대상 전체를 시도합니다**(신규 선택 없음).

<figure><img src="/files/0ChD914Xc1aVPLFukMMN" alt=""><figcaption><p>이관 신청 이력 상세 모달과 재이관 버튼</p></figcaption></figure>

* 정상 코드 서빙은 그대로 이관에 성공합니다.
* **삭제되었거나 존재하지 않는 코드 서빙은 해당 건만 실패 처리**되며 나머지 성공 건에는 영향이 없습니다(**부분 성공**). 실패 건은 대상 상세 패널의 "실패 로그"에 사유가 기록되고 이관 실패 뱃지가 표시됩니다.
* **결과 안내**: 재이관 클릭 시 "시작" 토스트만 즉시 노출되고, 실제 결과는 알림으로 전달됩니다.
  * 전체 성공: "재이관이 완료되었습니다."
  * 부분 실패: "전체 (N)건 중 (성공 수)건 완료, (실패 수)건 실패."
  * 전체 실패: "재이관에 실패했습니다. 다시 시도해 주세요."

> `[재이관]` 버튼은 완료·진행중 상태의 행에 모두 노출됩니다(코드 서빙 쓰기 권한 필수). 본 행이 진행 중이거나 같은 코드 서빙에 다른 진행 중인 이관(대기·진행중)이 있으면 "이관 중"으로 비활성화되며, 재이관을 시도하면 이미 진행 중이라는 토스트로 차단됩니다. 진행 중인 건이 끝난 뒤 다시 시도해 주세요.

## 권한 규칙

이관·연결 관계 화면의 권한별 동작은 다음과 같습니다.

| 권한 / 상황           | 동작                                                     |
| ----------------- | ------------------------------------------------------ |
| 연결 관계 탭 조회 권한 없음  | 탭 콘텐츠 전면 차단 — "권한 없음" 메시지가 표시되고 토폴로지·호출 테이블이 표시되지 않습니다 |
| ROOT 쓰기 권한 없음     | `[연결 추가]` 버튼 미표시, 토폴로지에서 ROOT 노드를 쓰기 권한 없음 색상으로 표기     |
| 이관 대상 노드 쓰기 권한 없음 | 이관 체크박스 미제공(그래프에는 표시) + 입력 폼 비활성화, 그 하위 자손도 선택 불가      |
| 운영망 사용자           | `[이관]` 버튼 미표시 — 이관 신청 불가                               |
| 승인 권한 없음          | 검토 모달은 열리되 `[승인]`/`[반려]` 비활성(검토 전용)                    |
| 재이관 쓰기 권한 없음      | `[재이관]` 버튼 미표시                                         |

## 상태 표시와 화면 안내

### 이관 결과 상태

토폴로지 노드 뱃지와 범례에 표시되는 이관 결과 상태는 4종입니다.

| 상태  | 색  |
| --- | -- |
| 대기  | 주황 |
| 진행중 | 파랑 |
| 완료  | 초록 |
| 실패  | 빨강 |

범례 노출 순서는 대기 → 진행중 → 완료 → 실패입니다.

### 빈 / 로딩 / 오류 화면

| 상태            | 화면                                                   |
| ------------- | ---------------------------------------------------- |
| 연결 0건         | 토폴로지에 "연결 없음" 안내가 표시됩니다                              |
| 토폴로지 로딩       | 노드 자리 표시와 스피너가 표시됩니다                                 |
| 토폴로지 오류       | 오류 안내가 표시되며, 선택·폼은 빈 상태로 유지됩니다. 잠시 후 화면을 새로 고쳐 주세요   |
| 조회 권한 없음      | 연결 관계 탭 콘텐츠가 차단되고 "권한 없음" 메시지가 표시됩니다                 |
| 검증 필요 / 검증 완료 | 트리 상태 뱃지와 요약 바 카운트로 확인합니다                            |
| 이관 진행중 노드     | `[이관 진행중]` 라벨이 표시되고 체크박스가 비활성화됩니다                    |
| 신청 실패         | 실패 사유가 토스트로 안내됩니다. 안내된 사유를 확인해 입력값을 수정한 뒤 다시 신청해 주세요 |

## 입력 검증 규칙

| 항목                | 규칙                                        |
| ----------------- | ----------------------------------------- |
| 이관 사유             | 필수, 최대 255자. 비어 있으면 `[이관 신청]` 비활성         |
| 태그                | 최대 3개, 각 16자, 한/영/숫자/공백만 허용, 중복 불가        |
| 외부 Git URL+브랜치 중복 | (URL, 외부 Git 브랜치) 조합이 2건 이상이면 중복으로 신청 비활성 |
| 검증 무효화            | 커밋 해시·URL·브랜치·ID·PAT 중 하나라도 변경 시 재검증 필요   |
| 신청 전제             | 선택한 모든 대상 검증 완료 + 이관 사유 입력 + 중복 없음        |
| ROOT 선택           | 항상 포함, 해제 불가                              |

## 자주 묻는 질문 (FAQ)

**Q. 연결된 코드 서빙을 한 번에 이관할 수 있나요?**

네. 이관 신청 모달 토폴로지(또는 이관 대상 트리)에서 함께 이관할 코드 서빙을 선택하면 묶어서 신청됩니다. ROOT 1개만 선택하면 기존 단건 이관과 동일합니다.

**Q. 연결 관계도 운영망으로 같이 넘어가나요?**

아니요. 코드만 이관되며, 연결 관계는 환경 간 충돌 위험·보안 정책상 대상 망에서 다시 지정해야 합니다.

**Q. 들어오는 호출도 함께 이관되나요?**

아니요. 들어오는 호출은 조회 전용이며 이관 대상이 아닙니다.

**Q. 쓰기 권한이 없는 코드 서빙은 어떻게 되나요?**

이관 대상으로 선택할 수 없습니다(체크박스 미제공). 영향도 파악을 위해 그래프에는 표시됩니다. 이미 다른 신청으로 이관 진행 중인 코드 서빙도 함께 선택할 수 없습니다.

**Q. 인증 정보(ID·PAT)는 코드 서빙마다 입력해야 하나요?**

네. 이관 대상 코드 서빙별로 외부 Git ID·PAT을 각각 입력·검증해야 합니다.

**Q. 일부만 취소할 수 있나요?**

아니요. 신청 취소는 묶음 전체 단위로만 동작합니다. 함께 신청한 코드 서빙 중 어느 상세에서 취소하더라도 신청 건 전체가 취소됩니다.

**Q. 재이관 시 일부 코드 서빙이 삭제되었으면 어떻게 되나요?**

신청 당시 범위 전체를 시도하며, 존재하지 않는 코드 서빙만 실패 처리되고 나머지는 정상 이관됩니다(부분 성공). 실패 건은 이관 실패 뱃지·실패 로그로 사유가 안내됩니다.

**Q. 운영망과 개발망이 같은 외부 Git 저장소를 사용해야 하나요?**

아니요. 같은 저장소를 공유해도 되고, 운영망 전용 저장소를 별도로 사용해도 됩니다.

**Q. PAT을 매번 입력해야 하나요?**

네. 보안 정책에 따라 PAT은 저장하지 않으며, 이관 신청 시마다 입력하고 `[검증]`으로 인증을 확인해야 합니다.

**Q. 브랜치를 비워두고 신청해도 되나요?**

네. 미입력 시 외부 Git 저장소의 기본 브랜치(예: main)로 푸시됩니다.

## 사용자 시나리오

### 단건 코드 서빙 이관

의존 연결이 없는 코드 서빙을 이관합니다. 상세에서 `[이관]` 버튼을 누르면 ROOT만 대상으로 표시됩니다. 브랜치·커밋 해시·외부 Git URL·ID·PAT을 입력하고 `[검증]`을 거친 뒤 이관 사유를 입력해 신청합니다. 승인자가 승인하면 자동 푸시되고 완료 알림이 발송됩니다.

### 연결된 코드 서빙 묶음 이관

A가 B·C를 호출하는 경우, 먼저 A 상세 `[연결 관계]` 탭에서 B·C를 나가는 호출로 연결합니다. A 상세에서 `[이관]`을 눌러 토폴로지에서 B·C를 함께 선택하고, 각 코드 서빙마다 이관 정보를 입력·검증한 뒤 일괄 신청합니다. 승인 시 A·B·C가 각자의 외부 Git 저장소로 자동 푸시됩니다.

### 쓰기 권한이 없는 의존 서빙이 포함된 경우

묶음 안에 쓰기 권한이 없는 코드 서빙이 있으면, 해당 노드는 영향도 파악용으로 그래프에는 표시되지만 이관 체크박스가 제공되지 않고 그 하위 자손도 선택할 수 없습니다. 권한이 있는 나머지 대상만 선택해 신청합니다.

### 승인 후 재이관 (부분 성공)

과거 승인된 이관 건을 상세 `운영 이력 > [이관]` 탭에서 `[재이관]`합니다. 신청 당시 저장된 대상 전체를 다시 시도하며, 그 사이 삭제된 코드 서빙만 실패 처리되고 나머지는 정상 이관됩니다. 결과는 알림으로 "전체 N건 중 M건 완료, K건 실패"처럼 전달됩니다.


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://genos-docs.gitbook.io/default/v1.8.8/basic-tutorials/guides/development/code_serving/promotion_code_serving.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
