Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
54 changes: 54 additions & 0 deletions .coderabbit.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
# ---------------------------------------------------------------- #
# CodeRabbit AI ์„ค์ •
# ---------------------------------------------------------------- #

# ์‘๋‹ต ๊ธฐ๋ณธ ์–ธ์–ด ์„ค์ •
language: "ko-KR"

# AI ํŽ˜๋ฅด์†Œ๋‚˜ ๋ฐ ํ†ค์•ค๋งค๋„ˆ ์ง€์‹œ
tone_instructions: >
1. ํ”ผ๋“œ๋ฐฑ์€ ๋ช…ํ™•ํ•˜๊ณ  ๊ตฌ์ฒด์ ์ด์–ด์•ผ ํ•˜๋ฉฐ, ๋ฌธ์ œ์˜ ์›์ธ๊ณผ ๊ฐœ์„  ๋ฐฉ๋ฒ•์„ ๋ฐ˜๋“œ์‹œ ์ œ์‹œํ•˜์„ธ์š”.
2. ๋ฆฌ๋ทฐ๋Š” ๊ต์œก์ ์ด์–ด์•ผ ํ•˜๋ฉฐ, ๊ด€๋ จ ๊ฐœ๋…์ด๋‚˜ ๊ณต์‹ ๋ฌธ์„œ๋ฅผ ํ•จ๊ป˜ ์ถ”์ฒœํ•˜์„ธ์š”.
3. ๋น„ํŒ๋ณด๋‹ค๋Š” ๊ฐœ์„  ์ค‘์‹ฌ์˜ ์ œ์•ˆ์„ ์šฐ์„ ํ•˜์„ธ์š”.
4. ์นญ์ฐฌ์€ ์งง๊ณ  ์œ„ํŠธ ์žˆ๊ฒŒ ์ž‘์„ฑํ•˜์„ธ์š”.

# ---------------------------------------------------------------- #
# ์ฝ”๋“œ ๋ฆฌ๋ทฐ ๊ธฐ๋Šฅ ์„ธ๋ถ€ ์„ค์ •
# ---------------------------------------------------------------- #
reviews:
profile: "chill" # ๋ฆฌ๋ทฐ ์ „๋ฐ˜ ์Šคํƒ€์ผ (๋ถ€๋“œ๋Ÿฌ์šด ํ†ค)
request_changes_workflow: false # ์ฝ”๋ฉ˜ํŠธ resolve ์‹œ ์ž๋™ Approve ์ฒ˜๋ฆฌ
high_level_summary: true # PR ๋ณ€๊ฒฝ ์‚ฌํ•ญ ๊ณ ์ˆ˜์ค€ ์š”์•ฝ ํ™œ์„ฑํ™”
collapse_walkthrough: true # ์›Œํฌ์Šค๋ฃจ ์ฝ”๋ฉ˜ํŠธ ์ ‘๊ธฐ ํ™œ์„ฑํ™”
changed_files_summary: true # ๋ณ€๊ฒฝ๋œ ํŒŒ์ผ๋ณ„ ์š”์•ฝ ์ƒ์„ฑ
sequence_diagrams: true # ์‹คํ–‰ ํ๋ฆ„ ์‹œํ€€์Šค ๋‹ค์ด์–ด๊ทธ๋žจ ์ƒ์„ฑ
assess_linked_issues: true # ์—ฐ๊ฒฐ๋œ ์ด์Šˆ ๋ถ„์„ ์ปจํ…์ŠคํŠธ ํ™œ์šฉ
related_issues: false # ์—ฐ๊ด€ ๋‹ค๋ฅธ ์ด์Šˆ ๋งํฌ ๋น„ํ™œ์„ฑํ™”
related_prs: true # ์—ฐ๊ด€ ๋‹ค๋ฅธ PR ๋งํฌ ํ™œ์„ฑํ™”
suggested_labels: false # ์ ์ ˆํ•œ ๋ ˆ์ด๋ธ” ์ œ์•ˆ ๋น„ํ™œ์„ฑํ™”
auto_apply_labels: false # ์ œ์•ˆ ๋ ˆ์ด๋ธ” ์ž๋™ ์ ์šฉ ๋น„ํ™œ์„ฑํ™”
suggested_reviewers: false # ๋™๋ฃŒ ๋ฆฌ๋ทฐ์–ด ์ถ”์ฒœ ๋น„ํ™œ์„ฑํ™”
auto_assign_reviewers: false # ์ถ”์ฒœ ๋ฆฌ๋ทฐ์–ด ์ž๋™ ํ• ๋‹น ๋น„ํ™œ์„ฑํ™”
poem: true # ๋ฆฌ๋ทฐ ์š”์•ฝ์— ์œ„ํŠธ ์žˆ๋Š” ์‹œ ํฌํ•จ ํ™œ์„ฑํ™”

