Skip to content

sik2Boii/stampic-portfolio

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

1 Commit
ย 
ย 

Repository files navigation

๐Ÿ“ฑ ์Šคํƒฌํ”ฝ(Stampic) Backend โ€” ํฌํŠธํด๋ฆฌ์˜ค

์‹ค์ œ ์šด์˜ ์ค‘์ธ ๋ชจ๋ฐ”์ผ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ, ๋ฐฐํฌ, ์šด์˜ ๊ฒฝํ—˜์„ ๋‹ด์€ ํฌํŠธํด๋ฆฌ์˜ค์ž…๋‹ˆ๋‹ค.

์›๋ณธ ๋ ˆํฌ์ง€ํ† ๋ฆฌ๋Š” ์‹ค์šด์˜ ์ค‘์ธ ์„œ๋น„์Šค๋กœ ๋ณด์•ˆ์ƒ Private์œผ๋กœ ๊ด€๋ฆฌ๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.


๐Ÿ“ฒ ๋‹ค์šด๋กœ๋“œ ๋งํฌ

App Store Google Play


๐Ÿ“ธ ์„œ๋น„์Šค ํ™”๋ฉด (Preview)

1. ์ผ์ƒ์˜ ์ˆ˜์ง‘ (๋‚ด ๊ธฐ๋ก ์กฐํšŒ)

Image

2. ์ˆœ๊ฐ„์˜ ์™„์„ฑ (์Šคํƒฌํ”„ ์นด๋ฉ”๋ผ ์ดฌ์˜ ๋ฐ ์ ์šฉ)

Image

3. ๊ธฐ๋ก์˜ ์—ฐ๊ฒฐ (์ปค๋ฎค๋‹ˆํ‹ฐ ํ”ผ๋“œ)

Image


๐Ÿ“Œ ํ”„๋กœ์ ํŠธ ๊ฐœ์š”

์Šคํƒฌํ”ฝ(Stampic) ์€ ์ผ์ƒ ์ค‘ ์ˆœ๊ฐ„์˜ ์‚ฌ์ง„์„ ํƒ€์ž„์Šคํƒฌํ”„๋กœ ๊ธฐ๋กํ•˜๊ณ  ๊ณต์œ ํ•˜๋Š” ๋ชจ๋ฐ”์ผ ์ปค๋ฎค๋‹ˆํ‹ฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ž…๋‹ˆ๋‹ค.

ํ•ญ๋ชฉ ๋‚ด์šฉ
MVP ๊ฐœ๋ฐœ 2025.11 ~ 2026.01
๊ณ ๋„ํ™” 2026.01 ~ ํ˜„์žฌ (์ง„ํ–‰ ์ค‘)
์—ญํ•  ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ, ๋ฐฐํฌ, ์šด์˜ (๋ฐฑ์—”๋“œ 2์ธ ์ค‘ 1์ธ)
์ƒํƒœ App Store, Google Play ์‹ค๋ฐฐํฌ ์šด์˜ ์ค‘
๋ˆ„์  ๊ฐ€์ž…์ž 130๋ช…+

๐Ÿ‘ฅ ํŒ€ ๊ตฌ์„ฑ ๋ฐ ํ˜‘์—…

์ด 7๋ช… ํŒ€ ํ”„๋กœ์ ํŠธ

์—ญํ•  ์ธ์›
PM 1๋ช…
๋””์ž์ด๋„ˆ 2๋ช…
iOS ๊ฐœ๋ฐœ์ž 1๋ช…
Android ๊ฐœ๋ฐœ์ž 1๋ช…
๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ์ž 2๋ช…

