π English | νκ΅μ΄
Full-Stack Software Engineer & Open-Source Creator. Passionate about high-performance Java architectures, eliminating developer friction, and developer ergonomics.
π Flagship Project: s2-util & s2-validator
"Tired of writing validation rules twice in Java and JavaScript? Tired of annotation hell for conditional fields?" s2-validator is a next-generation dynamic validation framework that lets you Write Once, Validate Anywhere β from server-side Java DTOs to native browser HTML with zero frontend JavaScript code.
| Pain Points in Real-World Enterprise | Standard Bean Validation (JSR-380) | β s2-validator |
|---|---|---|
| Conditional Fields (If A then B required) | Verbose @GroupSequenceProvider or custom annotation classes β |
Expressive in 2 lines: .when("type", "VIP").rule(REQUIRED) β
|
| Cross-Field Comparison (pw == confirmPw) | Class-level annotations; errors bound to root object β | Directly bound to the target field: .rule(EQUALS_FIELD, "pw") β
|
| Browser / Frontend Sync | Server-only. Must duplicate identical regex/rules in JS/TS β | Zero frontend code: getRulesJson() + native tooltip auto-focus β
|
| Korean Particle Grammar π°π· | Complex custom MessageInterpolator required β |
Built-in smart postpositions ({0|μ/λ}, {0|μ΄/κ°}) β
|
| Field Typo / Refactoring Safety | String-based property paths fail silently at runtime β | s2-validator-plugin catches typos at compile time via AST static analysis π‘οΈ β
|
Validate DTOs, VOs, or Maps in a single fluent line. Omitted rules default to REQUIRED:
// Fail-fast: throws S2RuntimeException on first error
S2Validator.of(command)
.field("name", "Name") // Omitting rule auto-applies REQUIRED
.field("email", "Email").rule(S2RuleType.EMAIL) // With rules, REQUIRED is NOT auto-applied
.field("birthDate", "Birth Date").rule(S2RuleType.REQUIRED).rule(S2RuleType.DATE)
.validate();
// Or collect all errors without throwing:
List<S2ValidationError> errors = new ArrayList<>();
boolean isValid = S2Validator.of(command)
.field("name", "Name")
.field("email", "Email").rule(S2RuleType.EMAIL)
.validate(errors::add);Need browser-side validation? Send the server rules directly to HTML:
// Server: Validate with Spring BindingResult & expose rules JSON
S2BindValidator.context("signUp", this::signUpRules).validate(command, result);
model.addAttribute("rules", S2BindValidator.context("signUp", this::signUpRules).getRulesJson());<!-- Client: Native browser tooltips & auto-focus with a single HTML attribute! -->
<form th:data-s2-rules="${rules}">π Dive Deeper into the Ecosystem:
- ποΈ s2-util Suite Repository β: Explore the complete utility toolkit (
s2-core,s2-validator,s2-jpa) and quick start guide - π s2-validator Deep Dive & Guide β: Complete rule reference, Spring MVC binding, and Thymeleaf/HTML integration
| Project / Module | Description | Repository |
|---|---|---|
s2-validator |
β Unified dynamic cross-platform validation engine & Spring binding integration | s2-util |
s2-validator-plugin |
Gradle static analysis plugin β catches DTO field typos and incomplete chains at compile time | s2-util |
s2-core |
High-performance Java utility toolkit (MethodHandle Reflection, W-TinyLFU Cache, Dates, Strings) | s2-util |
s2-jpa |
Fluent dynamic JPQL query builder with SQL injection prevention | s2-util |
s2-support |
Opinionated companion library for application-level workflows (Pagination, SFTP/Files, Spring Context) | s2-support |
s2-build-support |
Convention Gradle plugin for automated licensing, copyright, and publication | s2-build-support |
- Languages: Java (17 / 21+), Kotlin, SQL, JavaScript
- Frameworks & Tech: Spring Boot, Spring MVC, Spring Data JPA, Hibernate, Caffeine Cache
- Build & CI/CD: Gradle, Maven Central Publishing, GitHub Actions, Docker
- Architecture: Clean Architecture, High-Performance I/O & Concurrency, AST Static Analysis
- GitHub: @devers2
- Email: eseungsu.dev@gmail.com