메인 콘텐츠로 건너뛰기
우리 앱에는 두 개의 커스텀 객체가 필요합니다: document templates(무엇을 쓸지)와 documents(생성된 결과)입니다. 이들을 정의해 보겠습니다. 각 엔티티 파일을 CLI로 스캐폴딩하세요 — 그러면 유효한 UUID와 올바른 폴더가 자동으로 생성됩니다:
아래에 완성된 파일들을 보여 줍니다.
모든 *_UNIVERSAL_IDENTIFIER 상수는 src/constants/universal-identifiers.ts에 있으며, 사용하는 곳에서 import됩니다. 아래 코드 조각에서는 설명을 위해 해당 import를 생략했지만 — 실제 파일에서는 반드시 포함해야 합니다.

템플릿 객체

템플릿에는 name, {{placeholders}}가 포함된 body, 그리고 Person 또는 Company 중 어느 쪽을 대상으로 작성되었는지 나타내는 target이 있습니다. bodyRICH_TEXT 필드이므로, Twenty는 여기에 완전한 리치 텍스트 에디터를 제공합니다.
SELECT 옵션 values는 반드시 UPPER_CASE(person이 아니라 PERSON)여야 하며, defaultValue는 따옴표로 한 번 더 감싸야 합니다: `'PERSON'`. label은 사용자에게 표시되는 값입니다.

문서 객체

생성된 문서는 렌더링된 contentstatus를 저장합니다. statusDRAFT / GENERATEDselect 필드로 같은 방식으로 정의합니다. 전체 파일: document.object.ts.

관계를 사용해 둘을 연결하기

각 문서는 자신이 생성된 템플릿을 가리켜야 합니다. 관계는 항상 양방향이며, 각 필드 파일에서 각각 한쪽씩 정의합니다.
반대편(template-documents-relation.field.ts)은 반대 방향을 가리키는 documents라는 이름의 RelationType.ONE_TO_MANY 필드입니다. 전체 패턴은 Relations를 참조하세요.

Twenty에서 확인하기

yarn twenty dev를 실행한 상태에서 Settings → Data model을 엽니다. 두 객체가 모두 표시되며, 여러분의 앱으로 태깅되어 있습니다.
Documents와 Document templates가 표시된 데이터 모델 설정

Document Generator 앱이 소유한 두 개의 커스텀 객체.

테스트용으로 템플릿 하나를 생성하세요 — 이름을 Sales proposal로 지정하고, TargetPerson으로 설정한 뒤, placeholder 몇 개가 포함된 body를 붙여넣습니다:
플레이스홀더 본문이 있는 Sales proposal 템플릿 레코드

템플릿 레코드입니다. 문서가 생성될 때까지 body에는 placeholder가 유지됩니다.

이 단계를 마치면: relation으로 연결된 documentTemplatedocument 객체가 있고, 생성을 위한 템플릿이 하나 준비된 상태입니다. 다음은 이를 채워 넣는 로직입니다.

다음: 문서 생성 →

템플릿을 채우는 로직 함수를 작성합니다.