# ---------------------------------------------------------------- #
# ์ž๋™ ๋ฆฌ๋ทฐ ํŠธ๋ฆฌ๊ฑฐ ์„ค์ •
# ---------------------------------------------------------------- #
auto_review:
enabled: true
auto_incremental_review: true # ์ถ”๊ฐ€ ์ปค๋ฐ‹ ์‹œ ๋ณ€๊ฒฝ๋œ ๋ถ€๋ถ„๋งŒ ์ž๋™ ๋ฆฌ๋ทฐ

# ---------------------------------------------------------------- #
# ์ฑ„ํŒ… ๊ธฐ๋Šฅ ์„ค์ •
# ---------------------------------------------------------------- #
chat:
auto_reply: true # ํƒœ๊ทธํ•˜์ง€ ์•Š์•„๋„ ์ž๋™ ๋‹ต๊ธ€ ํ™œ์„ฑํ™”

# ---------------------------------------------------------------- #
# CodeRabbit์˜ ์ง€์‹ ๊ธฐ๋ฐ˜(Knowledge Base) ์„ค์ •
# ---------------------------------------------------------------- #
knowledge_base:
web_search:
enabled: true # ์ตœ์‹  ๋ฌธ์„œ ๊ฒ€์ƒ‰ ํ—ˆ์šฉ
code_guidelines:
enabled: true
10 changes: 10 additions & 0 deletions .gitattributes
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
# Git์ด ์•Œ์•„์„œ OS์— ๋งž๊ฒŒ ์ค„๋ฐ”๊ฟˆ์„ ๋ณ€ํ™˜ํ•ด ์ฃผ๋„๋ก ๊ฐ•์ œ
* text=auto

# ์œˆ๋„์šฐ ๋ฐฐ์น˜ ํŒŒ์ผ์€ ๋ฌด์กฐ๊ฑด CRLF๋กœ ๊ณ ์ •
*.bat text eol=crlf
*.cmd text eol=crlf

# ๋ฆฌ๋ˆ…์Šค/๋งฅ์šฉ ์…ธ ์Šคํฌ๋ฆฝํŠธ๋Š” ๋ฌด์กฐ๊ฑด LF๋กœ ๊ณ ์ •
gradlew text eol=lf
*.sh text eol=lf
30 changes: 30 additions & 0 deletions .github/PULL_REQUEST_TEMPLATE.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
## ๐Ÿ“ ๊ฐœ์š”
<!-- ์–ด๋–ค ์ฃผ์ œ์ธ์ง€ ์š”์•ฝ -->
> ์†Œ์…œ ๋กœ๊ทธ์ธ ๊ตฌํ˜„

### โ›“๏ธโ€๐Ÿ’ฅ ๊ด€๋ จ ์ด์Šˆ
<!-- ๊ด€๋ จ ์ด์Šˆ ๋ฒˆํ˜ธ -->
- Closes #์ด์Šˆ๋ฒˆํ˜ธ

