Kosmos Spring 0.2.0 — Spring Boot에서 Kosmos DSL로 페이지 만들기

UNeedSoft “유니드소프트-모두를 위한 소프트웨어” 비전 아래 공개 배포되는 kosmos-spring-0.2.0.jarRenderContext 자동 주입 기반의 첫 페이지를 실행하는 방법을 안내합니다.

이 가이드를 끝까지 따라하면
  • kosmos-dsl-0.2.0.jar + kosmos-spring-0.2.0.jar을 프로젝트에 추가하고
  • RenderContext를 컨트롤러 파라미터로 자동 주입받아
  • http://localhost:8080/에서 “Kosmos + Spring Boot” 첫 화면을 확인할 수 있습니다.
중요(초보자 오류 방지)
kosmos-spring의 RenderContextResolver는 내부에서 CsrfToken을 참조합니다. 따라서 초보자 가이드 기준으로는 Spring Security 의존성이 반드시 필요합니다. (의존성이 없으면 NoClassDefFoundError: CsrfToken가 발생할 수 있습니다.)

0) 준비물(필수)

  • Java 17 설치(권장)
  • Spring Boot 3.x 기반 웹 프로젝트(아래 단계에서 생성)
  • 첨부 파일 2개:
    • kosmos-dsl-0.2.0.jar
    • kosmos-spring-0.2.0.jar

1) 프로젝트 생성 (IntelliJ Community 또는 VS Code)

A. IntelliJ IDEA Community

  1. File > New > Project
  2. Generators > Spring Boot 선택
    • Name: kosmos-spring-lec01
    • Language: Java
    • Type: Gradle-Groovy (Gradle-Kotlin도 가능)
    • Group/Artifact: 예) com.example / kosmos-spring-lec01
    • Java: 17
    • Packaging: Jar (추천)
  3. Dependencies(의존성): Spring Web 선택
  4. 생성 후 실행 버튼(▶)으로 기본 앱이 실행되는지 먼저 확인

B. VS Code

  1. 확장 설치: Extension Pack for Java, Spring Boot Extension Pack
  2. Ctrl+Shift+PSpring Initializr: Create a Gradle Project
  3. Java 17 / Boot 3.x / Dependencies: Spring Web 선택
  4. 폴더 생성 후 열기

2) JAR 추가 (가장 쉬운 방식: libs/ 폴더)

(권장) Gradle 프로젝트 기준. 프로젝트 루트에 libs/ 폴더를 만들고 JAR을 복사한 뒤 의존성을 추가합니다.

  1. 프로젝트 루트에 폴더 생성: libs/
  2. libs/ 안에 첨부 파일 복사:
    • libs/kosmos-dsl-0.2.0.jar
    • libs/kosmos-spring-0.2.0.jar
  3. Gradle 의존성 추가 (아래 코드 중 하나 선택)
build.gradle (Groovy)
dependencies {
  implementation files("libs/kosmos-dsl-0.2.0.jar")
  implementation files("libs/kosmos-spring-0.2.0.jar")

  implementation "org.springframework.boot:spring-boot-starter-web"
  implementation "org.springframework.boot:spring-boot-starter-security" // 필수(초보자 오류 방지)
}
build.gradle.kts (Kotlin)
dependencies {
  implementation(files("libs/kosmos-dsl-0.2.0.jar"))
  implementation(files("libs/kosmos-spring-0.2.0.jar"))

  implementation("org.springframework.boot:spring-boot-starter-web")
  implementation("org.springframework.boot:spring-boot-starter-security") // 필수(초보자 오류 방지)
}

Gradle Sync(동기화)를 실행합니다.

3) KosmosWebMvcConfig 작성 (Resolver 빈 생성 + 자동 주입 등록)

이 단계는 두 가지를 한 번에 처리합니다. (1) RenderContextResolver 빈 생성(@Bean), (2) 컨트롤러 파라미터 자동 주입을 위해 ArgumentResolver 등록(WebMvcConfigurer).

파일 생성: src/main/java/.../config/KosmosWebMvcConfig.java
package com.example.demo.config;

import net.uneedsoft.kosmos.spring.web.config.RenderContextResolver;
import org.springframework.context.MessageSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Lazy;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

import java.util.List;

