A production-ready Spring Boot 3.5.3 + Kotlin 2.0 starter project, offering a unified package with essential backend features pre-integrated and real-world examples.
-
Application
- Kotlin 2.0
- Jdk 21
- Spring boot 3.5.3
- mvc
- webflux
- Gradle 8.10
- Spring Security
- Spring Batch
- Springdoc OpenAPI
- Postgresql
- h2 database (PostgreSQL mode) - localhost environment
- Jpa
- QueryDSL
- Redis
- Jwt
- Validation
- Kotlin Logging
- Logback
- Flyway
- Webhook
- Slack
- Discord
- Kafka
- WebClient
- Spring Actuator
-
Test
- Spring Boot Starter Test
- Spring Security
- Spring Batch
- Junit 5
- Mockito Kotlin
- Mockito Inline
- Kotest
- Mockk
- Instancio
- h2 database (PostgreSQL mode)
- Flyway
-
Etc
- Docker
- Pgadmin
- Ktlint
- Detekt
- Mailhog
- Netty resolver dns native macos
- Kafka UI
-
Monitoring
- Prometheus
- Grafana
- Sentry
- monitoring
- docker
- src
- common
- domain (post, user, auth)
- example
- WelcomeSignUpConsumer: Kafka Consumer(SignUp Event) Example
- infrastructure (kafka, redis, webhook, mail)
- security
- spring security + jwt logic
- utils
- resources
- db
- migration: flyway sql
- sql: spring batch postgresql metadata sql
- logback-spring.xml
- Logback configuration with environment-specific settings
- Profiles: prod, dev, local
- application.yml
- prod, dev, local, common, test, secret-{environment}
- common: Write common variables for the project.
- test: Create the variables needed for your test environment.
- secret-{environment}: your secret variables for each environment.
- db
To use the application, the following two services must be installed and running:
- kafka
- redis
- mailhog
- grafana
- prometheus
-
Database DDL Management
- This project uses Flyway for DDL management instead of JPA auto-generation.
- Migration scripts are located in src/main/resources/db/migration
- If you prefer not to use Flyway, entity synchronization is configured - you can use JPA DDL auto-generation instead.
- JPA DDL configuration: src/main/resources/application-common.yml ( spring.jpa.generate-ddl)
- Set
spring.jpa.hibernate.ddl-auto
property for each environment (local, dev, prod) as needed
-
Webhook
- enable & route endpoint
- default enable true
- types
- slack
- discord
- enable & route endpoint
// example
// 1. all
webHookProvider.sendAll(
"Subscription request received from method ${parameter.method?.name}.",
mutableListOf("Request Body: $body")
)
// 2. target slack
webHookProvider.sendSlack(
"Failed to send message to Kafka (foo)",
mutableListOf("Failed to send message to Kafka: ${exception.message} / $foo")
)
// 3. target discord
webHookProvider.sendDiscord(
"Failed to send message to Kafka (bar)",
mutableListOf("Failed to send message to Kafka: ${exception.message} / $bar")
)
-
Mailhog
- mailhog is a tool for testing email sending.
- If you want to use MailHog, the default SMTP port is 1025. Of course, if you already have your own preferred setup, you can freely adjust the port as needed.
- Please check the settings in application-local.yml and application-secret-local.yml.
-
Lint
- ktlint
- using the official lint rules by default.
- report output
- build/reports/ktlint
- detekt
- using rules
- report output
- build/reports/detekt
- ktlint
-
Docker & Infrastructure Services
- The project includes Docker Compose configurations for all required services
- For detailed setup, port information, and service management, see Docker Setup Guide
-
Create Spring Batch metadata table (localhost, development and production environments.)
- Run your ddl script or Please refer
to github - spring batch
- Since this project uses postgresql, the spring.batch.jdbc.initialize-schema: always option does not work.
- localhost & test environment, generating batch-postgresql-metadata-schema.sql.
- Run your ddl script or Please refer
to github - spring batch
-
Two types of tests
- mockito
- kotest & mockk
- if you want to bypass Spring Security authentication issues.
- SecurityListenerFactory
- BaseIntegrationController
// example listeners(SecurityListenerFactory()) Then("Call DELETE /api/v1/users/{userId}").config(tags = setOf(SecurityListenerFactory.NonSecurityOption)) { // ... }
- if you want to bypass Spring Security authentication issues.
-
Kafka
- KafkaTopicMetaProvider
- Manage metadata related to topics
- DLQ
- DLQs are dynamically created in this project.
- default fallback partition: 1 (if the topic partition does not exist)
- KafkaTopicMetaProvider
-
- To use the data collected by Spring Actuator, please enter the correct URL.
- Replace '{ip address}:8085' with your actual IP address.
- Actuator properties
- To use the data collected by Spring Actuator, please enter the correct URL.
-
Service Access URLs (When services are running)
### Application
-
API Documentation (Swagger): http://localhost:8085/swagger-ui/index.html
-
H2 Console (local environment): http://localhost:8085/h2-console
-
Application Server: http://localhost:8085
-
MailHog (Email Testing): http://localhost:8025
-
PgAdmin (PostgreSQL Management): http://localhost:8088
-
Kafka UI (Kafka Management): http://localhost:9000
-
Redis: localhost:6379 (CLI/Client access)
-
PostgreSQL: localhost:5432 (Database connection)
-
Kafka: localhost:9092 (Broker connection)
-
Zookeeper: localhost:2181 (Coordination service)
-
Grafana (Metrics Dashboard): http://localhost:3000
-
Prometheus (Metrics Collection): http://localhost:9090
-
Hyunwoo Park