Gesellschaft
TL;DR
림버스 컴퍼니 게임 데이터를 선언적 DSL(LPDL)로 기술하면 ANTLR 파서가 MySQL SQL과 Neo4j Cypher를 동시에 생성하는 컴파일러. 자연어 → LLM → LPDL 파이프라인까지 지원하며, 헥사고날 아키텍처 기반 도메인 모델(16 JPA 엔티티)을 갖춘 게임 데이터 아카이브 시스템입니다.
📊 핵심 아키텍처
개요
림버스 컴퍼니의 인격(Persona), 스킬, 패시브 데이터를 아카이브하는 Gesellschaft의 데이터 입력을 자동화하기 위해 개발한 DSL 컴파일러입니다. .lpdl 확장자의 선언적 언어로 게임 데이터를 기술하면 ANTLR 4 파서가 문법을 검증하고, MySQL INSERT SQL과 Neo4j Cypher를 동시에 생성합니다. 자연어 → LLM(GPT-4) → LPDL 변환 파이프라인을 추가하여, 인격을 자연어로 설명하면 LPDL을 거쳐 데이터베이스 쿼리까지 자동으로 생성됩니다. 구문 오류 발생 시 오류 메시지를 LLM에게 피드백하여 자동 재시도하는 방식으로 안정성을 높였습니다. 백엔드 도메인 모델은 헥사고날 아키텍처 기반으로 설계되었으며, 16개 JPA 엔티티로 구성된 복잡한 스킬·효과·조건 시스템을 표현합니다. 조건 시스템은 JOINED 상속 전략으로 구현된 재귀적 트리 구조로, AND/OR 조건 중첩과 무한 깊이 조건 트리를 지원합니다.
핵심 성과
- ✓ANTLR 4 기반 LPDL 문법 설계 및 파서 구현 (림버스 컴퍼니 스킬 시스템 전체 커버)
- ✓Visitor 패턴 기반 MySQL SQL / Neo4j Cypher 동시 코드 생성
- ✓LLM(GPT-4) 기반 자연어 → LPDL 변환 파이프라인 구현 (구문 오류 피드백 자동 재시도)
- ✓Neo4j MERGE 최적화로 SinAffinity·StatusEffect 등 공유 노드 중복 방지
- ✓헥사고날 아키텍처 기반 POJO 도메인 모델 ↔ JPA 엔티티 변환 설계
- ✓PersonaJpa Aggregate Root 패턴 — CascadeType.ALL + orphanRemoval 생명주기 관리
- ✓JOINED 상속 전략으로 재귀적 조건 트리(AbstractConditionJpa) 구현 (AND/OR 무한 중첩)
- ✓triggerJson·amountJson 등 복잡한 객체의 JSON 직렬화 전략으로 테이블 수 최소화
- ✓Jinx를 활용한 컴파일 타임 DDL 마이그레이션 자동화
회고
림버스 컴퍼니 데이터를 직접 입력하는 것이 너무 번거로워서 DSL을 만들었고, 거기에 자연어 입력까지 붙였다. 컴파일러를 만들면서 데이터 구조를 언어로 표현한다는 것의 어려움과 재미를 동시에 느꼈다.
- —ANTLR 문법 설계는 데이터 구조를 얼마나 잘 이해하느냐가 핵심이다. 스킬 시스템을 DSL로 표현하면서 데이터 간 관계를 명확히 정리하지 않으면 문법이 점점 복잡해진다는 것을 배웠다.
- —LLM을 파이프라인 중간에 끼우면 구문 오류가 발생한다. 오류 메시지를 LLM에게 그대로 피드백하는 방식이 가장 효과적이었고, 재시도 횟수와 피드백 품질이 성공률을 결정한다는 것을 알았다.
- —Neo4j에서 SinAffinity, StatusEffect 같은 공유 개념은 MERGE로 관리해야 한다. 처음에 CREATE로 모두 만들었다가 중복 노드 문제가 생겼고, MERGE 전략으로 전환하면서 그래프 설계의 멱등성 개념을 이해했다.