문서, 이미지 및 기타 파일을 레코드에 첨부하기 위한 파일 필드를 생성합니다.
파일 사용자 정의 필드를 사용하면 레코드에 여러 파일을 첨부할 수 있습니다. 파일은 AWS S3에 안전하게 저장되며, 포괄적인 메타데이터 추적, 파일 유형 검증 및 적절한 접근 제어가 이루어집니다.
기본 예제
간단한 파일 필드를 생성합니다:
mutation CreateFileField {
createCustomField(input: {
name: "Attachments"
type: FILE
}) {
id
name
type
}
}
고급 예제
설명이 포함된 파일 필드를 생성합니다:
mutation CreateDetailedFileField {
createCustomField(input: {
name: "Project Documents"
type: FILE
description: "Upload project-related documents, images, and files"
}) {
id
name
type
description
}
}
입력 매개변수
CreateCustomFieldInput
매개변수 | 유형 | 필수 | 설명 |
---|---|---|---|
name |
String! | ✅ 예 | 파일 필드의 표시 이름 |
type |
CustomFieldType! | ✅ 예 | FILE 여야 합니다. |
description |
String | 아니요 | 사용자에게 표시되는 도움말 텍스트 |
참고: 사용자 정의 필드는 사용자의 현재 프로젝트 컨텍스트에 따라 프로젝트와 자동으로 연결됩니다. projectId
매개변수가 필요하지 않습니다.
파일 업로드 프로세스
1단계: 파일 업로드
먼저, 파일을 업로드하여 파일 UID를 가져옵니다:
mutation UploadFile {
uploadFile(input: {
file: $file # File upload variable
companyId: "company_123"
projectId: "proj_123"
}) {
id
uid
name
size
type
extension
status
}
}
2단계: 레코드에 파일 첨부
그런 다음 업로드된 파일을 레코드에 첨부합니다:
mutation AttachFileToRecord {
createTodoCustomFieldFile(input: {
todoId: "todo_123"
customFieldId: "file_field_456"
fileUid: "file_uid_from_upload"
}) {
id
file {
uid
name
size
type
}
}
}
파일 첨부 관리
단일 파일 추가
mutation AddFileToField {
createTodoCustomFieldFile(input: {
todoId: "todo_123"
customFieldId: "field_456"
fileUid: "file_uid_789"
}) {
id
position
file {
uid
name
size
type
extension
}
}
}
파일 제거
mutation RemoveFileFromField {
deleteTodoCustomFieldFile(input: {
todoId: "todo_123"
customFieldId: "field_456"
fileUid: "file_uid_789"
})
}
대량 파일 작업
customFieldOptionIds를 사용하여 여러 파일을 한 번에 업데이트합니다:
mutation SetMultipleFiles {
setTodoCustomField(input: {
todoId: "todo_123"
customFieldId: "field_456"
customFieldOptionIds: ["file_uid_1", "file_uid_2", "file_uid_3"]
})
}
파일 업로드 입력 매개변수
UploadFileInput
매개변수 | 유형 | 필수 | 설명 |
---|---|---|---|
file |
Upload! | ✅ 예 | 업로드할 파일 |
companyId |
String! | ✅ 예 | 파일 저장을 위한 회사 ID |
projectId |
String | 아니요 | 프로젝트별 파일을 위한 프로젝트 ID |
파일 관리 입력 매개변수
매개변수 | 유형 | 필수 | 설명 |
---|---|---|---|
todoId |
String! | ✅ 예 | 레코드의 ID |
customFieldId |
String! | ✅ 예 | 파일 사용자 정의 필드의 ID |
fileUid |
String! | ✅ 예 | 업로드된 파일의 고유 식별자 |
파일 저장 및 한계
파일 크기 한계
한계 유형 | 크기 |
---|---|
Maximum file size | 256MB per file |
Batch upload limit | 10 files max, 1GB total |
GraphQL upload limit | 256MB |
지원되는 파일 유형
이미지
jpg
,jpeg
,png
,gif
,bmp
,webp
,svg
,ico
,tiff
,tif
비디오
mp4
,avi
,mov
,wmv
,flv
,webm
,mkv
,3gp
오디오
mp3
,wav
,flac
,aac
,ogg
,wma
문서
pdf
,doc
,docx
,xls
,xlsx
,ppt
,pptx
,txt
,rtf
아카이브
zip
,rar
,7z
,tar
,gz
코드/텍스트
json
,xml
,csv
,md
,yaml
,yml
저장 아키텍처
- 저장소: 정리된 폴더 구조를 가진 AWS S3
- 경로 형식:
companies/{companySlug}/projects/{projectSlug}/uploads/{year}/{month}/{username}/{fileUid}_{filename}
- 보안: 안전한 접근을 위한 서명된 URL
- 백업: 자동 S3 중복성
응답 필드
파일 응답
필드 | 유형 | 설명 |
---|---|---|
id |
ID! | 데이터베이스 ID |
uid |
String! | 고유 파일 식별자 |
name |
String! | 원래 파일 이름 |
size |
Float! | 바이트 단위의 파일 크기 |
type |
String! | MIME 유형 |
extension |
String! | 파일 확장자 |
status |
FileStatus | PENDING 또는 CONFIRMED (nullable) |
shared |
Boolean! | 파일이 공유되는지 여부 |
createdAt |
DateTime! | 업로드 타임스탬프 |
TodoCustomFieldFile 응답
필드 | 유형 | 설명 |
---|---|---|
id |
ID! | 연결 레코드 ID |
uid |
String! | 고유 식별자 |
position |
Float! | 표시 순서 |
file |
File! | 관련 파일 객체 |
todoCustomField |
TodoCustomField! | 부모 사용자 정의 필드 |
createdAt |
DateTime! | 파일이 첨부된 시점 |
파일이 포함된 레코드 생성
레코드를 생성할 때 파일의 UID를 사용하여 파일을 첨부할 수 있습니다:
mutation CreateRecordWithFiles {
createTodo(input: {
title: "Project deliverables"
todoListId: "list_123"
customFields: [{
customFieldId: "file_field_id"
customFieldOptionIds: ["file_uid_1", "file_uid_2"]
}]
}) {
id
title
customFields {
id
customField {
name
type
}
todoCustomFieldFiles {
id
position
file {
uid
name
size
type
}
}
}
}
}
파일 검증 및 보안
업로드 검증
- MIME 유형 검사: 허용된 유형에 대해 검증합니다.
- 파일 확장자 검증:
application/octet-stream
에 대한 대체 수단입니다. - 크기 한계: 업로드 시 enforced됩니다.
- 파일 이름 정리: 특수 문자를 제거합니다.
접근 제어
- 업로드 권한: 프로젝트/회사 멤버십이 필요합니다.
- 파일 연결: ADMIN, OWNER, MEMBER, CLIENT 역할
- 파일 접근: 프로젝트/회사 권한에서 상속됩니다.
- 안전한 URL: 파일 접근을 위한 시간 제한 서명된 URL
필요한 권한
작업 | 필요한 권한 |
---|---|
Create file field | OWNER or ADMIN project-level role |
Update file field | OWNER or ADMIN project-level role |
Upload files | Project or company membership |
Attach files | ADMIN, OWNER, MEMBER, or CLIENT role |
View files | Standard record view permissions |
Delete files | Same as attach permissions |
오류 응답
파일이 너무 큽니다
{
"errors": [{
"message": "File \"filename.pdf\": Size exceeds maximum limit of 256MB",
"extensions": {
"code": "BAD_USER_INPUT"
}
}]
}
파일을 찾을 수 없습니다
{
"errors": [{
"message": "File not found",
"extensions": {
"code": "FILE_NOT_FOUND"
}
}]
}
필드를 찾을 수 없습니다
{
"errors": [{
"message": "Custom field not found",
"extensions": {
"code": "CUSTOM_FIELD_NOT_FOUND"
}
}]
}
모범 사례
파일 관리
- 레코드에 첨부하기 전에 파일을 업로드합니다.
- 설명적인 파일 이름을 사용합니다.
- 프로젝트/목적별로 파일을 정리합니다.
- 사용하지 않는 파일을 주기적으로 정리합니다.
성능
- 가능할 경우 파일을 배치로 업로드합니다.
- 콘텐츠 유형에 적합한 파일 형식을 사용합니다.
- 업로드 전에 큰 파일을 압축합니다.
- 파일 미리보기 요구 사항을 고려합니다.
보안
- 파일 내용을 검증하고 확장자만 검증하지 않습니다.
- 업로드된 파일에 대해 바이러스 검사를 사용합니다.
- 적절한 접근 제어를 구현합니다.
- 파일 업로드 패턴을 모니터링합니다.
일반적인 사용 사례
-
문서 관리
- 프로젝트 사양
- 계약 및 합의
- 회의 노트 및 프레젠테이션
- 기술 문서
-
자산 관리
- 디자인 파일 및 목업
- 브랜드 자산 및 로고
- 마케팅 자료
- 제품 이미지
-
규정 준수 및 기록
- 법적 문서
- 감사 기록
- 인증서 및 라이센스
- 재무 기록
-
협업
- 공유 리소스
- 버전 관리 문서
- 피드백 및 주석
- 참조 자료
통합 기능
자동화와 함께
- 파일이 추가/제거될 때 작업 트리거
- 유형 또는 메타데이터에 따라 파일 처리
- 파일 변경에 대한 알림 전송
- 조건에 따라 파일 아카이브
커버 이미지와 함께
- 파일 필드를 커버 이미지 소스로 사용
- 자동 이미지 처리 및 썸네일
- 파일 변경 시 동적 커버 업데이트
조회와 함께
- 다른 레코드에서 파일 참조
- 파일 수 및 크기 집계
- 파일 메타데이터로 레코드 찾기
- 파일 첨부에 대한 교차 참조
한계
- 파일당 최대 256MB
- S3 가용성에 의존
- 내장 파일 버전 관리 없음
- 자동 파일 변환 없음
- 제한된 파일 미리보기 기능
- 실시간 협업 편집 없음
관련 리소스
- 파일 업로드 API - 파일 업로드 엔드포인트
- 사용자 정의 필드 개요 - 일반 개념
- 자동화 API - 파일 기반 자동화
- AWS S3 문서 - 저장소 백엔드