Kosmos Overview
Kosmos는 Java 기반 서버사이드 HTML DSL입니다. 타입 안정성과 높은 성능, 일관된 디자인 철학으로 웹 애플리케이션을 빠르고 견고하게 만듭니다.
핵심 가치
정확성
타입 안정 DSL과 컴포넌트화로 리팩터링 안전성 확보
El.a().css("btn btn-primary")
.attr("href","/docs/kosmos/getting-started")
.text("시작하기");
성능
내부 StringBuilder 최적화 → 메모리/CPU 사용량 최소화
참고: 템플릿 기반 대비 렌더링 오버헤드가 낮아 대량 리스트에서도 안정적입니다.
일관성
Atomic Design 기반 계층 구조: Template → Organism → Molecule → Atom
| 레벨 | 예시 |
|---|---|
| Template | DocsPageTemplate |
| Organism | FragDocsNodeTree + FragDocsContent |
| Molecule | CompSaveForm, UnsTable |
| Atom | CompInputText, CompButton |
서버 일원화
Spring MVC와 자연스럽게 결합하여 Controller → Service → Repository → DSL 흐름을 단일화
주의: 뷰 렌더 로직은
RenderContext로만 데이터·세션을 전달해 보안/일관성을 유지하세요.코드 심화 예시
아래는 Kosmos DSL로 카드 리스트(기사 목록)를 렌더링하는 심화 예시입니다.
// Articles 리스트 렌더링
El.div().css("row").children(
articles.stream().map(article ->
El.div().css("col-md-4 mb-3").child(
El.div().css("card h-100 shadow-sm").children(
El.div().css("card-body").children(
El.h3().css("h6").text(article.getTitle()),
El.p().css("small text-muted").text(article.getSummary()),
El.a().css("btn btn-sm btn-outline-primary")
.href("/articles/" + article.getId())
.text("더보기")
)
)
)
).toList()
);
베스트 프랙티스
| 주제 | 권장 | 지양 |
|---|---|---|
| 컴포넌트화 | 반복되는 카드/폼/테이블을 Comp*로 추출 |
페이지마다 유사 HTML을 복붙 |
| 성능 | StringBuilder 기반 렌더, 불필요 객체 생성 억제 |
빈번한 문자열 결합(+)로 GC 압박 |
| 접근성 | 의미 있는 태그, 라벨/aria 속성, 키보드 포커스 흐름 | 모양만 맞춘 <div> 남용 |
| 국제화(i18n) | 문자열은 메시지 번들/리소스 키 사용 | 하드코딩 텍스트 |
| 보안 | 사용자 입력은 적절히 이스케이프/검증 | raw HTML을 무검증으로 삽입 |
아키텍처 도식
Controller Service Repository Kosmos DSL El.*, Comp*, Frag* HTML SSR
Controller → Service → Repository → Kosmos DSL → SSR HTML
주의사항
성능: 대용량 렌더링은 가급적 for-loop 사용. 스트림/람다는 과도한 람다 캡처로 오버헤드가 생길 수 있습니다.
보안: 사용자 입력을 포함하는 텍스트는 반드시 이스케이프하거나 화이트리스트 기반으로 정제하세요.
구조: 재사용 가능한 블록은
Comp*, 페이지 용도 조합은 Frag*, 레이아웃은 Template로 분리하세요.국제화: 하드코딩 텍스트 대신 메시지 번들을 사용하면 다국어 확장이 쉬워집니다.
다음으로
- Getting Started — 설치와 첫 화면
- Foundation — 용어와 Atomic Design
- Recipes — 실전 예제