Repository: dku-capstone/QRust-BE
Pull request #8: refactor: 멀티 모듈 구조 전환 및 gradle 모듈 분류
Author: login: JHZLO
Labels: name: 🧩 backend
description: 백엔드 관련
name: 🧹 chore
description: 설정 및 기타 관련
name: 🪜 refactor
description: 리팩터링 관련
Created: 2025-04-29T01:23:29Z | Merged: 2025-04-29T06:23:21Z

## 📌 Related Issue

> [!NOTE]
> 관련된 이슈 번호를 적어주세요.

- Close #7 

## 🚀 Description

> [!NOTE]
> 작업한 내용을 간략히 적어주세요.

## 1️⃣ 멀티모듈 구조 분류
![image](https://github.com/user-attachments/assets/795fe849-468e-4015-a556-4a5b65772072)
위와 같은 모듈로 분류하였습니다.
### `qrust-api`
- controller
- dto
(여기서 dto의 역할이 api의 request와 response 객체 포장이므로 controller와 붙어있는 게 좋다고 생각하였습니다!)

### `qrust-domain`
- application
- domain
    - service
    - entity
    - repository
- infrastructure

domain의 모듈에서는 저희가 나눠갖는 도메일별로  `DDD 패턴`을 적용해서 설계하면 어떨까 생각하는데 의견주십쇼

### `qrust-common`
- annotaion
- exception
- configuration
- infrastructure
- util
등등...

## 2️⃣ gradle setting
- gradle은 루트 gradle에다가 의존성 몰아넣고 모듈들이 전부 사용할 수 있도록 구성하였고,각각의 모듈의 gradle은 의존 관계에 따라 implement만 지정해주었습니다

- api 모듈의 gradle에만 `bootjar=true`로 둚으로써 QrustApiApplication.java가 build의 진입점이 될 수 있도록 구성하였습니다.

- gradle의 버전 관리는 gradle.properties에서 관리하도록 하였습니다

## 3️⃣ 멀티모듈에 따른 변화
```yml
# pr-merge-cd-pipeline.yml

run: docker build -f qrust-api/Dockerfile -t ${{ secrets.DOCKERHUB_USER_NAME }}/QRust-image:latest .
```
Dockerfile을 api 모듈안에 옮김에 따라 -f 옵션을 주어 qrust-api 모듈의 경로를 지정해주었습니다!


## 📸 Screenshot
> [!NOTE]
> 변경 사항을 보여주는 스크린샷(또는 GIF)을 첨부해 주세요.

![image](https://github.com/user-attachments/assets/d286e7ea-cab4-4a8c-88cc-70622ec2d2b7)

## 📢 Notes

> [!NOTE]
> 추가적인 설명이나 참고 사항을 작성해 주세요.

```text

```


<!-- This is an auto-generated comment: release notes by coderabbit.ai -->
## Summary by CodeRabbit

## Summary by CodeRabbit

- **신규 기능**
  - Spring Boot 기반의 새로운 API 애플리케이션 모듈(qrust-api) 및 도메인/공통 모듈(qrust-domain, qrust-common) 추가
  - 프로젝트 멀티 모듈 구조 도입 및 빌드 설정 개선, 외부 Gradle 스크립트로 의존성 관리 분리
  - H2 인메모리 데이터베이스 및 콘솔 기본 설정 추가

- **문서화**
  - Swagger-UI를 통한 API 문서화 지원 추가

- **테스트**
  - 기본 애플리케이션 구동 테스트 클래스 및 테스트 의존성 추가

- **기타**
  - Docker 빌드 및 컨테이너 설정 경로 명확화
  - 프로젝트 및 의존성 버전 중앙 관리 파일(gradle.properties) 추가
  - 기존 단일 엔트리포인트 및 예제 코드 제거
<!-- end of auto-generated comment: release notes by coderabbit.ai -->

Linked issue #7: 멀티모듈 구조 분리
### 📄 설명

멀티 모듈 구조 분리
- `api`
    - controller
    - dto
- `app` (앱 내부 DDD 패턴으로 설계)
    - domain (QR 인식, QR 생성, 신고게시판, QR 보관함, Auth)
        - application
        - domain
             - entity
             - repository
             - service
        - infrastructure
- `common`
    - annotaion
    - exception
    - configuration
    - infrastructure
    - util


### ✅ 작업할 내용

- [ ] 멀티 모듈 구조 설계
- [ ] gradle 모듈 분리

### 🙋🏻 참고 자료

_No response_

Diff:
diff --git a/.github/workflows/pr-merge-cd-pipeline.yml b/.github/workflows/pr-merge-cd-pipeline.yml
index 46e0814..aba7ff6 100644
--- a/.github/workflows/pr-merge-cd-pipeline.yml
+++ b/.github/workflows/pr-merge-cd-pipeline.yml
@@ -13,7 +13,7 @@ jobs:
         uses: actions/checkout@v4
 
       - name: Docker Build
-        run: docker build -t ${{ secrets.DOCKERHUB_USER_NAME}}/QRust-image:latest .
+        run: docker build -f qrust-api/Dockerfile -t ${{ secrets.DOCKERHUB_USER_NAME }}/QRust-image:latest .
 
       - name: Docker Hub Login
         run: |
diff --git a/build.gradle b/build.gradle
index d77e37c..4e447b9 100644
--- a/build.gradle
+++ b/build.gradle
@@ -1,54 +1,49 @@
 plugins {
     id 'java'
-    id 'org.springframework.boot' version '3.4.4'
-    id 'io.spring.dependency-management' version '1.1.7'
+    id 'org.springframework.boot' version "${springBootVersion}"
+    id 'io.spring.dependency-management' version "${springDependencyManagementVersion}"
 }
 
-group = 'dku_capstone'
-version = '0.0.1-SNAPSHOT'
-
-java {
-    toolchain {
-        languageVersion = JavaLanguageVersion.of(21)
-    }
+bootJar {
+    enabled = false
 }
 
 repositories {
     mavenCentral()
 }
 
-dependencies {
-    // starter
-    implementation 'org.springframework.boot:spring-boot-starter-web'
-    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-data-mongodb'
-
-    //database
-    runtimeOnly 'com.h2database:h2'
-    runtimeOnly 'com.oracle.database.jdbc:ojdbc11'
-    runtimeOnly 'com.mysql:mysql-connector-j'
-
-    //swagger
-    implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.8.5'
-
-    //lombok
-    compileOnly 'org.projectlombok:lombok'
-    annotationProcessor 'org.projectlombok:lombok'
-
-    //querydsl
-    implementation 'com.querydsl:querydsl-jpa:5.0.0:jakarta'
-    annotationProcessor "com.querydsl:querydsl-apt:${dependencyManagement.importedProperties['querydsl.version']}:jakarta"
-    annotationProcessor "jakarta.annotation:jakarta.annotation-api"
-    annotationProcessor "jakarta.persistence:jakarta.persistence-api"
-
-    //test
-    testImplementation 'org.springframework.boot:spring-boot-starter-test'
-    testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
-    testCompileOnly 'org.projectlombok:lombok'
-    testAnnotationProcessor 'org.projectlombok:lombok'
-}
 
-tasks.named('test') {
-    useJUnitPlatform()
+subprojects {
+    group = "${group}"
+    version = "${version}"
+    sourceCompatibility = JavaVersion.VERSION_21
+    targetCompatibility = JavaVersion.VERSION_21
+
+    apply plugin: 'java'
+    apply plugin: 'java-library'
+    apply plugin: 'org.springframework.boot'
+    apply plugin: 'io.spring.dependency-management'
+
+    apply from: "${rootDir}/gradle/db.gradle"
+    apply from: "${rootDir}/gradle/jwt.gradle"
+    apply from: "${rootDir}/gradle/lombok.gradle"
+    apply from: "${rootDir}/gradle/monitor.gradle"
+    apply from: "${rootDir}/gradle/spring.gradle"
+    apply from: "${rootDir}/gradle/swagger.gradle"
+    apply from: "${rootDir}/gradle/test.gradle"
+    apply from: "${rootDir}/gradle/webflux.gradle"
+
+    configurations {
+        compileOnly {
+            extendsFrom annotationProcessor
+        }
+    }
+
+    repositories {
+        mavenCentral()
+    }
+
+    test {
+        useJUnitPlatform()
+    }
 }
diff --git a/gradle.properties b/gradle.properties
new file mode 100644
index 0000000..5fdc6e4
--- /dev/null
+++ b/gradle.properties
@@ -0,0 +1,17 @@
+### Project ###
+group=com.qrust
+version=1.0
+### Spring ###
+javaVersion=21
+springBootVersion=3.4.3
+springDependencyManagementVersion=1.1.6
+### Database ###
+mysqlConnectorVersion=8.0.33
+### Lombok ###
+lombokVersion=1.18.30
+### Jwt ###
+jwtVersion=0.12.5
+### Swagger ###
+webMvcVersion=2.0.2
+### MockWebServer ###
+mockWebServerVersion=4.12.0
diff --git a/gradle/db.gradle b/gradle/db.gradle
new file mode 100644
index 0000000..0e8d847
--- /dev/null
+++ b/gradle/db.gradle
@@ -0,0 +1,11 @@
+dependencies {
+    // DB, JPA
+    runtimeOnly "com.mysql:mysql-connector-j:${mysqlConnectorVersion}"
+    implementation "org.springframework.boot:spring-boot-starter-data-jpa"
+
+    // h2
+    testImplementation "com.h2database:h2"
+
+    // Redis
+    // implementation "org.springframework.boot:spring-boot-starter-data-redis"
+}
diff --git a/gradle/jwt.gradle b/gradle/jwt.gradle
new file mode 100644
index 0000000..8cf67a6
--- /dev/null
+++ b/gradle/jwt.gradle
@@ -0,0 +1,6 @@
+dependencies {
+    // JWT
+    implementation "io.jsonwebtoken:jjwt-api:${jwtVersion}"
+    runtimeOnly "io.jsonwebtoken:jjwt-impl:${jwtVersion}"
+    runtimeOnly "io.jsonwebtoken:jjwt-jackson:${jwtVersion}"
+}
diff --git a/gradle/lombok.gradle b/gradle/lombok.gradle
new file mode 100644
index 0000000..238ca48
--- /dev/null
+++ b/gradle/lombok.gradle
@@ -0,0 +1,5 @@
+dependencies {
+    // lombok
+    compileOnly "org.projectlombok:lombok:${lombokVersion}"
+    annotationProcessor "org.projectlombok:lombok:${lombokVersion}"
+}
diff --git a/gradle/monitor.gradle b/gradle/monitor.gradle
new file mode 100644
index 0000000..d9592ba
--- /dev/null
+++ b/gradle/monitor.gradle
@@ -0,0 +1,5 @@
+dependencies {
+    // monitoring (Prometheus)
+    implementation 'org.springframework.boot:spring-boot-starter-actuator'
+    runtimeOnly 'io.micrometer:micrometer-registry-prometheus'
+}
diff --git a/gradle/spring.gradle b/gradle/spring.gradle
new file mode 100644
index 0000000..76efd9e
--- /dev/null
+++ b/gradle/spring.gradle
@@ -0,0 +1,26 @@
+dependencies {
+    // WEB
+    implementation 'org.springframework.boot:spring-boot-starter-web'
+
+    // Spring Security
+    implementation 'org.springframework.boot:spring-boot-starter-security'
+
+    // Development tools (for local development only)
+    developmentOnly 'org.springframework.boot:spring-boot-devtools'
+
+    // Spring Batch
+    implementation 'org.springframework.boot:spring-boot-starter-batch'
+    testImplementation 'org.springframework.batch:spring-batch-test'
+
+    // Thymeleaf
+    implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
+
+    // Validation (for request/response validation)
+    implementation 'org.springframework.boot:spring-boot-starter-validation'
+
+    // WebSocket (for real-time communication)
+    implementation 'org.springframework.boot:spring-boot-starter-websocket'
+
+    // Sentry
+    implementation 'io.sentry:sentry-spring-boot-starter-jakarta:7.17.0'
+}
diff --git a/gradle/swagger.gradle b/gradle/swagger.gradle
new file mode 100644
index 0000000..f9b3add
--- /dev/null
+++ b/gradle/swagger.gradle
@@ -0,0 +1,4 @@
+dependencies {
+    // Swagger-UI
+    implementation "org.springdoc:springdoc-openapi-starter-webmvc-ui:${webMvcVersion}"
+}
diff --git a/gradle/test.gradle b/gradle/test.gradle
new file mode 100644
index 0000000..bc78772
--- /dev/null
+++ b/gradle/test.gradle
@@ -0,0 +1,10 @@
+dependencies {
+    // Testing
+    testImplementation 'org.springframework.boot:spring-boot-starter-test'
+    testImplementation 'org.springframework.security:spring-security-test'
+    testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
+}
+
+tasks.named('test') {
+    useJUnitPlatform()
+}
diff --git a/gradle/webflux.gradle b/gradle/webflux.gradle
new file mode 100644
index 0000000..a22210b
--- /dev/null
+++ b/gradle/webflux.gradle
@@ -0,0 +1,4 @@
+dependencies {
+    // WebFlux 외부 API 호출
+    implementation 'org.springframework.boot:spring-boot-starter-webflux'
+}
diff --git a/Dockerfile b/qrust-api/Dockerfile
similarity index 96%
rename from Dockerfile
rename to qrust-api/Dockerfile
index aa648be..c515efe 100644
--- a/Dockerfile
+++ b/qrust-api/Dockerfile
@@ -5,7 +5,7 @@ FROM gradle:8.5-jdk21 AS build
 ARG APP_DIR=/home/app
 
 # 소스 코드 복사
-COPY . ${APP_DIR}
+COPY .. ${APP_DIR}
 WORKDIR ${APP_DIR}
 
 # 빌드 실행
diff --git a/qrust-api/build.gradle b/qrust-api/build.gradle
new file mode 100644
index 0000000..6e22f76
--- /dev/null
+++ b/qrust-api/build.gradle
@@ -0,0 +1,12 @@
+bootJar {
+    enabled = true
+}
+
+jar {
+    enabled = false
+}
+
+dependencies {
+    implementation project(':qrust-domain')
+    implementation project(':qrust-common')
+}
diff --git a/qrust-api/src/main/java/com/qrust/QrustApiApplication.java b/qrust-api/src/main/java/com/qrust/QrustApiApplication.java
new file mode 100644
index 0000000..edff569
--- /dev/null
+++ b/qrust-api/src/main/java/com/qrust/QrustApiApplication.java
@@ -0,0 +1,13 @@
+package com.qrust;
+
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class QrustApiApplication {
+
+    public static void main(String[] args) {
+        SpringApplication.run(QrustApiApplication.class, args);
+    }
+}
diff --git a/src/main/resources/application-prod.yml b/qrust-api/src/main/resources/application-prod.yml
similarity index 100%
rename from src/main/resources/application-prod.yml
rename to qrust-api/src/main/resources/application-prod.yml
diff --git a/qrust-api/src/main/resources/application.yml b/qrust-api/src/main/resources/application.yml
new file mode 100644
index 0000000..ef7070c
--- /dev/null
+++ b/qrust-api/src/main/resources/application.yml
@@ -0,0 +1,9 @@
+spring:
+  datasource:
+    url: jdbc:h2:mem:testdb
+    driver-class-name: org.h2.Driver
+    username: sa
+    password:
+  h2:
+    console:
+      enabled: true
diff --git a/src/test/java/dku_capstone/QRust/QRustApplicationTests.java b/qrust-api/src/test/java/com/qrust/QrustApiApplicationTest.java
similarity index 71%
rename from src/test/java/dku_capstone/QRust/QRustApplicationTests.java
rename to qrust-api/src/test/java/com/qrust/QrustApiApplicationTest.java
index e3397cc..5604aa5 100644
--- a/src/test/java/dku_capstone/QRust/QRustApplicationTests.java
+++ b/qrust-api/src/test/java/com/qrust/QrustApiApplicationTest.java
@@ -1,13 +1,13 @@
-package dku_capstone.QRust;
-
-import org.junit.jupiter.api.Test;
-import org.springframework.boot.test.context.SpringBootTest;
-
-@SpringBootTest
-class QRustApplicationTests {
-
-    @Test
-    void contextLoads() {
-    }
-
-}
+package com.qrust;
+
+import org.junit.jupiter.api.Test;
+import org.springframework.boot.test.context.SpringBootTest;
+
+@SpringBootTest
+class QrustApiApplicationTest {
+
+    @Test
+    void contextLoads() {
+    }
+
+}
diff --git a/qrust-common/build.gradle b/qrust-common/build.gradle
new file mode 100644
index 0000000..8ceda08
--- /dev/null
+++ b/qrust-common/build.gradle
@@ -0,0 +1,7 @@
+bootJar {
+    enabled = false
+}
+
+jar {
+    enabled = true
+}
diff --git a/qrust-domain/build.gradle b/qrust-domain/build.gradle
new file mode 100644
index 0000000..cd61912
--- /dev/null
+++ b/qrust-domain/build.gradle
@@ -0,0 +1,11 @@
+bootJar {
+    enabled = false
+}
+
+jar {
+    enabled = true
+}
+
+dependencies {
+    implementation project(':qrust-common')
+}
diff --git a/settings.gradle b/settings.gradle
index 576ec2f..7d9e417 100644
--- a/settings.gradle
+++ b/settings.gradle
@@ -1 +1,4 @@
 rootProject.name = 'QRust'
+include 'qrust-api'
+include 'qrust-domain'
+include 'qrust-common'
diff --git a/src/main/java/dku_capstone/QRust/QRustApplication.java b/src/main/java/dku_capstone/QRust/QRustApplication.java
deleted file mode 100644
index 9a41fce..0000000
--- a/src/main/java/dku_capstone/QRust/QRustApplication.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package dku_capstone.QRust;
-
-import org.springframework.boot.SpringApplication;
-import org.springframework.boot.autoconfigure.SpringBootApplication;
-import org.springframework.web.bind.annotation.GetMapping;
-
-@SpringBootApplication
-public class QRustApplication {
-
-    public static void main(String[] args) {
-        SpringApplication.run(QRustApplication.class, args);
-    }
-
-    @GetMapping("/")
-    public String home() {
-        return "Hello, World!";
-    }
-
-}
diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml
deleted file mode 100644
index e69de29..0000000


Reviews:
user: login: coderabbitai[bot]
body: **Actionable comments posted: 7**

<details>
<summary>🔭 Outside diff range comments (3)</summary><blockquote>

<details>
<summary>qrust-api/src/main/resources/application.yml (1)</summary><blockquote>

`1-10`: _⚠️ Potential issue_

**YAML 파일 줄바꿈 문자 LF 통일 필요**  
`YAMLLint`에서 줄바꿈 문자 오류(`expected \n`)가 발생했습니다. Windows CRLF 대신 유닉스 스타일 LF로 변경하고, `.gitattributes`에 아래 설정을 추가해 재발을 방지하세요:  
```
*.yml text eol=lf
```

<details>
<summary>🧰 Tools</summary>

<details>
<summary>🪛 YAMLlint (1.35.1)</summary>

[error] 1-1: wrong new line character: expected \n

(new-lines)

</details>

</details>

</blockquote></details>
<details>
<summary>.github/workflows/pr-merge-cd-pipeline.yml (2)</summary><blockquote>

`18-21`: _⚠️ Potential issue_

**Docker Hub 로그인 시크릿 키 이름 불일치**  
`docker login` 단계에서 `${{ secrets.DOCKER_USER_NAME }}`을 사용하지만, 빌드/푸시 단계에서는 `${{ secrets.DOCKERHUB_USER_NAME }}`을 참조하고 있습니다. 일관된 시크릿 키명을 사용하여 인증 오류를 방지하세요.  
  
```diff
- echo "${{ secrets.DOCKERHUB_PASSWORD }}" | docker login -u "${{ secrets.DOCKER_USER_NAME }}" --password-stdin
+ echo "${{ secrets.DOCKERHUB_PASSWORD }}" | docker login -u "${{ secrets.DOCKERHUB_USER_NAME }}" --password-stdin
```

---

`37-42`: _⚠️ Potential issue_

**이미지 태그 대소문자 일관성 필요**  
빌드 및 푸시 단계에서는 `QRust-image:latest`를 사용하지만, 배포 단계에서 `qrust-image:latest`를 pull하고 있습니다. Docker는 태그 대/소문자를 구분하므로 동일한 태그 문자열로 통일해야 합니다.

</blockquote></details>

</blockquote></details>

<details>
<summary>🧹 Nitpick comments (6)</summary><blockquote>

<details>
<summary>gradle.properties (2)</summary><blockquote>

`5-9`: **속성별 주석 블록 스타일을 통일하는 것을 권장합니다.**  
현재 `### Spring ###` 부분이 `###` 레벨 주석으로 되어 있는데, Gradle 속성 파일에서는 `# Spring` 과 같은 단일 `#` 주석을 사용하는 것이 관례입니다.  

```diff
- ### Spring ###
+ # Spring
```

---

`19-21`: **파일 끝에 개행이 없습니다.**  
POSIX 표준을 준수하기 위해 마지막 줄 끝에 빈 라인(개행)을 추가해 주세요.  

```diff
- mockWebServerVersion=4.12.0
+ mockWebServerVersion=4.12.0

+ 
```

</blockquote></details>
<details>
<summary>gradle/spring.gradle (1)</summary><blockquote>

`24-26`: **Sentry 의존성 버전을 중앙 관리로 이동하는 것이 좋습니다.**  
현재 `7.17.0`이 하드코딩 되어 있는데, `gradle.properties`에 `sentryVersion=7.17.0`을 추가하고 참조하는 방식이 일관성 유지에 도움이 됩니다.  

```diff
- implementation 'io.sentry:sentry-spring-boot-starter-jakarta:7.17.0'
+ implementation "io.sentry:sentry-spring-boot-starter-jakarta:${sentryVersion}"
```

</blockquote></details>
<details>
<summary>qrust-api/Dockerfile (1)</summary><blockquote>

`8-8`: **.dockerignore로 불필요 파일 제외 권장**  
상위 디렉토리 전체를 복사하면 `.git`, `build/`, `gradle/` 등 불필요 파일까지 모두 포함됩니다. `qrust-api/.dockerignore`에 해당 항목을 추가해 이미지 크기와 빌드 시간을 최적화하는 것을 제안드립니다.

</blockquote></details>
<details>
<summary>gradle/jwt.gradle (1)</summary><blockquote>

`1-6`: **JJWT BOM 사용 고려 제안**  
여러 JJWT 의존성을 동일 버전으로 관리하려면 `io.jsonwebtoken:jjwt-bom` 플랫폼 의존성을 도입하는 것이 유용합니다. 예시:  
```diff
+ implementation platform("io.jsonwebtoken:jjwt-bom:${jwtVersion}")
- implementation "io.jsonwebtoken:jjwt-api:${jwtVersion}"
- runtimeOnly "io.jsonwebtoken:jjwt-impl:${jwtVersion}"
- runtimeOnly "io.jsonwebtoken:jjwt-jackson:${jwtVersion}"
+ implementation "io.jsonwebtoken:jjwt-api"
+ runtimeOnly "io.jsonwebtoken:jjwt-impl"
+ runtimeOnly "io.jsonwebtoken:jjwt-jackson"
```

</blockquote></details>
<details>
<summary>build.gradle (1)</summary><blockquote>

`7-9`: **BootJar 비활성화 위치 조정 제안**  
루트 프로젝트에서 `bootJar.enabled = false` 를 설정하고 있는데, 서브 프로젝트에도 동일 설정이 의도치 않게 전파될 수 있습니다.  
- `qrust-api` 모듈에만 실행 가능한 JAR을 생성하도록 BootJar 설정을 모듈별로 분리 관리할 것을 권장합니다.

</blockquote></details>

</blockquote></details>

<details>
<summary>📜 Review details</summary>

**Configuration used: CodeRabbit UI**
**Review profile: CHILL**
**Plan: Pro**

<details>
<summary>📥 Commits</summary>

Reviewing files that changed from the base of the PR and between d8cbc093070aa08e93da317ce4169fd55b54e911 and bea84ae60ccee98d4d41a3dee12ca2ee5f06e30f.

</details>

<details>
<summary>📒 Files selected for processing (20)</summary>

* `.github/workflows/pr-merge-cd-pipeline.yml` (1 hunks)
* `build.gradle` (1 hunks)
* `gradle.properties` (1 hunks)
* `gradle/db.gradle` (1 hunks)
* `gradle/jwt.gradle` (1 hunks)
* `gradle/lombok.gradle` (1 hunks)
* `gradle/monitor.gradle` (1 hunks)
* `gradle/spring.gradle` (1 hunks)
* `gradle/swagger.gradle` (1 hunks)
* `gradle/test.gradle` (1 hunks)
* `gradle/webflux.gradle` (1 hunks)
* `qrust-api/Dockerfile` (1 hunks)
* `qrust-api/build.gradle` (1 hunks)
* `qrust-api/src/main/java/com/qrust/QrustApiApplication.java` (1 hunks)
* `qrust-api/src/main/resources/application.yml` (1 hunks)
* `qrust-api/src/test/java/com/qrust/QrustApiApplicationTest.java` (1 hunks)
* `qrust-common/build.gradle` (1 hunks)
* `qrust-domain/build.gradle` (1 hunks)
* `settings.gradle` (1 hunks)
* `src/main/java/dku_capstone/QRust/QRustApplication.java` (0 hunks)

</details>

<details>
<summary>💤 Files with no reviewable changes (1)</summary>

* src/main/java/dku_capstone/QRust/QRustApplication.java

</details>

<details>
<summary>🧰 Additional context used</summary>

<details>
<summary>🪛 YAMLlint (1.35.1)</summary>

<details>
<summary>qrust-api/src/main/resources/application.yml</summary>

[error] 1-1: wrong new line character: expected \n

(new-lines)

</details>

</details>

</details>

<details>
<summary>🔇 Additional comments (24)</summary><blockquote>

<details>
<summary>gradle.properties (2)</summary>

`1-4`: **프로젝트 기본 정보 선언이 적절합니다.**  
`group`, `version` 속성은 Gradle의 표준 구조에 맞게 잘 정의되어 있습니다.

---

`10-12`: **데이터베이스 버전 정보 선언이 올바릅니다.**  
`mysqlConnectorVersion=8.0.33` 설정은 문제 없어 보입니다.

</details>
<details>
<summary>gradle/test.gradle (2)</summary>

`1-6`: **테스트 의존성 정의가 적절합니다.**  
`spring-boot-starter-test`, `spring-security-test`, `junit-platform-launcher` 까지 모두 포함되어 있어 테스트 환경이 잘 갖춰졌습니다.

---

`8-10`: **JUnit Platform 사용 설정이 명확합니다.**  
`useJUnitPlatform()` 호출로 JUnit 5 기반 테스트를 실행하게 되어 있습니다.

</details>
<details>
<summary>gradle/spring.gradle (7)</summary>

`1-4`: **Spring Web 의존성 선언이 적절합니다.**  
`spring-boot-starter-web`을 통해 RESTful API 구축이 가능합니다.

---

`5-7`: **Spring Security 의존성 선언이 올바릅니다.**  
보안 관련 기능을 위해 `spring-boot-starter-security`를 잘 포함했습니다.

---

`8-10`: **개발 전용 도구(devtools) 의존성이 잘 분리되었습니다.**  
`developmentOnly`로 선언해 프로덕션 빌드에 포함되지 않게 한 점이 적절합니다.

---

`11-14`: **배치 처리 의존성 선언이 명확합니다.**  
Spring Batch와 테스트 모듈(`spring-batch-test`)이 모두 선언되어 있습니다.

---

`15-17`: **Thymeleaf 템플릿 엔진 의존성 선언이 적절합니다.**  
뷰 렌더링 기능을 위해 `spring-boot-starter-thymeleaf`가 잘 추가되었습니다.

---

`18-20`: **유효성 검사 의존성 선언이 올바릅니다.**  
`spring-boot-starter-validation`으로 요청/응답 객체 유효성 검사가 가능합니다.

---

`21-23`: **WebSocket 의존성 선언이 적절합니다.**  
실시간 통신을 위해 `spring-boot-starter-websocket` 추가가 적합합니다.

</details>
<details>
<summary>settings.gradle (1)</summary>

`1-1`: **rootProject 이름 설정이 적절합니다.**  
프로젝트 루트 이름을 `QRust`로 선언한 부분은 문제 없습니다.

</details>
<details>
<summary>gradle/webflux.gradle (1)</summary>

`1-4`: **WebFlux 의존성 선언이 잘 이루어졌습니다.**  
리액티브 클라이언트 기능을 위해 `spring-boot-starter-webflux` 추가가 적합합니다.

</details>
<details>
<summary>qrust-domain/build.gradle (2)</summary>

`1-7`: **패키징 설정 검토 완료**  
`bootJar.enabled=false`·`jar.enabled=true` 설정을 통해 도메인 모듈을 실행 가능한 Spring Boot 패키징이 아닌 순수 라이브러리 JAR로 생성하도록 잘 구성되어 있습니다.

---

`9-11`: **의존성 모듈 참조 적절**  
`qrust-common` 모듈에 대한 `implementation project(':qrust-common')` 선언이 도메인 계층에서 공통 컴포넌트를 올바르게 참조하고 있어 문제가 없습니다.

</details>
<details>
<summary>gradle/swagger.gradle (1)</summary>

`1-4`: **버전 변수 정의 확인 필요**  
`implementation "org.springdoc:springdoc-openapi-starter-webmvc-ui:${webMvcVersion}"`에서 사용된 `webMvcVersion`이 `gradle.properties` 등에서 정확히 정의되어 있는지 확인하십시오. 미정의 시 빌드 오류가 발생할 수 있습니다.

</details>
<details>
<summary>qrust-api/build.gradle (2)</summary>

`1-7`: **패키징 구성 적절**  
`bootJar.enabled=true` 및 `jar.enabled=false` 설정을 통해 API 모듈을 실행 가능한 Spring Boot JAR로 빌드하도록 잘 구성했습니다.

---

`9-12`: **모듈 의존성 선언 확인**  
`qrust-domain` 및 `qrust-common` 모듈을 `implementation`으로 참조하여 API 계층에서 도메인 및 공통 로직을 올바르게 가져오고 있습니다. 문제 없습니다.

</details>
<details>
<summary>qrust-api/src/test/java/com/qrust/QrustApiApplicationTest.java (1)</summary>

`1-14`: **테스트 클래스 구조 검토 완료**  
패키지명(`com.qrust`), 클래스명(`QrustApiApplicationTest`), 어노테이션(`@SpringBootTest`) 및 테스트 메소드(`contextLoads`)가 모두 새로운 모듈 구조와 일치하며, 애플리케이션 컨텍스트 로딩 검증용으로 적합합니다.

</details>
<details>
<summary>qrust-api/Dockerfile (1)</summary>

`8-8`: **Docker 빌드 컨텍스트 참조 경로 검증 필요**  
CI 스크립트(`docker build -f qrust-api/Dockerfile -t ... .`)에서 빌드 컨텍스트를 루트(`.`)로 사용 중일 때 `COPY .. ${APP_DIR}`가 컨텍스트 외부를 참조하여 오류가 발생할 수 있습니다. 의도한 파일들이 올바르게 복사되는지 반드시 확인해주세요.

</details>
<details>
<summary>qrust-common/build.gradle (1)</summary>

`1-7`: **공통 모듈 jar 설정 적절함**  
`bootJar`를 비활성화하고 `jar`를 활성화하여 `qrust-common` 모듈이 일반 JAR으로 패키징되도록 한 것은 멀티모듈 구조에 부합합니다.

</details>
<details>
<summary>.github/workflows/pr-merge-cd-pipeline.yml (1)</summary>

`16-16`: **Dockerfile 경로 지정 갱신 적절**  
멀티모듈 구조에서 `qrust-api/Dockerfile`을 명시적으로 지정한 것은 올바른 접근입니다.

</details>
<details>
<summary>gradle/monitor.gradle (1)</summary>

`1-5`: **모니터링 종속성 설정 적절**  
Spring Boot Actuator와 Micrometer Prometheus Registry를 모듈 공통으로 분리된 스크립트에서 관리하여 모니터링 전략을 일관되게 적용했습니다.

</details>
<details>
<summary>qrust-api/src/main/java/com/qrust/QrustApiApplication.java (1)</summary>

`1-13`: **Spring Boot 진입점 클래스 구성 적절**  
`@SpringBootApplication` 애노테이션과 `main` 메서드가 올바르게 정의되어 멀티 모듈 구조에서 API 모듈의 진입점을 명확히 설정합니다.

</details>

</blockquote></details>

</details>

<!-- This is an auto-generated comment by CodeRabbit for review status -->
state: COMMENTED
author_association: NONE
submitted_at: 2025-04-29T01:28:29Z
user: login: MAYFIFTH99
body: LGTM
state: APPROVED
author_association: COLLABORATOR
submitted_at: 2025-04-29T05:58:21Z

Review comments:
diff_hunk: @@ -0,0 +1,20 @@
+### Project ###
+group=com.qrust
+version=1.0
+
+### Spring ###
+javaVersion=21
+springBootVersion=3.4.3
+springDependencyManagementVersion=1.1.6
+
+### Database ###
+mysqlConnectorVersion=8.0.33
+
+### Jwt ###
+jwtVersion = 0.12.5
+
path: gradle.properties
user: login: coderabbitai[bot]
body: _⚠️ Potential issue_

**속성 키와 값 사이 공백이 일관되지 않습니다.**  
다른 속성들과 포맷을 맞추기 위해 `=` 양쪽의 공백을 제거하는 것이 좋습니다.  

```diff
- jwtVersion = 0.12.5
+ jwtVersion=0.12.5
```


<!-- suggestion_start -->

<details>
<summary>📝 Committable suggestion</summary>

> ‼️ **IMPORTANT**
> Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

`````suggestion
### Jwt ###
jwtVersion=0.12.5
`````

</details>

<!-- suggestion_end -->

<!-- This is an auto-generated comment by CodeRabbit -->

✅ Addressed in commit 8c76f16
created_at: 2025-04-29T01:28:27Z
author_association: NONE
diff_hunk: @@ -0,0 +1,20 @@
+### Project ###
+group=com.qrust
+version=1.0
+
+### Spring ###
+javaVersion=21
+springBootVersion=3.4.3
+springDependencyManagementVersion=1.1.6
+
+### Database ###
+mysqlConnectorVersion=8.0.33
+
+### Jwt ###
+jwtVersion = 0.12.5
+
+### Swagger ###
+webMvcVersion = 2.0.2
+
path: gradle.properties
user: login: coderabbitai[bot]
body: _⚠️ Potential issue_

**Swagger 버전 선언 포맷 정렬이 필요합니다.**  
`webMvcVersion = 2.0.2` 도 공백을 제거해 통일하세요.  

```diff
- webMvcVersion = 2.0.2
+ webMvcVersion=2.0.2
```

<!-- This is an auto-generated comment by CodeRabbit -->

✅ Addressed in commit 8c76f16
created_at: 2025-04-29T01:28:27Z
author_association: NONE
diff_hunk: @@ -1 +1,6 @@
 rootProject.name = 'QRust'
+include 'qrust-api'
+include 'qrust-api'
+include 'qrust-domain'
+include 'qrust-common'
path: settings.gradle
user: login: coderabbitai[bot]
body: _⚠️ Potential issue_

**중복된 `include 'qrust-api'` 선언이 있습니다.**  
두 번 포함된 하위 모듈 선언을 하나만 남기고 삭제해야 합니다.  

```diff
- include 'qrust-api'
  include 'qrust-domain'
  include 'qrust-common'
```
(Note: 첫 번째 혹은 두 번째 `qrust-api` 선언 중 하나를 제거)
```


<!-- suggestion_start -->

<details>
<summary>📝 Committable suggestion</summary>

> ‼️ **IMPORTANT**
> Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

`````suggestion
include 'qrust-api'
include 'qrust-domain'
include 'qrust-common'
`````

</details>

<!-- suggestion_end -->

<!-- This is an auto-generated comment by CodeRabbit -->

✅ Addressed in commit 8c76f16
created_at: 2025-04-29T01:28:28Z
author_association: NONE
diff_hunk: @@ -0,0 +1,5 @@
+dependencies {
+    // lombok
+    compileOnly 'org.projectlombok:lombok'
+    annotationProcessor 'org.projectlombok:lombok'
+}
path: gradle/lombok.gradle
user: login: coderabbitai[bot]
body: _🛠️ Refactor suggestion_

**버전 관리 변수 사용 권장**  
현재 `org.projectlombok:lombok` 의존성에 버전을 명시하지 않아, Gradle에서 기본 버전이 적용되거나 중앙 관리 형식이 깨질 수 있습니다. `gradle.properties`에 정의된 `lombokVersion` 변수를 사용해 버전을 일관되게 관리할 것을 권장합니다.  


```diff
 dependencies {
-    compileOnly 'org.projectlombok:lombok'
-    annotationProcessor 'org.projectlombok:lombok'
+    compileOnly "org.projectlombok:lombok:${lombokVersion}"
+    annotationProcessor "org.projectlombok:lombok:${lombokVersion}"
 }
```


<!-- suggestion_start -->

<details>
<summary>📝 Committable suggestion</summary>

> ‼️ **IMPORTANT**
> Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

`````suggestion
dependencies {
    // lombok
    compileOnly "org.projectlombok:lombok:${lombokVersion}"
    annotationProcessor "org.projectlombok:lombok:${lombokVersion}"
}
`````

</details>

<!-- suggestion_end -->

<!-- This is an auto-generated comment by CodeRabbit -->

✅ Addressed in commit 8c76f16
created_at: 2025-04-29T01:28:28Z
author_association: NONE
diff_hunk: @@ -0,0 +1,6 @@
+dependencies {
+    // JWT
+    implementation "io.jsonwebtoken:jjwt-api:${jwtVersion}"
+    runtimeOnly "io.jsonwebtoken:jjwt-impl:${jwtVersion}"
+    runtimeOnly "io.jsonwebtoken:jjwt-jackson:${jwtVersion}"
+}
path: gradle/jwt.gradle
user: login: coderabbitai[bot]
body: _💡 Verification agent_

<details>
<summary>🧩 Analysis chain</summary>

**`jwtVersion` 속성 정의 여부 확인**  
`gradle.properties`에 `jwtVersion`이 정의되어 있지 않으면 빌드 시 변수 해석 오류가 발생합니다. 아래 스크립트를 실행하여 확인해주세요.

---

🏁 Script executed:

```shell
#!/bin/bash
# gradle.properties에서 jwtVersion이 정의되어 있는지 확인
grep -R "^jwtVersion=" -n gradle.properties
```

Length of output: 45

---

🏁 Script executed:

```shell
#!/bin/bash
# gradle.properties 파일 위치 확인
find . -type f -name 'gradle.properties'
# 전체 코드베이스에서 jwtVersion 정의 여부 확인
grep -R "^jwtVersion=" -n .
```

Length of output: 90

---



</details>

**`jwtVersion` 속성 정의 필요**  
현재 `gradle.properties`에서 `jwtVersion`이 전혀 정의되어 있지 않아, 아래와 같이 속성을 추가하지 않으면 빌드 시 오류가 발생합니다.

수정할 위치:
- 파일: `gradle.properties` (프로젝트 루트)

예시 추가 내용:
```
# JWT 라이브러리 버전 설정
jwtVersion=0.11.2  # 실제 사용하려는 버전으로 변경
```

<!-- This is an auto-generated comment by CodeRabbit -->
created_at: 2025-04-29T01:28:28Z
author_association: NONE
diff_hunk: @@ -0,0 +1,12 @@
+dependencies {
+    // DB, JPA
+    runtimeOnly "com.mysql:mysql-connector-j:${mysqlConnectorVersion}"
+    implementation "org.springframework.boot:spring-boot-starter-data-jpa"
+
+    // h2
+    testImplementation "com.h2database:h2"
+    runtimeOnly "com.h2database:h2"
+
path: gradle/db.gradle
user: login: coderabbitai[bot]
body: _🛠️ Refactor suggestion_

**H2 의존성 스코프 재검토 권장**  
`testImplementation "com.h2database:h2"` 로 테스트 목적 의존성만 선언해도 충분하며, `runtimeOnly "com.h2database:h2"` 는 프로덕션 런타임에 불필요한 H2 드라이버를 포함할 수 있습니다.  
제안:  
- `runtimeOnly "com.h2database:h2"` 제거  
- 또는 테스트 전용 의존성만 유지 (`testImplementation`으로만 선언)

<!-- This is an auto-generated comment by CodeRabbit -->

✅ Addressed in commit 8c76f16
created_at: 2025-04-29T01:28:28Z
author_association: NONE
diff_hunk: @@ -1,54 +1,49 @@
 plugins {
     id 'java'
-    id 'org.springframework.boot' version '3.4.4'
-    id 'io.spring.dependency-management' version '1.1.7'
+    id 'org.springframework.boot' version "${springBootVersion}"
+    id 'io.spring.dependency-management' version "${springDependencyManagementVersion}"
 }
 
-group = 'dku_capstone'
-version = '0.0.1-SNAPSHOT'
-
-java {
-    toolchain {
-        languageVersion = JavaLanguageVersion.of(21)
-    }
+bootJar {
+    enabled = false
 }
 
 repositories {
     mavenCentral()
 }
 
-dependencies {
-    // starter
-    implementation 'org.springframework.boot:spring-boot-starter-web'
-    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-data-mongodb'
-
-    //database
-    runtimeOnly 'com.h2database:h2'
-    runtimeOnly 'com.oracle.database.jdbc:ojdbc11'
-    runtimeOnly 'com.mysql:mysql-connector-j'
-
-    //swagger
-    implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.8.5'
-
-    //lombok
-    compileOnly 'org.projectlombok:lombok'
-    annotationProcessor 'org.projectlombok:lombok'
-
-    //querydsl
-    implementation 'com.querydsl:querydsl-jpa:5.0.0:jakarta'
-    annotationProcessor "com.querydsl:querydsl-apt:${dependencyManagement.importedProperties['querydsl.version']}:jakarta"
-    annotationProcessor "jakarta.annotation:jakarta.annotation-api"
-    annotationProcessor "jakarta.persistence:jakarta.persistence-api"
-
-    //test
-    testImplementation 'org.springframework.boot:spring-boot-starter-test'
-    testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
-    testCompileOnly 'org.projectlombok:lombok'
-    testAnnotationProcessor 'org.projectlombok:lombok'
-}
 
-tasks.named('test') {
-    useJUnitPlatform()
+subprojects {
+    group = "${group}"
+    version = "${version}"
+    sourceCompatibility = JavaVersion.VERSION_21
+    targetCompatibility = JavaVersion.VERSION_21
+
+    apply plugin: 'java'
+    apply plugin: 'java-library'
+    apply plugin: 'org.springframework.boot'
+    apply plugin: 'io.spring.dependency-management'
path: build.gradle
user: login: coderabbitai[bot]
body: _🛠️ Refactor suggestion_

**Spring Boot 플러그인 적용 범위 검토 필요**  
`subprojects` 블록에서 모든 모듈에 `org.springframework.boot` 플러그인을 적용하고 있어, `qrust-domain` 및 `qrust-common` 같은 라이브러리 모듈에서는 불필요하거나 부적절한 애플리케이션 설정이 전파될 수 있습니다.  
제안:  
```groovy
subprojects {
    apply plugin: 'java'
    apply plugin: 'java-library'
    apply plugin: 'io.spring.dependency-management'
    if (project.name == 'qrust-api') {
        apply plugin: 'org.springframework.boot'
    }
    // ...
}
```

<!-- This is an auto-generated comment by CodeRabbit -->
created_at: 2025-04-29T01:28:28Z
author_association: NONE

PR comments:
user: login: coderabbitai[bot]
created_at: 2025-04-29T01:23:36Z
body: <!-- This is an auto-generated comment: summarize by coderabbit.ai -->
<!-- walkthrough_start -->

"""
## Walkthrough

이번 변경사항은 프로젝트의 전체적인 Gradle 멀티모듈 구조 도입, 의존성 관리 방식 개선, 그리고 CI/CD 파이프라인 및 Docker 빌드 설정을 포함합니다. Gradle 설정이 루트 단일 프로젝트에서 하위 모듈별로 분리되었고, 의존성 및 플러그인 버전이 `gradle.properties`로 중앙화되었습니다. 각종 의존성은 별도의 Gradle 스크립트로 분리되어 관리됩니다. 또한, CI/CD 파이프라인에서 Docker 빌드 경로가 명시적으로 지정되었으며, Spring Boot 진입점 클래스와 테스트 클래스가 새 패키지로 이동 및 리네이밍되었습니다. 불필요한 기존 엔트리포인트 클래스는 삭제되었습니다.

## Changes

| 파일/경로 그룹                                                         | 변경 요약                                                                                                    |
|-----------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------|
| `.github/workflows/pr-merge-cd-pipeline.yml`                          | Docker 빌드 명령에서 Dockerfile 경로를 명시적으로 `qrust-api/Dockerfile`로 지정하도록 수정                   |
| `build.gradle`, `gradle.properties`, `settings.gradle`                | Gradle 멀티모듈 구조로 개편, 의존성/플러그인 버전 중앙화, 루트 설정 및 모듈 등록, 하위 프로젝트별 설정 분리   |
| `gradle/*.gradle`                                                     | DB, JWT, Lombok, 모니터링, Spring, Swagger, 테스트, WebFlux 등 의존성 별도 스크립트로 분리 및 추가           |
| `qrust-api/build.gradle`, `qrust-domain/build.gradle`, `qrust-common/build.gradle` | 각 모듈별 빌드 설정 추가 및 jar/bootJar 활성화/비활성화 설정                                                |
| `qrust-api/Dockerfile`                                                | COPY 명령의 소스 디렉토리를 상위 디렉토리(`..`)로 변경                                                       |
| `qrust-api/src/main/java/com/qrust/QrustApiApplication.java`          | 새로운 Spring Boot 진입점 클래스 추가                                                                        |
| `qrust-api/src/test/java/com/qrust/QrustApiApplicationTest.java`      | 테스트 클래스 패키지 이동 및 이름 변경                                                                       |
| `qrust-api/src/main/resources/application.yml`                        | H2 DB를 사용하는 Spring Boot 설정 파일 추가                                                                  |
| `src/main/java/dku_capstone/QRust/QRustApplication.java`              | 기존 Spring Boot 진입점 클래스 및 엔드포인트 삭제                                                            |

## Sequence Diagram(s)

```mermaid
sequenceDiagram
    participant User
    participant SpringBootApp as QrustApiApplication
    User->>SpringBootApp: 애플리케이션 실행 (main)
    SpringBootApp->>SpringBootApp: SpringApplication.run() 호출
    SpringBootApp->>SpringBootApp: Spring Boot 컨텍스트 초기화 및 서버 시작
```

## Assessment against linked issues

| Objective                                                                                          | Addressed | Explanation                                      |
|----------------------------------------------------------------------------------------------------|-----------|--------------------------------------------------|
| CI/CD 파이프라인 스크립트 작성 및 Dockerfile, docker-compose 등 배포 자동화 환경 구성 (#6)           | ✅        |                                                  |
| Gradle 빌드 라이브러리 의존성 추가 및 멀티모듈/중앙화 구조 적용 (#6)                                | ✅        |                                                  |
| Spring Boot 기본 프로젝트 세팅, 엔트리포인트 클래스 및 테스트 클래스 구조화 (#6)                    | ✅        |                                                  |
| 불필요한 엔트리포인트/설정 제거 및 패키지 구조 정비 (#6)                                            | ✅        |                                                  |

## Possibly related PRs

- dku-capstone/QRust-BE#6: 기존에 CI/CD 파이프라인 워크플로우와 빌드 의존성, Dockerfile 등을 처음 추가한 PR로, 이번 PR의 워크플로우 및 빌드 관련 변경과 직접적으로 연관됨.
- dku-capstone/QRust-BE#4: 기존 Spring Boot 애플리케이션 클래스의 패키지 및 이름 변경과 관련된 PR로, 이번 PR의 애플리케이션 클래스 리네이밍 및 패키지 이동과 관련됨.

## Suggested labels

`🧹 chore`
"""

<!-- walkthrough_end -->


---

<details>
<summary>📜 Recent review details</summary>

**Configuration used: CodeRabbit UI**
**Review profile: CHILL**
**Plan: Pro**

<details>
<summary>📥 Commits</summary>

Reviewing files that changed from the base of the PR and between bea84ae60ccee98d4d41a3dee12ca2ee5f06e30f and 8c76f16d3506b06d0fbff80d9f813374d0ee7f80.

</details>

<details>
<summary>📒 Files selected for processing (4)</summary>

* `gradle.properties` (1 hunks)
* `gradle/db.gradle` (1 hunks)
* `gradle/lombok.gradle` (1 hunks)
* `settings.gradle` (1 hunks)

</details>

<details>
<summary>✅ Files skipped from review due to trivial changes (1)</summary>

* gradle.properties

</details>

<details>
<summary>🚧 Files skipped from review as they are similar to previous changes (3)</summary>

* settings.gradle
* gradle/lombok.gradle
* gradle/db.gradle

</details>

</details>
<!-- internal state start -->


<!-- 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= -->

<!-- internal state end -->
<!-- tips_start -->

---

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

<details>
<summary>❤️ Share</summary>

- [X](https://twitter.com/intent/tweet?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A&url=https%3A//coderabbit.ai)
- [Mastodon](https://mastodon.social/share?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A%20https%3A%2F%2Fcoderabbit.ai)
- [Reddit](https://www.reddit.com/submit?title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&text=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code.%20Check%20it%20out%3A%20https%3A//coderabbit.ai)
- [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fcoderabbit.ai&mini=true&title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&summary=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code)

</details>

<details>
<summary>🪧 Tips</summary>

### Chat

There are 3 ways to chat with [CodeRabbit](https://coderabbit.ai?utm_source=oss&utm_medium=github&utm_campaign=dku-capstone/QRust-BE&utm_content=8):

- Review comments: Directly reply to a review comment made by CodeRabbit. Example:
  - `I pushed a fix in commit <commit_id>, please review it.`
  - `Generate unit testing code for this file.`
  - `Open a follow-up GitHub issue for this discussion.`
- Files and specific lines of code (under the "Files changed" tab): Tag `@coderabbitai` in a new review comment at the desired location with your query. Examples:
  - `@coderabbitai generate unit testing code for this file.`
  -	`@coderabbitai modularize this function.`
- PR comments: Tag `@coderabbitai` in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
  - `@coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.`
  - `@coderabbitai read src/utils.ts and generate unit testing code.`
  - `@coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.`
  - `@coderabbitai help me debug CodeRabbit configuration file.`

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

### CodeRabbit Commands (Invoked using PR comments)

- `@coderabbitai pause` to pause the reviews on a PR.
- `@coderabbitai resume` to resume the paused reviews.
- `@coderabbitai review` to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
- `@coderabbitai full review` to do a full review from scratch and review all the files again.
- `@coderabbitai summary` to regenerate the summary of the PR.
- `@coderabbitai generate docstrings` to [generate docstrings](https://docs.coderabbit.ai/finishing-touches/docstrings) for this PR.
- `@coderabbitai generate sequence diagram` to generate a sequence diagram of the changes in this PR.
- `@coderabbitai resolve` resolve all the CodeRabbit review comments.
- `@coderabbitai configuration` to show the current CodeRabbit configuration for the repository.
- `@coderabbitai help` to get help.

### Other keywords and placeholders

- Add `@coderabbitai ignore` anywhere in the PR description to prevent this PR from being reviewed.
- Add `@coderabbitai summary` to generate the high-level summary at a specific location in the PR description.
- Add `@coderabbitai` anywhere in the PR title to generate the title automatically.

### CodeRabbit Configuration File (`.coderabbit.yaml`)

- You can programmatically configure CodeRabbit by adding a `.coderabbit.yaml` file to the root of your repository.
- Please see the [configuration documentation](https://docs.coderabbit.ai/guides/configure-coderabbit) for more information.
- If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: `# yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json`

### Documentation and Community

- Visit our [Documentation](https://docs.coderabbit.ai) for detailed information on how to use CodeRabbit.
- Join our [Discord Community](http://discord.gg/coderabbit) to get help, request features, and share feedback.
- Follow us on [X/Twitter](https://twitter.com/coderabbitai) for updates and announcements.

</details>

<!-- tips_end -->
author_association: NONE
user: login: MAYFIFTH99
created_at: 2025-04-29T05:59:34Z
body: 모듈 분리랑 gradle 분리할 때 참고하신 자료 있으시면 공유 가능할까요?.?
author_association: COLLABORATOR
user: login: JHZLO
created_at: 2025-04-29T06:12:49Z
body: @MAYFIFTH99 
여러 자료를 참고하긴 했는데, 제 판단 하에 프로젝트의 사이즈에 맞게 일단 방안을 제시한겁니다!
[멀티모듈 참고1](https://soso-hyeon.tistory.com/83)
[멀티모듈 참고2](https://techblog.woowahan.com/2637/)
[멀티모듈 참고3](https://github.com/depromeet/street-drop-server)
[gradle 모듈 분리 참고](https://github.com/depromeet/moring-server)


일단 이 두 자료를 참고하긴 했는데, 저희의 프로젝트 사이즈가 작다보니 너무 잘게 쪼개는 것은 오버엔지니어링 같은 느낌이 있어 우선 기존의 레이어 아키텍처 느낌으로 모듈을 쪼개보았습니다!
- api
- domain
- common
이렇게 일단 3개의 모듈로 쪼개고, 각각의 모듈에 대한 역할든은 위에서 언급한 것처럼 가져갈려하는데, 괜찮을까요?

최소 단위로 쪼개고 추후에 batch나 admin과 같은 기능들을 설계할 때 만들어서 개발하는 방향도 좋아보여서요!
author_association: MEMBER
user: login: MAYFIFTH99
created_at: 2025-04-29T06:20:40Z
body: 네네 좋아요 저도 공부좀 해보고 싶어서요 ㅎㅎ 병합해주세요!

author_association: COLLABORATOR