> ## Documentation Index
> Fetch the complete documentation index at: https://docs.replit.com/llms.txt
> Use this file to discover all available pages before exploring further.

# 다른 워크스페이스로 프로젝트를 수동으로 복사하기

> 라이브 앱을 다른 워크스페이스나 계정으로 직접 복사하기: 코드를 복사하고, 새 앱을 설정하고, 최소한의 다운타임으로 사용자를 새 앱으로 안내하고, 되돌리는 방법을 알아보세요

이 가이드는 앱을 다른 워크스페이스나 계정으로 직접 복사하는 방법을 안내합니다. 코드를 복사하고, 새 앱을 설정하고, 데이터를 복사한 다음, 사용자를 새 앱으로 안내합니다.

아무것도 이동되거나 삭제되지 않습니다. 이전 프로젝트는 원래 있던 자리에 그대로 남아 있으며, 두 복사본은 서로 동기화되지 않습니다. 작업이 끝나면 이전 프로젝트를 유지할지 삭제할지 선택할 수 있습니다.

<Note>
  기본 제공되는 원클릭 이전 기능을 찾고 계신가요? [팀으로 앱 이전하기](/ko/teams/identity-and-access-management/transfer-app-to-teams)를 참조하세요. 이 옵션을 사용할 수 없거나 계정 간에 복사해야 하는 경우 이 가이드를 사용하세요.
</Note>

## 시작하기 전에

다음이 필요합니다:

* 이전 프로젝트와 새 워크스페이스 또는 계정 모두에 대한 액세스 권한
* 최종 전환을 위한 약 1시간의 집중 시간. 이전 단계들은 며칠에 걸쳐 진행할 수 있습니다.
* 앱에 커스텀 웹 주소가 있는 경우, 해당 도메인을 관리하는 곳에 대한 액세스 권한

두 가지는 자동으로 복사되지 않으며 가장 많은 시간이 소요됩니다: **데이터베이스**와 **웹 주소**입니다. 이 가이드에서는 두 가지 모두를 다룹니다.