---
### ๐Ÿ› ๏ธ ์ž‘์—… ๋‚ด์šฉ
<!-- ๋ฌด์—‡์„ ๋ณ€๊ฒฝํ–ˆ๋Š”์ง€ ํ•ต์‹ฌ ๋‚ด์šฉ ์š”์•ฝ -->
- ์†Œ์…œ ๋กœ๊ทธ์ธ API ์ถ”๊ฐ€

---
### ๐Ÿ”ฅ ๋ฆฌ๋ทฐ ์š”์ฒญ ์‚ฌํ•ญ
> ๋ฆฌ๋ทฐ์–ด๊ฐ€ ์ค‘์ ์ ์œผ๋กœ ํ™•์ธํ•ด์ฃผ์—ˆ์œผ๋ฉด ํ•˜๋Š” ๋‚ด์šฉ์„ ์ž‘์„ฑํ•ด์ฃผ์„ธ์š”.

- ์˜ˆ์™ธ ์ฝ”๋“œ ์ฒ˜๋ฆฌ ๋ฐฉ์‹

---
### โœ… ์ฒดํฌ๋ฆฌ์ŠคํŠธ

* [ ] ์ฝ”๋“œ ์ปจ๋ฒค์…˜์„ ์ค€์ˆ˜ํ–ˆ์Šต๋‹ˆ๋‹ค.
* [ ] ๋ถˆํ•„์š”ํ•œ ์ฝ”๋“œ ๋ฐ import๋ฅผ ์ œ๊ฑฐํ–ˆ์Šต๋‹ˆ๋‹ค.
* [ ] ์˜ˆ์™ธ ์ฒ˜๋ฆฌ๋ฅผ ์ ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.
* [ ] ํ…Œ์ŠคํŠธ๋ฅผ ์™„๋ฃŒํ–ˆ์Šต๋‹ˆ๋‹ค.
* [ ] ๊ด€๋ จ Issue๋ฅผ ์—ฐ๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค.

---
### ๐Ÿ“Ž ์ฐธ๊ณ  ์‚ฌํ•ญ
53 changes: 53 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
# ================================================================= #
# Git ignore for Spring Boot / Java / Gradle / IntelliJ (Muse Review)
# ================================================================= #

HELP.md
.gradle
build/
!gradle/wrapper/gradle-wrapper.jar
!**/src/main/resources/gradle/wrapper/gradle-wrapper.jar
!**/src/test/resources/gradle/wrapper/gradle-wrapper.jar

### STS ###
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans
.sts4-cache

### IntelliJ IDEA ###
.idea
*.iws
*.iml
*.ipr
out/

### NetBeans ###
/nbproject/private/
/nbbuild/
/dist/
/nbdist/
/.nb-gradle/

### VS Code ###
.vscode/

### Operating System ###
.DS_Store
Thumbs.db
desktop.ini

# ์•”ํ˜ธํ‚ค ๋ฐ ๋ณด์•ˆ ์ธ์ฆ์„œ ๊ด€๋ จ ํŒŒ์ผ
*.key
*.pem
*.jks


