snapshot of https://github.com/twentyhq/twenty.git (main, 2026-09-17; blobs > 131072B omitted)
Some checks failed
App Prod-Parity E2E Dispatch / dispatch (push) Failing after 10s
CD Storybook UI / build (push) Failing after 3m25s
CD Storybook UI / dispatch (push) Has been skipped
CD deploy main / website-changed-files (push) Successful in 18m8s
CI Agent Skills / changed-files-check (push) Successful in 18m9s
CI Create App E2E minimal / changed-files-check (push) Successful in 24s
CI Create App / changed-files-check (push) Successful in 26s
CI Docs / changed-files-check (push) Successful in 26s
CI Emails / changed-files-check (push) Successful in 28s
CI Example App Hello World / changed-files-check (push) Successful in 23s
CI Front / changed-files-check (push) Has been skipped
CI Example App Postcard / changed-files-check (push) Successful in 27s
CI UI / changed-files-check (push) Has been skipped
CI Utils Test / changed-files-check (push) Successful in 45s
CI Twenty Apps / discover (push) Successful in 1m3s
CD deploy main / deploy-main (push) Failing after 3s
CI Agent Skills / agent-skills-validate (push) Has been skipped
CI Create App / create-app-test (lint) (push) Has been skipped
CI Emails / emails-test (push) Has been skipped
CI Front / front-task (lingui:compile) (push) Has been skipped
CI Front / front-task (lint) (push) Has been skipped
CI Example App Postcard / example-app-postcard (push) Has been skipped
CI UI / ui-task (lint) (push) Has been skipped
CI UI / ui-task (pack-size) (push) Has been skipped
CI UI / ui-task (size) (push) Has been skipped
CI UI / ui-task (test) (push) Has been skipped
CI UI / ui-task (typecheck) (push) Has been skipped
CI Utils Test / utils-test (push) Has been skipped
CI Twenty Apps / ${{ matrix.app.name }} (push) Has been skipped
CI Emails / ci-emails-status-check (push) Successful in 2s
CI Example App Hello World / ci-example-app-hello-world-status-check (push) Successful in 2s
CI Example App Postcard / ci-example-app-postcard-status-check (push) Successful in 3s
CI UI / ui-sb-test (push) Has been skipped
CI Utils Test / ci-utils-test-status-check (push) Successful in 2s
CI Twenty Apps / ci-twenty-apps-status-check (push) Successful in 2s
CI UI / ci-ui-status-check (push) Successful in 2s
CI Desktop / desktop (push) Failing after 1m8s
Push docs to Crowdin / Push documentation to Crowdin (push) Failing after 55s
Push translations to Crowdin / Extract and upload translations (push) Failing after 5s
Push website translations to Crowdin / Extract and upload website translations (push) Failing after 5s
CI Create App / create-app-test (test) (push) Has been skipped
CI Create App / create-app-test (typecheck) (push) Has been skipped
CI Docs / docs-lint (push) Has been skipped
CI Example App Hello World / example-app-hello-world (push) Has been skipped
CI Front / front-task (lingui:extract) (push) Has been skipped
CI Front / front-task (test) (push) Has been skipped
CI Front / front-task (typecheck) (push) Has been skipped
CI UI / ui-sb-build (push) Failing after 1m32s
CI Twenty Apps / ${{ matrix.app.name }} (${{ matrix.server-source }}) (push) Has been skipped
CI Agent Skills / agent-skills-publish (push) Has been skipped
CI Create App / ci-create-app-status-check (push) Successful in 2s
CI Agent Skills / agent-skills-remote-source (push) Has been skipped
CI Create App E2E minimal / create-app-e2e-minimal (push) Has been cancelled
CI E2E Main / e2e-test (push) Has been cancelled
CI Front / front-sb-build (push) Has been cancelled
CI Front / front-build (push) Has been cancelled
CI Create App E2E minimal / ci-create-app-e2e-minimal-status-check (push) Has been cancelled
CI E2E Main / ci-e2e-main-status-check (push) Has been cancelled
CI E2E Main / notify-main-ci-failure (push) Has been cancelled
CI E2E Main / qa-scout-comment (push) Has been cancelled
CI Front / front-sb-test (push) Has been cancelled
CI Front / front-sb-screenshots (push) Has been cancelled
CI Front / ci-front-status-check (push) Has been cancelled
DPA Sub-Processor Sync / sync-subprocessors (push) Failing after 3s
AI Catalog Sync / sync-catalog (push) Failing after 3s

