Skip to content

Commit

Permalink
Merge branch 'main' into feat/#72_qa/1-issue
Browse files Browse the repository at this point in the history
  • Loading branch information
dvp-tae committed Nov 28, 2024
2 parents b9885a0 + 6c82bae commit 2d3e4e3
Show file tree
Hide file tree
Showing 7 changed files with 152 additions and 26 deletions.
Binary file added .github/readme-assets/ai-flow.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added .github/readme-assets/architecture.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added .github/readme-assets/cicd.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added .github/readme-assets/erd.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added .github/readme-assets/server-test.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added .github/readme-assets/test-coverage.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
178 changes: 152 additions & 26 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,34 +1,98 @@
# Claco ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ ๋ฌธ์„œ
# ์‚ฌ์šฉ์ž ๋งž์ถค ํด๋ž˜์‹ ๊ณต์—ฐ ํ๋ ˆ์ด์…˜ ์„œ๋น„์Šค Claco

## ๐Ÿ“ฑ ์„œ๋น„์Šค ์†Œ๊ฐœ
- ํด๋ž˜์‹ ๊ณต์—ฐ ๊ฐ์ƒ์˜ ๊ธธ์žก์ด๊ฐ€ ๋˜๋Š” ์„œ๋น„์Šค๋ฅผ ์ œ๊ณตํ•จ์œผ๋กœ์จ ํด๋ž˜์‹ ๊ณต์—ฐ ๋ฌธํ™”๋ฅผ ๋” ์ฆ๊ฒ๊ฒŒ ํ–ฅ์œ ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.
- ์‚ฌ์šฉ์ž์˜ ์ทจํ–ฅ์— ๋งž๋Š” ๊ณต์—ฐ์„ ์ถ”์ฒœํ•ด์ฃผ๊ณ , ํ‹ฐ์ผ“์„ ๋งŒ๋“ค์–ด ์ถ”์–ต์„ ๊ฐ„์งํ•˜๊ณ , ๊ณต์œ ํ•ฉ๋‹ˆ๋‹ค.

### ๐Ÿ“† ๊ฐœ๋ฐœ ๊ธฐ๊ฐ„ ๋ฐ ์ธ์›
- ***2024.10.05 ~ 2024.11.24***
- ```Frontend```: 2๋ช…
- ```Backend```: 2๋ช…

## ๐Ÿง‘โ€๐Ÿ’ป R&R
| Profile | Name | Role |
|:---------------------------------------------------------------------------------------------------------------------------:|:---------------------------------------:|:------------------------------------------------------------------------------------------------:|
| <a href="https://github.com/kimzini"><img src="https://avatars.githubusercontent.com/u/127485569?v=4" height="120px"></a> | ๊น€์ง„ํฌ<br> **kimzini** <br> FE | ์†Œ์…œ ๋กœ๊ทธ์ธ, ์˜จ๋ณด๋”ฉ, ๊ณต์—ฐ ์ƒ์„ธ, ๋งˆ์ด ํŽ˜์ด์ง€,<br> ํ‹ฐ์ผ“ ๋“ฑ๋ก ์„œ๋น„์Šค GUI ๊ฐœ๋ฐœ ๋ฐ API ์—ฐ๋™
| <a href="https://github.com/dvp-tae"><img src="https://avatars.githubusercontent.com/u/109207415?v=4" height="120px"></a> | ์„ฑํƒœํ˜„ <br> **dvp-tae** <br> FE | ์„œ๋น„์Šค ๋ฉ”์ธ, ๋ฆฌ๋ทฐ, ๋‘˜๋Ÿฌ๋ณด๊ธฐ,<br> ํด๋ผ์ฝ”๋ถ ๋งŒ๋“ค๊ธฐ ์„œ๋น„์Šค GUI ๊ฐœ๋ฐœ ๋ฐ API ์—ฐ๋™
| <a href="https://github.com/devkeon"><img src="https://avatars.githubusercontent.com/u/121371840?v=4" height="120px"></a> | \<๊ฐœ๋ฐœ ๋ฆฌ๋“œ><br>์ด๊ฑด <br> **devkeon** <br> BE | ์•„ํ‚คํ…์ฒ˜ ์„ค๊ณ„, ERD ์„ค๊ณ„, ๋ฉ”์ธ ์„œ๋ฒ„ ์ธํ”„๋ผ ๋ฐ CI/CD ๊ตฌ์ถ•, <br> ์ธ์ฆ/์ธ๊ฐ€, ๋ชจ๋‹ˆํ„ฐ๋ง ์‹œ์Šคํ…œ ๊ตฌ์ถ•, ํ‹ฐ์ผ“/๋ฆฌ๋ทฐ ๊ธฐ๋Šฅ,<br> ํด๋ผ์ฝ”๋ถ ๊ธฐ๋Šฅ, ํšŒ์› ๊ด€๋ จ ๊ธฐ๋Šฅ |
| <a href="https://github.com/anselmo228"><img src="https://avatars.githubusercontent.com/u/24919880?v=4" height="120px"></a> | ์ •ํฌ์ฐฌ <br> **anselmo** <br> BE | ERD ์„ค๊ณ„, AI ๋ฐ ๋ฐฐ์น˜ ์„œ๋ฒ„ ์ธํ”„๋ผ ๋ฐ CI/CD ๊ตฌ์ถ•, <br> ์ถ”์ฒœ AI ๋ชจ๋ธ ๊ตฌํ˜„, ๋ฐฐ์น˜ ๊ธฐ๋Šฅ(๋ฐ์ดํ„ฐ ๋กœ๋“œ) ๊ตฌ์ถ•, <br> ๊ณต์—ฐ ๊ธฐ๋Šฅ, ๊ณต์—ฐ ๋ฐ ํ‹ฐ์ผ“ ์ถ”์ฒœ ๊ธฐ๋Šฅ |


