Akan.js는 기술적인 배관 코드를 최소화하고, 비즈니스 로직을 표현하는 데 집중할 수 있도록 도와줍니다.
또한, 애플리케이션을 구축하기 위한 편의 기능과 설치 가능한 라이브러리를 제공하여 검증된 비즈니스 패턴을 반복 구현하지 않고 재사용할 수 있게 합니다.
이는 에이전틱 코딩 시대에 더욱 중요합니다. 비즈니스 의도가 놓일 자리가 분명하고 나머지 배치가 컨벤션으로 정해져 있을 때, 에이전트는 더 좋은 코드를 작성할 수 있습니다.
워크스페이스 (모노레포)
Akan.js는 monorepo 구조를 기본으로 합니다. 하나의 조직(팀)은 하나의 레포지토리(workspace) 위에서 여러 앱과 공통 라이브러리를 개발하며, 앱 실행부터 production build, library 개발, package 관리까지 모두 workspace root에서 실행하고 운영합니다.
Akan Workspace
appA는 libA를 사용
appB는 libA와 libB를 사용
appC는 libB를 사용
앱(apps): 독립적으로 배포될 수 있는 제품 surface입니다. 앱은 page, runtime entry, app configuration, asset, 앱 전용 domain code를 가집니다.
공통 라이브러리(libs): 여러 앱이 공유하는 재사용 가능한 비즈니스 및 유틸리티 모듈입니다. 인증, 파일, 결제, 알림, 채팅, 관리자 기능, 도메인 모듈 등을 이곳에 두고 안전하게 재사용할 수 있습니다.
처음 `akan create-workspace`를 진행하면, 기본적으로 shared, util 라이브러리가 설치되고, 이는 공통 라이브러리로서 모든 앱에서 사용할 수 있습니다.
생성한 내 애플리케이션(e.g. myapp)에서 서버 로직, 도메인 모듈, 클라이언트 로직, 컴포넌트 등의 공통 라이브러리를 사용할 수 있습니다. 예를 들면, shared 라이브러리에서는 관리자페이지와 파일 업로드 도구 등을 제공합니다.
80:20 규칙
건강하게 유지되는 워크스페이스는 약 80%의 코드가 공통 라이브러리로 공유되고, 20%의 코드가 각 앱에 특화되어 운영되는 구조를 권장합니다.
하지만 규칙을 지키려고 노력하지 않아도 됩니다. 당신이 마음을 담아 워크스페이스를 유지보수 하는 과정에서 자연스럽게 비율이 맞추어질 것입니다.
워크스페이스 파일 구조
앱과 라이브러리는 예측 가능한 구조를 공유합니다. 그래서 page, domain module, asset, runtime entry가 어디에 있는지 쉽게 찾을 수 있습니다.
앱은 main.ts에서 AkanApp으로 실행되고, 사용자에게 전달되는 route는 page/ 아래에 선언합니다. 도메인 모듈은 lib/ 아래에 위치하며 apps와 libs 어디에서든 공유할 수 있습니다.
처음부터 모든 파일 규칙을 이해할 필요는 없습니다. 먼저 내가 바꾸려는 코드가 사용자에게 전달되는 page인지, 비즈니스 domain module인지, 재사용 UI인지, 앱 runtime configuration인지 파악하면 됩니다.
워크스페이스 전체에서 같은 컨벤션이 반복되기 때문에 사람과 에이전트 모두 낯선 코드를 처음부터 추측하지 않고 탐색할 수 있습니다.
Application or Library Anatomy
serverclientshared
Domain modules
Interface
lib/product/product.constant.ts · dictionary.ts · signal.ts
Data and service
lib/product/product.document.ts · service.ts
UI and state
lib/product/product.store.ts · Product.Template.tsx · Unit.tsx · View.tsx · Zone.tsx
Scalar modules
lib/__scalar/fileMeta/fileMeta.constant.ts
Service utilities
srvkit/account.ts · srvkit/guards.ts
UI and webkit
ui/Field.tsx · webkit/useFirebaseMessaging.tsx
public/ · private/
정적 asset
파일 규칙을 따르면 애플리케이션이 커져도 확장 가능하고 재사용 가능한 구조를 유지할 수 있습니다. 중요한 질문은 어떤 프레임워크 레이어와 씨름할지가 아니라, 어떤 비즈니스 의도를 표현하고 있으며 그 의도가 어디에 위치해야 하는지입니다.
예를 들어 패스워드 기반 로그인 기능에서는 입력 폼은 page 또는 UI component 가까이에, 비밀번호 규칙은 공유 domain definition 가까이에, 저장과 보안 동작은 domain module의 service layer에 두는 식입니다.