๋‹ด๋‹น ์—…๋ฌด

  • ์‹œ์Šคํ…œ ์•„ํ‚คํ…์ฒ˜ ์„ค๊ณ„: ๋„ค์ด๋ฒ„ ํด๋ผ์šฐ๋“œ ํ™˜๊ฒฝ ๊ธฐ๋ฐ˜ ์ „์ฒด ์‹œ์Šคํ…œ ์•„ํ‚คํ…์ฒ˜ ๊ตฌ์„ฑ ๋ฐ Presigned URL ์—…๋กœ๋“œ ๋กœ์ง ์„ค๊ณ„

  • ์ปค๋ฎค๋‹ˆํ‹ฐ ๋„๋ฉ”์ธ ๊ฐœ๋ฐœ: ์‚ฌ์ง„ ๊ณต์œ , ์ข‹์•„์š” ๋“ฑ ์ปค๋ฎค๋‹ˆํ‹ฐ ํ•ต์‹ฌ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ๋ฐ REST API ๊ตฌํ˜„

  • DB ์„ฑ๋Šฅ ์ตœ์ ํ™”: ์ปค๋ฒ„๋ง ์ธ๋ฑ์Šค ์ ์šฉ์„ ํ†ตํ•œ ๋Œ€์šฉ๋Ÿ‰ ์ปค๋ฎค๋‹ˆํ‹ฐ ํ”ผ๋“œ ์กฐํšŒ ์ฟผ๋ฆฌ ํŠœ๋‹

  • ์ธํ”„๋ผ ๋ฐ DevOps: GitHub Actions, Docker, Nginx๋ฅผ ํ™œ์šฉํ•œ CI/CD ์ž๋™ํ™” ํŒŒ์ดํ”„๋ผ์ธ ๋ฐ ๋ธ”๋ฃจ-๊ทธ๋ฆฐ ๋ฌด์ค‘๋‹จ ๋ฐฐํฌ ํ™˜๊ฒฝ ๊ตฌ์ถ•

  • ๋ฐฑ์˜คํ”ผ์Šค(Admin) ๊ตฌํ˜„: App Store ์ปค๋ฎค๋‹ˆํ‹ฐ ์‹ฌ์‚ฌ ๊ฐ€์ด๋“œ๋ผ์ธ ๋Œ€์‘์„ ์œ„ํ•ด ์ ‘์ˆ˜๋œ ์‚ฌ์šฉ์ž ์‹ ๊ณ  ๋‚ด์—ญ์„ ๊ฒ€์ฆํ•˜๊ณ  ์•…์„ฑ ์ฝ˜ํ…์ธ ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” Thymeleaf ๊ธฐ๋ฐ˜ ๊ด€๋ฆฌ์ž ์›น ํŽ˜์ด์ง€ ๊ฐœ๋ฐœ

    ๐Ÿ“Ž ๊ด€๋ฆฌ์ž ํŽ˜์ด์ง€ ์Šคํฌ๋ฆฐ์ƒท (ํด๋ฆญํ•˜์—ฌ ํŽผ์น˜๊ธฐ)
    Image

ํ˜‘์—… ๋ฐฉ์‹

  • ๊ฒฉ์ฃผ ์›”์š”์ผ ์ •๊ธฐ ํšŒ์˜ ๊ธฐ๋ฐ˜ 2์ฃผ ๋‹จ์œ„ ์Šคํ”„๋ฆฐํŠธ๋กœ MVP ์ถœ์‹œ ํ›„ ์ง€์† ๊ณ ๋„ํ™” ์ค‘
  • iOS, Android ๊ฐœ๋ฐœ์ž์™€์˜ REST API ์„ค๊ณ„ ๋ฐ ์กฐ์œจ
  • Swagger ๊ธฐ๋ฐ˜ API ๋ฌธ์„œํ™”๋กœ iOS, Android ๊ฐœ๋ฐœ์ž์™€์˜ ๋ช…์„ธ ๊ณต์œ 
  • ๋””์ž์ด๋„ˆ์™€์˜ ํ”ผ๋“œ๋ฐฑ ๋ฃจํ”„๋ฅผ ํ†ตํ•œ UI/UX ๊ธฐ๋ฐ˜ API ์‘๋‹ต ์„ค๊ณ„
  • ๋ฐฑ์—”๋“œ ํŒ€์›๊ณผ์˜ ์ฝ”๋“œ ๋ฆฌ๋ทฐ ๋ฐ ์‹œ์Šคํ…œ ์•„ํ‚คํ…์ฒ˜ ์„ค๊ณ„
  • GitHub PR ๊ธฐ๋ฐ˜ ๊ฐœ๋ฐœ ํ”„๋กœ์„ธ์Šค (์ปค๋ฐ‹ ์ปจ๋ฒค์…˜, ๋ธŒ๋žœ์น˜ ์ „๋žต)