This commit is contained in:
upstream-mirror
2026-09-17 23:28:13 +05:00
commit e7da97194a
32688 changed files with 4208681 additions and 0 deletions

View File

@@ -0,0 +1,175 @@
---
title: 다대다 관계 만들기
description: 정션 오브젝트를 사용하여 양쪽에서 여러 항목이 서로 연결될 수 있는 레코드를 연결합니다.
---
다대다 관계를 사용하면 양쪽에서 여러 레코드를 연결할 수 있습니다. 예: 여러 사람은 여러 프로젝트에서 작업할 수 있으며, 각 프로젝트에는 많은 사람이 포함될 수 있습니다.
<Warning>
**베타 기능**: 정션 관계는 현재 베타 단계입니다. 이 가이드를 따르기 전에 **Settings → Community → Features**에서 이를 활성화하세요.
</Warning>
<Note>
이 기능을 사용하려면 **Advanced mode**도 활성화되어 있어야 합니다(설정 사이드바 왼쪽 하단의 토글).
</Note>
## 다대다 관계를 사용할 때
관계의 양쪽 모두에 여러 연결이 있을 수 있을 때 다대다를 사용하세요:
| 관계 | 예시 |
| --------- | ---------------------------------------------------- |
| 사람 ↔ 프로젝트 | 한 사람은 여러 프로젝트에서 작업하고, 하나의 프로젝트에는 여러 팀원이 있습니다. |
| 회사 ↔ 태그 | 하나의 회사에는 여러 태그가 있을 수 있으며, 하나의 태그는 여러 회사에 적용될 수 있습니다. |
| 제품 ↔ 주문 | 하나의 제품은 여러 주문에 포함될 수 있으며, 하나의 주문에는 여러 제품이 포함됩니다. |
## 작동 방식
Twenty는 다대다 관계에 **정션 오브젝트** 패턴을 사용합니다. 정션 오브젝트는 두 객체 사이에 위치하여 연결을 보관합니다:
```
People ←→ Project Assignments ←→ Projects
```
**Project Assignments** 오브젝트(정션)에는 다음이 있습니다:
* 사람에 대한 관계(다대일)
* 프로젝트에 대한 관계(다대일)
정션 관계 토글을 활성화하면, Twenty는 중간 정션 레코드를 표시하지 않고 연결된 레코드를 직접 표시합니다.
## 사전 준비
1. **베타 기능에서 Junction Relations 활성화**: **Settings → Community → Features**로 이동하여 **Junction Relations**를 활성화하세요
2. **Advanced mode 활성화**: 설정 사이드바 왼쪽 하단에서 **Advanced mode**를 켭니다
3. 데이터 모델을 계획하세요:
* 어떤 두 오브젝트를 연결하나요?
* 정션 오브젝트의 이름은 무엇으로 할까요?
## 1단계: 정션 오브젝트 만들기
먼저, 연결을 보관할 중간 오브젝트를 만드세요.
1. **설정 → 데이터 모델**로 이동
2. **+ 객체 추가**를 클릭합니다
3. 설명을 담은 이름을 지정하세요(예: "Project Assignment", "Team Member", "Product Order")
4. "이름 필드 생성을 건너뛰기"를 켭니다
<img src="/images/user-guide/fields/new-pivot-object.png" alt="새 피벗 오브젝트" />
5. **저장**을 클릭합니다
<Tip>
**명명 규칙**: "Project Assignment" 또는 "Team Membership"처럼 관계를 설명하는 이름을 사용하세요. 이렇게 하면 데이터 모델을 더 쉽게 이해할 수 있습니다.
</Tip>
## 2단계: 오브젝트와 정션 간 관계 만들기
두 개의 오브젝트 각각에서 정션 오브젝트로 관계 필드를 추가합니다.
### 첫 번째 관계(오브젝트 A → 정션)
1. **Settings → Data Model**에서 첫 번째 오브젝트를 선택하세요
2. **+ 관계 추가**를 클릭합니다
3. 정션 오브젝트를 선택하세요(예: "Project Assignments")
4. 관계 유형을 **One-To-Many**로 설정합니다(한 사람이 여러 할당에 연결될 수 있음)
5. 필드 이름 지정:
* People의 필드: 예: "Project Assignments"
* 정션의 필드: 예: "Person"
6. **저장**을 클릭합니다
### 두 번째 관계(오브젝트 B → 정션)
1. **Settings → Data Model**에서 두 번째 오브젝트를 선택하세요
2. **+ 관계 추가**를 클릭합니다
3. 정션 오브젝트를 선택하세요(예: "Project Assignments")
4. 관계 유형을 **One-To-Many**로 설정합니다(하나의 프로젝트가 여러 할당에 연결될 수 있음)
5. \*\*"This is a relation to a Junction Object"\*\*를 활성화하세요
<img src="/images/user-guide/fields/junction-relation-toggle.png" style={{width:'100%'}} />
6. 필드 이름 지정:
* 정션의 필드: 예: "Project"
* Projects의 필드: 예: "Team Members"
7. **저장**을 클릭합니다
## 3단계: 정션 관계 표시 구성
이제 중간 정션 오브젝트를 건너뛰고 연결된 레코드를 직접 표시하도록 소스 오브젝트를 구성하세요.
1. **설정 → 데이터 모델**로 이동
2. 첫 번째 오브젝트를 선택하세요(예: "People")
3. 정션 오브젝트를 가리키는 관계 필드(예: "Project Assignments")를 찾으세요
4. 클릭하여 필드를 편집하세요
5. \*\*"This is a relation to a Junction Object"\*\*를 활성화하세요
6. **Target relation**을 선택하세요(예: "Project" — 반대편을 가리키는 정션의 필드)
7. **저장**을 클릭합니다
## 결과
구성 후:
* **Person** 레코드에서는 "Project Assignments" 필드가 할당 레코드가 아니라 **Projects**를 직접 표시합니다
* **Project** 레코드에서는 "Team Members" 필드가 **People**를 직접 표시합니다
정션 오브젝트는 여전히 존재하며 연결을 저장하지만, UI는 더 깔끔한 다대다 보기를 제공합니다.
## 예: People ↔ Projects
전체 단계별 안내는 다음과 같습니다:
### 정션 오브젝트 만들기
* 이름: **Project Assignment**
* 설명: "사람을 작업 중인 프로젝트에 연결합니다"
### 관계 추가
1. **People → Project Assignment**
* 유형: One-to-Many
* People의 필드: "Project Assignments"
* Assignment의 필드: "Person"
2. **Projects → Project Assignment**
* 유형: One-to-Many
* Projects의 필드: "Team Members"
* Assignment의 필드: "Project"
### 정션 표시 구성
1. **People** 오브젝트에서:
* "Project Assignments" 필드를 편집하세요
* 정션 토글을 활성화하세요
* 대상: "Project"
2. **Projects** 오브젝트에서:
* "Team Members" 필드를 편집하세요
* 정션 토글을 활성화하세요
* 대상: "Person"
### 사용하기
* Person 레코드를 열면 → 해당 Projects를 바로 확인할 수 있습니다
* Project 레코드를 열면 → 팀원을 바로 확인할 수 있습니다
* 양쪽 어디에서든 새 연결을 만들 수 있습니다
## 연결에 추가 데이터 추가하기
정션 오브젝트는 실제 오브젝트이므로, 관계에 대한 정보를 저장할 사용자 정의 필드를 추가할 수 있습니다:
* **역할**: "Developer", "Designer", "Manager"
* **시작일**: 해당 인원이 프로젝트에 참여한 시점
* **할당 시간**: 이 프로젝트의 주간 시간
이 데이터를 확인하려면 정션 오브젝트로 직접 이동하거나 API를 통해 조회하세요.
## 제한 사항
* **CSV 가져오기/내보내기**: 다대다 관계를 직접 가져오기는 지원되지 않습니다. 대신 정션 오브젝트로 레코드를 가져오세요.
* **필터**: 다대다 관계로 필터링하는 경우 옵션이 제한될 수 있습니다.
## 관련 항목
* [관계 필드](/l/ko/user-guide/data-model/capabilities/relation-fields) — 관계 유형 설명
* [사용자 정의 오브젝트 만들기](/l/ko/user-guide/data-model/how-tos/create-custom-objects) — 오브젝트 생성 방법
* [관계 필드 만들기](/l/ko/user-guide/data-model/how-tos/create-relation-fields) — 기본 관계 설정