MR_config/*

MR_config/local/*

!MR_config/local/application.example.yml
42 changes: 42 additions & 0 deletions MR_config/local/application.example.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
# ================================================================= #
# ๐Ÿ”’ [NOTICE] ๋ณธ ํŒŒ์ผ์€ ๋กœ์ปฌ ํ™˜๊ฒฝ ์„ธํŒ…์šฉ '๊ณตํ†ต ์˜ˆ์‹œ ํŒŒ์ผ'์ž…๋‹ˆ๋‹ค.
# ๊ฐ์ž ๋กœ์ปฌ PC ์‚ฌ์–‘์— ๋งž๊ฒŒ ์ •๋ณด๋ฅผ ์ž…๋ ฅํ•œ ํ›„, ํŒŒ์ผ ์ด๋ฆ„์„
# 'application.yml'๋กœ ๋ณ€๊ฒฝํ•˜์—ฌ ๋™์ผํ•œ ๊ฒฝ๋กœ์— ์œ„์น˜์‹œ์ผœ ์ฃผ์„ธ์š”!
# ================================================================= #

spring:
# 1. ๋กœ์ปฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ปค๋„ฅ์…˜ ์„ค์ • (PostgreSQL 18)
datasource:
driver-class-name: org.postgresql.Driver
url: jdbc:postgresql://localhost:5432/mr_db # [์ฒดํฌ] ๋กœ์ปฌ์— mr_db ๋นˆ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๋จผ์ € ์ƒ์„ฑ
username: postgres # [์ž…๋ ฅ] PostgreSQL ๊ณ„์ •๋ช…
password: "" # [์ž…๋ ฅ] PostgreSQL ๋น„๋ฐ€๋ฒˆํ˜ธ (๋นˆ๊ฐ’ ์ž…๋ ฅ ๊ฐ€๋Šฅ)

# 2. JPA ๋ฐ ํ•˜์ด๋ฒ„๋„ค์ดํŠธ ๊ตฌ๋™ ์„ค์ •
jpa:
hibernate:
ddl-auto: update # ์—”ํ‹ฐํ‹ฐ ๋งคํ•‘ ์ •๋ณด ๋ณ€๊ฒฝ ์‹œ DB ํ…Œ์ด๋ธ” ์ž๋™ ๋ฐ˜์˜
show-sql: true # ์ฝ˜์†”์— ์‹คํ–‰ SQL ํฌ๋งท ์ถœ๋ ฅ
properties:
hibernate:
format_sql: true
dialect: org.hibernate.dialect.PostgreSQLDialect

# 3. Spring Security ๋ฐ JWT ์ธ์ฆ ์„ค์ •
jwt:
# [์ž…๋ ฅ] HS256 ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ถฉ์กฑํ•˜๋Š” 256๋น„ํŠธ(32๋ฐ”์ดํŠธ) ์ด์ƒ์˜ ์ž„์˜์˜ ๋น„๋ฐ€ํ‚ค๋ฅผ ์ฑ„์›Œ์ฃผ์„ธ์š”.
# ๊ธฐ์ž… ์˜ˆ์‹œ: "your-local-custom-secret-key-must-be-very-long-and-secure-32bytes"
secret: ""
access-token-validity-in-seconds: 1800 # Access Token ๋งŒ๋ฃŒ ์‹œ๊ฐ„ (30๋ถ„)
refresh-token-validity-in-seconds: 604800 # Refresh Token ๋งŒ๋ฃŒ ์‹œ๊ฐ„ (7์ผ)

# 4. ์™ธ๋ถ€ ์†Œ์…œ ๋กœ๊ทธ์ธ API ์—ฐ๋™ ์ •๋ณด (OAuth์šฉ)
oauth:
kakao:
client-id: "" # [์ž…๋ ฅ] ์นด์นด์˜ค ๋””๋ฒจ๋กœํผ์Šค REST API ํ‚ค
client-secret: "" # [์ž…๋ ฅ] ์นด์นด์˜ค ๋ณด์•ˆ Client Secret ํ‚ค
redirect-uri: http://localhost:8080/login/oauth2/code/kakao
google:
client-id: "" # [์ž…๋ ฅ] ๊ตฌ๊ธ€ ํด๋ผ์šฐ๋“œ ์ฝ˜์†” OAuth ํด๋ผ์ด์–ธํŠธ ID
client-secret: "" # [์ž…๋ ฅ] ๊ตฌ๊ธ€ ํด๋ผ์šฐ๋“œ ์ฝ˜์†” ๋ณด์•ˆ ๋น„๋ฐ€๋ฒˆํ˜ธ
redirect-uri: http://localhost:8080/login/oauth2/code/google
71 changes: 71 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
# ๐ŸŽต Muse Review - Backend

> **๋ฎค์ฆˆ๋ฆฌ๋ทฐ ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ ํŒ€ ๊ณตํ†ต ์ปจ๋ฒค์…˜ ๋ฐ ๊ฐ€์ด๋“œ๋ถ์ž…๋‹ˆ๋‹ค.** > ๋ชจ๋“  ํŒ€์›์€ ์›ํ™œํ•œ ํ˜‘์—…์„ ์œ„ํ•ด ์•„๋ž˜ ๊ทœ์น™์„ ๋ฐ˜๋“œ์‹œ ์ค€์ˆ˜ํ•ด ์ฃผ์„ธ์š”!

---

## ๐ŸŒฟ 1. ๋ธŒ๋žœ์น˜ ์ „๋žต (Git Flow)

์šฐ๋ฆฌ ํŒ€์€ ์•ˆ์ •์ ์ธ ๋ฐฐํฌ์™€ ๋…๋ฆฝ์ ์ธ ๊ธฐ๋Šฅ ๊ฐœ๋ฐœ์„ ์œ„ํ•ด ๋ธŒ๋žœ์น˜๋ฅผ ๋ถ„๋ฆฌํ•˜์—ฌ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

* ๐Ÿ”ต **`main`** : ํ•ญ์ƒ ๋ฐฐํฌ ๊ฐ€๋Šฅํ•œ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜๋Š” ์šด์˜ ๋ธŒ๋žœ์น˜ (์ง์ ‘ ์ž‘์—… ๊ธˆ์ง€, PR ๋จธ์ง€๋งŒ ํ—ˆ์šฉ)
* ๐ŸŸข **`develop`** : ๋‹ค์Œ ๋ฐฐํฌ๋ฅผ ์ค€๋น„ํ•˜๋Š” ํ†ตํ•ฉ ๊ฐœ๋ฐœ ๋ธŒ๋žœ์น˜ (๋ชจ๋“  ๊ธฐ๋Šฅ ๊ฐœ๋ฐœ๋ณธ์ด ๋ชจ์ด๋Š” ๊ณณ)
* ๐ŸŸก **`๊ธฐ๋Šฅ ๋ธŒ๋žœ์น˜`** : ๊ธฐ๋Šฅ/์ด์Šˆ ๋‹จ์œ„๋กœ `develop`์—์„œ ํŒŒ์ƒํ•˜์—ฌ ๊ฐœ๋ฐœํ•˜๋Š” ๋ธŒ๋žœ์น˜

### ๐Ÿ“Œ Branch Naming Convention
* **๊ตฌ์กฐ:** `Prefix/#์ด์Šˆ๋ฒˆํ˜ธ-์ž‘์—…๋‚ด์šฉ` (Kebab Case ์‚ฌ์šฉ)
* **์˜ˆ์‹œ:** `feat/#10-login-api`, `chore/#1-setting-base`

| Prefix | ์„ค๋ช… | ์‚ฌ์šฉ ์˜ˆ์‹œ |
| :--- | :--- | :--- |
| `feat` | ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ ์ถ”๊ฐ€ | `feat/#10-login-api` |
| `fix` | ๋ฒ„๊ทธ ์ˆ˜์ • | `fix/#23-header-layout` |
| `docs` | ๋ฌธ์„œ ์ˆ˜์ • (README ๋“ฑ) | `docs/#5-update-readme` |
| `style` | ์ฝ”๋“œ ํฌ๋งทํŒ… (๋กœ์ง ๋ณ€๊ฒฝ ์—†์Œ) | `style/#12-format-code` |
| `refactor`| ์ฝ”๋“œ ๋ฆฌํŒฉํ† ๋ง | `refactor/#30-user-service` |
| `chore` | ์„ค์ • ํŒŒ์ผ ๋ณ€๊ฒฝ, ํŒจํ‚ค์ง€ ๋นŒ๋“œ ๋“ฑ | `chore/#1-setting-base` |

---

## ๐Ÿ“ 2. ์ปค๋ฐ‹ ์ปจ๋ฒค์…˜ (Commit Convention)

* **๋ฉ”์‹œ์ง€ ๊ตฌ์กฐ:** `ํƒ€์ž…: ์ž‘์—… ๋‚ด์šฉ (#์ด์Šˆ๋ฒˆํ˜ธ)` ํ˜•์‹์œผ๋กœ ์ž‘์„ฑ (์ œ๋ชฉ์€ 50์ž ์ด๋‚ด ์†Œ๋ฌธ์ž ํƒœ๊ทธ ๊ถŒ์žฅ)
* **์˜ˆ์‹œ:** `feat: ์นด์นด์˜ค ์†Œ์…œ ๋กœ๊ทธ์ธ API ์ถ”๊ฐ€ (#10)`

### ๐Ÿ”“ PR ๋จธ์ง€ ๋ฐ ์ฝ”๋“œ ๋ฆฌ๋ทฐ ๊ทœ์น™
* **PR ๋จธ์ง€ ์กฐ๊ฑด:** ํ™œ๋ฐœํ•œ ์ฝ”๋“œ ๋ฆฌ๋ทฐ๋ฅผ ์œ„ํ•ด **์ตœ์†Œ 2๋ช… ์ด์ƒ์˜ ์Šน์ธ(Approve)**์ด ์žˆ์–ด์•ผ ๋จธ์ง€ ๊ฐ€๋Šฅ
* **๋ฆฌ๋ทฐ ํƒœ๊ทธ ๊ฐ€์ด๋“œ:**
* `P1`: ๊ผญ ๋ฐ˜์˜ํ•ด ์ฃผ์„ธ์š” (์ค‘๋Œ€ํ•œ ์˜ค๋ฅ˜ ๊ฐ€๋Šฅ์„ฑ, Request Changes ํ•„์ˆ˜)
* `P2`: ์ ๊ทน์ ์œผ๋กœ ๊ณ ๋ คํ•ด ์ฃผ์„ธ์š” (ํ† ํฐ/๋…ผ์˜ ๊ถŒ์žฅ)
* `P3`: ์›ฌ๋งŒํ•˜๋ฉด ๋ฐ˜์˜ํ•ด ์ฃผ์„ธ์š” / ๊ฐ€๋ฒผ์šด ์˜๊ฒฌ (Comment ์ฒ˜๋ฆฌ)

---

## ๐Ÿ› ๏ธ 3. ๊ฐœ๋ฐœ ํ™˜๊ฒฝ ๋ฐ ์ฝ”๋“œ ์ปจ๋ฒค์…˜

### ๐Ÿ’ป Tech Stack
* **Language & Framework:** Java 17 / Spring Boot 3.2.2
* **Database:** PostgreSQL 18 / JPA

### ๐ŸŽจ Code Style (Spring JavaFormat)
์šฐ๋ฆฌ ํ”„๋กœ์ ํŠธ๋Š” `Spring JavaFormat` ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ณตํ†ต ํฌ๋งท์„ ๊ฐ•์ œํ•ฉ๋‹ˆ๋‹ค. ๋นŒ๋“œ ์‹œ ํฌ๋งท์ด ๋งž์ง€ ์•Š์œผ๋ฉด ์ปดํŒŒ์ผ์ด ์‹คํŒจํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
* **ํด๋ž˜์Šค๋ช…:** `PascalCase` (`class AuthController`)
* **๋ณ€์ˆ˜/๋ฉ”์„œ๋“œ๋ช…:** `camelCase` (`String accessToken`)
* **์ƒ์ˆ˜๋ช…:** `UPPER_SNAKE_CASE` (`int MAX_LIMIT = 3`)
* โš ๏ธ **์ฃผ์˜:** ๋ณ€์ˆ˜ ๋ฐ ๋ฉ”์„œ๋“œ๋ช…์— ์–ธ๋”๋ฐ”(`_`) ์‚ฌ์šฉ์„ ๊ธˆ์ง€ํ•ฉ๋‹ˆ๋‹ค.

---

## ๐Ÿ”’ 4. ๋กœ์ปฌ ํ™˜๊ฒฝ ์„ธํŒ… (๋ฏผ๊ฐ ์ •๋ณด ๋ณดํ˜ธ)

๋ฏผ๊ฐ ์ •๋ณด(DB ํŒจ์Šค์›Œ๋“œ, JWT Secret, OAuth Key) ์œ ์ถœ ๋ฐฉ์ง€๋ฅผ ์œ„ํ•ด `MR_config` ์•ˆ์ „ ๊ธˆ๊ณ  ์‹œ์Šคํ…œ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

1. ๋กœ์ปฌ PostgreSQL์— `mr_db` ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
2. ํ”„๋กœ์ ํŠธ ๋ฃจํŠธ์— `MR_config/local/` ํด๋”๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
3. ๊ณต์œ ๋œ `application.example.yml` ํŒŒ์ผ์„ ํ•ด๋‹น ํด๋”์— ๋ณต์‚ฌํ•œ ๋’ค, ํŒŒ์ผ๋ช…์„ **`application.yml`**๋กœ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค.
4. ๋ณธ์ธ์˜ ๋กœ์ปฌ DB ๋น„๋ฐ€๋ฒˆํ˜ธ์™€ ๊ฐœ์ธ API Key๋ฅผ ์ž…๋ ฅํ•œ ํ›„ ์„œ๋ฒ„๋ฅผ ๊ตฌ๋™ํ•ฉ๋‹ˆ๋‹ค.

### ๐Ÿš€ ๋กœ์ปฌ ๋นŒ๋“œ ๋ช…๋ น์–ด
* **Windows PowerShell:** `./gradlew.bat build -x test`
* **Git Bash / Mac:** `./gradlew build -x test`
* **Swagger UI ์ฃผ์†Œ:** `http://localhost:8080/swagger-ui/index.html`
76 changes: 76 additions & 0 deletions build.gradle
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
plugins {
id 'java'
id 'org.springframework.boot' version '3.2.2'
id 'io.spring.dependency-management' version '1.1.7'
// formater
id 'io.spring.javaformat' version '0.0.41'
}

group = 'com.mr'
version = '0.0.1-SNAPSHOT'

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

configurations {
compileOnly {
extendsFrom annotationProcessor
}
}

repositories {
mavenCentral()
}

dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.boot:spring-boot-starter-validation'

// Swagger
implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.3.0'

// JWT
implementation 'org.springframework.boot:spring-boot-starter-security'
implementation 'io.jsonwebtoken:jjwt-api:0.11.5'
runtimeOnly 'io.jsonwebtoken:jjwt-impl:0.11.5'
runtimeOnly 'io.jsonwebtoken:jjwt-jackson:0.11.5'

// PostgreSQL 18, JPA
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
runtimeOnly 'org.postgresql:postgresql'

// Lombok , DevTools
compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
developmentOnly 'org.springframework.boot:spring-boot-devtools'

// Health Check
implementation 'org.springframework.boot:spring-boot-starter-actuator'

testImplementation 'org.springframework.boot:spring-boot-starter-test'
testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
}

test {
useJUnitPlatform()
}

// Private Config Copy
tasks.register('copyPrivateConfig', Copy) {
def envDir = file('./MR_config/local')

if (!envDir.exists()) {
envDir.mkdirs()
file('./MR_config/local/application.yml').text = "# ์ด ๊ฒฝ๋กœ์— ๋ณต์‚ฌํ•œ ๋กœ์ปฌ ์„ค์ •์„ ์ฑ„์›Œ ๋„ฃ์–ด ์ฃผ์„ธ์š”!"
}

from './MR_config/local'
into 'src/main/resources'
}

tasks.named('processResources') {
dependsOn 'copyPrivateConfig'
}
Binary file added gradle/wrapper/gradle-wrapper.jar
Binary file not shown.
7 changes: 7 additions & 0 deletions gradle/wrapper/gradle-wrapper.properties
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-9.0.0-bin.zip
networkTimeout=10000
validateDistributionUrl=true
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
Loading