๐Ÿ›  ๊ธฐ์ˆ  ์Šคํƒ

๋ถ„๋ฅ˜ ๊ธฐ์ˆ 
Backend Spring Boot 3.5.6, Java 17
API JWT, OAuth2, Swagger
ORM JPA, QueryDSL
Database MySQL
Admin Thymeleaf
Storage ๋„ค์ด๋ฒ„ ํด๋ผ์šฐ๋“œ Object Storage
Analytics Amplitude
Monitoring Prometheus, Grafana
DevOps Docker, Nginx, Certbot, GitHub Actions
Cloud ๋„ค์ด๋ฒ„ ํด๋ผ์šฐ๋“œ ํ”Œ๋žซํผ

๐Ÿ— ์‹œ์Šคํ…œ ์•„ํ‚คํ…์ฒ˜

Image

ํ•ต์‹ฌ ์„ค๊ณ„ ํฌ์ธํŠธ

  • ์ด๋ฏธ์ง€ ์—…๋กœ๋“œ ์‹œ ์„œ๋ฒ„๋ฅผ ๊ฑฐ์น˜์ง€ ์•Š๊ณ  ํด๋ผ์ด์–ธํŠธ -> Object Storage ์ง์ ‘ ์—…๋กœ๋“œ (Presigned URL)
  • ์—…๋กœ๋“œ ์™„๋ฃŒ ํ›„ ์„œ๋ฒ„์— ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋งŒ ์ €์žฅ -> ์„œ๋ฒ„ ๋ถ€ํ•˜ ์ตœ์†Œํ™”
  • ์ œํ•œ๋œ ์„œ๋ฒ„ ๋ฆฌ์†Œ์Šค ํ™˜๊ฒฝ ๋‚ด์—์„œ ์ตœ์ ์˜ ๊ฐ€์šฉ์„ฑ์„ ํ™•๋ณดํ•˜๊ธฐ ์œ„ํ•ด ๋‹จ์ผ ์ธ์Šคํ„ด์Šค ๋‚ด Nginx ํฌํŠธ ์Šค์œ„์นญ ๊ธฐ๋ฐ˜์˜ ๋ธ”๋ฃจ-๊ทธ๋ฆฐ ๋ฌด์ค‘๋‹จ ๋ฐฐํฌ ํŒŒ์ดํ”„๋ผ์ธ ๊ตฌ์ถ•

โšก ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ…

๐Ÿ”ง ๊ฐœ๋ฐœ ์ค‘ ๋ฐœ์ƒ


1. ์ปค๋ฒ„๋ง ์ธ๋ฑ์Šค ์ ์šฉ โ€” ์ฟผ๋ฆฌ ์„ฑ๋Šฅ 160๋ฐฐ ๊ฐœ์„ 

๋ฌธ์ œ ์ƒํ™ฉ

๋”๋ฏธ ๋ฐ์ดํ„ฐ(๊ฒŒ์‹œ๊ธ€ 100,100๊ฑด / ์ข‹์•„์š” 2,409,198๊ฑด) ๊ธฐ๋ฐ˜ ๋ถ€ํ•˜ ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ
์ปค๋ฎค๋‹ˆํ‹ฐ ํ”ผ๋“œ ์กฐํšŒ API ํ‰๊ท  ์‘๋‹ต ์‹œ๊ฐ„์ด ์•ฝ 4,000ms(4์ดˆ) ๋กœ ํ™•์ธ๋จ.

๊ฒŒ์‹œ๊ธ€ ์ •๋ ฌ(published_at DESC, image_id DESC) ๋ฐ ๊ฒŒ์‹œ๊ธ€๋ณ„ ์ข‹์•„์š” ์ˆ˜ ์ง‘๊ณ„ ์„œ๋ธŒ์ฟผ๋ฆฌ๋กœ ์ธํ•ด
๋Œ€๋Ÿ‰์˜ ๋ฐ์ดํ„ฐ ์Šค์บ”์ด ๋ฐœ์ƒํ•˜๋ฉฐ ์ „์ฒด ํ”ผ๋“œ ์กฐํšŒ ์„ฑ๋Šฅ์— ๋ณ‘๋ชฉ์ด ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ์œผ๋กœ ํŒ๋‹จ๋จ.

