코드 생성 대상과 실행
목표가 콘솔 계산인지, HTTP 서버인지, 화면인지 먼저 정합니다. 입력 문법과 표준 라이브러리의 지원 범위는 생성 대상에 따라 다르므로 실제 생성 결과와 진단을 확인합니다. 예제 화면의 사용법은 변환과 실행 사용 안내를 참고하세요.
공통 API와 대상 언어의 동작
섹션 제목: “공통 API와 대상 언어의 동작”Unibase는 독립적인 중립 언어입니다. 표준 API의 이름·인수와 정상 입력에서의 의미를 공통으로 정의하고, 언어마다 다른 세부 동작은 생성 대상의 규칙을 따릅니다. native도 하나의 실행 대상입니다.
Java·Kotlin·Python·C#·Go·TypeScript·Rust·C++ 생성기는 대상 언어의 문법과 표준 라이브러리를 먼저 사용합니다. 그것만으로 표현할 수 없으면 짧은 인라인 코드와 필요한 보조 함수를 생성하며, 일부 참조형·라이브러리는 사용 시 모듈을 포함합니다. SQL을 사용하지 않는 콘솔에 DB 런타임이나 SQLite 드라이버를 일괄 포함하지 않습니다. 외부 의존성은 필요한 기능에 한해 추가되므로 생성된 README와 의존성 파일을 확인하세요.
정수 overflow, 음수 정수 나눗셈·나머지, double·bool의 문자열 표현, 잘못된 변환 입력과 오류 메시지는 대상별로 다를 수 있습니다. 예를 들어 Python의 -7 / 2 생성 결과는 -7 // 2여서 -4이고, TypeScript는 Math.trunc(-7 / 2)여서 -3입니다. 대상 간 같은 결과가 필요하면 숫자 타입의 공통 범위와 표준 API의 정상 입력 조건을 확인하고, 사용할 대상에서 결과를 검증하세요.
| 경로 | 입력 | 결과 |
|---|---|---|
| native | main이 있는 콘솔 실행 소스 | unic build --target native 또는 unic run의 프로그램 |
| Windows UI | Window와 Widget으로 구성한 소스 | unic build --target windows의 공통 runtime·renderer·Windows host. UI 빌드 절차 |
| console | main이 하나인 소스 집합 | 언어별 콘솔 진입점·프로젝트·필요한 SQLite 연결 |
| 서버 | Api/Controller/Service/Mapper/DTO와 환경 | HTTP 프로젝트·DB 바인딩 |
| 화면 | HTML/Widget 소스, 리소스·환경 | 선택한 frontend profile의 프로젝트 |
| API 클라이언트 | Api/Schema와 Controller 연결 | TypeScript fetch 클라이언트·타입·명세 |
콘솔 프로그램
섹션 제목: “콘솔 프로그램”unic-project는 JSON 요청을 표준 입력으로 받고 결과 JSON을 표준 출력으로 내보내는 도구입니다. 일반 unic build --target과 다른 계약입니다. 준비된 unic-project가 있을 때 UTF-8 요청 파일을 작성합니다.
{ "protocolVersion": 1, "operation": "generate", "target": "console", "language": "python", "files": [{ "id": "hello", "path": "Hello.uni", "content": "class Hello { static void main() { print(\"Hello, world!\"); } }" }]}지원 언어 값은 java/kotlin/python/csharp/go/typescript/rust/cpp와 dart입니다. 이 사이트의 언어 탭은 앞의 8개 언어만 제공하므로 Dart 결과는 이 계약으로 직접 요청해 확인합니다. Dart 콘솔 프로젝트는 Dart SDK 3.10 이상으로 실행하며, 하나의 package와 하나의 진입점만 받습니다. 제네릭 클래스·메서드, 오버로드, 어노테이션, native·External 선언, 파일·프로세스 API, HTTP 클라이언트, 서버·Mapper 선언은 Dart 콘솔 프로필에 포함되지 않습니다. 입력은 1–500개 파일이며 main은 하나여야 합니다. package가 없는 콘솔 소스에는 생성기가 app package를 부여합니다. 언어의 모든 인터페이스·문장·타입이 변환되는 것은 아니므로 success와 진단부터 확인합니다.
준비된 예제에서 언어 탭을 선택하면 즉시 서버에 변환을 요청합니다. 처리 중에는 해당 탭에 진행 표시가 나타나며, 완료되면 이 계약으로 생성한 파일을 볼 수 있습니다. 서버는 등록된 원본만 받으며, 반환한 생성 파일·실제 진단·원본과 컴파일러의 식별 정보를 표시합니다. 파일 생성과 생성물의 빌드·실행은 별도 단계입니다.
Node.js로 호출하면 PowerShell 파이프의 문자 인코딩에 의존하지 않고 JSON을 보낼 수 있습니다.
import { readFileSync, mkdirSync, writeFileSync } from 'node:fs';import { resolve, relative, isAbsolute, dirname } from 'node:path';import { spawnSync } from 'node:child_process';const result = spawnSync(process.argv[2], [], { input: readFileSync(process.argv[3] || 'console-request.json', 'utf8'), encoding: 'utf8',});if (result.error) throw result.error;const reply = JSON.parse(result.stdout);if (result.status !== 0 || !reply.success) throw new Error(JSON.stringify(reply));const root = resolve('generated-project');mkdirSync(root); // 기존 폴더를 덮어쓰지 않음for (const file of reply.result.files) { const target = resolve(root, file.path); const child = relative(root, target); if (!child || child.startsWith('..') || isAbsolute(child)) throw new Error('Invalid output path'); mkdirSync(dirname(target), { recursive: true }); writeFileSync(target, file.content, { flag: 'wx' });}node generate.mjs <unic-project의 실제 경로>로 생성한 뒤 출력 폴더의 README를 따릅니다. 위 예시는 외부 도구를 설치하거나 생성 앱을 자동 실행하지 않습니다.
SQL 콘솔은 SQLite를 사용합니다. UNIBASE_DB_PATH가 있으면 지정 파일을 사용하고, 없으면 임시 DB를 사용합니다. 기존 사용자 DB를 시험 대상으로 지정하지 마세요. SQL 바인딩 예제의 main 내부 SQL과 서버 Mapper 경로를 구분하세요.
| 생성 언어 | 생성 README에서 확인할 도구·진입점 |
|---|---|
| Java / Kotlin | Gradle application과 mainClass, Java toolchain |
| Python | Python 진입 파일, SQL을 사용하면 DB 모듈 |
| C# | .NET 프로젝트와 실행 명령 |
| Go | Go module, SQL을 사용하면 SQLite driver, go run . |
| TypeScript | Node.js 22 이상·TypeScript, npm run build 후 npm start |
| Rust | Cargo 프로젝트의 README와 Cargo.toml |
| C++ | CMake 프로젝트의 README와 CMakeLists.txt |
콘솔과 해당 서버 생성 경로에서 long은 Go의 int64, TypeScript의 number로 표현합니다. 모든 대상에서 정확히 같은 정수가 필요한 공통 범위는 −9,007,199,254,740,991부터 9,007,199,254,740,991까지입니다. 이를 벗어나는 TypeScript 값과 JSON 숫자는 정밀도가 손실될 수 있습니다. 스칼라 표현과 DB·HTTP 경계의 지원은 별개입니다. 현행 Go HTTP 경계는 long 입력·DTO를 처리하지만 DB 호출은 별도입니다. Go·NestJS의 ResultSet.getLong은 거절됩니다. NestJS의 Mapper 매개변수·행과 SQL 바인딩도 long을 지원하지 않습니다.
TypeScript의 DateTime은 JavaScript Date로 생성합니다. 지원 날짜 범위, 시간대·일광절약시간과 잘못된 날짜의 결과도 대상 날짜 라이브러리를 따릅니다. 다른 대상의 날짜 오류나 출력 형식을 그대로 기대하지 마세요.
서버 프로젝트
섹션 제목: “서버 프로젝트”@Api 인터페이스가 HTTP 경로·입력·응답을 정의하고 Controller가 구현에 연결합니다. Service는 업무 로직, Mapper는 DB 질의, DTO/Schema는 경계 데이터입니다. @Controller·@Service는 생성자로 받은 @Mapper로만 DB에 접근하며, 메서드 안의 직접 SQL이나 Database·SqlStatement 사용은 검사 오류입니다. 어노테이션 표를 참고하세요.
| target | 생성 기술 | DB 준비 시 확인 |
|---|---|---|
springBoot |
Java / Spring Boot / Gradle / MyBatis XML | 데이터 소스·Mapper·DDL |
egovFrame |
Java / eGovFrame 4.3 / Spring Boot 2.7 / Gradle / MyBatis XML | Spring Boot 대상과 같은 원본·MyBatis XML. Mapper의 DB 바인딩은 하나. Gradle 8 필요 |
kotlinSpringBoot |
Kotlin / Spring Boot / Gradle / MyBatis XML | 동일 계약의 Kotlin 타입·제약 |
pythonFastApi |
Python / FastAPI | 선택 DB driver·바인딩 |
aspNetCore |
C# / ASP.NET Core | .NET·선택 DB driver |
nestJs |
TypeScript / NestJS | npm·선택 DB driver |
goNetHttp |
Go / net/http | Go Modules·선택 DB driver |
rustAxum |
Rust / Axum | Cargo·선택한 DB 환경 |
cppHttplib |
C++ / cpp-httplib | CMake·선택한 DB 환경 |
ERWeb 내보내기에서 모델·환경을 선택하고 진단을 해결한 뒤 생성합니다. 외부 DB를 사용하는 서버의 테이블은 DDL로 미리 준비합니다. SQL의 값은 문자열 연결이 아닌 driver 매개변수로 전달합니다. 연결 설정·CORS·TLS·인증 정책은 선택한 환경의 명시적 설정을 확인하며 생성 코드가 운영 환경을 자동으로 준비한다고 가정하지 않습니다.
환경의 DBMS 선택
섹션 제목: “환경의 DBMS 선택”프로젝트 environment의 각 데이터베이스는 dbms로 DBMS를 고릅니다. SQL은 Unibase SQL 하나로 작성하고, 생성기가 선택한 DBMS의 형태로 바꿉니다.
dbms |
DBMS | 버전 |
|---|---|---|
sqlite |
SQLite | 3.35 이상 |
mysql |
MySQL, MariaDB | MySQL 8.0, MariaDB 10.6 이상 |
postgresql |
PostgreSQL | 13 이상 |
oracle |
Oracle Database | 23ai 이상 |
sqlserver |
Microsoft SQL Server | 2019 이상 |
| target | SQLite | MySQL | PostgreSQL | Oracle | SQL Server |
|---|---|---|---|---|---|
springBoot, kotlinSpringBoot |
○ | ○ | ○ | ○ | ○ |
pythonFastApi |
○ | ○ | ○ | ○ | tls.mode: "disabled"만 |
aspNetCore |
○ | ○ | ○ | tls.mode: "disabled"만 |
tls.mode: "disabled"만 |
goNetHttp |
○ | ○ | ○ | tls.mode: "disabled"만 |
○ |
nestJs |
○ | ○ | ○ | tls.mode: "disabled"만 |
○ |
rustAxum |
○ | tls.mode: "disabled"만 |
tls.mode: "disabled"만 |
미지원 | tls.mode: "disabled"만 |
cppHttplib |
○ | ○ | ○ | 미지원 | tls.mode: "disabled"만 |
tls.mode: "disabled"만: 해당 대상의 driver가 서버 인증서를 CA 파일 하나로 검증하지 못하므로 다른tls.mode는 검증 없이 연결하는 대신 생성 오류(PYTHON_SQLSERVER_TLS_UNSUPPORTED,CSHARP_TLS_UNSUPPORTED,GO_TLS_UNSUPPORTED,NESTJS_TLS_UNSUPPORTED,RUST_TLS_UNSUPPORTED,CPP_TLS_UNSUPPORTED)가 됩니다.- 미지원: 해당 대상에 DBMS client가 없으며
RUST_ORACLE_UNSUPPORTED,CPP_ORACLE_UNSUPPORTED오류입니다. - 선택한 DBMS가 표현할 수 없는 구문(예: Oracle·SQL Server의
LIMIT n OFFSET m)은 다른 의미로 바꾸지 않고SQL_DIALECT_UNSUPPORTED: <이유>로 거절합니다. - 생성 프로젝트에는 환경에서 선택한 DBMS의 driver만 들어갑니다. 서비스는 데이터베이스를 만들지 않으며 테이블은 작성한 SQL이 만들 때만 생깁니다.
서버 경계에서 사용할 값
섹션 제목: “서버 경계에서 사용할 값”HTTP query·JSON 본문·응답은 일반 메서드와 별도 계약입니다. query는 int/long/bool/string/double/DateTime 스칼라를 처리합니다. JSON 본문·응답은 여기에 JsonValue, List<T>와 중첩 DTO를 포함합니다. JSON 본문은 최대 32,768 bytes, 목록은 최대 4,096개, 중첩은 깊이 16의 제한을 따릅니다. 필수 필드 누락·알 수 없는 필드·타입 불일치·잘못된 날짜는 요청 오류입니다. nullable이고 @Field(required=false)인 선택 필드는 생략할 수 있습니다.
Future, Completer, Socket, 함수 값과 Regex는 HTTP 전달 타입이 아닙니다. Mapper의 double은 REAL, DateTime과 JsonValue는 TEXT를 사용하며 실제 DB 값의 타입과 파싱 결과를 확인합니다. nullable 타입과 long 정밀도·DB 지원은 대상별 제한을 따릅니다.
화면과 TypeScript API 클라이언트
섹션 제목: “화면과 TypeScript API 클라이언트”화면 프로젝트에는 이미지(PNG·JPEG·GIF·WebP·AVIF·SVG·ICO), 동영상(MP4·WebM), 글꼴(WOFF2·WOFF·TTF·OTF), 오디오(MP3·WAV·OGG·M4A·FLAC), PDF와 JSON·XML·텍스트·Markdown·CSV·CSS 리소스를 함께 담을 수 있습니다. SVG는 스크립트·이벤트 핸들러·javascript: URL·foreignObject가 없는 정적 마크업만 담습니다.
CLI export-ui는 vue/react/svelte를 받습니다. 별도 project host에는 Next/Nuxt/SvelteKit/Angular/Flutter 등 profile별 생성 경로가 있으나 입력·지원 타입·HTTP/비동기·SSR 조건이 다릅니다. CLI에 해당 이름을 바로 넣지 말고 ERWeb에서 제공하는 profile과 진단을 사용합니다. 브라우저에서는 File·Console·raw TCP가 적용되지 않아 생성이 거절됩니다. Next·Nuxt·SvelteKit의 사용자 클래스 정적 필드는 서버 렌더링과 브라우저 상태가 분리되므로 거절되며 인스턴스 필드 또는 Store를 사용합니다. 정적 메서드와는 구분합니다.
typeScriptApiClient는 서버가 아닌 API 소비자입니다. Api/Schema와 Controller 연결을 읽고 src/api, 공통 HTTP client와 unibase-api-client.json을 생성합니다. baseUrl, 선택적 bearer token provider, 공통 headers, timeoutMs를 설정합니다. GET/POST/PUT/PATCH/DELETE와 typed 오류를 다루며 토큰을 생성 소스에 고정하지 않습니다. 생성된 manifest로 경로·매개변수·응답 타입을 원본 API와 비교하세요.
이 API 클라이언트의 long도 number로 생성됩니다. JavaScript의 안전 정수 범위를 벗어나면 정밀도가 손실될 수 있으므로 API 값의 범위를 확인하세요. 클라이언트 생성 성공이 서버의 DB 타입 지원을 보장하지는 않습니다.
생성 후 확인 순서
섹션 제목: “생성 후 확인 순서”success와 모든 진단을 읽고 생성 파일·기준 소스를 보존합니다.- 생성 README에 명시된 의존성과 환경을 준비하고 생성 프로젝트 폴더에서 타입 검사·빌드를 수행합니다. Java·Kotlin은 지정한 JDK toolchain과 Gradle 의존성을 확인하고, 다른 언어도 생성된 의존성 파일과 진입점을 함께 사용합니다.
- 콘솔은 stdout·stderr·종료 코드, 서버는 실제 요청·응답·DB 재조회, 화면은 입력·오류·탐색을 확인합니다.
true/True같은 대상별 출력 표기를 구분하며, 처리하지 않은 throw와 잘못된 인덱스는 같은 기대 결과로 묶지 않습니다. - 실패한 generated 파일의 위치를 원래 모델·소스로 역추적합니다. 생성물만 수정해 원본과 분리하지 않습니다.
서버 변환 성공·빌드 성공·실행 성공은 다른 상태입니다. 해당 리비전과 대상에서 실제 확인한 단계까지만 지원 근거로 사용하세요.