-
Notifications
You must be signed in to change notification settings - Fork 1
✨ feat: AI 파생 이미지 유사성 판단 투표 시스템 구현 #170
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from all commits
e49304e
c40e6db
831a508
d55f271
a1949b4
aab9ada
e29ada3
83cb62f
0d4237c
b3191a4
8308a27
701cb9f
329b590
6e4cb1c
f5a6c11
7fdde55
a80e9a9
fd2be5d
c47060a
a45bd6f
d4ffe00
6c87535
2d85758
46006ab
80ce579
9469674
ac0f27b
9caded1
d887a4f
2312424
52ed38d
4a0d8b8
4ed1000
dbcd1a7
f5819f8
64f2e32
4deb807
5802210
c05465f
73cc987
96009c0
1b64f9d
6843494
66848d5
b1bf987
b4774a9
48d2f60
fdf2779
9548afc
d342ce0
6ffff57
474ab1a
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -21,6 +21,22 @@ configurations { | |
|
|
||
| repositories { | ||
| mavenCentral() | ||
| maven { url "https://repo.spring.io/milestone" } | ||
| maven { url "https://repo.spring.io/snapshot" } | ||
| } | ||
|
|
||
| // 의존성 버전 강제 고정 | ||
| configurations.all { | ||
| resolutionStrategy { | ||
| // AWS SDK v2 및 다른 라이브러리 버전을 강제 고정하여 잠재적 충돌 방지 | ||
| force 'software.amazon.awssdk:cloudfront:2.26.14', | ||
| 'software.amazon.awssdk:s3:2.26.14', | ||
| 'software.amazon.awssdk:url-signer:2.26.14' | ||
| force 'io.jsonwebtoken:jjwt-api:0.12.5' | ||
| force "io.swagger.core.v3:swagger-annotations-jakarta:2.2.36" | ||
| force "io.swagger.core.v3:swagger-core-jakarta:2.2.36" | ||
| force "io.swagger.core.v3:swagger-models-jakarta:2.2.36" | ||
| } | ||
| } | ||
|
|
||
| dependencies { | ||
|
|
@@ -33,40 +49,46 @@ dependencies { | |
| runtimeOnly 'com.h2database:h2' | ||
| runtimeOnly 'com.mysql:mysql-connector-j' | ||
| annotationProcessor 'org.projectlombok:lombok' | ||
| implementation 'com.google.guava:guava:30.1.1-jre' | ||
| implementation 'com.google.guava:guava:33.2.1-jre' | ||
|
|
||
| // test | ||
| testImplementation 'org.springframework.boot:spring-boot-starter-test' | ||
| testImplementation 'org.springframework.security:spring-security-test' | ||
| testRuntimeOnly 'org.junit.platform:junit-platform-launcher' | ||
|
|
||
| //s3 | ||
| implementation 'org.springframework.cloud:spring-cloud-starter-aws:2.2.6.RELEASE' | ||
| implementation 'com.amazonaws:aws-java-sdk-cloudfront:1.12.772' | ||
| // AWS SDK v2 (버전은 resolutionStrategy로 관리) | ||
| implementation 'software.amazon.awssdk:s3' | ||
| implementation 'software.amazon.awssdk:cloudfront' | ||
|
|
||
| //swagger | ||
| implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.8.6' | ||
| implementation("org.springdoc:springdoc-openapi-starter-webmvc-ui:2.8.12") { | ||
| exclude group: "io.swagger.core.v3", module: "swagger-annotations" | ||
| } | ||
|
|
||
| implementation 'io.jsonwebtoken:jjwt-api:0.11.5' | ||
| runtimeOnly 'io.jsonwebtoken:jjwt-impl:0.11.5' | ||
| runtimeOnly 'io.jsonwebtoken:jjwt-jackson:0.11.5' | ||
|
|
||
| implementation 'jakarta.xml.bind:jakarta.xml.bind-api:4.0.0' | ||
| runtimeOnly 'org.glassfish.jaxb:jaxb-runtime:4.0.3' | ||
| implementation 'jakarta.xml.bind:jakarta.xml.bind-api:4.0.2' | ||
| runtimeOnly 'org.glassfish.jaxb:jaxb-runtime:4.0.5' | ||
|
|
||
| implementation 'org.springframework.boot:spring-boot-starter-mail' | ||
|
|
||
| implementation 'org.springframework.boot:spring-boot-starter-data-redis' | ||
| // Amqp | ||
| implementation 'org.springframework.boot:spring-boot-starter-amqp:3.4.2' | ||
| // Amqp (버전은 Spring Boot가 관리) | ||
| implementation 'org.springframework.boot:spring-boot-starter-amqp' | ||
| // Redisson(Redis Client) | ||
| implementation 'org.redisson:redisson-spring-boot-starter:3.27.2' | ||
| // OAuth | ||
| implementation 'org.springframework.boot:spring-boot-starter-oauth2-client:3.5.0' | ||
| implementation 'org.redisson:redisson-spring-boot-starter:3.32.0' | ||
| // OAuth (버전은 Spring Boot가 관리) | ||
| implementation 'org.springframework.boot:spring-boot-starter-oauth2-client' | ||
| // metric | ||
| implementation("org.springframework.boot:spring-boot-starter-actuator") | ||
| implementation("io.micrometer:micrometer-registry-cloudwatch2") | ||
| implementation("io.micrometer:micrometer-registry-cloudwatch2:1.13.4") | ||
|
|
||
| // webClient용 라이브러리, WebFlux 사용x | ||
| implementation 'org.springframework.boot:spring-boot-starter-webflux' | ||
| } | ||
|
Comment on lines
+88
to
90
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🧩 Analysis chainWebFlux 스타터 동시 사용 주의 MVC+WebFlux 스타터 동시 포함은 서버 이중 탑재(톰캣+Netty)와 클래스패스 부피 증가를 야기합니다. WebClient만 필요하면 다음으로 내장 서버 충돌 여부를 점검해주세요. 🏁 Script executed: #!/bin/bash
rg -nPI 'Netty|Reactor Netty|undertow' -g 'build/**/reports/*' -S || trueLength of output: 148 🏁 Script executed: #!/bin/bash
set -euo pipefail
echo "== Searching repository for WebFlux / Web starters and embedded servers =="
rg -nPI --hidden -S --glob '!**/build/**' --glob '!**/target/**' --glob '!**/.git/**' -C3 'spring-boot-starter-webflux|spring-boot-starter-web|spring-boot-starter-tomcat|spring-boot-starter-undertow|spring-boot-starter-jetty|spring-boot-starter-reactor-netty|io\.projectreactor\.netty|reactor-netty|reactor\.netty|netty|undertow|jetty' || true
echo
echo "== Searching for WebClient usage =="
rg -nPI --hidden -S --glob '!**/build/**' --glob '!**/target/**' --glob '!**/.git/**' -C2 'org\.springframework\.web\.reactive\.function\.client\.WebClient|WebClient' || true
echo
echo "== Searching for spring.main.web-application-type settings =="
rg -nPI --hidden -S --glob '!**/build/**' --glob '!**/target/**' --glob '!**/.git/**' -C2 'spring\.main\.web-application-type|web-application-type' || true
echo
echo "== List of build files found (build.gradle*, build.gradle.kts, pom.xml, settings.gradle*) =="
find . -maxdepth 6 -type f \( -name 'build.gradle*' -o -name 'build.gradle.kts' -o -name 'pom.xml' -o -name 'settings.gradle*' \) -print | sed 's|^\./||' || true
echo
echo "== Show dependency lines from found build files =="
for f in $(find . -maxdepth 6 -type f \( -name 'build.gradle*' -o -name 'build.gradle.kts' -o -name 'pom.xml' \)); do
echo "---- $f ----"
rg -nPI --hidden -S -n 'spring-boot-starter-webflux|spring-boot-starter-web|spring-boot-starter-tomcat|spring-boot-starter-undertow|spring-boot-starter-jetty|spring-boot-starter-reactor-netty|io\.projectreactor\.netty|reactor-netty|reactor\.netty|netty|undertow|jetty' "$f" || true
doneLength of output: 971 WebFlux 스타터 동시 포함 확인 — 즉시 수정 필요 build.gradle에 'org.springframework.boot:spring-boot-starter-web' (44행)과 'org.springframework.boot:spring-boot-starter-webflux' (89행)가 동시에 선언되어 있습니다. 톰캣 + Reactor Netty 이중 내장 서버, 클래스패스 증가 및 포트/런타임 충돌 가능성이 있습니다.
🤖 Prompt for AI Agents |
||
|
|
||
| tasks.named('test') { | ||
| useJUnitPlatform() | ||
| } | ||
| } | ||
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,21 @@ | ||
| package hanium.modic.backend.common.property.property; | ||
|
|
||
| import org.springframework.boot.context.properties.ConfigurationProperties; | ||
|
|
||
| import lombok.Getter; | ||
| import lombok.Setter; | ||
|
|
||
| @Getter | ||
| @Setter | ||
| @ConfigurationProperties(prefix = "ai") | ||
| public class AiProperties { | ||
|
|
||
| private OpenAi openai = new OpenAi(); | ||
|
|
||
| @Getter | ||
| @Setter | ||
| public static class OpenAi { | ||
| private String apiKey; | ||
| private String model; | ||
| } | ||
| } |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,18 @@ | ||
| package hanium.modic.backend.common.property.property; | ||
|
|
||
| import org.springframework.boot.context.properties.ConfigurationProperties; | ||
|
|
||
| import lombok.Getter; | ||
| import lombok.Setter; | ||
|
|
||
| @Getter | ||
| @Setter | ||
| @ConfigurationProperties(prefix = "vote.similarity") | ||
| public class VoteProperties { | ||
|
|
||
| private int minTotalWeight; | ||
| private int aiVoteWeight; | ||
| private int humanVoteWeight; | ||
| private Boolean enableAiAssessment; | ||
| private int maxVotesPerUserPerDay; | ||
| } | ||
goalSetter09 marked this conversation as resolved.
Show resolved
Hide resolved
|
||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,12 @@ | ||
| package hanium.modic.backend.domain.ai.aiChat.dto; | ||
|
|
||
| import java.time.LocalDateTime; | ||
|
|
||
| /** | ||
| * 컨텍스트 초기화 응답 DTO | ||
| */ | ||
| public record ChatContextResetResponse( | ||
| Long roomId, | ||
| LocalDateTime contextResetAt | ||
| ) { | ||
| } |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,19 @@ | ||
| package hanium.modic.backend.domain.ai.aiChat.dto; | ||
|
|
||
| import io.swagger.v3.oas.annotations.media.Schema; | ||
| import jakarta.validation.constraints.NotBlank; | ||
| import jakarta.validation.constraints.Size; | ||
|
|
||
| /** | ||
| * 채팅 메시지 전송 요청 DTO | ||
| */ | ||
| @Schema(description = "채팅 메시지 전송 요청") | ||
| public record ChatMessageRequest( | ||
| @Schema(description = "채팅 메시지 내용", example = "안녕하세요! 이 그림을 더 밝게 만들어주세요.", required = true) | ||
| @NotBlank(message = "메시지 내용은 필수입니다.") | ||
| String textContent, | ||
|
|
||
| @Schema(description = "첨부할 이미지 ID (선택사항)", example = "123") | ||
| Long aiChatImageId // 이미지 첨부 시에만 (optional) | ||
| ) { | ||
| } |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Milestone/Snapshot 저장소 전역 추가는 공급망 리스크
릴리즈가 아닌 아티팩트를 전역으로 받아들이면 예기치 않은 상향/호환 깨짐 위험이 있습니다. 필요한 모듈 범위로 국소화하거나 제거를 권장합니다.
maven { url ... }를 개별 서브프로젝트나 필요 Task에만 선언🤖 Prompt for AI Agents