Skip to content

kusitms-com/30th_Meetup_TeamE_Claco_Front

Folders and files

NameName
Last commit message
Last commit date
Nov 28, 2024
Nov 1, 2024
Nov 28, 2024
Oct 6, 2024
Nov 28, 2024
Oct 24, 2024
Oct 14, 2024
Oct 6, 2024
Nov 8, 2024
Nov 24, 2024
Oct 6, 2024
Nov 7, 2024
Oct 21, 2024
Oct 14, 2024
Oct 30, 2024
Oct 24, 2024
Oct 21, 2024
Nov 24, 2024

Repository files navigation

์‚ฌ์šฉ์ž ๋งž์ถค ํด๋ž˜์‹ ๊ณต์—ฐ ํ๋ ˆ์ด์…˜ ์„œ๋น„์Šค Claco

๐Ÿ“ฑ ์„œ๋น„์Šค ์†Œ๊ฐœ

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

๐Ÿ“† ๊ฐœ๋ฐœ ๊ธฐ๊ฐ„ ๋ฐ ์ธ์›

  • 2024.10.05 ~ 2024.11.24
  • Frontend: 2๋ช…
  • Backend: 2๋ช…

๐Ÿง‘โ€๐Ÿ’ป R&R

Profile Name Role
๊น€์ง„ํฌ
kimzini
FE
์†Œ์…œ ๋กœ๊ทธ์ธ, ์˜จ๋ณด๋”ฉ, ๊ณต์—ฐ ์ƒ์„ธ, ๋งˆ์ด ํŽ˜์ด์ง€,
ํ‹ฐ์ผ“ ๋“ฑ๋ก ์„œ๋น„์Šค GUI ๊ฐœ๋ฐœ ๋ฐ API ์—ฐ๋™
์„ฑํƒœํ˜„
dvp-tae
FE
์„œ๋น„์Šค ๋ฉ”์ธ, ๋ฆฌ๋ทฐ, ๋‘˜๋Ÿฌ๋ณด๊ธฐ,
ํด๋ผ์ฝ”๋ถ ๋งŒ๋“ค๊ธฐ ์„œ๋น„์Šค GUI ๊ฐœ๋ฐœ ๋ฐ API ์—ฐ๋™
<๊ฐœ๋ฐœ ๋ฆฌ๋“œ>
์ด๊ฑด
devkeon
BE
์•„ํ‚คํ…์ฒ˜ ์„ค๊ณ„, ERD ์„ค๊ณ„, ๋ฉ”์ธ ์„œ๋ฒ„ ์ธํ”„๋ผ ๋ฐ CI/CD ๊ตฌ์ถ•,
์ธ์ฆ/์ธ๊ฐ€, ๋ชจ๋‹ˆํ„ฐ๋ง ์‹œ์Šคํ…œ ๊ตฌ์ถ•, ํ‹ฐ์ผ“/๋ฆฌ๋ทฐ ๊ธฐ๋Šฅ,
ํด๋ผ์ฝ”๋ถ ๊ธฐ๋Šฅ, ํšŒ์› ๊ด€๋ จ ๊ธฐ๋Šฅ
์ •ํฌ์ฐฌ
anselmo
BE
ERD ์„ค๊ณ„, AI ๋ฐ ๋ฐฐ์น˜ ์„œ๋ฒ„ ์ธํ”„๋ผ ๋ฐ CI/CD ๊ตฌ์ถ•,
์ถ”์ฒœ AI ๋ชจ๋ธ ๊ตฌํ˜„, ๋ฐฐ์น˜ ๊ธฐ๋Šฅ(๋ฐ์ดํ„ฐ ๋กœ๋“œ) ๊ตฌ์ถ•,
๊ณต์—ฐ ๊ธฐ๋Šฅ, ๊ณต์—ฐ ๋ฐ ํ‹ฐ์ผ“ ์ถ”์ฒœ ๊ธฐ๋Šฅ

๐Ÿ›๏ธ ์•„ํ‚คํ…์ฒ˜

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

  • Static Badge Static Badge
  • Static Badge Static Badge
  • Static Badge Static Badge
  • Static Badge Static Badge Static Badge

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

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

๐Ÿ—‚๏ธ Naming Rules

  • ํด๋”๋ช… - PascalCase
  • ํŒŒ์ผ๋ช… - PascalCase
  • ํƒ€์ž…, ์œ ํ‹ธํ•จ์ˆ˜ ๋“ฑ - camelCase
  • ์ƒ์ˆ˜ - UpperCase

๐Ÿ“„ Commit Convension

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

๐Ÿ“ŒType

ํƒœ๊ทธ๋ช… commit ๊ทœ์น™
๐Ÿ”— feat ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ ๊ฐœ๋ฐœ
๐Ÿ›  fix UI,UX ๋ฐ ์ฝ”๋“œ ์ˆ˜์ •
๐ŸŽจ style CSS ์Šคํƒ€์ผ๋ง ๋ฐ ํผ๋ธ”๋ฆฌ์‹ฑ ์ž‘์—…
๐Ÿ“„ docs ๋ฌธ์„œ ์ž‘์—…(REANME.md ๋“ฑ)
๐Ÿ“˜ test ๋ฐฐํฌ ํ…Œ์ŠคํŠธ, QA ํ…Œ์ŠคํŒ… ๊ด€๋ จ
๐Ÿงฐ refactor ์ฝ”๋“œ ๋ฆฌํŒฉํ† ๋ง
๐Ÿ”ง rename ํด๋” ํ˜น์€ ํŒŒ์ผ๋ช… ๋ณ€๊ฒฝ
โœ‚๏ธ remove ํŒŒ์ผ ์‚ญ์ œ