## ๐Ÿ›๏ธ ์•„ํ‚คํ…์ฒ˜
![architecture.png](./.github/readme-assets/architecture.png)

### PWA
- ๊ฐœ๋ฐœ ๋ฐ ์œ ์ง€๋ณด์ˆ˜ ๋น„์šฉ ์ ˆ๊ฐ
- ์‚ฌ์šฉ์ž๊ฐ€ ํ™ˆ ํ™”๋ฉด์— ์ถ”๊ฐ€ํ•˜์—ฌ ์•ฑ์ฒ˜๋Ÿผ ํ™œ์šฉ ๊ฐ€๋Šฅ
- ๋„ค์ดํ‹ฐ๋ธŒ ์•ฑ๊ณผ ์œ ์‚ฌํ•œ ์‚ฌ์šฉ์„ฑ๊ณผ ๋น ๋ฅธ ๋กœ๋”ฉ ์†๋„ ์ œ๊ณต
- ํ”Œ๋žซํผ ์ œ์•ฝ ์—†์ด ๋‹ค์–‘ํ•œ ํ™˜๊ฒฝ์—์„œ ๋™์ผํ•œ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜ ์ œ๊ณต
- ์ถ”ํ›„ ์›น ํ‘ธ์‹œ ์•Œ๋ฆผ, ๋ฐฑ๊ทธ๋ผ์šด๋“œ ๋™์ž‘ ๋“ฑ ๊ธฐ๋Šฅ ํ™•์žฅ์ด ์šฉ์ด

### ๋ณด์•ˆ ๊ณ ๋ ค ์‚ฌํ•ญ
- JWT๋ฅผ ํ™œ์šฉํ•œ ์ธ์ฆ/์ธ๊ฐ€
- SSL ๋ณด์•ˆ ๊ณ„์ธต์„ ํ™œ์šฉํ•œ ํ† ํฐ ์•”ํ˜ธํ™” (HTTPS, ALB ์„ค์น˜)
- CSRF / XSS ๊ณต๊ฒฉ์— ๋Œ€๋น„ํ•œ ํ† ํฐ ์ €์žฅ ๋ถ„๋ฆฌ (Local storage, HTTP-only Cookie)
- Nginx๋ฅผ ํ™œ์šฉํ•œ actuator์™€ ๊ฐ™์€ ๋ฏผ๊ฐ ์ •๋ณด deny
- Spring Security๋ฅผ ํ™œ์šฉํ•œ ์ฒ ์ €ํ•œ Auth ๊ฒ€์‚ฌ ๋ฐ uri ์ ‘๊ทผ ์กฐ์ •
- Kakao OAuth2.0์„ ํ™œ์šฉํ•œ ์ธ์ฆ/์ธ๊ฐ€ ๊ธฐ๋Šฅ ๊ฐ„ํŽธํ™”
- docker ๋„คํŠธ์›Œํฌ๋ฅผ ํ™œ์šฉํ•˜์—ฌ spring ์„œ๋ฒ„๋‚˜, prometheus๊ฐ™์€ ์ธ์Šคํ„ด์Šค ํฌํŠธ ๋งคํ•‘x (Endpoint ๋‹จ์ผํ™”)

### ์ถ”์ฒœ ์‹œ์Šคํ…œ ๋กœ์ง

