# LOTIS: DOM과 비동기 호출을 객체로 대체하는 PHP 프레임워크
10년 개발 끝에 LOTIS 프레임워크 저자는 급진적인 해결책에 도달했습니다: 태그와 비동기 요청을 버리고 객체 지향 접근법으로 전환. 그 결과? 클라이언트와 서버를 분리하지 않고 웹 앱을 하나의 통합된 전체로 구축할 수 있습니다. 개발자들은 DOM 요소 대신 도메인 객체를 다루며, 비즈니스 로직 구현에 필요한 시간을 대폭 줄일 수 있습니다.
CMA 개념: 객체에서 메타데이터로
LOTIS 아키텍처의 기반은 CMA 원리(Construct-Metadata-Assembly)입니다. 앱은 기본 Construct 인터페이스를 구현하는 객체들로 완전히 구축됩니다. 각 객체는 인터페이스 구축, 반응성 활성화, 또는 API 생성에 사용되는 메타데이터를 생성합니다. 핵심 구성 요소는 이러한 객체들로부터 웹 앱을 조립하는 Space 클래스입니다.
전통적인 프레임워크가 마크업과 로직을 분리하는 것과 달리, LOTIS는 다음과 같이 할 수 있게 합니다:
- PHP 객체를 통해 UI 설명
- 클라이언트와 서버에서 동일한 변수 사용
- 수동 비동기 작업 처리 생략
- 상속을 통한 컴포넌트 계층 동적 변경
최소 작동 예제가 본질을 보여줍니다:
$div = LTS::Div()->capt("Hello from LOTIS!");
LTS::Space()->build($div);
여기서 LTS::Div()는 HTML 태그가 아닌 객체를 생성합니다. DOM 변환은 객체를 Space에 전달할 때만 발생합니다. 이를 통해 고전적인 데스크톱 프레임워크의 자유로움으로 앱 구조를 조작할 수 있습니다.
실제 사례: "Tracker" 회계 시스템
재고 추적과 급여 계산을 위한 실제 앱 코드 스니펫을 보세요. LOTIS는 템플릿이나 AJAX 호출 없이 복잡한 로직을 간결하게 표현합니다:
$maindiv = LTS::DataView();
$maindiv->bindtodb($kassa, [
'head' => ['sel' => '', 'date' => 'Date'],
'inputs' => [
['name' => 'id', 'type' => 'hidden'],
['name' => 'date', 'type' => 'date', 'caption' => 'Date'],
['name' => 'save', 'caption' => 'Write', 'type' => 'button'],
['name' => 'close', 'caption' => 'Cancel', 'type' => 'button']
],
'cells' => ['save, close', 'date']
]);
$subtable = $maindiv->subtable('kassasubtable', $kassatable, [
'head' => [
'sel' => '',
'name' => 'Employee',
'pay' => 'Received',
'del' => ''
],
'inputs' => [
['name' => 'user', 'type' => 'table', 'dbtable' => $users, 'caption' => 'Employee'],
['name' => 'message', 'caption' => 'Onwartość'],
['name' => 'pay', 'type' => 'numeric', 'caption' => 'Issued']
]
]);
$maindiv->onsave(function ($args, $result) {
global $money, $users;
$paytable = $args['subtables']['kassasubtable'];
$stock = LTS::Stock($money);
$stock->collector($users, 'user', ['total' => 'pay']);
$stock->update(['doc' => $result['data']['id']], $paytable);
return $result;
});
문서 저장 처리에 주목하세요: 비즈니스 로직(예: 급여 지급)은 하나의 블록에 담기며, 클라이언트-서버 분리가 없습니다. JavaScript 훅은 table->out() 같은 메서드를 통해 통합되며, 비동기 패턴 전문 지식이 필요 없습니다.
개발자 이점
LOTIS는 전통적인 웹 개발의 세 가지 핵심 문제를 해결합니다:
- 로직 중복 제거 — 데이터 검사와 변환은 객체에 한 번 정의되며, JS와 PHP 모듈에 흩어지지 않습니다
- 아키텍처 복잡도 감소 — API 설계나 로딩 상태 관리 필요 없음
- 통합 데이터 모델 — 객체 변경이 메타데이터를 통해 클라이언트와 서버 간 자동 동기화
특히 마감이 촉박한 프로젝트에 유용합니다: 표준 작업(폼, 테이블, 유효성 검사)이 수십 줄 대신 3-5줄로 끝납니다. 유연성은 유지되며 — JS 훅으로 날짜 포맷팅처럼 아무거나 커스터마이징 가능합니다:
$maindiv->table->out(<<<JS
function (row, obj) {
row.find('td.Column_date').text(obj.date.substr(0, 10));
}
JS);
주요 포인트
- LOTIS는 메타데이터를 생성하는 객체 모델로 클라이언트-서버 경계를 모호하게 합니다
- 개발은 순수 PHP 사용, 템플릿 없음, 하지만 JS 로직 임베드 가능
- 일상 작업 시간 절약: AJAX, 유효성 검사, 상태 동기화
- CMA로 동일 객체가 UI, API, 오프라인 모드에 사용
- Node.js 포트로 PWA와 로컬 앱 동기화 지원
현재 구현은 속도가 핵심인 비즈니스 앱을 대상으로 합니다. 다음 주요 버전은 TypeScript 지원과 현대 빌드 도구 통합을 강화합니다. DOM 래퍼와 Promise 체인에 지친 개발자들에게 LOTIS는 웹 기능 희생 없이 OOP 단순함을 되살립니다.
— Editorial Team
아직 댓글이 없습니다.