🧩 SFDX 프로젝트 생성 방식 비교
| 항목 | 일반 프로젝트 생성
SFDX: Create Project | 매니페스트 포함 생성
SFDX: Create Project with Manifest |
|---|
| 📂 폴더 구조 | force-app/만 생성 | force-app/ + manifest/ 폴더 생성 |
🧾 package.xml 포함 여부 | ❌ 없음 | ✅ 포함됨 (모든 메타데이터 타입 포함한 템플릿 제공) |
| 🔄 retrieve 방식 | 수동 선택 (-m 옵션 or Org Browser) | package.xml 기준으로 자동 가져오기 가능 |
| Git 관리 편의성 | ❌ 가져온 항목 추적 어려움 | ✅ 가져올 대상 명확하게 추적 가능 |
| 협업 시 일관성 | ❌ 가져온 항목이 사람마다 다를 수 있음 | ✅ 동일한 package.xml 사용으로 공통 기반 확보 가능 |
| 반복 배포/백업 | ❌ 명령 재사용 어려움 | ✅ package.xml 한 번 작성해두면 반복 활용 가능 |
| 추천 대상 | 빠르게 새 기능을 개발하거나 실습할 때 | 실무 개발, 팀 협업, Org 메타데이터 관리 목적일 때 |
| 기타 장점 | 간단하고 빠름 | 대규모 Org에 최적, 메타데이터 관리 유리 |
🔍 두 방식의 retrieve 예시 차이
⛔ 일반 프로젝트
sfdx force:source:retrieve -m ApexClass
- → ApexClass 전체 또는 일부를 직접 명령어에 입력해야 함
- → 어떤 항목이 들어오는지 추적 어려움
✅ 매니페스트 프로젝트
sfdx force:source:retrieve -x manifest/package.xml
- → XML에 적힌 메타데이터만 가져옴
- → 추적 가능, Git에 함께 보관 가능
🛠 실무 팁: 매니페스트 관리 전략
| 전략 | 설명 |
|---|
package.xml을 목적별로 분리 | 예: package_apex.xml, package_flows.xml, package_ui.xml |
| 커밋 시 함께 보관 | Git에 manifest/ 폴더 그대로 커밋 |
| 팀원 간 공유 | → 팀 전체가 동일한 retrieve/배포 대상 사용 가능 |
| 코드 리뷰에도 용이 | 가져올 대상 명시되어 있어 변경사항 추적 쉬움 |
📌 추가로 알면 좋은 내용
| 개념 | 설명 |
|---|
* 와일드카드 | members>*</members>는 해당 타입의 모든 항목을 의미 |
| retrieve vs deploy | retrieve: Org → 로컬
deploy: 로컬 → Org |
| Org Browser | 매니페스트 없이도 특정 항목만 클릭으로 가져올 수 있는 도구 (GUI 방식) |
.gitignore와의 관계 | package.xml은 가져올 대상 정의, .gitignore은 버전 관리 제외 대상 정의 |
| package.xml 없이 retrieve | 가능하지만 반복 불가하고 추적 어려움 (임시적 활용에 적합) |
✅ 결론 요약
| 목적 | 추천 생성 방식 |
|---|
| 빠르게 코드 실습만 해보려는 경우 | SFDX: Create Project (간단하고 가볍게) |
| 기존 Org에서 코드/구성요소를 체계적으로 가져와서 개발하려는 경우 | SFDX: Create Project with Manifest (강력 추천) |
| 팀 협업, Git 연동, 배포 자동화까지 고려하는 실무 환경 | 무조건 매니페스트 방식 추천 |
실제 실무에서 자주 사용하는 package.xml 예시를 보여드릴게요.
📦 package.xml 샘플 예시 (대표 메타데이터 포함)
<?xml version="1.0" encoding="UTF-8"?>
<Package xmlns="http://soap.sforce.com/2006/04/metadata">
<types>
<members>*</members>
<name>ApexClass</name>
</types>
<types>
<members>*</members>
<name>ApexTrigger</name>
</types>
<types>
<members>*</members>
<name>LightningComponentBundle</name>
</types>
<types>
<members>Account</members>
<members>CustomObject__c</members>
<name>CustomObject</name>
</types>
<types>
<members>Account.My_Custom_Field__c</members>
<name>CustomField</name>
</types>
<types>
<members>*</members>
<name>Layout</name>
</types>
<types>
<members>*</members>
<name>PermissionSet</name>
</types>
<types>
<members>*</members>
<name>StaticResource</name>
</types>
<version>59.0</version>
</Package>
✅ 이 예시의 특징
| 포함된 항목 | 용도 |
|---|
ApexClass, ApexTrigger | 백엔드 코드 자동 가져오기 |
LightningComponentBundle | LWC 전체 |
CustomObject, CustomField | 객체 및 필드 설정 관리 |
Layout, PermissionSet | 사용자 UI 및 권한 구성 |
StaticResource | 이미지, CSS, JS 등 정적 리소스 포함 |
🛠 사용하는 방법
프로젝트 루트에 manifest/package.xml 파일을 만든 뒤, 아래 명령어로 retrieve:
sfdx force:source:retrieve -x manifest/package.xml
또는 sf CLI에서는:
sf project retrieve start --manifest manifest/package.xml
✳️ 필요에 따라 커스터마이징 가능
<members>MyClass</members>
<members>Contact</members>