- Collaborative Filtering & Cosine Similarity ๊ธฐ๋ฐ˜ ์ถ”์ฒœ์‹œ์Šคํ…œ
1. ๊ฐ Concert๋Š” AI๊ฐ€ ์ถ”์ถœํ•ด์ค€ ํ‚ค์›Œ๋“œ ๊ฐ’์— ๋Œ€ํ•ด 0 ~ 1 ์‚ฌ์ด์˜ ๊ฐ’์„ ๊ฐ€์ง
2. ์œ ์ €๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์˜จ๋ณด๋”ฉ์—์„œ ๋“ฑ๋กํ•œ ์ทจํ–ฅ ์ •๋ณด๋กœ ๋ถ€ํ„ฐ ๋ชจ๋“  ํ‚ค์›Œ๋“œ ๊ฐ’์— ๋Œ€ํ•ด 0 ~ 1์‚ฌ์ด ๊ฐ’์„ ๊ฐ€์ง
3. Concerts, Users CSVํŒŒ์ผ์„ ํ†ตํ•ด์„œ Cosine Similarity์™€ Collaborative Filtering์„ ํ†ตํ•œ ์œ ์‚ฌ๋„ ๊ณ„์‚ฐ ํ›„ ์ถ”์ฒœ ์ง„ํ–‰

### ๋ฉ”์ธ ์„œ๋ฒ„
- ์„œ๋น„์Šค์˜ ์ฃผ์š” ๋กœ์ง์„ ์ฒ˜๋ฆฌํ•˜๋Š” ์„œ๋ฒ„
- Grafana์™€ Prometheus์— ๊ธฐ๋ฐ˜ํ•œ ๋ชจ๋‹ˆํ„ฐ๋ง ์‹œ์Šคํ…œ ๊ตฌ์ถ•
- Nginx๋ฅผ ํ†ตํ•œ ๋ฆฌ๋ฒ„์Šค ํ”„๋ก์‹œ ์„ค์ •

### AI ์„œ๋ฒ„

- ๊ณต์—ฐ ์„ฑ๊ฒฉ ๋ถ„์„์ด๋‚˜, ์œ ์ € ์„ฑ๊ฒฉ ๋ถ„์„, OCR์„ ์ฒ˜๋ฆฌํ•˜๋Š” ์„œ๋ฒ„
- OCR ๋ฐ ๊ณต์—ฐ ์„ฑ๊ฒฉ ์ •๋ณด ์ถ”์ถœ์€ NCP์˜ AI ์„œ๋น„์Šค๋ฅผ ํ™œ์šฉ
- ์ถ”์ฒœ ์‹œ์Šคํ…œ์˜ ๊ฒฝ์šฐ ์ง์ ‘ Collaborative Filtering Model ๊ตฌํ˜„

### ๋ฐฐ์น˜ ์„œ๋ฒ„

- KOPIS ์‹œ์Šคํ…œ์œผ๋กœ๋ถ€ํ„ฐ ๊ณต์—ฐ ์ •๋ณด๋ฅผ ์ฃผ๊ธฐ์ ์œผ๋กœ ์—…๋ฐ์ดํŠธํ•˜๋Š” ์„œ๋ฒ„(ํ•œ๋‹ฌ์— 1๋ฒˆ)
- KOPIS์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„์˜ฌ๋•Œ๋งˆ๋‹ค AI์„œ๋ฒ„์— ํ•™์Šต ์š”์ฒญ

# โญ๏ธ Frontend

#### ๋ฐฐํฌ URL https://claco-client.vercel.app/
* * *