์‹คํ–‰๊ณ„ํš ๋ถ„์„ (EXPLAIN)

type key rows Extra
์ ์šฉ ์ „ ALL NULL 2,402,103 Using where
์ ์šฉ ํ›„ ref idx_image_like_image_user 27 Using index
  • ์ ์šฉ ์ „: ์ข‹์•„์š” ํ…Œ์ด๋ธ” ์ „์ฒด ํ’€ ์Šค์บ” (์ธ๋ฑ์Šค ๋ฏธ์‚ฌ์šฉ)
  • ์ ์šฉ ํ›„: ์ปค๋ฒ„๋ง ์ธ๋ฑ์Šค๋กœ 27๊ฑด๋งŒ ์ฐธ์กฐ, ํ…Œ์ด๋ธ” ์ ‘๊ทผ ์—†์ด ์ฟผ๋ฆฌ ์™„๊ฒฐ
๐Ÿ“Ž ์‹คํ–‰๊ณ„ํš ์บก์ณ๋ณธ ๋ณด๊ธฐ (ํด๋ฆญํ•˜์—ฌ ํŽผ์น˜๊ธฐ)

์ ์šฉ ์ „

Image

์ ์šฉ ํ›„

Image

ํ•ด๊ฒฐ ๋ฐฉ์•ˆ ๊ฒ€ํ† 

๋‘ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์„ ๊ณ ๋ คํ•จ.

๋ฐฉ๋ฒ• ์žฅ์  ๋‹จ์ 
๋ฐ˜์ •๊ทœํ™” (์ข‹์•„์š” ์ˆ˜ ์ปฌ๋Ÿผ ๋ณ„๋„ ๊ด€๋ฆฌ) ์กฐํšŒ ์‹œ ์ง‘๊ณ„ ๋ถˆํ•„์š”, ๋งค์šฐ ๋น ๋ฆ„ ๋ฐ์ดํ„ฐ ์ •ํ•ฉ์„ฑ ๊ด€๋ฆฌ ๋ณต์žก, ์“ฐ๊ธฐ ๋ถ€ํ•˜ ์ฆ๊ฐ€
์ปค๋ฒ„๋ง ์ธ๋ฑ์Šค ๊ตฌ์กฐ ๋ณ€๊ฒฝ ์—†์ด ์„ฑ๋Šฅ ๊ฐœ์„  ๊ฐ€๋Šฅ ๋ฐ์ดํ„ฐ๊ฐ€ ๋งค์šฐ ๋งŽ์•„์งˆ ๊ฒฝ์šฐ ํ•œ๊ณ„ ์กด์žฌ
  • ํ˜„์žฌ ์„œ๋น„์Šค ๊ทœ๋ชจ์—์„œ๋Š” ๋Œ€๊ทœ๋ชจ ํŠธ๋ž˜ํ”ฝ์ด ๋ฐœ์ƒํ•  ๊ฐ€๋Šฅ์„ฑ์ด ๋‚ฎ๊ณ  ๋ฐ˜์ •๊ทœํ™”๋กœ ์ธํ•œ ๋ฐ์ดํ„ฐ ์ •ํ•ฉ์„ฑ ๊ด€๋ฆฌ ๋ณต์žก๋„๊ฐ€ ๋” ํฐ ๋ฆฌ์Šคํฌ๋ผ๊ณ  ํŒ๋‹จํ•˜์—ฌ ์ปค๋ฒ„๋ง ์ธ๋ฑ์Šค ์ ์šฉ.

