Skip to content

kusitms-com/30th_Meetup_TeamE_Claco_Front

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

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Contributors 3

  •  
  •  
  •