Locomotive; Light weight Server
- Java 98.6%
- JavaScript 1.4%
| .vscode | ||
| build-logic | ||
| gradle | ||
| httpd | ||
| jwebserver | ||
| lokomotivo | ||
| steampowered | ||
| .gitattributes | ||
| .gitignore | ||
| AGENTS.md | ||
| build.gradle.kts | ||
| gradle.properties | ||
| gradlew | ||
| gradlew.bat | ||
| LICENSE | ||
| locomotive-2.png | ||
| locomotive-3.png | ||
| locomotive.png | ||
| README.md | ||
| settings.gradle.kts | ||
Locomotive: Light-weight, High-speed Server Library
Locomotive는 Java NIO Selector 기반의 Reactor 패턴을 탑재하여 경량, 고속, Almost-Zero-Config를 지향하는 서버 프레임워크입니다. TCP, UDP 및 간단한 HTTP/1.1 서버/클라이언트를 내장 스레드 풀(ExecutorService)과 비동기 논블로킹 채널을 통해 빠르고 안정적으로 구동할 수 있습니다.
주요 기능 (Features)
- Java NIO 기반 비동기 논블로킹 서버
- 단일 스레드가 수천 개의 커넥션을 관리하는 Selector 모델 채택.
- Reactor 패턴으로 메인 스레드는 Accept 연산만 수락하고, 비즈니스 및 입출력은 Worker 스레드 풀에서 수행.
- Almost-Zero-Config & Fluent DSL
- 설정 파일 없이 몇 줄의 코드로 즉시 구동 가능.
- Fluent API 스타일로 라우팅 등록 지원.
- HTTP/1.1 프로토콜 기본 처리 및 동적 라우팅
- HTTP Request/Response 객체 추상화 및 쿼리 파라미터 파싱.
- Regular Expression을 활용한 동적 라우팅 및 경로 변수(Path Variables) 추출 기능 지원 (예:
/posts/:id). - 기본 404 Not Found 처리 탑재.
- 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 등.