ํ•ด๊ฒฐ

  • WHERE, SELECT, ORDER BY ์ปฌ๋Ÿผ์„ ๋ชจ๋‘ ํฌํ•จํ•˜๋Š” ์ปค๋ฒ„๋ง ์ธ๋ฑ์Šค ์„ค๊ณ„
  • ํ…Œ์ด๋ธ” ์ ‘๊ทผ ์—†์ด ์ธ๋ฑ์Šค๋งŒ์œผ๋กœ ์ฟผ๋ฆฌ ์™„๊ฒฐ๋˜๋„๋ก ๊ตฌ์กฐ ๊ฐœ์„ 
  • QueryDSL์„ ํ™œ์šฉํ•œ ์ตœ์ ํ™”๋œ ์ฟผ๋ฆฌ ์ž‘์„ฑ
๐Ÿ“Ž ์‘๋‹ต ์‹œ๊ฐ„ ์ธก์ • ๊ฒฐ๊ณผ: 4,000ms -> 25ms (ํด๋ฆญํ•˜์—ฌ ํŽผ์น˜๊ธฐ)

์ ์šฉ ์ „ โ€” 10ํšŒ ์š”์ฒญ ํ‰๊ท  ์•ฝ 4,000ms

Image

์ ์šฉ ํ›„ โ€” 10ํšŒ ์š”์ฒญ ํ‰๊ท  ์•ฝ 25ms

Image

๊ฒฐ๊ณผ

โšก 4,000ms -> 25ms (160๋ฐฐ ๊ฐœ์„ )
โœ… ์ข‹์•„์š” ํ…Œ์ด๋ธ” ์Šค์บ” rows: 2,402,103 -> 27
โœ… ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ถ€ํ•˜ ๊ฐ์†Œ
โœ… ์‚ฌ์šฉ์ž ํ”ผ๋“œ ์‘๋‹ต ์†๋„ ๋Œ€ํญ ํ–ฅ์ƒ

2. Presigned URL ๊ธฐ๋ฐ˜ ์ด๋ฏธ์ง€ ์—…๋กœ๋“œ โ€” ์„œ๋ฒ„ ๋ถ€ํ•˜ ์ตœ์†Œํ™”

๋ฌธ์ œ ์ƒํ™ฉ

  • ์ด๋ฏธ์ง€ ์ค‘์‹ฌ ์„œ๋น„์Šค ํŠน์„ฑ์ƒ ๋‹ค์ˆ˜์˜ ์ด๋ฏธ์ง€ ํŒŒ์ผ ์—…๋กœ๋“œ๊ฐ€ ๋นˆ๋ฒˆํ•˜๊ฒŒ ๋ฐœ์ƒ
  • ์„œ๋ฒ„ ์ง์ ‘ ์—…๋กœ๋“œ ๋ฐฉ์‹์˜ ์ž ์žฌ์  ํ•œ๊ณ„
    • ์„œ๋ฒ„ ๋ฉ”๋ชจ๋ฆฌ, ๋„คํŠธ์›Œํฌ ๋ถ€ํ•˜ ์ฆ๊ฐ€

ํ•ด๊ฒฐ

์„œ๋ฒ„                    ํด๋ผ์ด์–ธํŠธ                      ์—…๋กœ๋“œ ์™„๋ฃŒ ํ›„
Presigned URL ๋ฐœ๊ธ‰  ->  Object Storage ์ง์ ‘ ์—…๋กœ๋“œ  ->  ์„œ๋ฒ„์— ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ์ €์žฅ
  • ์œ ํšจ์‹œ๊ฐ„ 1๋ถ„์œผ๋กœ ์„ค์ • โ€” ์‹ค์ œ ์—…๋กœ๋“œ ์™„๋ฃŒ๊นŒ์ง€ ์ˆ˜์ดˆ ๋‚ด์™ธ๋กœ ์ถฉ๋ถ„ํ•˜๋ฉฐ ์œ ํšจ์‹œ๊ฐ„์„ ์ตœ์†Œํ™”ํ•˜์—ฌ URL ์œ ์ถœ ์‹œ ๋ฌด๋‹จ ์—…๋กœ๋“œ ํ”ผํ•ด๋ฅผ ๋ฐฉ์ง€

๊ฒฐ๊ณผ