@Configuration
public class KosmosWebMvcConfig implements WebMvcConfigurer {

    private final RenderContextResolver resolver;

    public KosmosWebMvcConfig(RenderContextResolver resolver) {
        this.resolver = resolver;
    }

    // RenderContextResolver는 kosmos-spring 라이브러리에 포함되어 있으므로 "작성"하지 않습니다.
    // 여기서는 프로젝트에서 Bean으로 생성만 해줍니다.
    @Bean
    public RenderContextResolver renderContextResolver(@Lazy MessageSource messageSource) {
        return new RenderContextResolver(messageSource);
    }

    // 컨트롤러 파라미터(RenderContext) 자동 주입을 위해 ArgumentResolver 등록
    @Override
    public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {
        resolvers.add(resolver);
    }
}

4) SecurityConfig 작성 (초보자용: permitAll)

spring-boot-starter-security를 추가하면 기본 보안 정책 때문에 로그인 화면/차단이 발생할 수 있습니다. 초보자 단계에서는 아래처럼 전체 요청 허용으로 시작하는 것이 가장 안전합니다.

파일 생성: src/main/java/.../config/SecurityConfig.java
package com.example.demo.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.web.SecurityFilterChain;

@Configuration
public class SecurityConfig {

    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        return http
            .authorizeHttpRequests(auth -> auth.anyRequest().permitAll())
            // 초보자 단계에서는 GET 위주로 먼저 확인하므로 기본 CSRF를 유지해도 됩니다.
            // 폼/POST까지 진행하면서 막히면 그때 csrf.disable()을 안내하는 방식이 깔끔합니다.
            .build();
    }
}

5) Kosmos DSL 페이지 작성 (HomePage)

이제 실제로 Kosmos DSL로 HTML을 렌더링하는 페이지 클래스를 만들어 봅니다.

파일 생성: src/main/java/.../pages/HomePage.java
package com.example.demo.pages;

import net.uneedsoft.kosmos.dsl.core.base.HtmlComponent;
import net.uneedsoft.kosmos.dsl.core.context.RenderContext;
import net.uneedsoft.kosmos.dsl.factory.El;

public class HomePage implements HtmlComponent {

    @Override
    public String render(RenderContext ctx) {
        return El.div().css("container py-5")
            .children(
                El.h1().text("Kosmos + Spring Boot"),
                El.p().text("kosmos-spring 0.2.0 설정이 완료되었습니다."),
                El.p().css("text-muted mb-0")
                    .text("RenderContext가 컨트롤러 파라미터로 자동 주입됩니다.")
            )
            .render(ctx);
    }
}

6) 컨트롤러에서 RenderContext 자동 주입 사용

핵심 포인트는 컨트롤러 메서드 파라미터에 RenderContext ctx를 선언하는 것입니다. 이제부터는 매번 RenderContext.builder(...)를 직접 만들지 않아도 됩니다.

파일 생성: src/main/java/.../HomeController.java
package com.example.demo;

import com.example.demo.pages.HomePage;
import net.uneedsoft.kosmos.dsl.core.context.RenderContext;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HomeController {

    @GetMapping("/")
    public String home(RenderContext ctx) { // 자동 주입
        return new HomePage().render(ctx);
    }
}

7) 실행 후 브라우저 접속

  • 앱 실행(▶) 또는 Gradle 실행 후
  • http://localhost:8080/ 접속
  • “Kosmos + Spring Boot” 화면이 보이면 성공

8) 초보자 체크 포인트

  • 메시지(i18n)를 쓰고 싶다 → ctx.getMessage("key", "fallback")
  • 로그인/권한 분기ctx.isAuthenticated(), ctx.hasRole("ROLE_ADMIN")
  • CSRF 토큰ctx.getOrDefault("_csrf.token","")
  • request 객체ctx.get("request")

9) 다음 확장(선택)

  • 레이아웃(헤더/푸터) 컴포넌트화
  • Section 토큰(uns-section--lg) 기반 페이지 표준화
  • 정적 리소스(css/js) 구성 및 JSON 기반 콘텐츠 구조화
UNeedSoft는 “모두를 위한 소프트웨어” 비전 아래, 누구나 Kosmos 기반 웹 개발을 시작할 수 있도록 지속적으로 가이드를 공개합니다.