Locomotive; Light weight Server
  • Java 98.6%
  • JavaScript 1.4%
Find a file
2026-06-26 13:02:42 +09:00
.vscode Refactoring; add jdk.webserver 2026-06-26 12:42:53 +09:00
build-logic refactoring; 2026-06-26 13:02:42 +09:00
gradle refactoring 2026-06-21 03:39:15 +09:00
httpd Refactoring; add jdk.webserver 2026-06-26 12:42:53 +09:00
jwebserver refactoring; 2026-06-26 13:02:42 +09:00
lokomotivo Refactoring; add jdk.webserver 2026-06-26 12:42:53 +09:00
steampowered Lokomotivo 2026-06-22 13:25:41 +09:00
.gitattributes Ernst 2026-06-21 02:39:23 +09:00
.gitignore Lokomotivo 2026-06-22 13:25:41 +09:00
AGENTS.md Lokomotivo 2026-06-22 13:25:41 +09:00
build.gradle.kts Refactoring; add jdk.webserver 2026-06-26 12:42:53 +09:00
gradle.properties Ernst 2026-06-21 02:39:23 +09:00
gradlew Ernst 2026-06-21 02:39:23 +09:00
gradlew.bat Ernst 2026-06-21 02:39:23 +09:00
LICENSE Ernst 2026-06-21 02:39:23 +09:00
locomotive-2.png Refactoring; add jdk.webserver 2026-06-26 12:42:53 +09:00
locomotive-3.png Refactoring; add jdk.webserver 2026-06-26 12:42:53 +09:00
locomotive.png Refactoring; add jdk.webserver 2026-06-26 12:42:53 +09:00
README.md Refactoring; add jdk.webserver 2026-06-26 12:42:53 +09:00
settings.gradle.kts Refactoring; add jdk.webserver 2026-06-26 12:42:53 +09:00

Locomotive: Light-weight, High-speed Server Library

Locomotive는 Java NIO Selector 기반의 Reactor 패턴을 탑재하여 경량, 고속, Almost-Zero-Config를 지향하는 서버 프레임워크입니다. TCP, UDP 및 간단한 HTTP/1.1 서버/클라이언트를 내장 스레드 풀(ExecutorService)과 비동기 논블로킹 채널을 통해 빠르고 안정적으로 구동할 수 있습니다.

Locomotive


주요 기능 (Features)

  1. Java NIO 기반 비동기 논블로킹 서버
    • 단일 스레드가 수천 개의 커넥션을 관리하는 Selector 모델 채택.
    • Reactor 패턴으로 메인 스레드는 Accept 연산만 수락하고, 비즈니스 및 입출력은 Worker 스레드 풀에서 수행.
  2. Almost-Zero-Config & Fluent DSL
    • 설정 파일 없이 몇 줄의 코드로 즉시 구동 가능.
    • Fluent API 스타일로 라우팅 등록 지원.
  3. HTTP/1.1 프로토콜 기본 처리 및 동적 라우팅
    • HTTP Request/Response 객체 추상화 및 쿼리 파라미터 파싱.
    • Regular Expression을 활용한 동적 라우팅 및 경로 변수(Path Variables) 추출 기능 지원 (예: /posts/:id).
    • 기본 404 Not Found 처리 탑재.
  4. TCP & UDP 기본 제공
    • TCP 서버와 클라이언트(AutoCloseable 구현) 제공.
    • UDP 서버 및 클라이언트 제공.

사용 예시 (Usage)

1. HTTP 서버 구동 및 동적 라우팅

import com.elex_project.locomotive.Locomotive;
import com.elex_project.locomotive.HttpRouter;
import com.elex_project.locomotive.TcpServer;
import com.elex_project.locomotive.HttpHandler;

public class Main {
    public static void main(String[] args) throws Exception {
        // HTTP 서버 생성 (포트 8080)
        final TcpServer server = new TcpServer(8080);
        final HttpRouter router = new HttpRouter();

        // 1. 정적 라우팅 등록
        router.addRoute("GET", "/", (req, resp) -> {
            resp.html("<h1>Welcome to Ernst Server!</h1>");
        });

        // 2. 동적 라우팅 (Path Variables) 등록
        router.addRoute("GET", "/posts/:postId", (req, resp) -> {
            final String postId = req.getPathParam("postId");
            resp.json("{\"postId\": \"" + postId + "\", \"title\": \"Hello World\"}");
        });

        // 3. POST 요청 처리
        router.addRoute("POST", "/submit", (req, resp) -> {
            final String body = req.getBody();
            resp.text("Submitted Body: " + body);
        });

        // 핸들러 연동 및 시작
        server.handler(new HttpHandler(router));
        server.start();
    }
}

2. TCP 에코 서버 및 클라이언트 연동

TCP 서버

final TcpServer server = Ernst.createTcpServer(9090);
server.handler(new EchoHandler());
server.start();

TCP 클라이언트

try (final TcpClient client = new TcpClient("127.0.0.1", 9090)) {
    client.listener((message, tcpClient) -> {
        System.out.println("Received: " + new String(message));
    });
    
    // 백그라운드 이벤트 루프 기동
    new Thread(() -> {
        try {
            client.start();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }).start();

    // 메시지 송신
    client.send("Hello Ernst!".getBytes());
}

빌드 및 테스트 (Build & Test)

본 프로젝트는 Gradle을 통해 빌드 및 테스트를 관리합니다.

  • 프로젝트 빌드:
    ./gradlew build
    
  • 프로젝트 청소:
    ./gradlew clean
    
  • 단위 테스트 실행:
    ./gradlew test
    

프로젝트 규칙 (Guidelines)

  • 모든 공개 API는 영문 Javadoc으로 상세히 명시되어 있습니다.
  • 소스코드 내 모든 내부 주석 및 JUnit 5 테스트 코드 주석은 한국어로 친절하게 작성되어 있습니다.
  • 예외 안전성과 경계 조건에 대한 방어 로직이 모든 핵심 컴포넌트에 적용되어 있습니다.

향후 계획

[] 웹소켓 지원 [] 리버스 프록시 서버 뒤에서 운영될 경우가 많으므로, 이에 대한 유연한 요청 헤더 처리. 예를 들어, X-Remote_user 등. [] http 요청 헤더에 따른 유연한 동작. 예를 들어, Connection: close라거나, Compression 등.