โœ… ์„œ๋ฒ„ ๋ถ€ํ•˜ ์ตœ์†Œํ™”
โœ… ์ด๋ฏธ์ง€ ์—…๋กœ๋“œ ์•ˆ์ •์„ฑ ํ™•๋ณด
โœ… ๋„คํŠธ์›Œํฌ ํšจ์œจ ๋ฐ ์‘๋‹ต ์†๋„ ๊ฐœ์„ 
โœ… Presigned URL ์œ ํšจ์‹œ๊ฐ„ ์ตœ์†Œํ™”๋กœ ๋ณด์•ˆ ๊ฐ•ํ™”

๐Ÿšจ ์šด์˜ ์ค‘ ๋ฐœ์ƒ


3. SSL ์ธ์ฆ์„œ ๊ฐฑ์‹  ํ›„ Nginx ๋ฏธ๋ฐ˜์˜ โ€” ์ „์ฒด API ์„œ๋ฒ„ ๋‹ค์šด (์•ฝ 7์‹œ๊ฐ„)

๋ฌธ์ œ ์ƒํ™ฉ

  • SSL ์ธ์ฆ์„œ ์ž๋™ ๊ฐฑ์‹  ๋กœ์ง์€ ์กด์žฌํ–ˆ์œผ๋‚˜ Nginx๊ฐ€ ๊ธฐ์กด ์ธ์ฆ์„œ๋ฅผ ๊ทธ๋Œ€๋กœ ์ฐธ์กฐํ•˜์—ฌ ์ƒˆ ์ธ์ฆ์„œ๊ฐ€ ๋ฐ˜์˜๋˜์ง€ ์•Š์Œ
  • ๊ฒฐ๊ณผ์ ์œผ๋กœ ์ „์ฒด API ์„œ๋ฒ„ ๋‹ค์šด ๋ฐœ์ƒ (๋‹ค์šดํƒ€์ž„ ์•ฝ 7์‹œ๊ฐ„)
  • ์ธํ”„๋ผ ๋‹ด๋‹น์ž๊ฐ€ ๋ณธ์ธ 1์ธ์ด์—ˆ๋˜ ๊ด€๊ณ„๋กœ ์—…๋ฌด ์ค‘ ์˜ค๋ฅ˜๋ฅผ ์ธ์ง€ํ•œ ํ›„ ํ‡ด๊ทผ ์ฆ‰์‹œ ์กฐ์น˜

ํ•ด๊ฒฐ

  1. Nginx ๋ฆฌ๋กœ๋“œ๋กœ ์ฆ‰์‹œ ์„œ๋ฒ„ ๋ณต๊ตฌ
  2. ์ธ์ฆ์„œ ๊ฐฑ์‹  ์‹œ Nginx ์ž๋™ ๋ฆฌ๋กœ๋“œ๋˜๋„๋ก ์Šคํฌ๋ฆฝํŠธ ์ˆ˜์ •
  3. ์ธ์ฆ์„œ ๋งŒ๋ฃŒ ์ „ AWS Lambda + SNS ์—ฐ๋™์œผ๋กœ ๋ฌธ์ž ์•Œ๋ฆผ ๋ฐœ์†ก ๊ตฌ์„ฑ
    • ์ธ์ฆ์„œ ์œ ํšจ๊ธฐ๊ฐ„ 90์ผ / ์—ฐ๊ฐ„ ์•ฝ 4ํšŒ ๋ฐœ์ƒ ์ด๋ฒคํŠธ -> ์„œ๋ฒ„๋ฆฌ์Šค(Lambda)๋กœ ์ฒ˜๋ฆฌ

๊ฒฐ๊ณผ

โœ… ๋™์ผ ์žฅ์•  ์žฌ๋ฐœ ๋ฐฉ์ง€
โœ… ์ธ์ฆ์„œ ๋งŒ๋ฃŒ ์ „ ์‚ฌ์ „ ์•Œ๋ฆผ์œผ๋กœ ์„ ์ œ ๋Œ€์‘ ์ฒด๊ณ„ ๊ตฌ์ถ•
โœ… ์ €๋นˆ๋„ ์ด๋ฒคํŠธ๋ฅผ ์„œ๋ฒ„๋ฆฌ์Šค๋กœ ์ฒ˜๋ฆฌํ•˜์—ฌ ๋ฆฌ์†Œ์Šค ํšจ์œจํ™”

