Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
33 commits
Select commit Hold shift + click to select a range
bfeda37
chore: ๋ฒ„์ „์—…
handwoong Jan 4, 2026
6f20e75
chore: ์ฝ”ํ‹€๋ฆฐ ์„ค์ •
handwoong Jan 4, 2026
8c85ad6
Rename .java to .kt
handwoong Jan 4, 2026
a85cece
chore: ktfmt ์ œ๊ฑฐ
handwoong Jan 4, 2026
a9ba96c
test: ๊ณ„์ • ๋„๋ฉ”์ธ ํ…Œ์ŠคํŠธ ์ž‘์„ฑ
handwoong Jan 4, 2026
86ebab1
Rename .java to .kt
handwoong Jan 5, 2026
ce61f22
test: ์ธ์ฆ ๋„๋ฉ”์ธ ํ…Œ์ŠคํŠธ ์ž‘์„ฑ
handwoong Jan 5, 2026
993d59e
remove: ๋ฆฌํ”„๋ ˆ์‹œ ํ† ํฐ ๊ธฐ๋Šฅ ์‚ญ์ œ
handwoong Jan 5, 2026
0c20fd4
refactor: JWT ํŽ˜์ด๋กœ๋“œ ID ํƒ€์ž… Long -> String ๋ณ€๊ฒฝ
handwoong Jan 5, 2026
9a599a4
refactor: ์„œ๋น„์Šค ๊ณ„์ธต์—์„œ authenticator ์˜์กดํ•˜์ง€ ์•Š๋„๋ก ๋ณ€๊ฒฝ
handwoong Jan 5, 2026
b9ba42a
fix: spotbugs ์˜ค๋ฅ˜ ์ˆ˜์ •
handwoong Jan 5, 2026
2681f24
fix: SonarQube ๊ฒฝ๊ณ  ์ˆ˜์ •
handwoong Jan 5, 2026
81d72e1
refactor: ๋ฏธ์‚ฌ์šฉ value ๋””ํดํŠธ ๋ฉ”์„œ๋“œ ์ฒ˜๋ฆฌ
handwoong Jan 5, 2026
3810031
Rename .java to .kt
handwoong Jan 5, 2026
160ade0
feat: APK ๋ฒ„์ „ ์ƒ์„ฑ ํŽธ์˜ API ์ถ”๊ฐ€
handwoong Jan 5, 2026
7644feb
refactor: ์„ค์ • ํด๋ž˜์Šค ํŒจํ‚ค์ง€ ์ด๋™
handwoong Jan 6, 2026
de4c514
test: ์ธ์ฆ ๋ฒˆํ˜ธ ์ƒ์„ฑ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค ์ถ”๊ฐ€
handwoong Jan 6, 2026
953d713
refactor: ๋น„๋™๊ธฐ ์„ค์ • ํด๋ž˜์Šค ํŒจํ‚ค์ง€ ์ด๋™
handwoong Jan 6, 2026
0fde727
Rename .java to .kt
handwoong Jan 6, 2026
cc865a2
test: ๊ณต์šฉ ๋„๋ฉ”์ธ ํ…Œ์ŠคํŠธ ์ž‘์„ฑ
handwoong Jan 6, 2026
5b616a7
refactor: ๊ณ„์ • ๋ฐ ๊ธฐ๊ธฐ ์ธ์ฆ ์–ด๋…ธํ…Œ์ด์…˜ ํŒจํ‚ค์ง€ ์ด๋™
handwoong Jan 6, 2026
b583ca5
Rename .java to .kt
handwoong Jan 7, 2026
630a1ea
test: ์•Œ๋ฆผ ๋„๋ฉ”์ธ ํ…Œ์ŠคํŠธ ์ž‘์„ฑ
handwoong Jan 7, 2026
168f207
style: ์ฝ”ํ‹€๋ฆฐ ํฌ๋งคํŒ… ์ ์šฉ
handwoong Jan 7, 2026
4c36946
Rename .java to .kt
handwoong Jan 7, 2026
aa897ff
test: ์„œํฌํŠธ ๋„๋ฉ”์ธ ํ…Œ์ŠคํŠธ ์ž‘์„ฑ
handwoong Jan 7, 2026
aa27061
chore: gradle ๋นŒ๋“œ ์บ์‹ฑ ์„ค์ •
handwoong Jan 9, 2026
666a4df
chore: spotbugs ์ฝ”ํ‹€๋ฆฐ ์ œ์™ธ
handwoong Jan 9, 2026
fd30aae
feat: ๊ฐœ๋ฐœ ํ™˜๊ฒฝ ํ…Œ์ŠคํŠธ ๋ฐ์ดํ„ฐ ์ƒ์„ฑ ํด๋ž˜์Šค ์ถ”๊ฐ€
handwoong Jan 9, 2026
b1dc9ea
feat: ๊ณ„์ • ๋น„๋ฐ€๋ฒˆํ˜ธ ๋ณ€๊ฒฝ ๊ธฐ๋Šฅ ๊ตฌํ˜„
handwoong Jan 9, 2026
05d79b5
test: ํ…Œ์ŠคํŠธ ํ”ฝ์Šค์ฒ˜ ์ถ”๊ฐ€
handwoong Jan 10, 2026
bca3463
fix: ์ฃผ๋ฌธ ์ˆ˜์ • ์‹œ ํ”„๋ฆฐํŠธ ์ถœ๋ ฅ ๋ฒˆํ˜ธ ๋ฏธ์ฆ๊ฐ€ ๋ฒ„๊ทธ ์ˆ˜์ •
handwoong Jan 11, 2026
d8eedbf
Preview 1.0.9 (#18)
handwoong Jan 11, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
162 changes: 87 additions & 75 deletions build.gradle.kts
Original file line number Diff line number Diff line change
@@ -1,9 +1,12 @@
plugins {
java
id("org.springframework.boot")
id("io.spring.dependency-management")
id("com.gorylenko.gradle-git-properties")
id("com.github.spotbugs")
java
kotlin("jvm")
kotlin("plugin.spring")
kotlin("plugin.jpa")
id("org.springframework.boot")
id("io.spring.dependency-management")
id("com.gorylenko.gradle-git-properties")
id("com.github.spotbugs")
}

val appGroup: String by project
Expand All @@ -15,9 +18,23 @@ version = appVersion
description = appDescription

java {
toolchain {
languageVersion = JavaLanguageVersion.of(21)
}
toolchain {
languageVersion = JavaLanguageVersion.of(21)
}
}

kotlin {
compilerOptions {
freeCompilerArgs.addAll("-Xjsr305=strict", "-Xannotation-default-target=param-property")
}
}

spotbugs {
excludeFilter.set(file("${projectDir}/spotbugs-exclude.xml"))
}

springBoot {
buildInfo()
}

val springCloud: String by project
Expand All @@ -33,81 +50,76 @@ val tsid: String by project
val mockitoAgent: Configuration? = configurations.create("mockitoAgent")

repositories {
mavenCentral()
mavenCentral()
}

dependencyManagement {
imports {
mavenBom("org.springframework.cloud:spring-cloud-dependencies:$springCloud")
}
imports {
mavenBom("org.springframework.cloud:spring-cloud-dependencies:$springCloud")
}
}

dependencies {
implementation("org.springframework.boot:spring-boot-starter-actuator")
implementation("org.springframework.boot:spring-boot-starter-aspectj")
implementation("org.springframework.boot:spring-boot-starter-data-jpa")
implementation("org.springframework.boot:spring-boot-starter-data-redis")
implementation("org.springframework.boot:spring-boot-starter-flyway")
implementation("org.springframework.boot:spring-boot-starter-mail")
implementation("org.springframework.boot:spring-boot-starter-security")
implementation("org.springframework.boot:spring-boot-starter-thymeleaf")
implementation("org.springframework.boot:spring-boot-starter-validation")
implementation("org.springframework.boot:spring-boot-starter-webmvc")
implementation("org.springframework.cloud:spring-cloud-starter-openfeign")
implementation("org.flywaydb:flyway-mysql")
implementation("org.springdoc:springdoc-openapi-starter-webmvc-ui:$springdoc") {
exclude(group = "org.webjars", module = "swagger-ui")
}
implementation("org.redisson:redisson-spring-boot-starter:$redisson")
implementation("com.github.f4b6a3:tsid-creator:$tsid")
implementation("io.jsonwebtoken:jjwt-api:$jjwt")
implementation("io.github.openfeign.querydsl:querydsl-core:$queryDSL")
implementation("io.github.openfeign.querydsl:querydsl-jpa:$queryDSL")
implementation("org.apache.pdfbox:pdfbox:$pdfbox")
implementation("com.sksamuel.scrimage:scrimage-core:$scrimage")
implementation("com.sksamuel.scrimage:scrimage-webp:$scrimage")
implementation("com.oracle.oci.sdk:oci-java-sdk-common:$oci")
implementation("com.oracle.oci.sdk:oci-java-sdk-objectstorage:$oci")
implementation("com.oracle.oci.sdk:oci-java-sdk-common-httpclient-jersey3:$oci")

compileOnly("org.projectlombok:lombok")

runtimeOnly("com.mysql:mysql-connector-j")
runtimeOnly("io.micrometer:micrometer-registry-prometheus")
runtimeOnly("io.jsonwebtoken:jjwt-impl:$jjwt")
runtimeOnly("io.jsonwebtoken:jjwt-jackson:$jjwt")

annotationProcessor("org.projectlombok:lombok")
annotationProcessor("io.github.openfeign.querydsl:querydsl-apt:$queryDSL:jpa")
annotationProcessor("jakarta.annotation:jakarta.annotation-api")
annotationProcessor("jakarta.persistence:jakarta.persistence-api")

testImplementation("org.springframework.boot:spring-boot-starter-actuator-test")
testImplementation("org.springframework.boot:spring-boot-starter-data-jpa-test")
testImplementation("org.springframework.boot:spring-boot-starter-data-redis-test")
testImplementation("org.springframework.boot:spring-boot-starter-flyway-test")
testImplementation("org.springframework.boot:spring-boot-starter-mail-test")
testImplementation("org.springframework.boot:spring-boot-starter-security-test")
testImplementation("org.springframework.boot:spring-boot-starter-thymeleaf-test")
testImplementation("org.springframework.boot:spring-boot-starter-validation-test")
testImplementation("org.springframework.boot:spring-boot-starter-webmvc-test")
testImplementation("org.mockito:mockito-core:$mockito")
mockitoAgent?.let { it("org.mockito:mockito-core:$mockito") { isTransitive = false } }

testCompileOnly("org.projectlombok:lombok")
testAnnotationProcessor("org.projectlombok:lombok")
testRuntimeOnly("org.junit.platform:junit-platform-launcher")
}
implementation("org.jetbrains.kotlin:kotlin-reflect")
implementation("tools.jackson.module:jackson-module-kotlin")
implementation("org.springframework.boot:spring-boot-starter-actuator")
implementation("org.springframework.boot:spring-boot-starter-aspectj")
implementation("org.springframework.boot:spring-boot-starter-data-jpa")
implementation("org.springframework.boot:spring-boot-starter-data-redis")
implementation("org.springframework.boot:spring-boot-starter-flyway")
implementation("org.springframework.boot:spring-boot-starter-mail")
implementation("org.springframework.boot:spring-boot-starter-security")
implementation("org.springframework.boot:spring-boot-starter-thymeleaf")
implementation("org.springframework.boot:spring-boot-starter-validation")
implementation("org.springframework.boot:spring-boot-starter-webmvc")
implementation("org.springframework.cloud:spring-cloud-starter-openfeign")
implementation("org.flywaydb:flyway-mysql")
implementation("org.springdoc:springdoc-openapi-starter-webmvc-ui:$springdoc") {
exclude(group = "org.webjars", module = "swagger-ui")
}
implementation("org.redisson:redisson-spring-boot-starter:$redisson")
implementation("com.github.f4b6a3:tsid-creator:$tsid")
implementation("io.jsonwebtoken:jjwt-api:$jjwt")
implementation("io.github.openfeign.querydsl:querydsl-core:$queryDSL")
implementation("io.github.openfeign.querydsl:querydsl-jpa:$queryDSL")
implementation("org.apache.pdfbox:pdfbox:$pdfbox")
implementation("com.sksamuel.scrimage:scrimage-core:$scrimage")
implementation("com.sksamuel.scrimage:scrimage-webp:$scrimage")
implementation("com.oracle.oci.sdk:oci-java-sdk-common:$oci")
implementation("com.oracle.oci.sdk:oci-java-sdk-objectstorage:$oci")
implementation("com.oracle.oci.sdk:oci-java-sdk-common-httpclient-jersey3:$oci")

tasks.withType<Test> {
useJUnitPlatform()
mockitoAgent?.let { jvmArgs("-javaagent:${it.asPath}", "-Xshare:off") }
}
compileOnly("org.projectlombok:lombok")

spotbugs {
excludeFilter.set(file("${projectDir}/spotbugs-exclude.xml"))
runtimeOnly("com.mysql:mysql-connector-j")
runtimeOnly("io.micrometer:micrometer-registry-prometheus")
runtimeOnly("io.jsonwebtoken:jjwt-impl:$jjwt")
runtimeOnly("io.jsonwebtoken:jjwt-jackson:$jjwt")

annotationProcessor("org.projectlombok:lombok")
annotationProcessor("io.github.openfeign.querydsl:querydsl-apt:$queryDSL:jpa")
annotationProcessor("jakarta.annotation:jakarta.annotation-api")
annotationProcessor("jakarta.persistence:jakarta.persistence-api")

testImplementation("org.jetbrains.kotlin:kotlin-test-junit5")
testImplementation("org.springframework.boot:spring-boot-starter-actuator-test")
testImplementation("org.springframework.boot:spring-boot-starter-data-jpa-test")
testImplementation("org.springframework.boot:spring-boot-starter-data-redis-test")
testImplementation("org.springframework.boot:spring-boot-starter-flyway-test")
testImplementation("org.springframework.boot:spring-boot-starter-mail-test")
testImplementation("org.springframework.boot:spring-boot-starter-security-test")
testImplementation("org.springframework.boot:spring-boot-starter-thymeleaf-test")
testImplementation("org.springframework.boot:spring-boot-starter-validation-test")
testImplementation("org.springframework.boot:spring-boot-starter-webmvc-test")
testImplementation("org.mockito:mockito-core:$mockito")
mockitoAgent?.let { it("org.mockito:mockito-core:$mockito") { isTransitive = false } }

testCompileOnly("org.projectlombok:lombok")
testAnnotationProcessor("org.projectlombok:lombok")
testRuntimeOnly("org.junit.platform:junit-platform-launcher")
}

springBoot {
buildInfo()
tasks.withType<Test> {
useJUnitPlatform()
mockitoAgent?.let { jvmArgs("-javaagent:${it.asPath}", "-Xshare:off") }
}
2 changes: 1 addition & 1 deletion docker-compose.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ services:
everyonewaiter-api:
container_name: everyonewaiter-api
build: .
image: everyonewaiter-api:1.0.8
image: everyonewaiter-api:1.0.9
ports:
- "8081:8081"
volumes:
Expand Down
6 changes: 5 additions & 1 deletion gradle.properties
Original file line number Diff line number Diff line change
@@ -1,9 +1,13 @@
# Configuration
org.gradle.configuration-cache=true

# Artifact
appGroup=com.everyonewaiter
appVersion=1.0.8
appVersion=1.0.9
appDescription=๋ชจ๋‘์˜ ์›จ์ดํ„ฐ API

# Plugin
kotlin=2.2.21
springBoot=4.0.1
springCloud=2025.1.0
springDependencyManagement=1.1.7
Expand Down
30 changes: 17 additions & 13 deletions settings.gradle.kts
Original file line number Diff line number Diff line change
@@ -1,19 +1,23 @@
rootProject.name = "everyonewaiter-api"

pluginManagement {
val springBoot: String by settings
val springDependencyManagement: String by settings
val gitProperties: String by settings
val spotBugs: String by settings
val kotlin: String by settings
val springBoot: String by settings
val springDependencyManagement: String by settings
val gitProperties: String by settings
val spotBugs: String by settings

resolutionStrategy {
eachPlugin {
when (requested.id.id) {
"org.springframework.boot" -> useVersion(springBoot)
"io.spring.dependency-management" -> useVersion(springDependencyManagement)
"com.gorylenko.gradle-git-properties" -> useVersion(gitProperties)
"com.github.spotbugs" -> useVersion(spotBugs)
}
}
resolutionStrategy {
eachPlugin {
when (requested.id.id) {
"org.jetbrains.kotlin.jvm" -> useVersion(kotlin)
"org.jetbrains.kotlin.plugin.spring" -> useVersion(kotlin)
"org.jetbrains.kotlin.plugin.jpa" -> useVersion(kotlin)
"org.springframework.boot" -> useVersion(springBoot)
"io.spring.dependency-management" -> useVersion(springDependencyManagement)
"com.gorylenko.gradle-git-properties" -> useVersion(gitProperties)
"com.github.spotbugs" -> useVersion(spotBugs)
}
}
}
}
18 changes: 14 additions & 4 deletions spotbugs-exclude.xml
Original file line number Diff line number Diff line change
@@ -1,19 +1,24 @@
<?xml version="1.0" encoding="UTF-8"?>
<FindBugsFilter>
<Match>
<Source name="~.*\.kt"/>
</Match>

<Match>
<Bug code="EQ" pattern="EQ_CHECK_FOR_OPERAND_NOT_COMPATIBLE_WITH_THIS"/>
</Match>

<Match>
<Method name="equals"/>
<Bug pattern="RCN_REDUNDANT_NULLCHECK_OF_NONNULL_VALUE"/>
<Method name="equals"/>
</Match>
<Match>
<Method name="hashCode"/>
<Bug pattern="RCN_REDUNDANT_NULLCHECK_OF_NONNULL_VALUE"/>
<Method name="hashCode"/>
</Match>

<Match>
<Bug pattern="EI_EXPOSE_REP"/>
<Or>
<Class name="~.*View"/>
<Class name="com.everyonewaiter.domain.menu.CategoryView$CategoryDetails"/>
Expand All @@ -32,13 +37,16 @@
<Class name="com.everyonewaiter.domain.notification.DiscordEmbeds"/>
<Class name="~.*Request"/>
<Class name="~.*Requests"/>
<Class name="com.everyonewaiter.domain.shared.GithubRelease"/>
<Class name="com.everyonewaiter.domain.shared.GithubAuthor"/>
<Class name="com.everyonewaiter.domain.shared.GithubAsset"/>
<Package name="com.everyonewaiter.domain.receipt"/>
<Package name="com.everyonewaiter.adapter.web.api.dto"/>
</Or>
<Bug pattern="EI_EXPOSE_REP"/>
</Match>

<Match>
<Bug pattern="EI_EXPOSE_REP2"/>
<Or>
<Class name="~.*View"/>
<Class name="com.everyonewaiter.domain.menu.CategoryView$CategoryDetails"/>
Expand All @@ -57,10 +65,12 @@
<Class name="com.everyonewaiter.domain.notification.DiscordEmbeds"/>
<Class name="~.*Request"/>
<Class name="~.*Requests"/>
<Class name="com.everyonewaiter.domain.shared.GithubRelease"/>
<Class name="com.everyonewaiter.domain.shared.GithubAuthor"/>
<Class name="com.everyonewaiter.domain.shared.GithubAsset"/>
<Method name="moveTable"/>
<Package name="com.everyonewaiter.domain.receipt"/>
<Package name="com.everyonewaiter.adapter.web.api.dto"/>
</Or>
<Bug pattern="EI_EXPOSE_REP2"/>
</Match>
</FindBugsFilter>
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.everyonewaiter;
package com.everyonewaiter.adapter.config.integration;

import java.util.concurrent.Executors;
import java.util.concurrent.ThreadFactory;
Expand All @@ -10,7 +10,7 @@

@Configuration
@EnableAsync
class EveryonewaiterApiConfiguration {
class AsyncConfiguration {

@Bean(name = "eventTaskExecutor")
public TaskExecutor eventTaskExecutor() {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.everyonewaiter.adapter.integration;
package com.everyonewaiter.adapter.config.integration;

import feign.Logger;
import org.springframework.cloud.openfeign.EnableFeignClients;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.everyonewaiter.adapter.persistence;
package com.everyonewaiter.adapter.config.persistence;

import com.querydsl.jpa.impl.JPAQueryFactory;
import jakarta.persistence.EntityManager;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.everyonewaiter.adapter.persistence;
package com.everyonewaiter.adapter.config.persistence;

import lombok.RequiredArgsConstructor;
import org.redisson.Redisson;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.everyonewaiter.adapter.persistence;
package com.everyonewaiter.adapter.config.persistence;

import lombok.Getter;
import lombok.RequiredArgsConstructor;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.everyonewaiter.adapter.security;
package com.everyonewaiter.adapter.config.security;

import java.util.Collections;
import java.util.List;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.everyonewaiter.adapter.security;
package com.everyonewaiter.adapter.config.security;

import java.util.List;
import lombok.RequiredArgsConstructor;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,18 +1,22 @@
package com.everyonewaiter.adapter.web.config;
package com.everyonewaiter.adapter.config.web;

import static com.everyonewaiter.domain.support.TimeZone.ASIA_SEOUL;
import static lombok.AccessLevel.PRIVATE;

import com.everyonewaiter.domain.support.DateFormatter;
import java.time.Instant;
import lombok.NoArgsConstructor;
import org.springframework.boot.jackson.JacksonComponent;
import tools.jackson.core.JacksonException;
import tools.jackson.core.JsonGenerator;
import tools.jackson.databind.SerializationContext;
import tools.jackson.databind.ValueSerializer;

@JacksonComponent
@NoArgsConstructor(access = PRIVATE)
class InstantJacksonSerializer {

@SuppressWarnings("unused")
static class Serializer extends ValueSerializer<Instant> {

@Override
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
package com.everyonewaiter.adapter.web.docs;
package com.everyonewaiter.adapter.config.web;

import com.everyonewaiter.adapter.web.api.ErrorResponse;
import com.everyonewaiter.adapter.web.docs.ApiErrorResponse;
import com.everyonewaiter.adapter.web.docs.ApiErrorResponses;
import com.everyonewaiter.domain.shared.ErrorCode;
import io.swagger.v3.oas.models.Components;
import io.swagger.v3.oas.models.OpenAPI;
Expand Down
Loading