> ## Documentation Index
> Fetch the complete documentation index at: https://ayakaleaf-pro.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# Dropbox 동기화

> 사용자가 자신의 프로젝트를 Dropbox의 폴더와 동기화할 수 있도록 합니다.

> [!NOTE]
>
> 이 기능은 [ayaka-notes/ayakaleaf-pro](https://github.com/ayaka-notes/ayakaleaf-pro)에서 개발했습니다. v6.3.1에서 얼리 프리뷰로 도입되었으며 v6.4.0에서 정식 출시될 예정이므로, 구성과 동작이 아직 변경될 수 있습니다. 문제가 있으면 피드백을 보내주세요.

Dropbox 동기화는 Overleaf Cloud에서처럼 사용자의 프로젝트를 Dropbox와 동기화된 상태로 유지합니다. 사용자가 Dropbox 계정을 연결하면 각 프로젝트가 `Apps/<your Dropbox app>/`에 폴더로 나타나고, Overleaf의 변경 사항은 Dropbox로 전송되며, Dropbox에서 변경한 내용은 Overleaf로 반영됩니다.

### Dropbox 동기화 설정

> [!WARNING]
>
> 먼저 [git-bridge](https://ayakaleaf-pro.mintlify.site/ko/on-premises/configuration/overleaf-toolkit/integrations/git-integration.md)를 활성화해야 합니다. 활성화하지 않으면 계정 설정에서 프로젝트 동기화 섹션이 표시되지 않습니다.
>
> ```dotenv title="config/overleaf.rc" theme={null}
> GIT_BRIDGE_ENABLED=true
> ```

앱을 소유할 Dropbox 계정으로 로그인한 상태에서 [Dropbox App Console](https://www.dropbox.com/developers/apps)에서 앱을 만드세요.

1. **Create app**을 클릭한 다음 페이지를 작성하세요.
   * **1. Choose an API**: **Scoped access**를 선택합니다.
   * **2. Choose the type of access you need**: **Full Dropbox**가 아닌 **App folder**를 선택합니다. Overleaf는 앱 폴더 안에서만 동기화합니다.
   * **3. Name your app**: 이름을 입력합니다(예: `Overleaf`). 이 이름은 Dropbox에서 고유해야 합니다. 각 사용자의 프로젝트는 해당 사용자 Dropbox의 `Apps/<name of your app>/`에 나타나며, 이 이름이 아래의 `DROPBOX_APP_NAME`입니다.
   * **Create app**을 클릭합니다. 앱이 **Settings** 탭에서 열립니다.
2. **Permissions** 탭의 **Files and folders**에서 `files.metadata.write`, `files.content.write`, `files.content.read`를 체크하세요. `account_info.read`와 `files.metadata.read`는 함께 체크되며 해제할 수 없습니다. 다른 권한은 체크하지 마세요.
3. **Permissions** 탭 하단 표시줄에서 **Submit**을 클릭하세요. **Submit을 클릭하지 않으면 권한이 저장되지 않으며**, Dropbox는 계정을 연결한 사용자의 파일 동기화를 거부합니다.

![](https://mintcdn.com/ayakaleaf-pro/34P8O6kHo91beEvQ/images/on-premises/dropbox-app-permissions.png?fit=max\&auto=format\&n=34P8O6kHo91beEvQ\&q=85\&s=8e99711b1fcf03d3d1655f65fea3a6b8)

Dropbox App Console: 체크할 권한, Submit으로 저장

4. **Settings** 탭의 **OAuth 2**에서 **Redirect URIs**에 `${OVERLEAF_SITE_URL}/user/dropbox/oauth/callback`을 입력한 다음 **Add를 클릭하세요**. URI를 입력하는 것만으로는 충분하지 않습니다. 입력란 위의 목록에 표시되어야 저장된 것입니다.

![](https://mintcdn.com/ayakaleaf-pro/34P8O6kHo91beEvQ/images/on-premises/dropbox-app-redirect-uri.png?fit=max\&auto=format\&n=34P8O6kHo91beEvQ\&q=85\&s=d980dc4dec22a90b5bf1f7e147cfc7c0)

Dropbox App Console: 리디렉션 URI를 입력한 다음 Add 클릭

5. **Settings** 탭의 **Webhooks**에서 **Webhook URIs**에 `${OVERLEAF_SITE_URL}/dropbox/webhook`을 입력한 다음 마찬가지로 **Add를 클릭하세요**. Dropbox는 즉시 이 주소를 호출하여 확인하므로, Overleaf가 아래 설정으로 이미 실행 중이어야 하며 인터넷에서 접근할 수 있어야 합니다([Webhook](#webhook) 참조). 확인을 통과하면 상태가 **Enabled**로 표시됩니다.

**Settings** 탭에서 **App key**와 **App secret**(**Show** 클릭)을 복사한 다음 overleaf 환경 변수 파일에 다음 설정을 추가하세요. 웹훅(5단계)은 Overleaf가 이 설정으로 실행된 후에 추가할 수 있습니다.

```dotenv title="config/variables.env" wrap theme={null}
# used to encrypt the user's Dropbox refresh token.
# How to generate: `openssl rand -hex 32`
DROPBOX_TOKEN_CIPHER_PASSWORD=0123456789ABCDEFG # changed to yours

# Dropbox Sync Settings
DROPBOX_ENABLED=true
DROPBOX_APP_KEY=
DROPBOX_APP_SECRET=
# the name of your Dropbox app (step 1), which is the folder name in Apps/
DROPBOX_APP_NAME=Overleaf

# OAuth callback is: ${OVERLEAF_SITE_URL}/user/dropbox/oauth/callback
# Webhook is: ${OVERLEAF_SITE_URL}/dropbox/webhook
# (Optional) DROPBOX_SYNC_PROXY_URL=http://10.0.0.1:10808
```

> [!WARNING]
>
> * 리디렉션 URI와 웹훅을 구성하기 전에 `OVERLEAF_SITE_URL`이 올바르게 설정되어 있는지 확인하세요.
> * Dropbox는 사용자가 계정을 연결할 때 토큰의 권한을 고정합니다. 권한을 제출해도 기존 토큰은 변경되지 않습니다. 권한을 제출하기 전에, 또는 권한을 변경하기 전에 연결한 사용자는 Dropbox 계정의 연결을 해제한 후 다시 연결해야 합니다.
> * 새 앱은 **Development** 상태입니다. **Settings** 탭의 **Development users**에 **Only you**가 표시되면 본인의 Dropbox 계정만 연결할 수 있습니다. 다른 사용자도 계정을 연결할 수 있도록 하려면 **Enable additional users**를 클릭하세요. 그러면 연결된 사용자 수가 표시됩니다(예: `1 / 500`). **Development 앱은 최대 500명의 사용자만 허용합니다**. 더 많은 사용자가 필요하면 **Apply for production**을 클릭하세요. 그러면 Dropbox가 앱을 검토합니다.

네트워크 접근이 제한된 지역에 있는 경우 Dropbox에 접근하기 위해 프록시를 구성해야 할 수 있습니다. 다음 환경 변수를 설정하세요: `DROPBOX_SYNC_PROXY_URL=http://10.0.0.1:10808`. 표준 HTTP/HTTPS 포워드 프록시여야 하며 `127.0.0.1`을 사용해서는 안 됩니다.

#### 데이터베이스 인덱스 생성

사용자가 Dropbox 계정을 연결하기 전에 한 번 실행하세요. Dropbox 동기화가 사용하는 인덱스는 자동으로 생성되지 않으므로, 인덱스가 없으면 모든 동기화 조회가 컬렉션 전체를 스캔합니다.

Toolkit 사용자는 `bin/mongo`를 실행하세요. Docker Compose 사용자는 `docker compose exec mongo mongosh sharelatex`를 실행하세요. 그런 다음 다음 내용을 붙여넣으세요:

```js theme={null}
db.dropboxEntities.createIndex(
  { 'overleaf.userId': 1, 'dropbox.id': 1 },
  { name: 'overleaf.userId_1_dropbox.id_1', unique: true,
    partialFilterExpression: { 'dropbox.id': { $exists: true } } })
db.dropboxEntities.createIndex(
  { 'overleaf.userId': 1, 'overleaf.id': 1 },
  { name: 'overleaf.userId_1_overleaf.id_1', unique: true,
    partialFilterExpression: { 'overleaf.id': { $exists: true } } })
db.dropboxEntities.createIndex({ 'overleaf.userId': 1, 'dropbox.pathLower': 'hashed' })
db.dropboxProjects.createIndex({ userId: 1, projectId: 1 }, { name: 'projectId_userId_1', unique: true })
db.dropboxProjects.createIndex({ userId: 1, dropboxId: 1 }, { name: 'userId_dropboxId_1', unique: true })
```

다시 실행해도 문제없습니다. MongoDB는 이미 존재하는 인덱스를 건너뜁니다.

> [!CAUTION]
>
> 대신 `tools/migrations`의 `dropboxEntities` 마이그레이션을 실행하지 마세요. `20220825160708_recreate_dropboxEntities`는 컬렉션을 삭제하므로 모든 사용자의 동기화 상태가 삭제됩니다.

### Webhook

Dropbox는 웹훅을 통해 Dropbox의 변경 사항을 Overleaf에 알리므로, 변경 사항이 몇 초 안에 Overleaf에 나타납니다. 웹훅은 사이트 주소인 `${OVERLEAF_SITE_URL}/dropbox/webhook`으로 전송되므로 추가 포트는 필요 없지만, **Dropbox가 인터넷에서 이 주소에 접근할 수 있어야 합니다**. App Console에서 웹훅을 추가하면 Dropbox가 즉시 확인합니다.

웹훅이 없는 경우(예: Dropbox가 접근할 수 없는 서버), Overleaf의 변경 사항은 여전히 Dropbox로 전송되지만, Dropbox의 변경 사항은 사용자가 편집기의 Dropbox 대화 상자에서 \_sync this project now\_를 클릭할 때만 반영됩니다.

### 동기화 방식

* **연결**: 사용자가 Dropbox 계정을 연결하면 사용자가 소유한 프로젝트가 Dropbox로 전송됩니다. 사용자와 공유된 프로젝트는 다음 변경 시 Dropbox에 나타납니다.
* **Overleaf에서 Dropbox로**: 새 파일, 이름 변경, 이동, 삭제, 프로젝트 이름 변경은 즉시 전송됩니다. 편집기에서 수정한 내용은 모든 사용자가 프로젝트를 떠나고 몇 분 후 Overleaf가 저장소에 저장하면 전송됩니다. 더 빨리 전송하려면 편집기의 Dropbox 대화 상자에서 \_sync this project now\_를 클릭하세요(1분에 한 번).
* **Dropbox에서 Overleaf로**: 프로젝트 폴더의 새 파일 및 변경된 파일, 새 폴더, 삭제가 프로젝트에 적용됩니다. 앱 폴더 최상위에 새 폴더를 만들면 새 프로젝트가 됩니다. Dropbox에서 프로젝트 폴더를 삭제하면 Overleaf에서 해당 프로젝트가 삭제된 것으로 표시됩니다.
* **충돌**: 같은 파일이 양쪽에서 동시에 변경되면 마지막 변경이 우선합니다. Dropbox는 다른 버전을 \_conflicted copy\_로 보관할 수 있습니다.
* **공동 작업자**: Dropbox를 연결한 공동 작업자는 자신과 공유된 프로젝트를 받습니다. 보기 전용 사용자와 검토자도 프로젝트를 받지만, Dropbox에서 변경한 내용은 Overleaf로 다시 동기화되지 않습니다.
* **무시되는 파일**: 빌드 출력(`.aux`, `.log`, …), `.DS_Store`, Python 가상 환경 등 Overleaf가 동기화하지 않는 파일은 Dropbox에만 남습니다.

### Q\&A

> [accordion] 사용자가 Dropbox 계정을 연결할 수 없는 이유는 무엇인가요?
>
> **답변:**
>
> * Overleaf가 아직 알지 못하는 Dropbox 폴더는 이름으로 프로젝트와 매칭되므로, 같은 이름의 프로젝트가 있는 사용자는 먼저 해당 프로젝트의 이름을 변경하라는 안내를 받습니다. 이름은 대소문자를 구분하지 않고 비교되며, 보관된 프로젝트와 휴지통에 있는 프로젝트도 포함됩니다.
> * 하나의 Dropbox 계정은 하나의 Overleaf 계정에만 연결할 수 있습니다.

> [accordion] Dropbox 계정의 연결이 해제된 이유는 무엇인가요?
>
> **답변:** Overleaf는 Dropbox가 토큰을 거부하는 경우(예: 사용자가 Dropbox에서 앱을 제거한 후), Dropbox 용량이 가득 찬 경우, 또는 Dropbox가 계정을 정지한 경우 Dropbox 계정의 연결을 해제합니다. 사용자가 계정을 다시 연결할 때까지 프로젝트 목록의 알림을 통해 이 중 어떤 일이 발생했는지 알려 줍니다. 문제가 해결되면 사용자는 다시 연결할 수 있습니다.

> [accordion] Dropbox에서 프로젝트 폴더의 이름을 변경할 수 있나요?
>
> **답변:** 대신 Overleaf에서 프로젝트 이름을 변경하세요. 그러면 Dropbox의 폴더 이름도 함께 변경됩니다. Overleaf 입장에서 Dropbox에서 폴더 이름을 변경하는 것은 프로젝트 폴더를 삭제하고 새 폴더를 만드는 것과 같으므로, 기존 프로젝트는 삭제된 것으로 표시되고 해당 파일로 새 프로젝트가 생성됩니다.

> [accordion] 일부 프로젝트 폴더에 'Thesis (1)'처럼 번호가 붙는 이유는 무엇인가요?
>
> **답변:** 두 프로젝트의 이름이 같더라도 모든 프로젝트는 각자의 폴더를 가집니다. Dropbox는 같은 이름의 폴더 두 개를 가질 수 없으므로 나중에 만들어진 폴더에 번호를 붙입니다. 번호는 어느 프로젝트가 더 오래되었는지가 아니라, 그 시점에 Dropbox에서 어떤 이름이 비어 있었는지에 따라 결정됩니다. Overleaf는 각 프로젝트의 폴더를 알고 있으므로, 변경 사항이 같은 이름을 가진 다른 프로젝트의 폴더로 전송되는 일은 없습니다.
>
> 이미 사용 중인 이름으로 업로드된 프로젝트는 Overleaf에서도 "Thesis (1)"처럼 번호가 붙은 이름을 갖게 됩니다.

> [accordion] Dropbox에서 프로젝트 폴더를 삭제하면 어떻게 되나요?
>
> **답변:**
>
> * 다른 프로젝트가 해당 폴더 이름을 사용하지 않는 경우, 프로젝트는 Overleaf에서 삭제된 것으로 표시됩니다. 파일과 기록은 유지됩니다.
> * 해당 이름을 가진 프로젝트가 여러 개인 경우, Overleaf는 폴더가 어느 프로젝트의 것인지 알 수 없습니다. 이 경우 Dropbox 계정의 연결을 해제하고 프로젝트 이름을 변경하라는 알림을 표시합니다. Dropbox에서 폴더를 삭제하기 전에 프로젝트에 서로 다른 이름을 지정하세요.
> * "Thesis (1)"처럼 번호가 붙은 폴더는 어떤 프로젝트 이름과도 일치하지 않으므로, 이를 삭제해도 Overleaf의 프로젝트는 변경되지 않습니다. 프로젝트를 Dropbox로 다시 보내려면 편집기의 Dropbox 대화 상자에서 \_sync this project now\_를 클릭하세요.

> [accordion] Overleaf에서 프로젝트를 삭제하면 Dropbox에서는 어떻게 되나요?
>
> **답변:** 아무 일도 일어나지 않으며, 폴더는 Dropbox에 그대로 남습니다. 더 이상 필요하지 않다면 Dropbox에서 폴더를 삭제하세요.

> [accordion] 프로젝트가 보관되었거나 휴지통에 있는 동안 Dropbox에서 변경한 내용은 어떻게 되나요?
>
> **답변:** 해당 변경 사항은 프로젝트에 적용되지 않으며, 프로젝트를 복원해도 반영되지 않습니다. 복원 후 Overleaf는 그동안 Dropbox에서 변경된 파일에 대해 자신의 변경 사항을 더 이상 보내지 않으므로, 양쪽의 내용이 달라집니다.
>
> 이러한 파일을 다시 동기화하려면 Dropbox에서 한 번 더 저장하세요. 그러면 Overleaf가 Dropbox 버전을 가져옵니다. 복원 이후 Overleaf에서 해당 파일에 적용한 변경 사항은 대체되지만 프로젝트 기록에는 남아 있습니다. Dropbox에서 변경하기 전에 프로젝트를 먼저 복원하세요.

> [accordion] 편집기의 Dropbox 링크를 열면 Dropbox 홈페이지가 열리는 이유는 무엇인가요?
>
> **답변:** 이 링크는 Overleaf Cloud와 마찬가지로 dropbox.com의 `Apps/<app folder>/<project>`로 이동합니다. Dropbox가 `Apps` 폴더를 번역된 이름(예: 중국어의 `应用`)으로 표시하는 경우, 링크가 폴더를 찾지 못하고 대신 Dropbox 홈페이지가 열립니다. Dropbox에서 번역된 `Apps` 폴더를 통해 프로젝트 폴더를 여세요.

> [accordion] 프로젝트의 일부 파일이 Dropbox에 없는 이유는 무엇인가요?
>
> **답변:** 동기화 서비스가 실행되지 않는 동안(예: 재시작 중) 이루어진 변경 사항은 나중에 Dropbox로 전송되지 않습니다. 편집기의 Dropbox 대화 상자에서 \_sync this project now\_를 클릭하면 프로젝트 전체가 다시 전송됩니다.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.