<Note>
  워크스페이스 관리자가 [소스 코드 내보내기 금지](/ko/teams/enterprise-privacy-settings#ban-source-code-export)를 활성화한 경우, 프로젝트를 zip으로 다운로드할 수 없습니다. 시작하기 전에 워크스페이스 관리자와 협의하세요—관리자는 수동 복사가 허용되는지, 코드와 데이터베이스를 이동하는 방법을 확인해 줄 수 있습니다.
</Note>

## 다운타임 계획하기

두 번째 매장을 열고 첫 번째 매장을 닫는 것으로 생각하세요. 이전 매장이 닫히고 새 매장이 아직 열리지 않는 짧은 시간이 있습니다. 그 시간 동안 아무도 앱을 사용할 수 없습니다.

**앱이 얼마나 오래 오프라인 상태가 되나요?** 보통 15분에서 60분입니다. 데이터베이스에 저장된 데이터 양과 웹 주소가 얼마나 빨리 업데이트되는지에 따라 다릅니다.

**데이터를 잃을 수 있나요?** 데이터베이스를 복사한 후 누군가 이전 앱에 데이터를 추가하는 경우에만 그렇습니다. 이를 방지하기 위해 최종 복사를 하기 *전에* 이전 앱을 오프라인으로 전환합니다. 이 가이드는 그 순서대로 구성되어 있습니다.

**되돌릴 수 있나요?** 네. 이전 프로젝트는 삭제되지 않습니다. 문제가 발생하면 이전 앱을 다시 게시하면 이전과 똑같이 작동합니다.

**언제 해야 하나요?** 앱을 사용하는 사람이 적은 시간을 선택하세요. 가능하다면 사전에 사용자에게 알리세요.

## 1단계: 코드를 새 프로젝트로 복사하기

방법을 하나 선택하세요. 이 단계에서는 이전 앱이 계속 실행됩니다. 두 방법 모두 코드를 옮깁니다. GitHub는 항상 커밋 히스토리를 옮기지만, zip은 `.git` 폴더를 포함하는 경우에만 히스토리를 옮깁니다:

|              | GitHub 사용                      | zip 파일 사용                                                                |
| ------------ | ------------------------------ | ------------------------------------------------------------------------ |
| **코드 파일**    | 커밋하고 푸시한 파일만                   | 커밋되지 않은 변경 사항을 포함한 디스크의 모든 것                                             |
| **커밋 히스토리**  | 원격 저장소의 전체 히스토리                | zip에 `.git` 폴더가 포함된 경우 전체 히스토리. 가져오기 제한 이하로 유지하기 위해 `.git`을 제외하면 히스토리 없음 |
| **의존성 폴더**   | `.gitignore`를 따름               | 제외됨 (`node_modules`, `.venv`, `build` 등); 가져오기 시 재설치됨                    |
| **요구 사항**    | 두 Replit 계정 모두에 연결된 GitHub 계정  | 없음                                                                       |
| **지속적인 동기화** | 두 복사본 모두 동일한 저장소를 푸시 및 풀할 수 있음 | 없음—일회성 스냅샷                                                               |
| **적합한 경우**   | Git으로 장기간 백업하려는 프로젝트           | 빠른 일회성 복사                                                                |

### GitHub 사용

<Steps>
  <Step title="이전 프로젝트를 GitHub에 푸시하기">
    이전 프로젝트에서 [Git 창](/ko/features/workspace-tools/git-interface)을 열고, GitHub 저장소에 연결한 다음 커밋하고 푸시하세요. 코드를 공개하려는 경우가 아니라면 비공개 저장소를 사용하세요.
  </Step>

  <Step title="새 계정에 액세스 권한 부여하기">
    새 워크스페이스가 다른 Replit 계정에 속한 경우, 해당 계정의 GitHub 계정이 저장소에 액세스할 수 있어야 합니다. 비공개 저장소의 경우, 해당 GitHub 계정을 협력자로 추가하거나 공유 GitHub 조직을 사용하세요.
  </Step>

  <Step title="새 워크스페이스에서 가져오기">
    새 계정에 로그인하고 [replit.com/import](https://replit.com/import)를 연 다음 **GitHub**을 선택하고, GitHub 계정을 연결하고, 저장소를 선택하세요. 문제 해결 방법은 [제공업체에서 가져오기](/ko/build/import-from-providers)를 참조하세요.
  </Step>

  <Step title="복사본 확인하기">
    새 프로젝트를 열고 파일과 커밋 히스토리가 있는지 확인하세요. Replit은 가져오기 중에 의존성을 설치하고 실행 명령을 구성합니다.
  </Step>
</Steps>

<Warning>
  GitHub는 커밋하고 푸시한 것만 받습니다. `.gitignore`에 일치하는 파일과 커밋되지 않은 변경 사항은 남습니다. 시크릿 값이나 데이터베이스 덤프를 저장소에 절대 커밋하지 마세요.
</Warning>

### zip 파일 사용

<Steps>
  <Step title="이전 프로젝트 다운로드하기">
    이전 프로젝트에서 파일 트리 상단의 세 점 메뉴를 선택하고 **zip으로 다운로드**를 선택하세요.

    다운로드가 성공하고 파일이 200MB 미만이면 다음 단계로 넘어가세요.

    200MB보다 큰 zip 파일도 다운로드는 성공할 수 있습니다. 하지만 [ZIP 가져오기](/ko/build/import-from-providers#limitations)는 200MB를 초과하는 파일을 거부하므로 Replit이 이를 사용해 새 프로젝트를 만들 수 없습니다. 다운로드가 실패하거나 zip이 200MB를 초과하면 더 작은 파일을 만드세요:

    1. 이전 프로젝트에서 **Shell** 도구를 여세요.

    2. 다음 명령을 붙여넣고 Enter를 누르세요. 이 명령은 `project.zip`이라는 파일을 만들고 Replit이 자체적으로 재구성할 수 있는 폴더는 제외합니다:

       ```bash theme={null}
       zip -r project.zip . -x ".cache/*" "node_modules/*" ".venv/*" "venv/*" ".pythonlibs/*" "build/*" "target/*" ".next/*" "__pycache__/*"
       ```

    3. 크기를 확인하세요. 다음 명령을 붙여넣고 Enter를 누르세요. 이 명령은 150MB의 경우 `150M`과 같이 MB 단위로 크기를 출력합니다:

       ```bash theme={null}
       du -h project.zip
       ```

    4. 크기가 200MB를 초과하면 편집 히스토리를 제외하여 파일을 더 작게 만드세요. 두 줄을 모두 붙여넣고 Enter를 누르세요:

       ```bash theme={null}
       rm project.zip
       zip -r project.zip . -x ".cache/*" ".local/*" ".git/*" "node_modules/*" ".venv/*" "venv/*" ".pythonlibs/*" "build/*" "target/*" ".next/*" "__pycache__/*"
       ```

       zip을 200MB 미만으로 줄여야 할 때만 `.local`과 `.git`을 제외하세요. 이렇게 제외해도 이전 프로젝트에서 두 폴더가 삭제되지는 않습니다. 하지만 `.git`이 없는 zip에는 프로젝트의 커밋 히스토리가 포함되지 않습니다. 히스토리를 보존해야 한다면 GitHub 방법을 사용하세요.

    5. 파일 트리에서 `project.zip`을 찾아 옆의 세 점 메뉴를 선택하고 **Download**를 선택하세요.

    `.cache` 폴더에는 캐시된 시크릿 값을 포함한 Replit 내부 상태가 저장됩니다. 직접 만드는 zip 파일에서는 항상 이 폴더를 제외하세요. 프로젝트에 다른 큰 생성 폴더가 있다면 제외 목록에 추가하세요.
  </Step>

  <Step title="새 워크스페이스에서 가져오기">
    새 계정에 로그인하고 [replit.com/import](https://replit.com/import)를 연 다음 **ZIP**을 선택하고 파일을 업로드하세요.
  </Step>

  <Step title="복사본 확인하기">
    새 프로젝트를 열고 파일이 있는지 확인하세요. zip에 `.git` 폴더가 포함되어 있다면 커밋 히스토리도 함께 옮겨집니다. 더 작은 아카이브 명령을 사용했다면 새 프로젝트는 커밋 히스토리 없이 시작됩니다. Replit은 가져오기 중에 제외된 의존성을 다시 설치합니다.
  </Step>
</Steps>

## 2단계: 새 앱 설정하기

이전 앱은 여전히 실행 중입니다. 이 단계에서는 데이터의 *테스트 복사본*으로 새 앱을 완전히 작동시켜, 나중에 최종 전환을 빠르게 진행할 수 있도록 합니다.

<Steps>
  <Step title="시크릿 추가하기">
    시크릿 값(API 키, 비밀번호)은 이전 프로젝트를 벗어나지 않습니다. 두 프로젝트 모두에서 [시크릿](/ko/core-concepts/project-editor/app-setup/secrets) 도구를 열고 각 항목을 직접 복사하세요. 배포 시크릿도 포함하세요.
  </Step>

  <Step title="커넥터와 기타 서비스 다시 연결하기">
    새 프로젝트의 **도구 → 커넥터**에서 각 통합을 다시 연결하세요. App Storage, 협력자 및 기타 항목은 [자동으로 복사되지 않는 항목 다시 만들기](#re-create-what-doesnt-copy-over)를 참조하세요.
  </Step>

  <Step title="새 앱 게시하기">
    새 프로젝트를 [게시](/ko/features/publishing/overview)하세요. 새 프로젝트는 자체 `replit.app` 웹 주소와 자체 빈 프로덕션 데이터베이스를 갖게 됩니다. 아직 커스텀 도메인은 연결하지 마세요.
  </Step>

  <Step>
    아래 [데이터베이스 복사하기](#copy-the-database)를 따라, 새 프로젝트의 **프로덕션** 데이터베이스를 대상으로 사용하세요. 이렇게 하면 테스트할 실제 데이터를 얻을 수 있습니다. 3단계에서 이 복사본을 최신 데이터로 교체합니다.
  </Step>

  <Step>
    새 앱을 `replit.app` 주소로 열고 사용자처럼 사용해 보세요. 다음 단계로 넘어가기 전에 문제가 있는 부분을 수정하세요. 아직 사용자에게는 영향이 없습니다.
  </Step>
</Steps>

## 3단계: 사용자를 새 앱으로 전환하기

다운타임이 발생하는 부분입니다. 한 번에 진행하세요.

<Steps>
  <Step title="이전 앱 오프라인으로 전환하기">
    이전 프로젝트에서 **Publishing** 도구를 열고 **Unpublish**를 선택하세요. 이제 앱이 오프라인 상태가 됩니다. 이 시점부터 아무도 새 데이터를 추가할 수 없으므로, 다음에 만드는 복사본은 완전한 데이터를 담게 됩니다.
  </Step>

  <Step title="데이터베이스를 마지막으로 한 번 더 복사하기">
    아래 [데이터베이스 복사하기](#copy-the-database)를 따라, 새 프로젝트의 **프로덕션** 데이터베이스를 대상으로 사용하세요. 이 복사본에는 최신 데이터가 모두 담겨 있습니다.
  </Step>

  <Step title="웹 주소를 새 앱으로 연결하기">
    앱이 커스텀 도메인을 사용하는 경우: 이전 프로젝트에서 **Publishing → Domains**를 열고 도메인 연결을 해제하세요. 새 프로젝트에서 **Publishing → Domains**를 열고 [연결](/ko/features/publishing/custom-domains#connect-a-domain-you-already-own)하세요. Replit이 요청하면 도메인 제공업체(예: GoDaddy나 Namecheap)에서 레코드를 업데이트하세요.

    새 주소가 모든 사용자에게 적용되기까지 몇 분에서 몇 시간이 걸릴 수 있습니다. 그동안 일부 방문자는 오류를 볼 수 있습니다.

    앱이 `replit.app` 주소만 사용한다면 대신 사용자에게 새 주소를 공유하세요.
  </Step>

  <Step title="새 앱이 실행 중인지 확인하기">
    웹 주소를 열고 새 앱이 데이터와 함께 로드되는지 확인하세요. 앱이 다시 온라인 상태가 되었습니다.
  </Step>
</Steps>

## 데이터베이스 복사하기

코드 복사는 데이터베이스에 영향을 주지 않습니다. PostgreSQL의 `pg_dump` 및 `pg_restore` 도구를 사용해 데이터를 복사하세요. 두 도구 모두 두 프로젝트의 Shell에서 사용할 수 있습니다. 2단계와 3단계 모두 여기를 참조합니다. 명령은 매번 동일하며 *대상*만 바뀝니다.

<Warning>
  `pg_dump`를 실행한 후 기록된 데이터는 복사본에 포함되지 않습니다. 3단계의 최종 복사에서는 먼저 이전 앱을 오프라인으로 전환하세요.
</Warning>

<Steps>
  <Step title="이전 프로젝트에서 데이터 내보내기">
    이전 프로젝트에서 **Shell** 도구를 여세요. 다음 명령을 붙여넣고 Enter를 누르세요. 이 명령은 파일 트리에 `backup.dump`라는 파일을 만듭니다:

    ```bash theme={null}
    pg_dump -Fc "$DATABASE_URL" --no-owner --no-privileges -f backup.dump
    ```

    이는 **개발** 데이터베이스를 내보냅니다. 실제 데이터는 보통 **프로덕션** 데이터베이스에 있습니다. 프로덕션 데이터베이스를 내보내려면:

    1. **Database** 도구를 열고 프로덕션 데이터베이스를 선택한 다음 **Settings**를 여세요.
    2. 연결 문자열을 복사하세요.
    3. 위 명령에서 `"$DATABASE_URL"`을 연결 문자열로 바꾸고, 인용 부호는 그대로 유지하세요.

    찾을 수 없다면 [연결 세부 정보](/ko/features/data-and-storage/connection-details)를 참조하세요.
  </Step>

  <Step title="덤프 파일을 새 프로젝트로 이동하기">
    이전 프로젝트의 파일 트리에서 `backup.dump` 옆의 세 점 메뉴를 선택하고 다운로드하세요. 그런 다음 파일 트리의 **Upload files** 옵션으로 새 프로젝트에 업로드하세요.

    GitHub로 코드를 복사한 경우, 덤프 파일을 커밋하지 마세요. 데이터가 저장소에 남지 않도록 별도로 이동하세요.
  </Step>

  <Step title="새 프로젝트에서 데이터 가져오기">
    새 프로젝트에서 **Shell** 도구를 여세요. 다음 명령을 붙여넣고 Enter를 누르세요:

    ```bash theme={null}
    pg_restore --clean --if-exists --single-transaction --no-owner --no-privileges --exit-on-error -d "$DATABASE_URL" backup.dump
    ```

    위와 같이 작성하면 새 프로젝트의 **개발** 데이터베이스로 가져옵니다. 2단계에서는 이것이 필요합니다.

    3단계의 최종 복사에서는 대신 **프로덕션** 데이터베이스가 필요합니다. 새 프로젝트에서 **Database** 도구를 열고 프로덕션 데이터베이스를 선택한 다음 **Settings**를 열고 연결 문자열을 복사하여 `"$DATABASE_URL"` 대신 사용하세요.

    이 명령은 대상 데이터베이스의 일치하는 객체를 삭제한 다음 데이터를 로드합니다. 출력 없이 완료되면 성공한 것입니다.
  </Step>
</Steps>

<Note>
  `pg_restore`가 역할 또는 정책 오류로 실패하면, 데이터베이스가 새 프로젝트에 아직 존재하지 않는 커스텀 PostgreSQL 역할을 사용하고 있는 것입니다. 도움이 필요하면 [지원팀에 문의](https://replit.com/support)하세요.
</Note>

<Note>
  새 프로젝트가 [레거시 Neon 개발 데이터베이스](/ko/features/data-and-storage/development-and-production#legacy-development-database)를 사용하는 경우, 게시 플로우에서 **현재 개발 데이터로 프로덕션 데이터베이스 설정**을 제공합니다. 이는 게시하는 시점에 개발 데이터베이스에 있는 내용을 복사합니다. 테스트용으로는 괜찮지만, 최종 전환에서는 최신 데이터를 얻기 위해 위의 단계를 사용하세요.
</Note>

## 자동으로 복사되지 않는 항목 다시 만들기

프로젝트 설정의 나머지 부분은 파일 시스템 외부에 저장됩니다. 각 항목을 새 프로젝트에서 다시 만드세요:

| 항목              | 해야 할 일                                                                                                                                               |
| --------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------- |
| **시크릿**         | 시크릿 값은 이전 프로젝트를 벗어나지 않습니다. 배포 시크릿을 포함해 새 프로젝트의 [시크릿](/ko/core-concepts/project-editor/app-setup/secrets) 도구에 다시 추가하세요.                               |
| **계정 시크릿**      | 새 프로젝트에서 [연결](/ko/core-concepts/project-editor/app-setup/secrets#manage-account-secrets)하세요. 새 프로젝트가 다른 계정에 속한 경우 먼저 해당 계정에 추가하세요.                   |
| **App Storage** | 버킷은 이동하지 않습니다. 동일한 계정 내에서는 [기존 버킷을 추가](/ko/features/data-and-storage/object-storage#bucket-access-management)하세요. 계정 간에는 객체를 다운로드하여 새 버킷에 업로드하세요.    |
| **커넥터**         | 새 프로젝트의 **도구 → 커넥터**에서 각 통합을 다시 연결하세요. [통합 개요](/ko/features/integrations/overview)를 참조하세요.                                                           |
| **배포**          | 복사본은 게시되지 않은 상태입니다. [2단계](#step-2-set-up-the-new-app)에서처럼 새 워크스페이스에서 [게시](/ko/features/publishing/overview)하세요.                                      |
| **커스텀 도메인**     | 이전 배포에서 도메인을 제거하고 새 배포에 연결한 다음 DNS 레코드를 업데이트하세요. [3단계](#step-3-switch-your-users-to-the-new-app)에서 다룹니다.                                             |
| **협력자**         | 새 워크스페이스에서 협력자를 다시 초대하고 [액세스 권한](/ko/teams/identity-and-access-management/groups-and-permissions)을 설정하세요.                                            |
| **Agent 히스토리**  | Agent 대화와 [체크포인트](/ko/features/version-control/checkpoints-and-rollbacks) 롤백은 이전 프로젝트에 남습니다. 체크포인트 커밋은 Git 히스토리와 함께 이동하지만, 복사본에서는 그 지점으로 롤백할 수 없습니다. |

## 문제가 발생한 경우

이전 프로젝트는 여전히 존재합니다. 돌아가려면:

1. 이전 프로젝트에서 **Publishing** 도구를 열고 **Publish**를 선택하세요.
2. 커스텀 도메인을 이동했다면 같은 방법으로 다시 이동하세요.

앱은 오프라인으로 전환했을 때의 데이터로 다시 실행됩니다. 아무것도 손실되지 않았습니다.

## 정리하기

새 앱이 정상적으로 작동하는지 확인하기 위해 일주일 정도 기다리세요. 그런 다음:

* 두 프로젝트와 기기에서 `backup.dump`를 제거하세요. 각 복사본에는 데이터의 전체 내보내기가 포함되어 있습니다.
* 원한다면 이전 프로젝트를 삭제하세요.

## 관련 리소스

* [팀으로 앱 이전하기](/ko/teams/identity-and-access-management/transfer-app-to-teams): 프로젝트를 팀 워크스페이스로 또는 팀 워크스페이스 간에 이동하기 위한 기본 제공 이전 기능
* [제공업체에서 가져오기](/ko/build/import-from-providers): 지원되는 모든 가져오기 소스
* [공유 데이터베이스를 사용하는 게시된 앱 수정하기](/ko/features/data-and-storage/shared-database-migration): 더 많은 `pg_dump` 및 `pg_restore` 문제 해결 방법
