Terminology & Style
Kosmos DSL 전반에서 사용하는 용어/네이밍 규칙과 코딩 스타일을 정의합니다. 팀 전체가 같은 단어와 규칙으로 말하면 유지보수가 쉬워집니다.
주요 용어
외부 DSL (사용자 API)
css(...): 클래스 추가 (여러 개 공백 구분)attr(name, value): 속성 추가text(...): 텍스트 노드 설정child(...), children(...): 자식(들) 추가El.*: 요소 팩토리(div/a/img/table...)
내부 DSL (엔진 내부)
addClass / addAttribute/addChild(s)HtmlComponent:render(ctx)를 구현하는 타입HtmlTag / VoidTag: 자식 유무로 구분RenderContext: 요청/세션/권한/언어 등 컨텍스트
네이밍 규칙
| 범주 | 권장 | 지양 |
|---|---|---|
| Template | *PageTemplate (페이지 레이아웃/슬롯 제공) |
복잡한 화면 로직 혼재 |
| Fragment | Frag* (Organism; 페이지 조각의 조합) |
Controller 로직 포함 |
| Component | Comp* (Molecule/Atom; 재사용 단위) |
페이지 전역 상태 의존 |
| 변수/함수 | lowerCamelCase, 동사+명사 (예: buildTable()) |
약어 남용, 의미 없는 축약 |
| 패키지 | 단일 책임 (예: dsl.component) |
역할 혼합(유틸·컴포넌트·서비스 뒤섞임) |
코드 심화: 버튼 컴포넌트 표준화
버튼 스타일과 접근성 속성을 통일하면, 화면 간 일관성이 좋아집니다.
public class CompPrimaryButton implements HtmlComponent {
private final String label;
private final String href;
public CompPrimaryButton(String label, String href) {
this.label = label; this.href = href;
}
@Override public String render(RenderContext ctx) {
return El.a().css("btn btn-primary")
.attr("href", href)
.attr("role", "button")
.attr("aria-label", label)
.text(label)
.render(ctx);
}
}
스타일 가이드: 예 / 아님
| 예 (Good) | 아님 (Bad) |
|---|---|
|
|
|
|
접근성 & 국제화 체크리스트
- 의미 있는 HTML 태그 선택 (제목은
h1~h6, 목록은ul/ol) - 버튼/링크에
role,aria-label등 보조 속성 적용 - 문자열은 메시지 번들 키로 관리하여 다국어 확장
- 색만으로 의미를 전달하지 말기(아이콘/텍스트 병행)
주의사항
혼용 금지: 외부 DSL(사용자 API)와 내부 엔진 API 네이밍을 섞어 쓰지 마세요.
안티 패턴: 인라인 스타일/임의 클래스명 남용 → 재사용성과 유지보수 저하.
리뷰 규칙: PR 템플릿에 네이밍/접근성 체크 항목을 포함하세요.