어노테이션 하나로 ERP 화면이 나온다 — 오픈소스 Erupt를 우리 플랫폼으로 고도화하기
ERP를 만들다 보면 어느 순간 현타가 옵니다. 엔티티 정의하고, 리포지토리 만들고, 서비스 만들고, 컨트롤러 만들고, 화면 만들고, 권한 붙이고, 엑셀 내보내기 붙이고 — 그리고 다음 도메인에서 똑같은 걸 또 합니다. 도메인 200개면 200번.
이 반복을 없애는 방법을 찾다가 Erupt라는 오픈소스 로우코드 프레임워크(Apache 2.0)를 만났습니다. 어노테이션 메타데이터로 CRUD 전체를 런타임에 생성한다는 발상이 정확히 제가 원하던 것이었습니다. 처음부터 만드는 대신, 이 엔진을 기반으로 잡고 우리 회사 플랫폼으로 고도화하기로 했습니다. 그렇게 나온 것이 HunikFlow입니다.
@Flow 하나면 됩니다
JPA 엔티티에 어노테이션을 선언합니다.
@Flow(name = "거래처 관리")
@Entity
public class Customer {
@FlowField(
views = @View(title = "거래처명"),
edit = @Edit(title = "거래처명", notNull = true),
search = @Search
)
private String name;
...
}
이게 끝입니다. 런타임에 메타데이터를 읽어서:
- REST API가 자동으로 열리고 (
/api/v1/data/{flowName}범용 엔드포인트) - Angular 관리화면(테이블·검색·폼)이 같은 메타데이터로 렌더링되고
- 행/열 단위 권한, 엑셀 내보내기까지 따라옵니다
드래그앤드롭 폼 빌더 방식이 아니라 어노테이션 메타데이터 기반 런타임 CRUD라는 게 핵심입니다. 코드는 여전히 Java고, Git으로 버전 관리되고, IDE 자동완성이 됩니다. “코드 없이”가 아니라 “반복 없이”가 목표입니다.
물론 자동 생성만으로 안 되는 지점이 반드시 옵니다. @DataProxy(저장 전후 로직), @PowerHandler(동적 권한), @OnChange(필드 연동) 같은 확장 훅으로 안 되는 부분만 Java로 끼워넣는 구조입니다.
무엇을 얹었나
기반 엔진 위에 우리가 필요한 것들을 붙여나갔습니다. 원본에 없거나 부족했던 영역이 셋입니다.
업무 도메인. ERP 9모듈(CRM·재무·인사·재고·커머스·자산·CS 등)과 MES 3모듈을 엔진 위에 직접 구축했습니다. MES 쪽은 도메인 깊이가 상당합니다 — OEE(설비종합효율), SPC 관리도(Cp/Cpk에 Nelson Rules 8종), BOM, MRP, Andon까지. “로우코드는 장난감”이라는 인상을 깨려면 제조 현장 수준의 도메인을 소화한다는 걸 보여줘야 했습니다.
AI 모듈. LLM 프로바이더 14개를 통합한 AI 모듈을 새로 만들었습니다. Function Call과 SSE 스트리밍을 지원해서, 업무 화면 안에서 데이터를 두고 AI와 대화하는 흐름이 가능합니다.
엔진 자체의 개선. 한국 업무 환경에 맞는 결재(BPM) 워크플로우, GraalJS 동적 API(화면에서 스크립트를 작성하면 REST API로 즉시 등록), 그리고 전체 코드베이스의 현대화(Java 21, Angular 21, PostgreSQL 17)까지.
규모와 도구들
- Maven 46모듈, Java 소스 1,166개(약 98,000줄), 엔티티 217개
- 테스트 795+, CodeQL/Qodana 정적분석 상시 가동
- UI 렌더러 4종(Ant Design, Element UI 등) 교체 가능
오픈소스 위에서 만든다는 것
이 프로젝트에서 배운 가장 큰 교훈은 “기반을 인정하면 서사가 더 강해진다”는 것입니다. 처음부터 다 만들었다고 말하고 싶은 유혹이 있지만, 실제 엔지니어링의 가치는 다른 곳에 있습니다. 좋은 기반을 고르는 안목, 원본 구조를 깊게 이해하고 침습 없이 확장하는 기술, 그리고 그 위에 실제 업무 도메인(ERP·MES)을 완성해내는 실행력. KoCoinEx를 BIZZAN에서 출발해 Go+Rust로 재플랫폼한 것과 같은 결의 이야기입니다.
795개 테스트는 그 확장 과정의 안전망이었습니다. 엔진 한 줄의 변경이 200개 도메인에 영향을 주는 코드에서, Claude Code와 함께 구현과 테스트를 같은 호흡으로 만들지 않았다면 이 규모의 고도화는 엄두를 못 냈을 겁니다.