# ๐Ÿ’ป Technology
## ๐Ÿ’ป Technology
* ![Static Badge](https://img.shields.io/badge/react-%252320232a.svg?logo=React&color=%231C1C1C) ![Static Badge](https://img.shields.io/badge/Zustand-%252320232a.svg?color=%231C1C1C)
* ![Static Badge](https://img.shields.io/badge/typescript-%253178C6.svg?logo=typescript&logoColor=%23FFFFFF&color=%233178C6) ![Static Badge](https://img.shields.io/badge/yarn-%253178C6.svg?logo=yarn&logoColor=%23FFFFFF&color=%232C8EBB)
* ![Static Badge](https://img.shields.io/badge/tailwindCSS-%253178C6.svg?logo=tailwindCSS&logoColor=%23FFFFFF&color=%2306B6D4) ![Static Badge](https://img.shields.io/badge/shadcn%2Fui-%253178C6.svg?logo=shadcn%2Fui&logoColor=%23FFFFFF&color=%23000000)
* ![Static Badge](https://img.shields.io/badge/TanStack%20Query-%253178C6.svg?logo=React%20Query&logoColor=%23FFFFFF&color=%23FF4154) ![Static Badge](https://img.shields.io/badge/Vercel-%253178C6.svg?logo=Vercel&logoColor=%23FFFFFF&color=%23000000) ![Static Badge](https://img.shields.io/badge/PWA-%253178C6.svg?logo=PWA&logoColor=%23FFFFFF&color=%235A0FC8)


# ๐Ÿงธ ๊ธฐ์ˆ  ์Šคํƒ ์„ ์ • ์ด์œ 
## ๐Ÿงธ ๊ธฐ์ˆ  ์Šคํƒ ์„ ์ • ์ด์œ 

| ๊ธฐ์ˆ  ์Šคํƒ | ์„ค๋ช… |
|-----------|------|
| React | React๋Š” ๊ฐ€์žฅ ํ•ต์‹ฌ ์š”์†Œ์ธ Virtual Dom์„ ์ด์šฉํ•˜์—ฌ ๋ถˆํ•„์š”ํ•œ ํ™”๋ฉด ๊ฐฑ์‹ ์„ ์ตœ์†Œํ™”ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด, ์„ฑ๋Šฅ ํ–ฅ์ƒ์„ ์‹œํ‚ฌ ์ˆ˜ ์žˆ์œผ๋ฉฐ ๋น ๋ฅธ ๋ Œ๋”๋ง์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. React๋Š” ์ปดํฌ๋„ŒํŠธ ๊ธฐ๋ฐ˜ ์•„ํ‚คํ…์ฒ˜๋ฅผ ์ฑ„ํƒํ•˜๊ณ  ์žˆ์œผ๋ฉฐ, UI ์š”์†Œ๋“ค์„ ์ปดํฌ๋„ŒํŠธ๋กœ ๋ถ„๋ฆฌํ•˜์—ฌ ๊ฐœ๋ฐœํ•˜๊ณ  ์กฐํ•ฉํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ, ์ปดํฌ๋„ŒํŠธ์˜ ์žฌ์‚ฌ์šฉ์„ฑ์„ ์šฉ์ดํ•˜๊ฒŒ ํ•˜๋ฉฐ, ์ฝ”๋“œ ์ˆ˜์ • ๋ฐ ์œ ์ง€ยท๋ณด์ˆ˜์— ํšจ์œจ์ ์ด๊ธฐ์— React๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. |
| TypeScript | TypeScript๋Š” ์ •์  ํƒ€์ž… ์–ธ์–ด๋กœ, ์ฝ”๋“œ๋ฅผ ๋” ์•ˆ์ •์ ์œผ๋กœ ๋งŒ๋“ค๊ณ  ๊ฐœ๋ฐœ์ž ์‚ฌ์ด์˜ ํ˜‘์—…์„ ์šฉ์ดํ•˜๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค. ์ƒ์‚ฐ์„ฑ์ ‘๊ทผํŒŒ์ผ ๋‹จ๊ณ„์—์„œ ์—๋Ÿฌ๋ฅผ ๋ฐœ๊ฒฌํ•˜์—ฌ ๋Ÿฐํƒ€์ž„ ์˜ค๋ฅ˜๋ฅผ ๋ฐฉ์ง€ํ•˜๋ฉฐ, ์ฝ”๋“œ ํžŒํŠธ์™€ ์ž๋™ ์™„์„ฑ์„ ์ œ๊ณตํ•˜์—ฌ ๊ฐœ๋ฐœ ์ƒ์‚ฐ์„ฑ์„ ๋†’์—ฌ์ฃผ๋Š” ์žฅ์ ์ด ์žˆ์–ด TypeScript๋ฅผ ์„ ์ •ํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. |
| Zustand | ๊ฐ„๊ฒฐ์„ฑ๊ณผ ์œ ์—ฐ์„ฑ๊ฐ„๊ฒฐํ•˜๊ณ  ์ง๊ด€์ ์ธ ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ ๋ฐ ๊ฐœ๋ฐœ ๋ฐฉ์‹์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋ถˆํ•„์š”ํ•œ ๋ Œ๋”๋ง ์ตœ์†Œํ™”์ƒํƒœ๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ๋งŒ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ Œ๋”๋งํ•˜๋ฏ€๋กœ ๋ถˆํ•„์š”ํ•œ ๋ Œ๋”๋ง์„ ์ตœ์†Œํ™”ํ•  ์ˆ˜ ์žˆ์–ด ์„ฑ๋Šฅ ํ–ฅ์ƒ์— ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค. |
| Yarn | ๋†’์€ ์†๋„, ์•ˆ์ •์„ฑ ๋ฐ ๋ณด์•ˆ์„ฑYarn์€ JavaScript ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ €๋กœ, ๋น ๋ฅธ ์†๋„ ๋ฐ ๋†’์€ ์‹ ๋ขฐ์„ฑ๊ณผ ๋ณด์•ˆ์„ฑ์„ ์ œ๊ณตํ•˜์—ฌ ํšจ์œจ์ ์ธ ํ”„๋กœ์ ํŠธ ๊ด€๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. |
| Tanstack-Query | ํšจ์œจ์ ์ธ Data Fetching ๋ฐ ๊ด€๋ฆฌ๋ฐ์ดํ„ฐ ์บ์‹ฑ ๋“ฑ์˜ ๊ธฐ๋Šฅ์„ ์กด์žฌํ•˜์—ฌ ๋ถˆํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ ์š”์ฒญ์„ ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. |
| TypeScript | ์ •์  ํƒ€์ž… ์–ธ์–ด๋กœ์„œ ์ฝ”๋“œ์˜ ์•ˆ์ •์„ฑ์„ ๋†’์ด๊ณ  ํ˜‘์—…์„ ์šฉ์ดํ•˜๊ฒŒ ํ•˜๋ฉฐ, ์ƒ์‚ฐ์„ฑ ์ ‘๊ทผ ํŒŒ์ผ ๋‹จ๊ณ„์—์„œ ์˜ค๋ฅ˜๋ฅผ ์‚ฌ์ „์— ๋ฐœ๊ฒฌํ•˜์—ฌ ๋Ÿฐํƒ€์ž„ ์˜ค๋ฅ˜๋ฅผ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ, ์ฝ”๋“œ ํžŒํŠธ์™€ ์ž๋™ ์™„์„ฑ์„ ์ œ๊ณตํ•ด ๊ฐœ๋ฐœ ์ƒ์‚ฐ์„ฑ์„ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ์–ด TypeScript๋ฅผ ์„ ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. |
| Zustand | ๊ฐ„๊ฒฐํ•˜๊ณ  ์ง๊ด€์ ์ธ ์ƒํƒœ ๊ด€๋ฆฌ ๋ฐฉ์‹๊ณผ ์ตœ์†Œํ•œ์˜ ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ๋กœ ์œ ์—ฐ์„ฑ์„ ์ œ๊ณตํ•˜๋ฉฐ, ์ƒํƒœ ๋ณ€๊ฒฝ ์‹œ์—๋งŒ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ Œ๋”๋งํ•˜์—ฌ ๋ถˆํ•„์š”ํ•œ ๋ Œ๋”๋ง์„ ์ตœ์†Œํ™”ํ•˜๊ณ  ์„ฑ๋Šฅ ํ–ฅ์ƒ์— ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค. |
| Yarn | ๋น ๋ฅธ ์†๋„์™€ ๋†’์€ ์‹ ๋ขฐ์„ฑ์„ ๋ฐ”ํƒ•์œผ๋กœ ์•ˆ์ •์ ์ธ JavaScript ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ๋ฅผ ์ง€์›ํ•˜๋ฉฐ, ๋ณด์•ˆ์„ฑ ๊ฐ•ํ™” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜์—ฌ ํšจ์œจ์ ์ธ ํ”„๋กœ์ ํŠธ ๊ด€๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. |
| TailwindCSS | ๊ฐœ๋ฐœ์˜ ํŽธ์˜์„ฑ HTML๊ณผ CSS ํŒŒ์ผ์„ ๋ณ„๋„๋กœ ๊ฐœ๋ฐœ ๋ฐ ๊ด€๋ฆฌํ•  ํ•„์š”๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— ๊ฐœ๋ฐœํ•˜๊ธฐ์— ํŽธ๋ฆฌํ•˜๊ณ , ํŒ€ํ•‘ํ•˜๋Š” ๊ฐ ํƒœ๊ทธ์˜ ํด๋ž˜์Šค๋ช…์„ ๊ณ ๋ฏผํ•  ์‹œ๊ฐ„์„ ์ ˆ์•ฝํ•  ์ˆ˜ ์žˆ์–ด ๋น ๋ฅธ ๊ฐœ๋ฐœ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. |
| Vercel | ๊ฐ„ํŽธํ•œ ๋ฐฐํฌ ์ž๋™ํ™” ๊ฐ€๋Šฅํ•˜์—ฌ์— ํ‘ธ์‹œํ•  ๋•Œ๋งˆ๋‹ค ์ž๋™ ๋ฐฐํฌํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๊ฐ„ํŽธํ•˜๊ฒŒ ์›น์‚ฌ์ดํŠธ๋ฅผ ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. |
| shadcn/ui | TailwindCSS์™€์˜ ๊ธด๋ฐ€ํ•œ ํ†ตํ•ฉ์œผ๋กœ ๋น ๋ฅด๊ณ  ์ผ๊ด€๋œ ์Šคํƒ€์ผ๋ง์ด ๊ฐ€๋Šฅํ•˜๋ฉฐ, ๋†’์€ ํ™•์žฅ์„ฑ๊ณผ ์œ ์—ฐํ•œ ์ปค์Šคํ„ฐ๋งˆ์ด์ง• ๊ธฐ๋Šฅ์„ ํ†ตํ•ด ํ”„๋กœ์ ํŠธ ์š”๊ตฌ์‚ฌํ•ญ์— ๋งž๋Š” UI๋ฅผ ํšจ์œจ์ ์œผ๋กœ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. |
| Tanstack-Query | ํšจ์œจ์ ์ธ ๋ฐ์ดํ„ฐ ํŽ˜์นญ๊ณผ ๊ด€๋ฆฌ๋ฅผ ์ œ๊ณตํ•˜๋ฉฐ, ๋ฐ์ดํ„ฐ ์บ์‹ฑ ๊ธฐ๋Šฅ์„ ํ†ตํ•ด ๋ถˆํ•„์š”ํ•œ ์š”์ฒญ์„ ์ค„์—ฌ ์„ฑ๋Šฅ ์ตœ์ ํ™”์™€ ๋„คํŠธ์›Œํฌ ๋น„์šฉ ์ ˆ๊ฐ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. |
| Vercel | ๊นƒ ์ €์žฅ์†Œ์™€ ํ†ตํ•ฉ๋˜์–ด ์ฝ”๋“œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ž๋™์œผ๋กœ ๊ฐ์ง€ํ•˜๊ณ , ํ‘ธ์‹œํ•  ๋•Œ๋งˆ๋‹ค ์ž๋™ ๋ฐฐํฌ๋ฅผ ์ง€์›ํ•˜์—ฌ ํšจ์œจ์ ์ด๊ณ  ๊ฐ„ํŽธํ•˜๊ฒŒ ์›น์‚ฌ์ดํŠธ๋ฅผ ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. |
| PWA | ์›น ๊ธฐ์ˆ  ๊ธฐ๋ฐ˜์œผ๋กœ ๋‹ค์–‘ํ•œ ํ”Œ๋žซํผ์—์„œ ๋™์ž‘ํ•˜๊ณ , ์•ฑ ์Šคํ† ์–ด ์—†์ด ํ™ˆ ํ™”๋ฉด์— ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์–ด ์ ‘๊ทผ์„ฑ๊ณผ ํŽธ์˜์„ฑ์ด ๋›ฐ์–ด๋‚˜๋ฉฐ, ๊ฐœ๋ฐœ ๋น„์šฉ ์ ˆ๊ฐ๊ณผ ๋น ๋ฅธ ๋ฐฐํฌ๊ฐ€ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. |

# ๐Ÿ—‚๏ธ Naming Rules
## ๐Ÿ—‚๏ธ Naming Rules
* ํด๋”๋ช… - `PascalCase`
* ํŒŒ์ผ๋ช… - `PascalCase`
* ํƒ€์ž…, ์œ ํ‹ธํ•จ์ˆ˜ ๋“ฑ - `camelCase`
* ์ƒ์ˆ˜ - `UpperCase`

# ๐Ÿ“„ Commit Convension
## ๐Ÿ“„ Commit Convension
์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€๋Š” `ํƒœ๊ทธ: ์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€` ํ˜•์‹์œผ๋กœ ์ž‘์„ฑ (ex. git commit -m "feat: ์นด์นด์˜ค ๋กœ๊ทธ์ธ ๊ธฐ๋Šฅ ๊ตฌํ˜„")

๐Ÿ“ŒType
Expand All @@ -44,30 +108,30 @@
| ๐Ÿ”ง rename | ํด๋” ํ˜น์€ ํŒŒ์ผ๋ช… ๋ณ€๊ฒฝ |
| โœ‚๏ธ remove | ํŒŒ์ผ ์‚ญ์ œ |

# ๐Ÿ€ Issue Template
## ๐Ÿ€ Issue Template
* `๊ธฐ๋Šฅ ๊ฐœ๋ฐœ ๊ด€๋ จ Issue Template`
## ์ด์Šˆ ์„ค๋ช…โ˜€๏ธ
์ด์Šˆ์— ๊ด€ํ•œ ์„ค๋ช…
### ์ด์Šˆ ์„ค๋ช…โ˜€๏ธ
์ด์Šˆ์— ๊ด€ํ•œ ์„ค๋ช…

## TO-DO๐Ÿ“’
### TO-DO๐Ÿ“’
- [ ] ํ•  ์ผ 1

## ๊ธฐํƒ€๐Ÿ€
### ๊ธฐํƒ€๐Ÿ€

* `๋ฒ„๊ทธ ์ˆ˜์ • ๊ด€๋ จ Issue Template`
## ์—๋Ÿฌ ์„ค๋ช…๐Ÿšฆ
๋ฌด์Šจ ์—๋Ÿฌ์ธ์ง€ ์„ค๋ช…!
### ์—๋Ÿฌ ์„ค๋ช…๐Ÿšฆ
๋ฌด์Šจ ์—๋Ÿฌ์ธ์ง€ ์„ค๋ช…!

## ํ™˜๊ฒฝโš™๏ธ
ํŠน์ • ๊ธฐ๊ธฐ์—์„œ๋งŒ ๋ฐœ์ƒํ•˜๋Š” ์—๋Ÿฌ๋ผ๋ฉด ๋””๋ฐ”์ด์Šค ์ข…๋ฅ˜, ๋ธŒ๋ผ์šฐ์ € ์ข…๋ฅ˜ ๋“ฑ!
### ํ™˜๊ฒฝโš™๏ธ
ํŠน์ • ๊ธฐ๊ธฐ์—์„œ๋งŒ ๋ฐœ์ƒํ•˜๋Š” ์—๋Ÿฌ๋ผ๋ฉด ๋””๋ฐ”์ด์Šค ์ข…๋ฅ˜, ๋ธŒ๋ผ์šฐ์ € ์ข…๋ฅ˜ ๋“ฑ!

## ์žฌํ˜„ ๋ฐฉ๋ฒ•๐Ÿงฟ
์–ด๋–ป๊ฒŒ ์žฌํ˜„ํ•˜๋Š”์ง€ ์„ค๋ช…!
### ์žฌํ˜„ ๋ฐฉ๋ฒ•๐Ÿงฟ
์–ด๋–ป๊ฒŒ ์žฌํ˜„ํ•˜๋Š”์ง€ ์„ค๋ช…!

## ์—๋Ÿฌ ํ™”๋ฉด๐Ÿ“ธ
์Šคํฌ๋ฆฐ์ƒท or GIF ๋“ฑ..
### ์—๋Ÿฌ ํ™”๋ฉด๐Ÿ“ธ
์Šคํฌ๋ฆฐ์ƒท or GIF ๋“ฑ..

# ๐Ÿ€ Pull Request Template
## ๐Ÿ€ Pull Request Template
* ๊ด€๋ จ ์ด์Šˆ
* ๊ธฐ์กด ์ฝ”๋“œ์— ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š” ์ž‘์—… ์‚ฌํ•ญ
* ๊ธฐ์กด ์ฝ”๋“œ์— ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š๋Š” ์ž‘์—… ์‚ฌํ•ญ
Expand All @@ -76,10 +140,72 @@
* ์ถ”ํ›„ ์ž‘์—…ํ•  ๋‚ด์šฉ
* main (develop) ๋ธŒ๋žœ์น˜ pull ์—ฌ๋ถ€ ํ™•์ธ

# ๐ŸŒŠ Git Flow
| ๋ธŒ๋žœ์น˜ ๋ช… | ์—ญํ•  |
## ๐ŸŒŠ Git Flow
| ๋ธŒ๋žœ์น˜ ๋ช… | ์—ญํ•  |
|----------|--------------|
| main | ์ตœ์ข… ๋ฐฐํฌ๋  ์„œ๋น„์Šค์˜ ๋ธŒ๋žœ์น˜ |
| develop | ๊ฐœ๋ฐœ ๋ธŒ๋žœ์น˜, ํ•ด๋‹น ๋ธŒ๋žœ์น˜์—์„œ ๋ถ„๊ธฐ๋ฅผ ํŒŒ ์ž‘์—… ํ›„ merge |
| feature | ๊ธฐ๋Šฅ ๊ฐœ๋ฐœ ๋ธŒ๋žœ์น˜ |
| hotfix | main ๋ธŒ๋žœ์น˜ ๋ฐฐํฌ ํ›„ ๊ธด๊ธ‰ ์ˆ˜์ • ์‚ฌํ•ญ ๋ฐœ์ƒ ์‹œ ์‚ฌ์šฉํ•˜๋Š” ๋ธŒ๋žœ์น˜ |


# ๐Ÿ”ฅ Backend

## ๐Ÿ’ป ๊ฐœ๋ฐœ ํ™˜๊ฒฝ
> Language: ```Java 17``` <br>
> Framework: ```Spring Boot 3.3.4``` <br>
> Database: ```MySQL 8.x``` <br>
> ORM: ```JPA(Hibernate)``` <br>
> CI/CD: ```Github Actions``` <br>
> Cloud Platform: ```AWS(EC2, ALB, ACM), GCP(SQL)``` <br>
> Test DB: ```testcontainer```
## โš™๏ธ ๊ฐœ๋ฐœ ํ”„๋กœ์„ธ์Šค
- ```TDD (ํ…Œ์ŠคํŠธ ์ฃผ๋„ ๊ฐœ๋ฐœ)``` : ๊ตฌ๋ฌธ ์ปค๋ฒ„์ง€๋ฆฌ (Statement coverage) ๊ธฐ์ค€ 80%๋ฅผ ๋ชฉํ‘œ๋กœ ์ˆ˜ํ–‰
- ```Agile (์• ์ž์ผ ํ”„๋กœ์„ธ์Šค)``` : 1์ฃผ ๋‹จ์œ„ ์Šคํ”„๋ฆฐํŠธ ์ˆ˜ํ–‰
- ```Github Flow ์ „๋žต``` : ์ดˆ๊ธฐ ๊ฐœ๋ฐœ ๊ณผ์ •์—์„œ ๋ถˆํ•„์š”ํ•œ ๋ธŒ๋žœ์น˜ ๊ด€๋ฆฌ๋ฅผ ํ”ผํ•˜๊ณ , ๋น ๋ฅธ ๋ฐฐํฌ๋ฅผ ์œ„ํ•œ ์ „๋žต ์„ ํƒ
- ```CI/CD ํŒŒ์ดํ”„๋ผ์ธ์„ ํ†ตํ•œ ๋ฐฐํฌ ์ž๋™ํ™”``` : ์„œ๋น„์Šค ๊ฐœ๋ฐœ์ด 50% ์™„๋ฃŒ๋œ ์‹œ์ ์—์„œ ๊ตฌ์ถ•ํ•˜์—ฌ ๋ฐฐํฌ ์ž๋™ํ™”

## ๐Ÿ’ซ TDD ๊ฒฐ๊ณผ
- Service๋Š” ๋‹จ์œ„ ํ…Œ์ŠคํŠธ, Repository๋Š” ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ ์ง„ํ–‰
- ```testcontainer```๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ฉฑ๋“ฑ์„ฑ ๋ณด์žฅ
- ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ปค๋ฒ„๋ฆฌ์ง€ ์ธก์ • ํˆด: ```IntelliJ``` <br>

![img.png](./.github/readme-assets/test-coverage.png)
- summary
- statement coverage ๊ธฐ์ค€: 88%
- branch coverage: 54.8%
- class coverage: 100%
- method coverage: 96.7%

## ๐Ÿ’ซ ๋ถ€ํ•˜ ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ
- ์‚ฌ์šฉ ์ธ์Šคํ„ด์Šค ์œ ํ˜•: ```t2.large (ram 8GB)```
- ๋ถ€ํ•˜ ํ…Œ์ŠคํŠธ ์ธก์ • ํˆด: ```Jmeter```

![server-test.png](./.github/readme-assets/server-test.png)
- summary
- ๋„๋ฉ”์ธ๋ณ„ ์ฃผ์š” api ํ‰๊ท  50.3 Throughput





## ๐Ÿ”„ FlowChart of AI & Batch Server
![flow-chart.png](./.github/readme-assets/ai-flow.png)

## ๐Ÿ“ ERD
![erd.png](./.github/readme-assets/erd.png)

- ์นดํ…Œ๊ณ ๋ฆฌ์—์„œ ์—ฐ๊ด€ ๊ด€๊ณ„ ์„ค์ •์„ ํ†ตํ•ด ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ™œ์šฉ
- AI ์„œ๋น„์Šค ํ•™์Šต์„ ์œ„ํ•œ soft delete ํ™œ์šฉ

## ๐Ÿ› ๏ธ CI/CD pipeline
![ci-cd.png](./.github/readme-assets/cicd.png)
1. PR ์ด๋ฒคํŠธ ๋ฐœ์ƒ ์‹œ CI ์‹คํ–‰ (ํ…Œ์ŠคํŠธ ํฌํ•จ)
2. approve ๋ฐ CI ์„ฑ๊ณต ์‹œ merge ๊ฐ€๋Šฅ
3. merge ์ด๋ฒคํŠธ ๋ฐœ์ƒ ์‹œ CI ์Šคํฌ๋ฆฝํŠธ ์ˆ˜ํ–‰
4. CI ์Šคํฌ๋ฆฝํŠธ ์„ฑ๊ณต ์‹œ CD ์Šคํฌ๋ฆฝํŠธ ์ˆ˜ํ–‰
5. Docker ์ด๋ฏธ์ง€ docker hub์— push
6. SSH๋กœ AWS EC2 ์—ฐ๊ฒฐ
7. docker hub์—์„œ ์ด๋ฏธ์ง€ pull
8. dokcer-compose๋ฅผ ํ™œ์šฉํ•ด ์„œ๋น„์Šค ์‹คํ–‰ ๋ฐ ๋„์ปค ๋„คํŠธ์›Œํฌ ๊ตฌ์ถ•

0 comments on commit 2d3e4e3

Please sign in to comment.