ํšŒ๊ณ 

  • ๋‹จ์ˆœํ•œ ์„ค์ • ๋ˆ„๋ฝ์ด ์ „์ฒด ์‹œ์Šคํ…œ์˜ ์น˜๋ช…์ ์ธ ์žฅ์• ๋กœ ์ง๊ฒฐ๋  ์ˆ˜ ์žˆ์Œ์„ ๊ฒฝํ—˜ํ•จ.
  • ์ด๋ฅผ ํ†ตํ•ด ์ˆ˜๋™์ ์ธ ์šด์˜์„ ๋ฐฐ์ œํ•˜๊ณ  ํœด๋จผ ์—๋Ÿฌ๋ฅผ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ๋Š” ์ž๋™ํ™”์™€ ์„ ์ œ์ ์ธ ์•Œ๋ฆผ ์ฒด๊ณ„๊ฐ€ ํ•„์ˆ˜์ ์ž„์„ ๊นŠ์ด ์ฒด๊ฐํ•จ.

๐Ÿ“‚ ์ฃผ์š” ๊ธฐ๋Šฅ

๊ธฐ๋Šฅ ์„ค๋ช…
ํšŒ์› ๊ด€๋ฆฌ Google, Kakao, Apple OAuth2 ์†Œ์…œ ๋กœ๊ทธ์ธ, JWT ์ธ์ฆ
์ปค๋ฎค๋‹ˆํ‹ฐ ํ”ผ๋“œ ์‚ฌ์ง„ ๊ณต์œ , ์กฐํšŒ, ์ข‹์•„์š”
์ด๋ฏธ์ง€ ์—…๋กœ๋“œ Presigned URL ๊ธฐ๋ฐ˜ Object Storage ์ง์ ‘ ์—…๋กœ๋“œ
API ๋ฌธ์„œํ™” Swagger
์ด๋ฒคํŠธ ๋ถ„์„ Amplitude ์—ฐ๋™
๋ชจ๋‹ˆํ„ฐ๋ง Prometheus + Grafana ์‹ค์‹œ๊ฐ„ ์„œ๋ฒ„ ๋ชจ๋‹ˆํ„ฐ๋ง
๊ด€๋ฆฌ์ž ํŽ˜์ด์ง€ Thymeleaf ๊ธฐ๋ฐ˜ Admin UI
SSL ์ž๋™ํ™” Certbot + Docker ๊ธฐ๋ฐ˜ ์ธ์ฆ์„œ ์ž๋™ ๊ฐฑ์‹ 
CI/CD GitHub Actions ๊ธฐ๋ฐ˜ ์ž๋™ ๋ฐฐํฌ

๐Ÿš€ ๋ฐฐํฌ ๊ตฌ์กฐ

[GitHub] main/develop ๋ธŒ๋žœ์น˜ Merge
   โ†“
[GitHub Actions] ์ปค๋ฐ‹ ์ด๋ ฅ ๊ธฐ๋ฐ˜ ์ž๋™ ํƒœ๊ทธ(๋ฒ„์ „) ์ถ”์ถœ ๋ฐ ๋ฆด๋ฆฌ์ฆˆ ๋…ธํŠธ ์ƒ์„ฑ
   โ†“
[GitHub Actions] Docker Image ๋นŒ๋“œ ๋ฐ Docker Hub ํ‘ธ์‹œ
   โ†“
[Naver Cloud] ์„œ๋ฒ„์—์„œ ์ตœ์‹  Docker ์ด๋ฏธ์ง€ Pull
   โ†“
[Deploy] Nginx ํฌํŠธ ์Šค์œ„์นญ ๊ธฐ๋ฐ˜ ๋ธ”๋ฃจ-๊ทธ๋ฆฐ(Blue-Green) ๋ฌด์ค‘๋‹จ ๋ฐฐํฌ

๐Ÿ“Š ERD

Image

๐Ÿ“ˆ ์šด์˜ ํ˜„ํ™ฉ