๐Ÿ€ Issue Template

  • ๊ธฐ๋Šฅ ๊ฐœ๋ฐœ ๊ด€๋ จ Issue Template

    ์ด์Šˆ ์„ค๋ช…โ˜€๏ธ

    ์ด์Šˆ์— ๊ด€ํ•œ ์„ค๋ช…

    TO-DO๐Ÿ“’

    • ํ•  ์ผ 1

    ๊ธฐํƒ€๐Ÿ€

  • ๋ฒ„๊ทธ ์ˆ˜์ • ๊ด€๋ จ Issue Template

    ์—๋Ÿฌ ์„ค๋ช…๐Ÿšฆ

    ๋ฌด์Šจ ์—๋Ÿฌ์ธ์ง€ ์„ค๋ช…!

    ํ™˜๊ฒฝโš™๏ธ

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

    ์žฌํ˜„ ๋ฐฉ๋ฒ•๐Ÿงฟ

    ์–ด๋–ป๊ฒŒ ์žฌํ˜„ํ•˜๋Š”์ง€ ์„ค๋ช…!

    ์—๋Ÿฌ ํ™”๋ฉด๐Ÿ“ธ

    ์Šคํฌ๋ฆฐ์ƒท or GIF ๋“ฑ..

๐Ÿ€ Pull Request Template

  • ๊ด€๋ จ ์ด์Šˆ
  • ๊ธฐ์กด ์ฝ”๋“œ์— ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š” ์ž‘์—… ์‚ฌํ•ญ
  • ๊ธฐ์กด ์ฝ”๋“œ์— ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š๋Š” ์ž‘์—… ์‚ฌํ•ญ
  • ์ž‘์—… ๋‚ด์šฉ ์Šคํฌ๋ฆฐ ์ƒท
  • ๋ฆฌ๋ทฐ์–ด์—๊ฒŒ ๊ณต์œ ํ•  ๋‚ด์šฉ
  • ์ถ”ํ›„ ์ž‘์—…ํ•  ๋‚ด์šฉ
  • main (develop) ๋ธŒ๋žœ์น˜ pull ์—ฌ๋ถ€ ํ™•์ธ

๐ŸŒŠ Git Flow

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

๐Ÿ”ฅ Backend

๐Ÿ’ป ๊ฐœ๋ฐœ ํ™˜๊ฒฝ

Language: Java 17
Framework: Spring Boot 3.3.4
Database: MySQL 8.x
ORM: JPA(Hibernate)
CI/CD: Github Actions
Cloud Platform: AWS(EC2, ALB, ACM), GCP(SQL)
Test DB: testcontainer

โš™๏ธ ๊ฐœ๋ฐœ ํ”„๋กœ์„ธ์Šค

  • TDD (ํ…Œ์ŠคํŠธ ์ฃผ๋„ ๊ฐœ๋ฐœ) : ๊ตฌ๋ฌธ ์ปค๋ฒ„์ง€๋ฆฌ (Statement coverage) ๊ธฐ์ค€ 80%๋ฅผ ๋ชฉํ‘œ๋กœ ์ˆ˜ํ–‰
  • Agile (์• ์ž์ผ ํ”„๋กœ์„ธ์Šค) : 1์ฃผ ๋‹จ์œ„ ์Šคํ”„๋ฆฐํŠธ ์ˆ˜ํ–‰
  • Github Flow ์ „๋žต : ์ดˆ๊ธฐ ๊ฐœ๋ฐœ ๊ณผ์ •์—์„œ ๋ถˆํ•„์š”ํ•œ ๋ธŒ๋žœ์น˜ ๊ด€๋ฆฌ๋ฅผ ํ”ผํ•˜๊ณ , ๋น ๋ฅธ ๋ฐฐํฌ๋ฅผ ์œ„ํ•œ ์ „๋žต ์„ ํƒ
  • CI/CD ํŒŒ์ดํ”„๋ผ์ธ์„ ํ†ตํ•œ ๋ฐฐํฌ ์ž๋™ํ™” : ์„œ๋น„์Šค ๊ฐœ๋ฐœ์ด 50% ์™„๋ฃŒ๋œ ์‹œ์ ์—์„œ ๊ตฌ์ถ•ํ•˜์—ฌ ๋ฐฐํฌ ์ž๋™ํ™”

๐Ÿ’ซ TDD ๊ฒฐ๊ณผ

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

img.png

  • summary
    • statement coverage ๊ธฐ์ค€: 88%
    • branch coverage: 54.8%
    • class coverage: 100%
    • method coverage: 96.7%

๐Ÿ’ซ ๋ถ€ํ•˜ ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ

  • ์‚ฌ์šฉ ์ธ์Šคํ„ด์Šค ์œ ํ˜•: t2.large (ram 8GB)
  • ๋ถ€ํ•˜ ํ…Œ์ŠคํŠธ ์ธก์ • ํˆด: Jmeter

server-test.png

  • summary
    • ๋„๋ฉ”์ธ๋ณ„ ์ฃผ์š” api ํ‰๊ท  50.3 Throughput

๐Ÿ”„ FlowChart of AI & Batch Server

flow-chart.png

๐Ÿ“ ERD

erd.png

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

๐Ÿ› ๏ธ CI/CD pipeline

ci-cd.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๋ฅผ ํ™œ์šฉํ•ด ์„œ๋น„์Šค ์‹คํ–‰ ๋ฐ ๋„์ปค ๋„คํŠธ์›Œํฌ ๊ตฌ์ถ•