Kotlin ์ธ์ด๋ก JVM ํ๊ฒฝ์์ ๊ฐ๋ฐํ ๋ ์ฌ์ฉํ ๊ณต์ฉ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
KDoc ์์ฑ ์ง์นจ: doc/Kdoc_Instruction.md
Kotlin ์ธ์ด๋ฅผ ๋ฐฐ์ฐ๊ณ , ์ฌ์ฉํ๋ฉด์, Backend ๊ฐ๋ฐ์ ์์ฃผ ์ฌ์ฉํ๋ ๊ธฐ์ , Coroutines ๋ฑ ๊ธฐ์กด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์ ๊ณตํ์ง ์๋ ๊ธฐ๋ฅ ๋ค์ ๊ฐ๋ฐํด ์์ต๋๋ค.
-
Kotlin ์ ์ฅ์ ์ ์ต๋ํ ํ ์ ์๋ ์ถ์ฒํ ๋งํ ์ฝ๋ฉ ์คํ์ผ์ ์ ๊ณตํ ์ ์๋ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค.
bluetape4k-core์ assertions, required ๊ฐ์ ๊ธฐ๋ฅbluetape4k-measured์ ์กฐํฉ ๊ฐ๋ฅํ ๋จ์ ํ์ (Units)๊ณผ ์ธก์ ๊ฐ(Measure) ์ ๊ณต
-
๊ธฐ์กด Java ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ฌด์ง์ฑ์ผ๋ก ์ฌ์ฉํ์ง ์๊ณ , ์ข ๋ ํจ๊ณผ์ ์ผ๋ก ์ฌ์ฉํ ์ ์๋๋ก ๊ฐ์ ํ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค.
bluetape4k-core์ LZ4, Zstd ๋ฑ ์์ถ ๊ธฐ๋ฅ ๊ฐ์bluetape4k-redis์ lettuce, redisson ์ฉ Codec ์ ๊ณต (๊ณต์ Codec ๋ณด๋ค ์ฑ๋ฅ์ด ์๋ฑํจ)
-
ํ ์คํธ๋ฅผ ์ข ๋ ์์ฑ๋ ์๊ฒ ํ๊ธฐ ์ํ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค.
bluetape4k-junit5๋ค์ํ ํ ์คํธ ๊ธฐ๋ฒ์ Junit5 ๊ธฐ๋ฐ์ผ๋ก ์ ๊ณตํฉ๋๋ค.bluetape4k-testcontainers๋ค์ํ ์๋น์ค๋ค์ ํ ์คํธ ํ๊ฒฝ์์ ์ฌ์ฉํ ์ ์๋๋ก ํฉ๋๋ค.
-
Kotlin Coroutines ๋ฑ Async/Non-Blocking ๋ฐฉ์์ ๊ฐ๋ฐ์ ์ง์ํ๋ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค.
bluetape4k-coroutinesCoroutine ์ ์ฌ์ฉํ ๋ ์ ์ฉํ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค.bluetape4k-feigh,bluetape4k-retrofit2๋ฑ์ HTTP ํต์ ์ async/non-blocking์ ์ํด Coroutines ์ ์ฌ์ฉํ๋๋ก ํฉ๋๋ค
-
AWS SDK ์ฌ์ฉ ์ ์ฑ๋ฅ์ ์ํด ๊ฐ์ ํ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค.
bluetape4k-awsAWS Java SDK v2 ๊ธฐ๋ฐ์ผ๋ก DynamoDB, S3, SES, SNS, SQS, KMS, CloudWatch, Kinesis, STS ๋ฑ์ Async/Non-Blocking ๋ฐฉ์์ผ๋ก ์ฌ์ฉํ ์ ์๋๋ก ํฉ๋๋ค.- S3 TransferManager๋ฅผ ํ์ฉํ ๋์ฉ๋ ํ์ผ ์ ์ก ์ฑ๋ฅ ์ต์ ํ๋ฅผ ์ ๊ณตํฉ๋๋ค.
-
AWS Kotlin SDK ๋ฅผ ์ฌ์ฉ์ ํธ๋ฆฌํ๊ฒ ํ๊ธฐ ์ํ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค.
bluetape4k-aws-kotlinAWS Kotlin SDK ๊ธฐ๋ฐ์ผ๋ก nativesuspendํจ์๋ฅผ ๊ธฐ๋ณธ ์ ๊ณตํ์ฌ Coroutines ํ๊ฒฝ์์ ํธ๋ฆฌํ๊ฒ ์ฌ์ฉํ ์ ์์ต๋๋ค.
-
MSA์ ํ์์ธ Resilience4j ์ ๋ํ Kotlin Coroutines ์ง์์ ๊ฐํํ์ต๋๋ค.
bluetape4k-resilience4jResilience4j ๋ฅผ ์ฌ์ฉํ ๋ Kotlin Coroutines ๋ฅผ ์ฌ์ฉํ ์ ์๋๋ก ์ง์ํฉ๋๋ค.- ๋ํ Coroutines ์ฉ Cache๋ฅผ ์ถ๊ฐํ์ฌ, Coroutines ํ๊ฒฝ์์๋ API ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ์บ์ฑํ ์ ์๋๋ก ์ง์ํฉ๋๋ค.
-
Redis ๋ฅผ ๋์ํ ๋ฐฉ์์์ ์ฌ์ฉํ ์ ์๋๋ก ์ง์ํฉ๋๋ค.
bluetape4k-redis๋ Lettuce, Redisson ์ฉ ๊ณ ์ฑ๋ฅ Codec ์ ์ ๊ณตํฉ๋๋ค.- Redisson์ ๋ค์ํ Lock ๊ธฐ๋ฅ์ Coroutines ํ๊ฒฝ์์๋ ์ฌ์ฉํ ์ ์๋๋ก ์ง์ํฉ๋๋ค.
- Redis๋ฅผ ๋ถ์ฐ ์บ์๋ก๋ง ์ฌ์ฉํ๋ ๊ฒ์ด ์๋๋ผ, Near Cache๋ก ์ฌ์ฉํ ์ ์๋๋ก ํ์ฌ ๋์ฑ ์ฑ๋ฅ์ ๋ํ ์ ์๋๋ก ํฉ๋๋ค.
๊ทธ ์ธ ํ์ ์์ ๋ง์ฃผ์ณค๋ ๋ง์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๊ณผ์ ์์ ํ์๋ก ํ๋ ๊ธฐ๋ฅ ๋ค์ ์ ๊ณตํฉ๋๋ค.
์์ผ๋ก๋ ํ์ํ ๊ธฐ๋ฅ๋ค์ด ์๋ค๋ฉด Issue ์ ์ ์ ์ฃผ์๊ธฐ ๋ฐ๋๋๋ค.
- Java: 21 (JVM Toolchain)
- Kotlin: 2.3 (Language & API Version)
- Spring Boot: 3.4.0+ / 4.0.0+
- Kotlin Exposed: 1.0.0+
- ๋ฐ์ดํฐ๋ฒ ์ด์ค: H2, PostgreSQL, MySQL
Bluetape4k๋ ๊ธฐ๋ฅ๋ณ๋ก ๋ถ๋ฆฌ๋ ๋ฉํฐ ๋ชจ๋ Gradle ํ๋ก์ ํธ์ ๋๋ค.
- core: ํต์ฌ ์ ํธ๋ฆฌํฐ (assertions, required, ์ปฌ๋ ์ (BoundedStack, RingBuffer, PaginatedList, Permutation), Wildcard ํจํด ๋งค์นญ, XXHasher ๋ฑ)
- coroutines: Kotlin Coroutines ํ์ฅ (DeferredValue, Flow extensions, AsyncFlow)
- logging: ๋ก๊น ๊ด๋ จ ๊ธฐ๋ฅ
- bom: Bill of Materials (์์กด์ฑ ๊ด๋ฆฌ)
- io: ํ์ผ I/O, ์์ถ(LZ4, Zstd, Snappy, Zip), ์ง๋ ฌํ(Kryo, Fory), ZIP ๋น๋/์ ํธ๋ฆฌํฐ, Okio ํตํฉ (Tink ๊ธฐ๋ฐ ์ํธํ Sink/Source ํฌํจ)
- okio: Okio ๊ธฐ๋ฐ I/O ํ์ฅ โ Buffer/Sink/Source ์ ํธ๋ฆฌํฐ, Base64, Channel, Cipher, Compress, Coroutines, Jasypt/Tink ์ํธํ Sink/Source
- **jackson2/jackson3
**: Jackson 2.x/3.x ํตํฉ โ ๋ฐ์ด๋๋ฆฌ(CBOR, Ion, Smile) ๋ฐ ํ
์คํธ(CSV, YAML, TOML) ํฌ๋งท ํฌํจ (๊ตฌ
jackson-binary/text,jackson3-binary/textํตํฉ๋จ) - json: JSON ์ฒ๋ฆฌ
- csv: CSV ์ฒ๋ฆฌ
- feign: Feign HTTP ํด๋ผ์ด์ธํธ (Coroutines ์ง์)
- retrofit2: Retrofit2 HTTP ํด๋ผ์ด์ธํธ (Coroutines ์ง์)
- protobuf: Protobuf ์ ํธ๋ฆฌํฐ (Timestamp/Duration/Money ๋ณํ, ProtobufSerializer)
- grpc: gRPC ์๋ฒ/ํด๋ผ์ด์ธํธ ์ถ์ํ (
bluetape4k-protobufํฌํจ) crypto: ์ํธํ ๊ธฐ๋ฅ (Jasypt ๊ธฐ๋ฐ PBE, BouncyCastle) โ Deprecated (bluetape4k-tink๋ก ๋์ฒด)- tink: Google Tink ๊ธฐ๋ฐ ํ๋์ ์ํธํ โ AEAD, Deterministic AEAD, MAC, Digest, ํตํฉ Encryptor (
TinkEncryptor), OkioTinkEncryptSink/TinkDecryptSource - http: HTTP ์ ํธ๋ฆฌํฐ
- netty: Netty ํตํฉ
- avro: Apache Avro
- fastjson2: FastJSON2
- vertx: Vert.x ๋จ์ผ ํตํฉ ๋ชจ๋ โ ํต์ฌ ๊ธฐ๋ฅ, SQL ํด๋ผ์ด์ธํธ, Resilience4j ํตํฉ ํฌํจ (๊ตฌ
vertx/core,vertx/sqlclient,vertx/resilience4jํตํฉ๋จ)
๊ฐ ์๋น์ค๋ง๋ค 3๋จ๊ณ API ํจํด ์ ๊ณต: sync โ async (CompletableFuture) โ coroutines (suspend)
- bluetape4k-aws: AWS Java SDK v2 ๊ธฐ๋ฐ ๋จ์ผ ํตํฉ ๋ชจ๋ โ DynamoDB, S3(TransferManager), SES, SNS, SQS, KMS, CloudWatch/Logs, Kinesis, STS ํฌํจ. ๊ฐ ์๋น์ค์ coroutines ํ์ฅ (
XxxAsyncClientCoroutinesExtensions.kt) ์ ๊ณต - bluetape4k-aws-kotlin: AWS Kotlin SDK ๊ธฐ๋ฐ ๋จ์ผ ํตํฉ ๋ชจ๋ โ native
suspendํจ์ ๊ธฐ๋ณธ ์ ๊ณต (.await()๋ณํ ๋ถํ์). DynamoDB, S3, SES/SESv2, SNS, SQS, KMS, CloudWatch/Logs, Kinesis, STS ํฌํจ. DSL ์ง์ (metricDatum {},inputLogEvent {},stsClientOf {}๋ฑ)
- exposed: umbrella ๋ชจ๋ โ
exposed-core+exposed-dao+exposed-jdbc๋ฌถ์ (ํ์ ํธํ) - exposed-core: JDBC ์์ด ์ฌ์ฉ ๊ฐ๋ฅํ ํต์ฌ ๊ธฐ๋ฅ โ ์์ถ/์ํธํ/์ง๋ ฌํ ์ปฌ๋ผ ํ์
, ID ์์ฑ ํ์ฅ,
HasIdentifier,ExposedPage - exposed-dao: DAO ์ํฐํฐ ํ์ฅ โ
EntityExtensions,StringEntity, ์ปค์คํ IdTable (KsuidTable,SnowflakeIdTable,SoftDeletedIdTable๋ฑ) - exposed-jdbc: JDBC ์ ์ฉ โ
ExposedRepository,SoftDeletedRepository,SuspendedQuery,VirtualThreadTransaction - exposed-r2dbc: Exposed + R2DBC (reactive,
ExposedR2dbcRepository) - exposed-jdbc-redisson: Exposed JDBC + Redisson (๋ถ์ฐ ๋ฝ)
- exposed-r2dbc-redisson: Exposed R2DBC + Redisson (๋ถ์ฐ ๋ฝ)
- exposed-jackson2/jackson3: Exposed JSON ์ปฌ๋ผ ์ง์ (Jackson 2.x/3.x)
- exposed-fastjson2: Exposed FastJSON2 JSON ์ปฌ๋ผ ์ง์
- exposed-jasypt: Exposed Jasypt ์ํธํ ์ปฌ๋ผ
- exposed-tink: Exposed ์ํธํ ์ปฌ๋ผ (Google Tink AEAD/Deterministic AEAD)
- exposed-measured: Exposed ์ฟผ๋ฆฌ ์คํ ์๊ฐ ์ธก์ (Micrometer ํตํฉ)
- exposed-jdbc-tests: JDBC ๊ธฐ๋ฐ ํ ์คํธ ๊ณตํต ์ธํ๋ผ
- exposed-r2dbc-tests: R2DBC ๊ธฐ๋ฐ ํ ์คํธ ๊ณตํต ์ธํ๋ผ
- exposed-postgresql: PostgreSQL ์ ์ฉ Exposed ํ์ฅ โ PostGIS ๊ณต๊ฐ ๋ฐ์ดํฐ(
POINT/POLYGON), pgvector ๋ฒกํฐ ๊ฒ์(VECTOR(n)), TSTZRANGE ์๊ฐ ๋ฒ์ ์ปฌ๋ผ ํ์ ; H2 fallback ์ง์ - exposed-mysql8: MySQL 8.0 ์ ์ฉ Exposed ํ์ฅ โ GIS ๊ณต๊ฐ ๋ฐ์ดํฐ(8์ข
), JTS ๊ธฐ๋ฐ Geometry ์ปฌ๋ผ,
ST_Contains/ST_Distance๋ฑ ๊ณต๊ฐ ํจ์; MySQL Internal Format WKB ๋ณํ - exposed-duckdb: DuckDB JDBC ํตํฉ โ
DuckDBDialect(PostgreSQL ์์),DuckDBDatabaseํฉํ ๋ฆฌ(์ธ๋ฉ๋ชจ๋ฆฌ/ํ์ผ/์ฝ๊ธฐ์ ์ฉ),suspendTransaction,queryFlow - exposed-bigquery: Google BigQuery REST API ํตํฉ โ H2(PostgreSQL ๋ชจ๋)๋ก SQL ์์ฑ ํ BigQuery REST ์คํ,
BigQueryContext(SELECT/INSERT/UPDATE/DELETE/DDL),BigQueryResultRow(Column ์ฐธ์กฐ ํ์ ์์ ์ ๊ทผ), suspend/Flow API - exposed-jdbc-lettuce: Exposed JDBC + Lettuce Redis ์บ์ โ Read-through/Write-through/Write-behind,
AbstractJdbcLettuceRepository, ์ฝ๋ฃจํด ๋ค์ดํฐ๋ธAbstractSuspendedJdbcLettuceRepository - exposed-r2dbc-lettuce: Exposed R2DBC + Lettuce Redis ์บ์ โ ์ฝ๋ฃจํด ๋ค์ดํฐ๋ธ Read-through/Write-through/Write-behind,
AbstractR2dbcLettuceRepository - hibernate/hibernate-reactive: Hibernate ORM ํตํฉ
- hibernate-cache-lettuce: Hibernate 2nd Level Cache + Lettuce NearCache (Caffeine L1 + Redis L2) โ
LettuceNearCacheRegionFactory,LettuceNearCacheStorageAccess, region๋ณ TTL ์ค๋ฒ๋ผ์ด๋, 15๊ฐ์ง ์ฝ๋ฑ ์ง์ - mongodb: MongoDB Kotlin Coroutine Driver ํ์ฅ โ
mongoClient {}DSL,findFirst,exists,upsert,findAsFlow,documentOf {}, Aggregation Pipeline DSL - r2dbc: R2DBC ์ง์
- cassandra: Cassandra ๋๋ผ์ด๋ฒ
- jdbc: JDBC ์ ํธ๋ฆฌํฐ
- redis: Lettuce/Redisson umbrella ๋ชจ๋ (ํ์ ํธํ)
- lettuce: Lettuce ํด๋ผ์ด์ธํธ, ๊ณ ์ฑ๋ฅ Codec (Jdk/Kryo/Fory ร GZip/LZ4/Snappy/Zstd),
RedisFutureโ Coroutines ์ด๋ํฐ, ๋ถ์ฐ Primitive (Lock, Semaphore, AtomicLong, Leader Election),MapLoader/MapWriter/LettuceLoadedMap(Read-through/Write-through/Write-behind), BloomFilter/CuckooFilter (Lua ์คํฌ๋ฆฝํธ ๊ธฐ๋ฐ, RedisBloom ๋ถํ์), HyperLogLog (PFADD/PFCOUNT/PFMERGE) - redisson: Redisson ํด๋ผ์ด์ธํธ, Codec, Memorizer, NearCache (
RLocalCachedMap), Leader Election (Coroutines ์ง์)
- lettuce: Lettuce ํด๋ผ์ด์ธํธ, ๊ณ ์ฑ๋ฅ Codec (Jdk/Kryo/Fory ร GZip/LZ4/Snappy/Zstd),
- kafka: Kafka ํด๋ผ์ด์ธํธ
- resilience4j: Resilience4j + Coroutines, Coroutines Cache
- bucket4j: Rate limiting
- micrometer: ๋ฉํธ๋ฆญ
- opentelemetry: ๋ถ์ฐ ์ถ์
ํ๋ฌ๊ทธ์ธ ๋ฐฉ์์ผ๋ก ๋ฐฑ์๋๋ฅผ ๊ต์ฒดํ ์ ์๋ ์บ์ ์ถ์ํ ๋ ์ด์ด์ ๋๋ค.
- cache: umbrella ๋ชจ๋ (cache-core + hazelcast + redisson + lettuce)
- cache-core: JCache ์ถ์ํ + Caffeine/Cache2k/Ehcache ๋ก์ปฌ ์บ์ (๊ตฌ
cache-local๋ณํฉ) โAsyncCache,SuspendCache,NearCache,SuspendNearCache, Memorizer ๊ตฌํ์ฒด, testFixtures 6์ข ์ถ์ ํ ์คํธ - cache-hazelcast: Hazelcast ๋ถ์ฐ ์บ์ + Caffeine 2-Tier Near Cache (๊ตฌ
cache-hazelcast-near๋ณํฉ) - cache-redisson: Redisson ๋ถ์ฐ ์บ์ + Caffeine 2-Tier Near Cache (๊ตฌ
cache-redisson-near๋ณํฉ) - cache-lettuce: Lettuce(Redis) ๊ธฐ๋ฐ ๋ถ์ฐ ์บ์ โ
LettuceNearCacheConfig, RESP3 CLIENT TRACKING ๊ธฐ๋ฐ ์๋ invalidation
- bluetape4k-spring-boot3 (
spring-boot3/core): Spring Boot 3 ๊ธฐ๋ฐ ๊ณตํต ๊ธฐ๋ฅ ํตํฉ ๋ชจ๋ โ Spring core ์ ํธ๋ฆฌํฐ, WebFlux + Coroutines, Retrofit2 ํตํฉ, ํ ์คํธ ์ ํธ๋ฆฌํฐ ํฌํจ (๊ตฌspring/core,spring/webflux,spring/retrofit2,spring/testsํตํฉ๋จ) - data-redis: Spring Data Redis ๊ณ ์ฑ๋ฅ ์ง๋ ฌํ โ
RedisBinarySerializer,RedisCompressSerializer,redisSerializationContext {}DSL - cassandra: Spring Data Cassandra
- mongodb: Spring Data MongoDB Reactive โ
ReactiveMongoOperations์ฝ๋ฃจํด ํ์ฅ, Criteria/Query/Update infix DSL - r2dbc: Spring Data R2DBC
- exposed-jdbc (
bluetape4k-spring-boot3-exposed-jdbc): Exposed DAO ์ํฐํฐ ๊ธฐ๋ฐ Spring Data JDBC Repository โ PartTree ์ฟผ๋ฆฌ, QBE, Page/Sort ์ง์ - exposed-r2dbc (
bluetape4k-spring-boot3-exposed-r2dbc): Exposed R2DBC DSL ๊ธฐ๋ฐ ์ฝ๋ฃจํด Spring Data Repository โ suspend CRUD, Flow ์ง์ - exposed-jdbc-demo (
bluetape4k-spring-boot3-exposed-jdbc-demo): Exposed DAO + Spring Data JDBC + Spring MVC ํตํฉ ๋ฐ๋ชจ - exposed-r2dbc-demo (
bluetape4k-spring-boot3-exposed-r2dbc-demo): Exposed R2DBC + suspend Repository + Spring WebFlux ํตํฉ ๋ฐ๋ชจ - hibernate-lettuce (
bluetape4k-spring-boot3-hibernate-lettuce): Hibernate 2nd Level Cache + Lettuce NearCache Spring Boot Auto-Configuration โ Properties ๋ฐ์ธ๋ฉ, Micrometer Metrics, Actuator Endpoint - hibernate-lettuce-demo (
bluetape4k-spring-boot3-hibernate-lettuce-demo): Hibernate Lettuce NearCache + Spring MVC ํตํฉ ๋ฐ๋ชจ
Spring Data JPA๋
data/hibernate๋ชจ๋๋ก ์ด๋ํ์ต๋๋ค.
Spring Boot 4.x ์ ์ฉ ๋ชจ๋. Spring Boot 3 ๋ชจ๋๊ณผ ๋ ๋ฆฝ์ ์ผ๋ก ์ฌ์ฉ ๊ฐ๋ฅํฉ๋๋ค.
BOM ์ ์ฉ ์ฃผ์:
dependencyManagement { imports }๋์implementation(platform(...))๋ฐฉ์์ผ๋ก ์ ์ฉํด์ผ KGP 2.3.x์ ์ถฉ๋ ์์ด ๋น๋๋ฉ๋๋ค.
- core (
bluetape4k-spring-boot4-core): Spring Boot 4 ๊ธฐ๋ฐ ๊ณตํต ๊ธฐ๋ฅ โ WebFlux + Coroutines, RestClient DSL (suspendGet,suspendPost๋ฑ), Jackson 2 ์ปค์คํฐ๋ง์ด์ , Retrofit2 ํตํฉ, WebTestClient ํ ์คํธ ์ ํธ๋ฆฌํฐ - data-redis: Spring Data Redis ๊ณ ์ฑ๋ฅ ์ง๋ ฌํ โ
RedisBinarySerializer,RedisCompressSerializer,redisSerializationContext {}DSL - cassandra: Spring Data Cassandra ์ฝ๋ฃจํด ํ์ฅ
- mongodb: Spring Data MongoDB Reactive ์ฝ๋ฃจํด ํ์ฅ, Criteria/Query/Update infix DSL
- r2dbc: Spring Data R2DBC ์ฝ๋ฃจํด ํ์ฅ
- cassandra-demo: Cassandra ์ฌ์ฉ ์์
- exposed-jdbc (
bluetape4k-spring-boot4-exposed-jdbc): Exposed DAO ์ํฐํฐ ๊ธฐ๋ฐ Spring Data JDBC Repository โ PartTree ์ฟผ๋ฆฌ, QBE, Page/Sort ์ง์ (Spring Boot 4 BOM) - exposed-r2dbc (
bluetape4k-spring-boot4-exposed-r2dbc): Exposed R2DBC DSL ๊ธฐ๋ฐ ์ฝ๋ฃจํด Spring Data Repository โ suspend CRUD, Flow ์ง์ (Spring Boot 4 BOM) - exposed-jdbc-demo (
bluetape4k-spring-boot4-exposed-jdbc-demo): Exposed DAO + Spring Data JDBC + Spring MVC ํตํฉ ๋ฐ๋ชจ (Spring Boot 4 BOM) - exposed-r2dbc-demo (
bluetape4k-spring-boot4-exposed-r2dbc-demo): Exposed R2DBC + suspend Repository + Spring WebFlux ํตํฉ ๋ฐ๋ชจ (Spring Boot 4 BOM) - hibernate-lettuce (
bluetape4k-spring-boot4-hibernate-lettuce): Hibernate 2nd Level Cache + Lettuce NearCache Spring Boot Auto-Configuration (Spring Boot 4 BOM) - hibernate-lettuce-demo (
bluetape4k-spring-boot4-hibernate-lettuce-demo): Hibernate Lettuce NearCache + Spring MVC ํตํฉ ๋ฐ๋ชจ (Spring Boot 4 BOM)
- bluetape4k-geo (
utils/geo): ์ง๋ฆฌ ์ ๋ณด ์ฒ๋ฆฌ ๋จ์ผ ํตํฉ ๋ชจ๋ โ geocode(Bing/Google), geohash, geoip2(MaxMind) ํฌํจ (๊ตฌutils/geocode,utils/geohash,utils/geoip2ํตํฉ๋จ) - idgenerators: ID ์์ฑ๊ธฐ โ
Uuid(V1~V7 ํต์ผ API),ULID,Ksuid(Seconds/Millis),Snowflakersํต์ผ ํฉํ ๋ฆฌ,Flake,Hashids๋ฑ ๋ค์ํ ID ์์ฑ ์๊ณ ๋ฆฌ์ฆ ์ ๊ณต - images: ์ด๋ฏธ์ง ์ฒ๋ฆฌ
- javatimes: ๋ ์ง/์๊ฐ ์ ํธ๋ฆฌํฐ
- jwt: JWT ์ฒ๋ฆฌ
- leader: Leader ์ ์ถ
- math: ์ํ ์ ํธ๋ฆฌํฐ
- measured: ์กฐํฉ ๊ฐ๋ฅํ ๋จ์ ํ์
(
Units)๊ณผ ์ธก์ ๊ฐ(Measure) ๊ธฐ๋ฐ์ผ๋ก, ๋ณตํฉ ๋จ์(m/s,kg*m/s^2)๋ฅผ ํ์ ์์ ํ๊ฒ ํํ - money: Money API
- mutiny: Mutiny reactive ํตํฉ
units: ๋จ์ ํํ value class โ Deprecated (bluetape4k-measured์ ๊ธฐ๋ฅ์ผ๋ก ํตํฉ)
- junit5: JUnit 5 ํ์ฅ ๋ฐ ์ ํธ๋ฆฌํฐ
- testcontainers: Testcontainers ์ง์ (Redis, Kafka, DB ๋ฑ)
- virtualthread: Java 21/25 Virtual Thread ์ง์
- timefold: Timefold Solver + Exposed ํตํฉ
๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฌ์ฉ ๋ฐฉ๋ฒ์ ๋ณด์ฌ์ฃผ๋ ์์ ๋ชจ๋์ ๋๋ค. ๋ฐฐํฌ๋์ง ์์ต๋๋ค.
- coroutines-demo: Kotlin Coroutines ์ฌ์ฉ ์์
- jpa-querydsl-demo: JPA + QueryDSL ์ฌ์ฉ ์์
- redisson-demo: Redisson ์ฌ์ฉ ์์
- virtualthreads-demo: Java Virtual Thread ์ฌ์ฉ ์์
๋ ์ด์ ์ ์ง๋ณด์๋์ง ์๋ ๋ชจ๋์ ๋๋ค. ๋น๋์์ ์ ์ธ๋์์ผ๋ฉฐ ์ญ์ ๋ ์์ ์ ๋๋ค.
vertx-coroutines: Vert.x + Coroutines โbluetape4k-vertx๋ก ํตํฉ๋จvertx-sqlclient: Vert.x SQL Client โbluetape4k-vertx๋ก ํตํฉ๋จvertx-webclient: Vert.x Web Client โbluetape4k-vertx๋ก ํตํฉ๋จmapstruct: MapStruct ํตํฉ โ ๋ฏธ์ฌ์ฉ์ผ๋ก ํ๊ธฐbloomfilter: Bloom Filter โ ์ฌ์ฉ ๋น๋ ๋ฎ์ ํ๊ธฐcaptcha: CAPTCHA ์์ฑ โ ์ฌ์ฉ ๋น๋ ๋ฎ์ ํ๊ธฐlogback-kafka: Logback Kafka Appender โ ์ฌ์ฉ ๋น๋ ๋ฎ์ ํ๊ธฐnats: NATS ๋ฉ์์ง โ ์ฌ์ฉ ๋น๋ ๋ฎ์ ํ๊ธฐjavers: JaVers ๊ฐ์ฌ ๋ก๊ทธ โ ์ฌ์ฉ ๋น๋ ๋ฎ์ ํ๊ธฐtokenizer: ํ๊ตญ์ด/์ผ๋ณธ์ด ํํ์ ๋ถ์๊ธฐ โ ์ฌ์ฉ ๋น๋ ๋ฎ์ ํ๊ธฐahocorasick: ๋ฌธ์์ด ๊ฒ์ (Aho-Corasick) โ ์ฌ์ฉ ๋น๋ ๋ฎ์ ํ๊ธฐlingua: ์ธ์ด ๊ฐ์ง โ ์ฌ์ฉ ๋น๋ ๋ฎ์ ํ๊ธฐnaivebayes: Naive Bayes ๋ถ๋ฅ๊ธฐ โ ์ฌ์ฉ ๋น๋ ๋ฎ์ ํ๊ธฐmutiny-examples: Mutiny ์ฌ์ฉ ์์ โ ํ๊ธฐ
# ์ ์ฒด ํ๋ก์ ํธ ๋น๋
./gradlew clean build
# ํน์ ๋ชจ๋๋ง ๋น๋
./gradlew :bluetape4k-coroutines:build
# ํ
์คํธ ์ ์ธํ๊ณ ๋น๋
./gradlew build -x test# ์ ์ฒด ํ
์คํธ ์คํ
./gradlew test
# ํน์ ๋ชจ๋ ํ
์คํธ
./gradlew :bluetape4k-io:test
# ํน์ ํ
์คํธ ํด๋์ค ์คํ
./gradlew test --tests "io.bluetape4k.io.CompressorTest"
# ์์ธ ๋ก๊ทธ์ ํจ๊ป ํ
์คํธ
./gradlew test --info# Detekt ์ ์ ๋ถ์ ์คํ
./gradlew detekt๋ฒ์ ํ์ธ์ gradle.properties ํ์ผ์์ ํ์ธ
projectGroup=io.github.bluetape4k
baseVersion=1.5.0
snapshotVersion=-SNAPSHOT./gradlew publishAggregationToCentralSnapshots --no-daemon --no-configuration-cache# ๊ธฐ๋ณธ ๋ณ๋ ฌ๋(centralSnapshotsParallelism=8)๋ก SNAPSHOT ๋ฐฐํฌ
./gradlew publishAggregationToCentralSnapshots
# ๋ณ๋ ฌ๋๋ฅผ ๋ฎ์ถฐ ์๋ฒ ๋ถ๋ด์ ์ค์ด๊ณ ์ถ์ ๋
./gradlew -PcentralSnapshotsParallelism=4 publishAggregationToCentralSnapshots- ๋ฃจํธ ์ง๊ณ task๋
publishAggregationToCentralSnapshots์ ๋๋ค. - SNAPSHOT ๋ฐฐํฌ๋ release ์ ๋ฌ๋ฆฌ ZIP 1ํ ์ ๋ก๋๊ฐ ์๋๋ผ file-by-file ์ ๋ก๋๋ฅผ ์ํํฉ๋๋ค.
- ๋ฐ๋ผ์ ๋ชจ๋ ์๊ฐ ๋ง์์๋ก
PUT์์ฒญ์ด ๋ง์ด ๋ฐ์ํ๋ ๊ฒ์ด ์ ์์ ๋๋ค. - ์
๋ก๋ ๋์์
workshop/**,examples/**,-demo๋ชจ๋์ ์ ์ธํ publishable modules ์ ๋๋ค. - Snapshot ์ ์ฅ์๋
https://central.sonatype.com/repository/maven-snapshots/์ ๋๋ค. - ๋ณ๋ ฌ๋๋
centralSnapshotsParallelismproperty ๋ก ์กฐ์ ํ ์ ์์ต๋๋ค. ๊ธฐ๋ณธ๊ฐ์8์ ๋๋ค.
# snapshotVersion์ ์ ๊ฑฐํ๊ณ RELEASE ๋ฐฐํฌ
./gradlew publishAggregationToCentralPortal -PsnapshotVersion= --no-daemon --no-configuration-cache- ๋ฃจํธ ์ง๊ณ task๋
publishAggregationToCentralPortal์ ๋๋ค. - RELEASE ๋ฐฐํฌ๋ NMCP aggregation ZIP ์ ๋ง๋ค์ด Central Portal Publisher API ๋ก ์ ๋ก๋ํฉ๋๋ค.
- SNAPSHOT๊ณผ ๋ฌ๋ฆฌ artifact ํ์ผ๋ค์ ๊ฐ๋ณ
PUTํ์ง ์์ผ๋ฏ๋ก ์์ฒญ ์๊ฐ ํจ์ฌ ์ ์ต๋๋ค. - ์
๋ก๋ ๋์์
workshop/**,examples/**,-demo๋ชจ๋์ ์ ์ธํ publishable modules ์ ๋๋ค. - ๋์ผ RELEASE ๋ฒ์ ์ ์ฌ๋ฐฐํฌํ ์ ์์ผ๋ฏ๋ก ์คํจ ์
baseVersion์ ์ฌ๋ ค์ผ ํฉ๋๋ค.
# Sonatype Central Portal ๊ณ์
central.user=your-central-portal-username
central.password=your-central-portal-password
# ๊ถ์ฅ: In-memory PGP signing
signingUseGpgCmd=false
signingKeyId=YOUR_KEY_ID
signingKey=-----BEGIN PGP PRIVATE KEY BLOCK-----\n...\n-----END PGP PRIVATE KEY BLOCK-----
signingPassword=YOUR_KEY_PASSPHRASE
# Maven Central Snapshots ์
๋ก๋ ๋ณ๋ ฌ๋ (๊ธฐ๋ณธ๊ฐ: 8)
centralSnapshotsParallelism=8- ๊ธฐ์กด
publishAggregationToCentralPortalSnapshots๋ deprecated alias ์ด๋ฉฐ,publishAggregationToCentralSnapshots์ฌ์ฉ์ ๊ถ์ฅํฉ๋๋ค. publishAllPublicationsToCentralPortalSnapshots/publishAllPublicationsToCentralSnapshots๊ฐ์ ๊ฐ๋ณ task ์ง์ ์คํ ๋์ ๋ฃจํธ ์ง๊ณ task ์ฌ์ฉ์ ๊ถ์ฅํฉ๋๋ค.- SNAPSHOT์ด ๋๋ฆฌ๊ฑฐ๋ ์์ฒญ์ด ๊ณผ๋ํด ๋ณด์ด๋ฉด
centralSnapshotsParallelism๊ฐ์4,8,12์ ๋ ๋ฒ์์์ ์กฐ์ ํด ๋ณด์ธ์. - RELEASE๋ aggregation ZIP ์ ๋ก๋ ๊ฒฝ๋ก๋ฅผ ์ฌ์ฉํ๋ฏ๋ก SNAPSHOT๊ณผ ๋์ ๋ฐฉ์์ด ๋ค๋ฆ ๋๋ค.
AI ์์ด์ ํธ๋ ๊ธด ํฐ๋ฏธ๋ ์ธ์
์์ ์์ git/Gradle ์ถ๋ ฅ์ ๋ฐ๋ก ์ด๊ธฐ ์ ์, ์๋ ์์ฝ ๋ช
๋ น์ ๋จผ์ ์ฌ์ฉํ๋ ๊ฒ์ ๊ถ์ฅํฉ๋๋ค.
# ์ ์ฅ์ ์ํ ์์ฝ
./bin/repo-status
# ํ์ผ๋ณ diff ๋ณ๊ฒฝ๋ ์์ฝ
./bin/repo-diff
# Gradle ํ
์คํธ/๋น๋ ๋ก๊ทธ ์์ฝ
./bin/repo-test-summary -- ./gradlew :05-exposed-dml:01-dml:test๊ธฐ๋ณธ ํ๋ฆ์ "์์ฝ ๋จผ์ , ํ์ํ ํ์ผ์ด๋ ํ์คํฌ๋ง ์๋ณธ ์ถ๋ ฅ ํ์ธ"์ ๋๋ค.