๋ˆ„์  ๊ฐ€์ž…์ž  : 130๋ช…+
๋ฐฐํฌ ํ”Œ๋žซํผ  : App Store, Google Play
์šด์˜๊ธฐ๊ฐ„     : 2026.01 ~ ํ˜„์žฌ (3๊ฐœ์›”+)
ํ˜„์žฌ        : ๊ณ ๋„ํ™” ์ง„ํ–‰ ์ค‘

๐Ÿ’ก ์ด ํ”„๋กœ์ ํŠธ๋ฅผ ํ†ตํ•ด ์–ป์€ ๊ฒƒ

  • ์ตœ์‹  ๊ธฐ์ˆ  ์Šคํƒ ์‹ค์ „ ๊ฒฝํ—˜ โ€” ํ˜„์—…(Java 8)๊ณผ ๋‹ค๋ฅธ Spring Boot 3.x, Java 17 ํ™˜๊ฒฝ์„ ์‹ค๋ฌด ์ˆ˜์ค€์œผ๋กœ ๊ฒฝํ—˜
  • ํŒ€ ํ˜‘์—… ๊ฒฝํ—˜ โ€” PM, ๋””์ž์ด๋„ˆ, iOS, Android, ๋ฐฑ์—”๋“œ 7์ธ ํŒ€์—์„œ ํฌ๋กœ์Šค ํ”Œ๋žซํผ API ์„ค๊ณ„ ๋ฐ ์ฝ”๋“œ ๋ฆฌ๋ทฐ ๊ฒฝํ—˜
  • ์ „ ์‚ฌ์ดํด ๊ฒฝํ—˜ โ€” ์„ค๊ณ„, ๊ฐœ๋ฐœ, ๋ฐฐํฌ, ์šด์˜, ๊ณ ๋„ํ™”๊นŒ์ง€ ์ „์ฒด ๊ฐœ๋ฐœ ์ƒ๋ช…์ฃผ๊ธฐ ์ฐธ์—ฌ
  • ํŠธ๋ ˆ์ด๋“œ์˜คํ”„ ๊ธฐ๋ฐ˜ ์„ค๊ณ„ ํŒ๋‹จ โ€” ๋ฐ˜์ •๊ทœํ™” vs ์ปค๋ฒ„๋ง ์ธ๋ฑ์Šค ๋น„๊ต ๋ถ„์„ ํ›„ ์„œ๋น„์Šค ๊ทœ๋ชจ์— ๋งž๋Š” ๋ฐฉ๋ฒ• ์„ ํƒ
  • ํด๋ผ์šฐ๋“œ ์•„ํ‚คํ…์ฒ˜ โ€” ๋„ค์ด๋ฒ„ ํด๋ผ์šฐ๋“œ Object Storage, Presigned URL ๊ธฐ๋ฐ˜ ์—…๋กœ๋“œ ์„ค๊ณ„ ๊ฒฝํ—˜
  • ๋ฌด์ค‘๋‹จ ๋ฐฐํฌ โ€” ๋‹จ์ผ ์ธ์Šคํ„ด์Šค ํ™˜๊ฒฝ์—์„œ Nginx ํฌํŠธ ์Šค์œ„์นญ ๊ธฐ๋ฐ˜ ๋ธ”๋ฃจ๊ทธ๋ฆฐ ๋ฐฐํฌ ๊ตฌํ˜„
  • ๋ชจ๋‹ˆํ„ฐ๋ง ๊ตฌ์ถ• โ€” Prometheus + Grafana ๊ธฐ๋ฐ˜ ์‹ค์‹œ๊ฐ„ ์„œ๋ฒ„ ์ƒํƒœ ๋ชจ๋‹ˆํ„ฐ๋ง ๊ฒฝํ—˜
  • ์žฅ์•  ๋Œ€์‘ ๊ฒฝํ—˜ โ€” ์šด์˜ ์ค‘ SSL ์ธ์ฆ์„œ ์žฅ์•  ์ง์ ‘ ๋Œ€์‘ ๋ฐ ์žฌ๋ฐœ ๋ฐฉ์ง€ ์ฒด๊ณ„ ๊ตฌ์ถ•

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors