마지막 업데이트: 2026년 9월 2일

MS Project (MPP) 및 Primavera (XER) 파일 작업을 위한 주요 오픈 소스 API
엔터프라이즈 프로젝트 관리에서는 두 가지 독점 파일 형식이 최고 자리를 차지합니다: **Microsoft Project (.mpp)**와 Oracle Primavera P6 (.xer). 내부 분석 대시보드를 구축하든, 건설 일정과 ERP 시스템을 동기화하든, 혹은 프로젝트 상태 파이프라인을 자동화하든, 이러한 스케줄링 파일을 프로그래밍 방식으로 읽고 조작하는 것은 필수적인 요구 사항입니다.
하지만 두 형식 모두 악명 높은 엔지니어링 장벽을 제시합니다:
- MPP files는 이진 형식이며, 문서화되지 않은 OLE Structured Storage 또는 독점 복합 문서 형식으로, 거의 모든 주요 MS Project 릴리스(2000, 2003, 2007, 2010, 2013, 2016, 2019, 2021)에서 스키마가 변경됩니다.
- Primavera XER files는 탭 구분 텍스트 내보내기로, 관계형 데이터베이스 테이블(
%T테이블,%F필드 및%R레코드) 형태로 구조화되어 있으며, 복잡한 참조 무결성 제약, 다중 캘린더 상속 및 크리티컬 경로 로직이 포함됩니다.
Aspose.Tasks와 같은 상용 SDK가 존재하지만, 라이선스 비용과 공급업체 종속성 때문에 강력한 오픈소스 대안이 필수적입니다. 이 가이드에서는 Java, Python, C# 전반에 걸쳐 MPP 및 XER 파일을 깔끔하고 효율적으로 처리할 수 있는 최고의 오픈소스 API, 라이브러리 및 파서를 자세히 살펴봅니다.
오픈 소스 도구의 빠른 비교
| 라이브러리 / 도구 | 주요 언어 | 지원 포맷 | 읽기 / 쓰기 | 최적 사용 사례 |
|---|---|---|---|---|
| MPXJ | Java (Python / .NET 바인딩) | MPP, MPT, MPX, XER, PMXML, MSPDI | 읽기 (MPP/XER); 쓰기 (MPX/MSPDI/PMXML) | 엔터프라이즈 Java, 다중 형식 변환, 올인원 일정 |
| xerparser | Python | XER | 읽기 및 파싱 | 데이터 과학, pandas 스케줄링 분석, ETL 파이프라인 |
| python-mpxj | 파이썬 | MPP, XER, XML | 읽기 / 변환 | JPype를 사용한 MPXJ에 대한 파이썬식 래퍼 |
| netezza-xer / xer-to-csv | Shell / Python / Go | XER | 스트림 / 내보내기 | 원시 SQL과 유사한 테이블을 관계형 데이터베이스로 추출 |
| OpenProj / ProjectLibre Core | Java | MPP (구버전), XML | 읽기 / 렌더링 | 데스크톱/엔진 통합을 통한 기본 Gantt 뷰 |
1. MPXJ (Java용 Microsoft Project 교환)
일정 상호 운용성을 위한 확고한 업계 표준
오픈소스 일정 관리 라이브러리에서 금본위 표준이 있다면, 바로 MPXJ입니다. Jon Iles가 20년 넘게 활발히 유지 관리해 온 MPXJ는 원래 Microsoft Project MPX 파일을 처리하기 위해 만들어졌지만, 이제는 프로젝트 일정 형식을 위한 범용 변환 엔진으로 확장되었습니다.
핵심 기능
- Direct MPP Extraction: 거의 모든 MS Project 버전(Project 98부터 최신 Project 2016/2019/2021/365까지)의 독점 바이너리 MPP 파일을 Microsoft Project가 설치되지 않은 상태에서도 파싱합니다.
- Primavera P6 XER & PMXML Parsing: 텍스트 기반
.xer덤프와 최신 Primavera XML 파일 모두에 대한 기본 지원을 제공합니다. - Normalized Data Model: 통합 객체 모델(
ProjectFile,Task,Resource,ResourceAssignment,Relation,WorkCalendar)을 제공합니다. 입력이 MPP이든 XER이든, 애플리케이션 코드는 동일한 API와 상호 작용합니다. - Multi-Language Distribution: Java로 작성되었지만, MPXJ는 IKVM/CoreCLR을 통해 **.NET (C#)**용 네이티브 컴파일된 NuGet 패키지와 Python 패키지(
mpxjon PyPI)를 배포합니다.
빠른 코드 예제: Java
import net.sf.mpxj.ProjectFile;
import net.sf.mpxj.Task;
import net.sf.mpxj.reader.UniversalProjectReader;
public class ScheduleReader {
public static void main(String[] args) throws Exception {
// UniversalProjectReader automatically detects whether it's MPP, XER, or XML
UniversalProjectReader reader = new UniversalProjectReader();
ProjectFile project = reader.read("capital_project_schedule.xer");
System.out.println("Project Name: " + project.getProjectProperties().getProjectTitle());
for (Task task : project.getTasks()) {
if (task.getName() != null) {
System.out.printf("Task ID: %d | WBS: %s | Name: %s | Early Start: %s%n",
task.getID(), task.getWBS(), task.getName(), task.getEarlyStart());
}
}
}
}
MPXJ가 뛰어난 영역
- 진정한 교차 형식 정규화 (MPP를 XER 호환 PMXML 또는 MSPDI로 변환).
- 복잡한 캘린더 로직 (교대, 예외, 다중 캘린더 근무 시간).
- 활발한 커뮤니티와 함께하는 프로덕션 수준의 안정성.
2. xerparser (Python)
Primavera XER용 가볍고 네이티브 Python 파싱
MPXJ를 Python 바인딩을 통해 호출할 수 있지만, 이를 위해서는 JVM 백엔드(JPype)를 실행해야 합니다. Java 의존성 없이 순수하게 네이티브 Python 파서를 필요로 할 때, **xerparser**가 최적의 솔루션입니다.
XER 파일은 본질적으로 데이터베이스 스냅샷을 평문 텍스트로 덤프한 것입니다. xerparser는 이러한 테이블을 구조화된 Python 객체로 디코딩하고 pandas와 원활하게 통합됩니다.
핵심 기능
- Zero Java Dependencies:
pip install xerparser로 설치 가능한 순수 Python 3 라이브러리. - Relational Integrity:
TASK(활동),PROJECT(프로젝트 메타데이터),PROJWBS(WBS 계층),TASKRSRC(할당),TASKPRED(논리 연결)와 같은 핵심 Primavera 테이블을 매핑합니다. - Fast Execution: 컨테이너화된 마이크로서비스, AWS Lambda 함수, 최신 데이터 오케스트레이션 파이프라인(예: Apache Airflow, Prefect)에 이상적입니다.
빠른 코드 예시: Python
from xerparser.reader import Reader
import pandas as pd
# Load XER file
xer = Reader("plant_expansion.xer")
# Access projects inside the XER dump
for project in xer.projects:
print(f"Project Code: {project.short_name}, Description: {project.name}")
# Convert activities into a Pandas DataFrame for downstream analytics
tasks_data = []
for act in xer.activities:
tasks_data.append({
"Task_Code": act.task_code,
"Name": act.task_name,
"Status": act.status_code,
"Early_Start": act.early_start_date,
"Early_Finish": act.early_end_date,
"Total_Float": act.total_float_hr_cnt
})
df = pd.DataFrame(tasks_data)
print(df.head())
xerparser가 뛰어난 곳
- 데이터 엔지니어링, 지연 청구 분석, 및 일정 건강 검진 (DCMA 14점 평가 스크립트).
- 50MB 이상의 Java 런타임을 번들링하기가 비현실적인 서버리스 워크로드.
3. python-mpxj
Python을 MPXJ의 전체 기능과 연결
Python으로 작업하지만 반드시 바이너리 .mpp 파일을 처리해야 한다면, xerparser는 .xer만을 대상으로 하기 때문에 도움이 되지 않습니다. 가장 신뢰할 수 있는 오픈소스 브릿지는 **python-mpxj**입니다.
핵심 기능
jpype1을 사용하여 헤드리스 임베디드 JVM을 자동으로 시작합니다.- 전체 MPXJ API를 Python 개발자에게 직접 노출합니다.
- 독점
.mpp파일을.json또는.csv와 같은 최신 오픈 포맷으로 직접 변환할 수 있게 합니다.
pip install mpxj
import mpxj
# MPXJ provides high-level helper utilities
from net.sf.mpxj.reader import UniversalProjectReader
reader = UniversalProjectReader()
project = reader.read("commercial_tower.mpp")
for task in project.getTasks():
if task.getName():
print(f"{task.getUniqueID()}: {task.getName()} -> {task.getDuration()}")
4. 맞춤 파싱 유틸리티 및 데이터베이스 인제스트 스크립트
스트림 처리를 통한 원시 Primavera XER 처리
Primavera XER가 예측 가능한 테이블 형식을 따르기 때문에, 많은 오픈소스 엔지니어링 팀은 고수준 DOM 스타일 일정 라이브러리 대신 (Go, Python, Rust로 작성된) 맞춤형 표 스트림 디코더를 활용합니다.
XER 파일 구조는 다음과 같이 포맷됩니다:
%T TASK
%F task_id proj_id wbs_id task_code task_name status_code
%R 10182 120 45 A1000 Mobilization TK_Complete
%R 10183 120 45 A1010 Excavation TK_Active
%E
GitHub에 있는 여러 오픈소스 스크립트(예: xer2sqlite 및 xer-to-csv)가 이 구조를 직접 SQLite 또는 PostgreSQL로 파싱합니다. 이 접근 방식이 최적인 경우는 다음과 같습니다:
- SQL로 표 형식 관계만 조회하면 됩니다.
- 스케줄이 수백 메가바이트 규모이며 수만 개의 작업을 포함하고 있어, 객체 지향 트리 로더를 사용하면 메모리 부족 오류가 발생합니다.
기술 비교: 어느 것을 선택해야 할까요?
MPXJ를 선택해야 하는 경우:
- 독점 상용 소프트웨어에 비용을 지불하지 않고 바이너리 Microsoft Project
.mpp파일을 읽어야 합니다. - 깊은 스케줄 인텔리전스가 필요합니다: 작업 캘린더, 지연 기간 계산, 임계 경로 계산, 그리고 기준선 변동성.
- 귀하의 기술 스택이 Java, Kotlin, C# (.NET) 또는 엔터프라이즈 Python인 경우.
xerparser를 선택해야 하는 경우:
- 오직 Primavera P6
.xer파일만 다루는 경우. - 파이프라인이 native Python으로 작성되어 pandas, NumPy 또는 Dash / Streamlit과 같은 시각화 도구에 직접 연결되는 경우.
- 경량 컨테이너 환경이나 서버리스 클라우드 러너에 배포하고 있습니다.
Direct DB / CSV 스트림 인제션을 선택해야 하는 경우:
- 대규모 다중 프로젝트 엔터프라이즈 XER 내보내기를 위한 고처리량 데이터베이스 스테이징이 필요합니다.
- SQL 분석을 통해 메타데이터, 비용 계정 및 진행 곡선만 추출하면 됩니다.
요약 및 모범 사례
일정 데이터용 오픈소스 파이프라인을 구축할 때:
.mpp를 수동으로 파싱하지 마세요: Microsoft 바이너리 사양은 복잡하고 문서화되지 않았습니다. 항상 MPXJ와 같은 검증된 라이브러리를 사용하세요.- 날짜 시간대에 주의하세요: Primavera 일정은 종종 프로젝트 캘린더에 의존하여 시간대 메타데이터 없이 작업 기간을 기록합니다. 데이터 수집 파이프라인이 8시간 근무 교대와 24시간 캘린더 일 사이의 차이를 고려하도록 하세요.
- 참조 무결성을 검증하세요: XER 파일에서는 수동으로 만든 프로젝트 내보내기에서 고아 레코드(예: 삭제된 WBS 노드를 가리키는 작업)가 자주 발생합니다. ETL 과정에서 외래 키를 항상 방어적으로 검증하세요.
자주 묻는 질문
**Q1: 1. 오픈소스 라이브러리가 네이티브 바이너리 .mpp 파일을 직접 작성하거나 업데이트할 수 있나요?
A1: 아니요, Microsoft의 독점 바이너리 형식 때문에 오픈소스 라이브러리는 .mpp 파일을 신뢰성 있게 읽을 수 있지만, 쓰기는 일반적으로 MSPDI (XML) 또는 MPX와 같은 표준 형식으로 내보냅니다.
**Q2: 이 파일들을 파싱하기 위해 서버에 Microsoft Project 또는 Primavera P6를 설치해야 합니까?
A2: 아니요, MPXJ와 xerparser와 같은 라이브러리는 호스트 소프트웨어 라이선스를 요구하지 않고 파일을 직접 처리하는 독립 파서입니다.
**Q3: Java 의존성 없이 Primavera P6 XER 파일을 파싱하기 위한 최고의 순수 Python 라이브러리는 무엇입니까?
A3: xerparser는 XER 덤프를 직접 네이티브 딕셔너리와 pandas DataFrame으로 파싱하는 최고의 순수 Python 선택입니다.
**Q4: MPXJ가 Microsoft Project MPP 파일을 Primavera P6 형식으로 변환할 수 있습니까?
A4: 예, MPXJ는 .mpp 파일을 읽고 정규화된 일정을 Primavera 호환 PMXML 형식으로 내보낼 수 있습니다.
**Q5: Primavera XER 파일이 Microsoft Project MPP 파일보다 파싱하기 쉬운 이유는 무엇입니까?
A5: XER 파일은 사람이 읽을 수 있는 탭 구분 관계형 데이터베이스 덤프이며, MPP 파일은 독점적인 바이너리 복합 문서 구조입니다.
파일 형식 리소스
파일 포맷 뉴스 – Your one stop for all the news related to file formats from around the world 파일 포맷 포럼 – Post your queries in file format forums to get useful information from file format experts and community users 파일 포맷 위키 –Explore file format categories for information about various file formats 프로젝트 관리용 오픈 소스 API 및 라이브러리