Skip to content
Merged
Changes from 3 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
83 changes: 74 additions & 9 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,14 +1,20 @@
# [์„ฑ๋Šฅ ๊ฐœ์„  ๋ณด๊ณ ์„œ] ํ™ˆ ํ™”๋ฉด API ๋‹จ๊ณ„๋ณ„ ์ตœ์ ํ™” ๋ฐ 1,000 VUs ๊ฐ€์šฉ์„ฑ ๊ฒ€์ฆ
# ๐ŸŒพ UMC 7th FarmON BackEnd
![Image](https://github.com/user-attachments/assets/95c2519f-7e02-4cec-83e2-6064737ba3e9)
**๋†์—…์˜ ์—ฐ๊ฒฐ ๊ณ ๋ฆฌ** **FarmON**์€ UMC 7๊ธฐ์—์„œ ์ง„ํ–‰๋œ ํ”„๋กœ์ ํŠธ ๋ฐ ๋†์—…์˜ ํ˜์‹ ์„ ์ด๋„๋Š” ๋””์ง€ํ„ธ ์†”๋ฃจ์…˜์œผ๋กœ, <br>
**๋””์ง€ํ„ธ ์ปค๋ฎค๋‹ˆํ‹ฐ**๋ฅผ ํ†ตํ•ด ์†Œ๊ทœ๋ชจ ์˜์„ธ๋†์—…์˜ **๊ณต๋™๋†์—…์„ ํ™œ์„ฑํ™”**ํ•˜๊ณ , ํ”Œ๋žซํผ์„ ํ™œ์šฉํ•˜์—ฌ **์ „๊ตญ์˜ ๋†์—… ์ „๋ฌธ๊ฐ€๋ฅผ ์—ฐ๊ฒฐ**ํ•˜๋ฉฐ, **๋†์—… ๋ฐ์ดํ„ฐ**๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ **์ฒด๊ณ„์ ์ธ ๋†์—… ์„œ๋น„์Šค**๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

๋ณธ ๋ณด๊ณ ์„œ๋Š” ํ™ˆ ํ™”๋ฉด์˜ ์ปค๋ฎค๋‹ˆํ‹ฐ ๊ฒŒ์‹œ๊ธ€ ์กฐํšŒ API๋ฅผ ๋Œ€์ƒ์œผ๋กœ, ์ดˆ๊ธฐ ์„ฑ๋Šฅ ์ธก์ •๋ถ€ํ„ฐ ๋กœ์ง/์ธํ”„๋ผ/์•„ํ‚คํ…์ฒ˜ ์ตœ์ ํ™”์— ๋”ฐ๋ฅธ ์‹œ์Šคํ…œ ์ž„๊ณ„์น˜ ๋ณ€ํ™”๋ฅผ ์ •๋Ÿ‰์ ์œผ๋กœ ๋ถ„์„ํ•œ ๊ธฐ๋ก์ž…๋‹ˆ๋‹ค.
&nbsp;
# ๐Ÿ“Š ๋ถ€ํ•˜ ํ…Œ์ŠคํŠธ ๋ฐ ์„ฑ๋Šฅ ์ตœ์ ํ™”
## ํ™ˆ ํ™”๋ฉด API ๋‹จ๊ณ„๋ณ„ ์ตœ์ ํ™” ๋ฐ ๋™์‹œ ์‚ฌ์šฉ์ž 1,000 VUs ๊ฐ€์šฉ์„ฑ ๊ฒ€์ฆ

---
๋ณธ ๋ฌธ์„œ๋Š” ํ™ˆ ํ™”๋ฉด ์ปค๋ฎค๋‹ˆํ‹ฐ ๊ฒŒ์‹œ๊ธ€ ์กฐํšŒ API๋ฅผ ๋Œ€์ƒ์œผ๋กœ k6๋ฅผ ํ™œ์šฉํ•ด **๋™์‹œ ์‚ฌ์šฉ์ž 1,000๋ช… ๊ทœ๋ชจ์˜ ๋ถ€ํ•˜ ํ…Œ์ŠคํŠธ**๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ณ ,
Prometheus์™€ Grafana๋ฅผ ํ†ตํ•ด ์ฃผ์š” ์„ฑ๋Šฅ ์ง€ํ‘œ๋ฅผ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๋ฉฐ **์‹œ์Šคํ…œ์˜ ์„ฑ๋Šฅ ํ•œ๊ณ„**์™€ **๋ณ‘๋ชฉ ์ง€์ **์„ ๋ถ„์„ํ•˜์—ฌ ๊ฐœ์„ ํ•œ ๊ณผ์ •์„ ์ •๋ฆฌํ–ˆ์Šต๋‹ˆ๋‹ค.

## 1. ์‹คํ—˜ ๊ฐœ์š” ๋ฐ ํ™˜๊ฒฝ

### 1.1 ์‹คํ—˜ ํ™˜๊ฒฝ ๋ฐ ์‹œ๋‚˜๋ฆฌ์˜ค
- **ํ…Œ์ŠคํŠธ ๋„๊ตฌ**: k6 (ramping-vus)
- **ํ…Œ์ŠคํŠธ ์‹œ๋‚˜๋ฆฌ์˜ค**: 32๋ถ„๊ฐ„ ๊ฐ€์ƒ ์‚ฌ์šฉ์ž(VU)๋ฅผ 1์—์„œ 1,000๊นŒ์ง€ 13๋‹จ๊ณ„์— ๊ฑธ์ณ ์ ์ง„์  ์ฆ๊ฐ€
- **ํ…Œ์ŠคํŠธ ์‹œ๋‚˜๋ฆฌ์˜ค**: 32๋ถ„๊ฐ„ ๊ฐ€์ƒ ์‚ฌ์šฉ์ž(VU)๋ฅผ 1 -> 1,000๊นŒ์ง€ 13๋‹จ๊ณ„์— ๊ฑธ์ณ ์ ์ง„์  ์ฆ๊ฐ€
- **๋Œ€์ƒ API**: ํ™ˆ ํ™”๋ฉด ์นดํ…Œ๊ณ ๋ฆฌ๋ณ„ ๊ฒŒ์‹œ๋ฌผ ์ •๋ณด ๋ฐ˜ํ™˜ API (์ข‹์•„์š”/๋Œ“๊ธ€ ์ˆ˜ ํฌํ•จ)
- **๋ชจ๋‹ˆํ„ฐ๋ง**: Prometheus, Grafana
- **๋ฐฑ์—”๋“œ**: Spring Boot(3.0.0), Java(17)
Expand All @@ -34,6 +40,8 @@

<img width="1280" height="675" alt="v1_result_1" src="https://github.com/user-attachments/assets/d045e6f8-4323-4782-acf0-0a24ae35b3da" />
<img width="1280" height="989" alt="v1_result_2" src="https://github.com/user-attachments/assets/4ea13c6b-080b-4892-b88d-4475ffbbf03f" />
<img width="1280" height="851" alt="image" src="https://github.com/user-attachments/assets/1f1e09a6-9b11-4819-97f3-fdd3c2a5b437" />


### 2.2 ์‹คํ—˜ ๊ฒฐ๊ณผ (1,000 VUs)
| ์ง€ํ‘œ ํ•ญ๋ชฉ | ์ธก์ • ๊ฒฐ๊ณผ | ํŒ์ • ๋ฐ ์˜๋ฏธ |
Expand All @@ -47,7 +55,7 @@

## 3. [v2] 1์ฐจ ๊ฐœ์„ : QueryDSL ๊ธฐ๋ฐ˜ ๋‹จ์ผ ์กฐํšŒ (N+1 ์ œ๊ฑฐ)

### โœ… ๋ณ€๊ฒฝ ์‚ฌํ•ญ (What was changed?)
### โœ… ๋ณ€๊ฒฝ ์‚ฌํ•ญ
- **์ฟผ๋ฆฌ ํ†ตํ•ฉ**: QueryDSL์„ ์ด์šฉํ•ด `JOIN` ๋ฐ `GROUP BY`๋ฅผ ํ™œ์šฉํ•œ **๋‹จ์ผ ์ง‘๊ณ„ ์ฟผ๋ฆฌ**๋กœ ๋ฆฌํŒฉํ† ๋ง
- **์ตœ์ ํ™” ๊ธฐ๋ฒ•**: `COUNT(DISTINCT ...)`๋ฅผ ์ ์šฉํ•˜์—ฌ ์กฐ์ธ ์‹œ ์ค‘๋ณต ์ง‘๊ณ„ ๋ฐฉ์ง€
- **DTO Projection**: Entity ๋Œ€์‹  ์กฐํšŒ ์ „์šฉ DTO(**HomePostRow**)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ ๋ถ€ํ•˜ ์ ˆ๊ฐ
Expand All @@ -59,6 +67,8 @@

<img width="1280" height="716" alt="v2_result_1" src="https://github.com/user-attachments/assets/23708d85-d470-4123-b3c8-b7e1b36b4a21" />
<img width="1280" height="933" alt="v2_result_2" src="https://github.com/user-attachments/assets/914a33b3-17ee-44ec-b4be-3f14a6f38450" />
<img width="1280" height="336" alt="image" src="https://github.com/user-attachments/assets/c6ed97a4-3618-4b71-a6a4-e46e9ce719a3" />


### 3.2 ์„ฑ๋Šฅ ์ง€ํ‘œ ๋น„๊ต (v1 vs v2)
| ์ง€ํ‘œ ํ•ญ๋ชฉ | v1 (Baseline) | v2 (๋กœ์ง ์ตœ์ ํ™”) | ์„ฑ๊ณผ |
Expand All @@ -71,7 +81,7 @@

## 4. [v3] 2์ฐจ ๊ฐœ์„ : ์ธํ”„๋ผ ์„ค์ • ์ตœ์ ํ™” (WAS/DB ํŠœ๋‹)

### โœ… ๋ณ€๊ฒฝ ์‚ฌํ•ญ (What was changed?)
### โœ… ๋ณ€๊ฒฝ ์‚ฌํ•ญ
- **HikariCP**: `maximum-pool-size: 30`, `connection-timeout: 30000` (์ปค๋„ฅ์…˜ ๋ถ€์กฑ ํ•ด์†Œ)
- **Tomcat**: `threads.max: 400`, `max-connections: 8192` (๋™์‹œ ์š”์ฒญ ์ˆ˜์šฉ๋Ÿ‰ ์ฆ๋Œ€)
- **RDS**: DB ํŒŒ๋ผ๋ฏธํ„ฐ ๊ทธ๋ฃน ์ˆ˜์ •์„ ํ†ตํ•ด `max_connections: 300` ํ™•๋ณด
Expand All @@ -82,13 +92,14 @@
- **โ‘ข [๋ฌผ๋ฆฌ ์ž„๊ณ„์  ์‹๋ณ„]**: ์„ค์ •์„ ํ™•์žฅํ–ˆ์Œ์—๋„ p(95)๊ฐ€ **3.30s**์—์„œ ์ •์ฒด๋จ. ํ˜„์žฌ ๊ตฌ์กฐ์ƒ **๋ฌผ๋ฆฌ์  Disk I/O ํฌํ™”**๋กœ ํŒ๋‹จ๋จ.

<img width="1280" height="717" alt="v3_result_1" src="https://github.com/user-attachments/assets/cc0ab432-26e8-43e1-b355-80ed0748dd11" />
<img width="1280" height="915" alt="image" src="https://github.com/user-attachments/assets/a4ac54aa-83a8-4295-8f7f-ce8b78b7de56" />
<img width="1280" height="322" alt="v3_result_3" src="https://github.com/user-attachments/assets/08322a78-6dff-40aa-8f83-371ab8de1951" />

---

## 5. [v4] ๊ฐœ์„ : Redis ์บ์‹œ ๋„์ž… (In-memory ์•„ํ‚คํ…์ฒ˜)

### โœ… ๋ณ€๊ฒฝ ์‚ฌํ•ญ (What was changed?)
### โœ… ๋ณ€๊ฒฝ ์‚ฌํ•ญ
- **์บ์‹ฑ ์ „๋žต**: ํ™ˆ ์ปค๋ฎค๋‹ˆํ‹ฐ ๋ฐ์ดํ„ฐ๋ฅผ `category:{PostType}` ํ‚ค ๊ตฌ์กฐ๋กœ **Redis**์— ์ €์žฅ (In-memory)
- **์œ ํšจ ์ •์ฑ…**: `TTL 60์ดˆ` ์ ์šฉ ๋ฐ ์ข‹์•„์š”/๋Œ“๊ธ€ ๋ณ€๊ฒฝ ์‹œ `afterCommit` ์‹œ์ ์— **์„ ํƒ์  ์บ์‹œ ๋ฌดํšจํ™”(Evict)**
- **์ง๋ ฌํ™”**: `GenericJackson2JsonRedisSerializer`๋ฅผ ํ†ตํ•œ DTO ์ง๋ ฌํ™”
Expand All @@ -99,7 +110,9 @@
- **โ‘ข [์•ˆ์ •์„ฑ ์œ ์ง€]**: ์ด ์š”์ฒญ ์ˆ˜ **77.3๋งŒ ๊ฑด**์œผ๋กœ ํญ์ฆํ–ˆ์œผ๋‚˜, ์—๋Ÿฌ์œจ **0.009%**๋กœ ์‹ ๋ขฐ์„ฑ ์žˆ๋Š” ์‘๋‹ต ์œ ์ง€.

<img width="1280" height="706" alt="v4_result_1" src="https://github.com/user-attachments/assets/560b66db-4e21-47fa-bfdc-7e07f844d14f" />
<img width="1280" height="584" alt="v4_result_3" src="https://github.com/user-attachments/assets/9678d362-afd9-4005-a415-46f93f8c07bb" />
<img width="1280" height="896" alt="image" src="https://github.com/user-attachments/assets/05a7555e-e7b8-478b-879b-143b3e2ba44b" />
<img width="1280" height="584" alt="image" src="https://github.com/user-attachments/assets/b68da464-c7ca-4602-92a0-2acaed73759d" />


### 5.2 ์„ฑ๋Šฅ ์ง€ํ‘œ ๋น„๊ต (v1 ~ v4)
| ์ง€ํ‘œ ํ•ญ๋ชฉ | v1 (Baseline) | v2 (๋กœ์ง) | v3 (์„ค์ •) | v4 (Redis) | ์„ฑ๊ณผ (v1 vs v4) |
Expand All @@ -120,4 +133,56 @@
| **Error Rate** | **1.0% ๋ฏธ๋งŒ** | 0.005% | **0.009%** | **ํ†ต๊ณผ** |

**ํ–ฅํ›„ ๋ชฉํ‘œ**:
๋กœ์ง, ์ธํ”„๋ผ, ์บ์‹ฑ ์ตœ์ ํ™”๋ฅผ ํ†ตํ•ด ๋น„์•ฝ์ ์ธ ์„ฑ๋Šฅ ํ–ฅ์ƒ์„ ๊ฑฐ๋‘์—ˆ์œผ๋‚˜, 1,000 VU ํ™˜๊ฒฝ์—์„œ ๋‹จ์ผ ์ธ์Šคํ„ด์Šค์˜ CPU ๋ถ€ํ•˜๋กœ ์ธํ•ด p(95) 2.0s ๋ชฉํ‘œ์—๋Š” ๋ฏธ๋‹ฌํ–ˆ์Šต๋‹ˆ๋‹ค. ํ–ฅํ›„ **์ธ์Šคํ„ด์Šค ํ™•์žฅ(Scale-out)** ๋ฐ **๋กœ๋“œ๋ฐธ๋Ÿฐ์„œ(ALB)** ์ ์šฉ์„ ํ†ตํ•ด ์ž์› ๋ถ€ํ•˜๋ฅผ ๋ถ„์‚ฐํ•˜๊ณ  ์ตœ์ข… ๋ชฉํ‘œ ์ง€ํ‘œ๋ฅผ ๋‹ฌ์„ฑํ•  ์˜ˆ์ •์ž…๋‹ˆ๋‹ค.
๋กœ์ง, ์ธํ”„๋ผ, ์บ์‹ฑ ์ตœ์ ํ™”๋ฅผ ํ†ตํ•ด ๋น„์•ฝ์ ์ธ ์„ฑ๋Šฅ ํ–ฅ์ƒ์„ ๊ฑฐ๋‘์—ˆ์œผ๋‚˜, 1,000 VU ํ™˜๊ฒฝ์—์„œ ๋‹จ์ผ ์ธ์Šคํ„ด์Šค์˜ CPU ๋ถ€ํ•˜๋กœ ์ธํ•ด p(95) 2.0s ๋ชฉํ‘œ์—๋Š” ๋ฏธ๋‹ฌํ–ˆ์Šต๋‹ˆ๋‹ค. ํ–ฅํ›„ **์ธ์Šคํ„ด์Šค ํ™•์žฅ(Scale-out)** ๋ฐ **๋กœ๋“œ๋ฐธ๋Ÿฐ์„œ(ALB)** ์ ์šฉ์„ ํ†ตํ•ด ์ž์› ๋ถ€ํ•˜๋ฅผ ๋ถ„์‚ฐํ•˜๊ณ  ์ตœ์ข… ๋ชฉํ‘œ ์ง€ํ‘œ๋ฅผ ๋‹ฌ์„ฑํ•  ์˜ˆ์ •์ž…๋‹ˆ๋‹ค.

---

## ๐Ÿ”ง Tech Stack
<p>
<img src="https://img.shields.io/badge/SpringBoot-6DB33F?style=for-the-badge&logo=springboot&logoColor=white">
<img src="https://img.shields.io/badge/Java-007396?style=for-the-badge&logo=openjdk&logoColor=white">
<img src="https://img.shields.io/badge/JWT-000000?style=for-the-badge&logo=jsonwebtokens&logoColor=white">
<img src="https://img.shields.io/badge/MySQL-4479A1?style=for-the-badge&logo=mysql&logoColor=white">
<img src="https://img.shields.io/badge/Redis-DC382D?style=for-the-badge&logo=redis&logoColor=white">
<img src="https://img.shields.io/badge/STOMP-6E4C13?style=for-the-badge&logo=apachekafka&logoColor=white">
<img src="https://img.shields.io/badge/RabbitMQ-FF6600?style=for-the-badge&logo=rabbitmq&logoColor=white">

</p>

<p>
<img src="https://img.shields.io/badge/Docker-2496ED?style=for-the-badge&logo=docker&logoColor=white">
<img src="https://img.shields.io/badge/Nginx-009639?style=for-the-badge&logo=nginx&logoColor=white">
<img src="https://img.shields.io/badge/AWS-232F3E?style=for-the-badge&logo=amazonaws&logoColor=white">
<img src="https://img.shields.io/badge/github-181717?style=for-the-badge&logo=github&logoColor=white">
<img src="https://img.shields.io/badge/GitHub_Actions-2088FF?style=for-the-badge&logo=githubactions&logoColor=white">
<img src="https://img.shields.io/badge/Swagger-85EA2D?style=for-the-badge&logo=swagger&logoColor=white">
</p>

<p>
<img src="https://img.shields.io/badge/k6-7D64FF?style=for-the-badge&logo=k6&logoColor=white">
<img src="https://img.shields.io/badge/Prometheus-E6522C?style=for-the-badge&logo=prometheus&logoColor=white">
<img src="https://img.shields.io/badge/Grafana-F46800?style=for-the-badge&logo=grafana&logoColor=white">
Comment on lines +144 to +166
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

โš ๏ธ Potential issue | ๐ŸŸก Minor

๋ฐฐ์ง€ ์ด๋ฏธ์ง€์— ๋Œ€์ฒด ํ…์ŠคํŠธ(alt text) ์ถ”๊ฐ€ ํ•„์š”

๊ธฐ์ˆ  ์Šคํƒ ๋ฐฐ์ง€ ์ด๋ฏธ์ง€๋“ค์— ๋Œ€์ฒด ํ…์ŠคํŠธ๊ฐ€ ๋ˆ„๋ฝ๋˜์–ด ์žˆ์–ด ์ ‘๊ทผ์„ฑ(accessibility) ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์Šคํฌ๋ฆฐ ๋ฆฌ๋” ์‚ฌ์šฉ์ž๋“ค์ด ์–ด๋–ค ๊ธฐ์ˆ ์ด ์‚ฌ์šฉ๋˜์—ˆ๋Š”์ง€ ํŒŒ์•…ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๊ฐ ๋ฐฐ์ง€์— ํ•ด๋‹น ๊ธฐ์ˆ ๋ช…์„ alt text๋กœ ์ถ”๊ฐ€ํ•ด์ฃผ์„ธ์š”.

โ™ฟ ์ ‘๊ทผ์„ฑ ๊ฐœ์„ ์„ ์œ„ํ•œ ์ˆ˜์ • ์ œ์•ˆ
-  <img src="https://img.shields.io/badge/SpringBoot-6DB33F?style=for-the-badge&logo=springboot&logoColor=white">
-  <img src="https://img.shields.io/badge/Java-007396?style=for-the-badge&logo=openjdk&logoColor=white">
-    <img src="https://img.shields.io/badge/JWT-000000?style=for-the-badge&logo=jsonwebtokens&logoColor=white">
+  <img src="https://img.shields.io/badge/SpringBoot-6DB33F?style=for-the-badge&logo=springboot&logoColor=white" alt="SpringBoot">
+  <img src="https://img.shields.io/badge/Java-007396?style=for-the-badge&logo=openjdk&logoColor=white" alt="Java">
+  <img src="https://img.shields.io/badge/JWT-000000?style=for-the-badge&logo=jsonwebtokens&logoColor=white" alt="JWT">

๋‚˜๋จธ์ง€ ๋ฐฐ์ง€๋“ค๋„ ๋™์ผํ•œ ๋ฐฉ์‹์œผ๋กœ alt ์†์„ฑ์„ ์ถ”๊ฐ€ํ•ด์ฃผ์„ธ์š”.

๐Ÿงฐ Tools
๐Ÿช› markdownlint-cli2 (0.18.1)

142-142: Images should have alternate text (alt text)

(MD045, no-alt-text)


143-143: Images should have alternate text (alt text)

(MD045, no-alt-text)


144-144: Images should have alternate text (alt text)

(MD045, no-alt-text)


145-145: Images should have alternate text (alt text)

(MD045, no-alt-text)


146-146: Images should have alternate text (alt text)

(MD045, no-alt-text)


147-147: Images should have alternate text (alt text)

(MD045, no-alt-text)


148-148: Images should have alternate text (alt text)

(MD045, no-alt-text)


153-153: Images should have alternate text (alt text)

(MD045, no-alt-text)


154-154: Images should have alternate text (alt text)

(MD045, no-alt-text)


155-155: Images should have alternate text (alt text)

(MD045, no-alt-text)


156-156: Images should have alternate text (alt text)

(MD045, no-alt-text)


157-157: Images should have alternate text (alt text)

(MD045, no-alt-text)


158-158: Images should have alternate text (alt text)

(MD045, no-alt-text)


162-162: Images should have alternate text (alt text)

(MD045, no-alt-text)


163-163: Images should have alternate text (alt text)

(MD045, no-alt-text)


164-164: Images should have alternate text (alt text)

(MD045, no-alt-text)

</p>

&nbsp;
## ๐Ÿ›  Backend Architecture
<img width="3002" height="2376" alt="image" src="https://github.com/user-attachments/assets/0faefea2-ad94-4a9c-b423-4f8fa49fbf27" />

&nbsp;
## ๐Ÿ—‚ ERD
<img width="972" alt="Image" src="https://github.com/user-attachments/assets/f6805244-44b5-45b1-9e47-c47521d8d53a" />

&nbsp;
## ๐Ÿš€ git flow
- `main`
- ํ”„๋กœ์ ํŠธ ์ตœ์ข… merge
- ๊ธฐ๋ณธ ํ”„๋กœ์ ํŠธ ์„ธํŒ…, ๋ฐฐํฌ ๊ฐ€๋Šฅํ•œ ๋ธŒ๋žœ์น˜, ํ•ญ์ƒ ๋ฐฐํฌ ๊ฐ€๋Šฅํ•œ ์ƒํƒœ๋ฅผ ์œ ์ง€
- `develop`
- ๋ฐ๋ชจ๋ฐ์ด ์ „๊นŒ์ง€ ์™„์„ฑํ•œ ๊ธฐ๋Šฅ๋“ค์„ ๊ณ„์†ํ•ด์„œ merge
- ๋ฐฐํฌ ๊ฐ€๋Šฅํ•œ ๋ธŒ๋žœ์น˜, ํ•ญ์ƒ ๋ฐฐํฌ ๊ฐ€๋Šฅํ•œ ์ƒํƒœ๋ฅผ ์œ ์ง€
- `{type}/{description}`: ๊ฐœ๋ฐœ ๋ธŒ๋žœ์น˜
- ์˜ˆ:ย `feat/login`, `fix/login-token`

&nbsp;
## ๐Ÿ‘ฉโ€๐Ÿ’ป๐Ÿ‘จโ€๐Ÿ’ป Organization Repository
https://github.com/Farm-On/BE
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

๐Ÿงน Nitpick | ๐Ÿ”ต Trivial

URL ๋งํฌ ํฌ๋งทํŒ… ๋ฐ ํŒŒ์ผ ๋ ๊ฐœํ–‰ ์ถ”๊ฐ€

๋‘ ๊ฐ€์ง€ ๋งˆํฌ๋‹ค์šด ํฌ๋งท ๊ฐœ์„ ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค:

  1. Bare URL์„ ๋งˆํฌ๋‹ค์šด ๋งํฌ ํ˜•์‹์œผ๋กœ ๋ณ€๊ฒฝ
  2. ํŒŒ์ผ ๋์— ๊ฐœํ–‰ ๋ฌธ์ž ์ถ”๊ฐ€
๐Ÿ“ ํฌ๋งทํŒ… ๊ฐœ์„  ์ œ์•ˆ
-https://github.com/Farm-On/BE
+[https://github.com/Farm-On/BE](https://github.com/Farm-On/BE)
+
๐Ÿงฐ Tools
๐Ÿช› markdownlint-cli2 (0.18.1)

188-188: Bare URL used

(MD034, no-bare-urls)


188-188: Files should end with a single newline character

(MD047, single-trailing-newline)

๐Ÿค– Prompt for AI Agents
In `@README.md` at line 188, Replace the bare URL "https://github.com/Farm-On/BE"
in README.md with a Markdown link (e.g. [Farm-On
BE](https://github.com/Farm-On/BE)) so it renders properly, and ensure the file
ends with a newline character by adding a trailing line break at EOF.

Loading