쿠키런: 킹덤, JSON Schema로 데이터 입력 오류 99% 감소!
게임 데이터의 수기 입력 시 발생하는 오타 및 잘못된 값 입력 문제를 해결하기 위해 JSON Schema 기반 검증 시스템 도입을 결정함
로직을 데이터로 작성하는 패턴에서 발생하는 데이터 입력의 어려움을 해소하고 빠른 이터레이션(Iteration) 및 콘텐츠 업데이트 지원
JSON Schema 자동 생성 및 후처리, VS Code 연동을 통해 데이터 입력 생산성 향상 및 런타임 오류 감소 달성
2023년부터 쿠키 캐릭터 및 전투 콘텐츠 복잡도 증가에 맞춰 시스템을 고도화하여 현재 클라이언트, 기획자, QA 모두 활용 중
게임 로직 데이터화의 장점과 JSON 채택 이유
게임 개발에서 로직을 데이터로 분리하는 패턴은 기획자의 빠른 이터레이션과 콘텐츠 업데이트를 가능하게 함. 특히 복잡한 조건 분기나 상태 관리가 필요한 경우, 테이블 형식보다 유연한 JSON 포맷이 가독성과 적용 용이성 측면에서 유리함.
데이터 중심 설계(Data-Centric Design): 코드 수정 없이 데이터 변경만으로 버그 수정 및 콘텐츠 업데이트 가능
JSON의 유연성: 중첩 객체, 배열, 다양한 타입 지원으로 복잡한 조건 로직 표현 용이
가독성: 텍스트 기반으로 사람이 직접 작성하고 이해하기 쉬움
이러한 특성으로 인해 쿠키런: 킹덤은 복잡한 스킬 로직 및 상태 관리를 위해 JSON 데이터 입력을 채택함.
JSON Schema 도입으로 얻는 이점과 필요성
수기 입력 방식은 데이터 유효성 검증의 어려움과 런타임 오류 발생 가능성을 내포함. 유니티 내장 JSON 파서는 오류를 무시하는 경향이 있어 문제 식별이 더욱 어려움. JSON Schema는 데이터 구조와 제약 조건을 명확히 정의하여 이러한 문제를 해결함.
자동 검증: 입력된 JSON 데이터가 정의된 스키마를 준수하는지 실시간 또는 런타임 시 검증
오류 감소: 오타, 타입 불일치, 누락된 필드 등 입력 오류를 사전에 방지하여 런타임 에러 최소화
가독성 및 유지보수성 향상: 스키마 자체가 데이터 구조를 명확히 설명하는 문서 역할 수행
독립성: JSON 및 JSON Schema 지원 환경이라면 어디서든 검증 가능
JSON Schema 자동 생성 및 커스터마이징 전략
개발 생산성 향상을 위해 C#의 Json.NET 라이브러리를 활용하여 클래스로부터 JSON Schema를 자동 생성함. 하지만 기본 생성 방식은 camelCase/PascalCase 불일치, 불필요한 필드 포함 등의 문제를 야기함. 이를 해결하기 위해 Contract Resolver를 튜닝하거나 JSON Schema 후처리 방식을 적용함.
Contract Resolver 튜닝: `[SerializeField]` 어트리뷰트, 커스텀 어트리뷰트(`[GenerateSchemaAs]`) 등을 활용하여 클래스 멤버와 JSON 키 매핑 및 타입 불일치 문제 해결
JSON Schema 후처리: 생성된 스키마를 재귀적으로 탐색하며 Enum 타입을 문자열로 변환하고, `additionalProperties: false` 및 `required: null` 설정을 통해 불필요한 검증 제거 및 유연성 확보
이러한 커스터마이징을 통해 개발자 의도에 맞는 정확한 스키마 생성이 가능해짐.
Visual Studio Code 연동을 통한 개발 환경 최적화
생성된 JSON Schema를 Visual Studio Code와 연동하여 기획자 및 QA 담당자의 콘텐츠 작성 효율을 극대화함. VS Code의 JSON Schema 지원 기능을 활용해 자동완성 및 실시간 값 검증 기능을 제공함.
자동완성(Autocomplete): 스키마 기반으로 가능한 필드명, 값 제안으로 입력 속도 향상
실시간 검증(Real-time Validation): JSON 파일 작성 중 스키마 위반 시 즉각적인 오류 표시
통합 배포: `.vscode/settings.json`, `.gitignore`, `json-schema.json` 등을 포함한 Git 저장소 형태로 배포하여 일관된 개발 환경 구축
이를 통해 별도의 클라이언트 조작 없이도 편리하게 JSON 데이터를 입력하고 검증할 수 있는 올인원 패키지 제공.