Skip to content

HeoJunHyoung/linkfolio-backend

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

340 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

๐Ÿ”— LinkFolio

๐Ÿง‘โ€๐Ÿ’ป ๊ฐœ๋ฐœ์ž๋ฅผ ์œ„ํ•œ ํฌํŠธํด๋ฆฌ์˜ค ๊ณต์œ  ๋ฐ ์ปค๋ฎค๋‹ˆํ‹ฐ ํ”Œ๋žซํผ

๐Ÿ“„ LinkFolio ๊ฐœ๋ฐœ ๋ณด๊ณ ์„œ (PDF) ๋ณด๊ธฐ

linkfolio

ย  ย 


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

"ํŒŒํŽธํ™”๋œ ๊ฐœ๋ฐœ์ž์˜ ๊ฒฝํ—˜์„ ํ•˜๋‚˜๋กœ, LinkFolio"

ํ˜„๋Œ€ ์ฑ„์šฉ ์‹œ์žฅ์—์„œ ๊ฐœ๋ฐœ์ž์˜ ์ด๋ ฅ์€ GitHub, ๊ธฐ์ˆ  ๋ธ”๋กœ๊ทธ, LinkedIn ๋“ฑ์œผ๋กœ ๋ถ„์‚ฐ๋˜์–ด ๊ด€๋ฆฌ์˜ ๋ฒˆ๊ฑฐ๋กœ์›€์ด ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. LinkFolio๋Š” ์ด๋Ÿฌํ•œ ์ •๋ณด์˜ ํŒŒํŽธํ™”(Fragmentation)๋ฅผ ํ•ด๊ฒฐํ•˜๊ณ , ๊ตฌ์ง์ž๊ฐ€ ์ž์‹ ์˜ ์ „๋ฌธ์„ฑ์„ ํšจ๊ณผ์ ์œผ๋กœ ์ฆ๋ช…ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋•๋Š” ํผ์Šค๋„ ๋ธŒ๋žœ๋”ฉ ๋ฐ ์ฑ„์šฉ ํ†ตํ•ฉ ๊ด€๋ฆฌ ํ”Œ๋žซํผ์ž…๋‹ˆ๋‹ค.

๋‹จ์ˆœํ•œ ๋งํฌ ๋ชจ์Œ(Link-in-Bio) ์„œ๋น„์Šค๋ฅผ ๋„˜์–ด, ํ”„๋กœ์ ํŠธ ๊ฒฝํ—˜๊ณผ ๊ธฐ์ˆ  ์Šคํƒ์„ ์‹œ๊ฐ์ ์œผ๋กœ ๊ตฌ์กฐํ™”ํ•˜์—ฌ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ๋˜ํ•œ, ๊ธฐ์—…๊ณผ ๊ตฌ์ง์ž๊ฐ€ ์ง์ ‘ ์†Œํ†ตํ•  ์ˆ˜ ์žˆ๋Š” ์‹ค์‹œ๊ฐ„ ์ฑ„ํŒ…๊ณผ ์ปค๋ฎค๋‹ˆํ‹ฐ ๊ธฐ๋Šฅ์„ ํ†ตํ•ด, ์ •์ ์ธ ์ด๋ ฅ์„œ ์ œ์ถœ ๋ฐฉ์‹์„ ๋„˜์–ด์„  ์–‘๋ฐฉํ–ฅ ์ฑ„์šฉ ์ƒํƒœ๊ณ„๋ฅผ ์ง€ํ–ฅํ•ฉ๋‹ˆ๋‹ค.


๐ŸŽฏ ์•ฑ ์ฃผ์š” ๊ธฐ๋Šฅ

1. ํฌํŠธํด๋ฆฌ์˜ค

ํฌํŠธํด๋ฆฌ์˜ค ๋ชฉ๋ก ์กฐํšŒ

ํฌํŠธํด๋ฆฌ์˜ค ๋ชฉ๋ก ์กฐํšŒ

ํฌํŠธํด๋ฆฌ์˜ค ์ƒ์„ธ ์กฐํšŒ

ํฌํŠธํด๋ฆฌ์˜ค ์ƒ์„ธ ์กฐํšŒ

  • ์ธ๊ธฐ ๊ฐœ๋ฐœ์ž ๋žญํ‚น: ๋‹จ์ˆœ ์กฐํšŒ์ˆ˜๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์ตœ์‹  ํŠธ๋ Œ๋“œ๋ฅผ ๋ฐ˜์˜ํ•˜๊ธฐ ์œ„ํ•ด Hacker News์˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๋ณ€ํ˜•ํ•œ '์ธ๊ธฐ ์ ์ˆ˜(Popularity Score)' ๋กœ์ง์„ ์ ์šฉํ•˜์—ฌ ๋ฉ”์ธ ํŽ˜์ด์ง€์— ๋…ธ์ถœํ•ฉ๋‹ˆ๋‹ค.
  • ํ•„ํ„ฐ๋ง: QueryDSL์„ ํ™œ์šฉํ•˜์—ฌ ์ง๊ตฐ(Frontend, Backend ๋“ฑ) ๋ฐ ๊ธฐ์ˆ  ์Šคํƒ๋ณ„ ๋™์  ํ•„ํ„ฐ๋ง์„ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค.

2. ์ปค๋ฎค๋‹ˆํ‹ฐ

๊ฒŒ์‹œ๊ธ€ ๋Œ“๊ธ€ ์ž‘์„ฑ

๊ฒŒ์‹œ๊ธ€ ๋Œ“๊ธ€ ์ž‘์„ฑ

๊ฒŒ์‹œ๊ธ€ ๋‹ต๋ณ€ ์ฑ„ํƒ

๊ฒŒ์‹œ๊ธ€ ๋‹ต๋ณ€ ์ฑ„ํƒ

์ปค๋ฎค๋‹ˆํ‹ฐ ๊ฒŒ์‹œ๊ธ€ ์ž‘์„ฑ

์ปค๋ฎค๋‹ˆํ‹ฐ ๊ฒŒ์‹œ๊ธ€ ์ž‘์„ฑ

ํŒ€์› ๋ชจ์ง‘ ์‹ ์ฒญ

ํŒ€์› ๋ชจ์ง‘ ์‹ ์ฒญ

  • ์นดํ…Œ๊ณ ๋ฆฌ๋ณ„ ๊ฒŒ์‹œํŒ: QnA(์งˆ๋ฌธ/๋‹ต๋ณ€), ์ •๋ณด ๊ณต์œ , ํŒ€์› ๋ชจ์ง‘ ๋“ฑ ๋ชฉ์ ์— ๋งž๋Š” ๊ฒŒ์‹œํŒ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. QnA ๊ฒŒ์‹œํŒ์€ ์งˆ๋ฌธ ํ•ด๊ฒฐ ์—ฌ๋ถ€(isSolved)์™€ ๋‹ต๋ณ€ ์ฑ„ํƒ ๊ธฐ๋Šฅ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.
  • ํŒ€์› ๋ชจ์ง‘ ํ”„๋กœ์„ธ์Šค: ์ž‘์„ฑ์ž๋Š” ์›ํด๋ฆญ์œผ๋กœ ๋ชจ์ง‘ ์ƒํƒœ(OPEN โ†” CLOSED)๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ง€์›์ž๋Š” ๊ฒŒ์‹œ๊ธ€ ๋‚ด์—์„œ ์ฆ‰์‹œ ์ž‘์„ฑ์ž์™€ 1:1 ์ฑ„ํŒ…์„ ์‹œ์ž‘ํ•˜์—ฌ ์ง€์›ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๊ณ„์ธตํ˜• ๋Œ“๊ธ€: ๋Œ€๋Œ“๊ธ€ ๊ตฌ์กฐ๋ฅผ ์ง€์›ํ•˜์—ฌ ์‚ฌ์šฉ์ž ๊ฐ„์˜ ๊นŠ์ด ์žˆ๋Š” ํ† ๋ก ๊ณผ ์†Œํ†ต์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

3. ์‹ค์‹œ๊ฐ„ 1:1 ์ฑ„ํŒ…

์ฑ„ํŒ…(1)

์ฑ„ํŒ… (1)

์ฑ„ํŒ…(2)

์ฑ„ํŒ… (2)

  • ์‹ค์‹œ๊ฐ„ ์†Œํ†ต: WebSocket๊ณผ STOMP ํ”„๋กœํ† ์ฝœ์„ ํ™œ์šฉํ•˜์—ฌ ์ง€์—ฐ ์—†๋Š” ๋Œ€ํ™” ํ™˜๊ฒฝ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. Redis Pub/Sub์„ ๋„์ž…ํ•˜์—ฌ ๋‹ค์ค‘ ์„œ๋ฒ„ ํ™˜๊ฒฝ์—์„œ๋„ ๋ฉ”์‹œ์ง€ ์ „์†ก์„ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค.
  • ์‚ฌ์šฉ์ž ๋™๊ธฐํ™”: ํƒ€ ์„œ๋น„์Šค์˜ ํ”„๋กœํ•„ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ Kafka CDC๋กœ ์‹ค์‹œ๊ฐ„ ๋™๊ธฐํ™”ํ•˜์—ฌ, ์ฑ„ํŒ… ๋ชฉ๋ก ์กฐํšŒ ์‹œ ๋ฐœ์ƒํ•˜๋Š” N+1 ๋ฌธ์ œ๋ฅผ ๊ทผ๋ณธ์ ์œผ๋กœ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค.

4. ๋งˆ์ดํŽ˜์ด์ง€

ํฌํŠธํด๋ฆฌ์˜ค ๊ด€๋ฆฌ

ํฌํŠธํด๋ฆฌ์˜ค ๊ด€๋ฆฌ

์ปค๋ฎค๋‹ˆํ‹ฐ ๊ด€๋ฆฌ

์ปค๋ฎค๋‹ˆํ‹ฐ ๊ด€๋ฆฌ

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

5. ๊ณ ๊ฐ์„ผํ„ฐ

๊ณต์ง€์‚ฌํ•ญ

๊ณต์ง€์‚ฌํ•ญ (USER)

FAQ

FAQ (USER)

๊ณต์ง€์‚ฌํ•ญ

๊ณต์ง€์‚ฌํ•ญ (ADMIN)

FAQ

FAQ (ADMIN)

  • ๊ณต์ง€์‚ฌํ•ญ ๋ฐ FAQ: ์„œ๋น„์Šค ์ด์šฉ์— ํ•„์š”ํ•œ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ฝ๊ธฐ ์š”์ฒญ์ด ๋งŽ์€ ํŠน์„ฑ์„ ๊ณ ๋ คํ•˜์—ฌ Redis Caching์„ ์ ๊ทน์ ์œผ๋กœ ํ™œ์šฉ, ์กฐํšŒ ์„ฑ๋Šฅ์„ ๊ทน๋Œ€ํ™”ํ–ˆ์Šต๋‹ˆ๋‹ค.
  • ๊ด€๋ฆฌ์ž ๊ธฐ๋Šฅ: ๊ด€๋ฆฌ์ž(Admin) ๊ถŒํ•œ์„ ๊ฐ€์ง„ ์‚ฌ์šฉ์ž๋งŒ์ด ๊ณต์ง€์‚ฌํ•ญ์„ ์ž‘์„ฑ ๋ฐ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ถŒํ•œ์„ ๋ถ„๋ฆฌํ–ˆ์Šต๋‹ˆ๋‹ค.

6. ํšŒ์›๊ฐ€์ž… ๋ฐ ๊ณ„์ • ๊ด€๋ฆฌ (Authentication)

๋กœ๊ทธ์ธ

๋กœ๊ทธ์ธ

์ด๋ฉ”์ผ ์ธ์ฆ

์ธ์ฆ์ฝ”๋“œ

๋กœ๊ทธ์ธ

์•„์ด๋”” ์ฐพ๊ธฐ

์ด๋ฉ”์ผ ์ธ์ฆ

๋น„๋ฐ€๋ฒˆํ˜ธ ์ฐพ๊ธฐ

  • ์ž์ฒด ํšŒ์›๊ฐ€์ž…(์ด๋ฉ”์ผ ์ธ์ฆ ๊ธฐ๋ฐ˜): ์‚ฌ์šฉ์ž๋Š” ์ด๋ฉ”์ผ ์ธ์ฆ(SMTP)์„ ๊ฑฐ์ณ ์•ˆ์ „ํ•˜๊ฒŒ ๊ณ„์ •์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. Redis๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์ธ์ฆ ์ฝ”๋“œ์˜ ์œ ํšจ ์‹œ๊ฐ„์„ ์—„๊ฒฉํ•˜๊ฒŒ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
  • ์†Œ์…œ ๋กœ๊ทธ์ธ: ์‚ฌ์šฉ์ž๋Š” ์นด์นด์˜ค, ๋„ค์ด๋ฒ„, ๊ตฌ๊ธ€์„ ํ†ตํ•ด ์†Œ์…œ ๋กœ๊ทธ์ธ์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๊ณ„์ • ์ฐพ๊ธฐ: ์‹ค๋ช…๊ณผ ์ด๋ฉ”์ผ ๊ฒ€์ฆ์„ ํ†ตํ•ด ์žŠ์–ด๋ฒ„๋ฆฐ ์•„์ด๋””๋ฅผ ์ฐพ๊ฑฐ๋‚˜, ์ž„์‹œ ๋น„๋ฐ€๋ฒˆํ˜ธ ๋ฐœ๊ธ‰ ๋Œ€์‹  ์•ˆ์ „ํ•˜๊ฒŒ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์žฌ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋Š” ํ”„๋กœ์„ธ์Šค๋ฅผ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค.

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

LinkFolio๋Š” On-Premise Kubernetes ํ™˜๊ฒฝ๊ณผ ์™ธ๋ถ€ ๋ฉ”์‹œ์ง• ์ธํ”„๋ผ๊ฐ€ ๊ฒฐํ•ฉ๋œ ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ์•„ํ‚คํ…์ฒ˜๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

System Architecture Diagram

๐ŸŒ ์ธํ”„๋ผ ์„ค๊ณ„ ๋ฐ ๋ฐฐํฌ ์ „๋žต (Infrastructure & Deployment)

1. Hybrid Cloud Topology

์‹œ์Šคํ…œ์˜ ์•ˆ์ •์„ฑ๊ณผ ๋ฆฌ์†Œ์Šค ํšจ์œจ์„ฑ์„ ์œ„ํ•ด Kubernetes ํด๋Ÿฌ์Šคํ„ฐ์™€ ๋ฉ”์‹œ์ง• ์‹œ์Šคํ…œ์„ ๋ฌผ๋ฆฌ์ ์œผ๋กœ ๋ถ„๋ฆฌํ•˜์—ฌ ๊ตฌ์ถ•ํ–ˆ์Šต๋‹ˆ๋‹ค.

  • Kubernetes Cluster (Self-Hosted On-Premise)
    • VirtualBox VM ์œ„์— 3๊ฐœ์˜ ๋…ธ๋“œ(1 Master, 2 Worker)๋กœ ๊ตฌ์„ฑ๋œ ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ์ง์ ‘ ๊ตฌ์ถ•ํ•˜์—ฌ ์šด์˜ํ•ฉ๋‹ˆ๋‹ค.
    • ๋ชจ๋“  ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค์™€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ์ด๊ณณ์—์„œ ๊ตฌ๋™๋˜๋ฉฐ, NodePort๋ฅผ ํ†ตํ•ด ์™ธ๋ถ€ ๋„คํŠธ์›Œํฌ(Kafka VM)์™€ ํ†ต์‹ ํ•ฉ๋‹ˆ๋‹ค.
  • External Messaging Server (Ubuntu VM)
    • Kafka, Zookeeper, Kafka Connect ๋“ฑ ์ด๋ฒคํŠธ ๋ธŒ๋กœ์ปค ์ƒํƒœ๊ณ„๊ฐ€ ๋…๋ฆฝ๋œ ํ™˜๊ฒฝ์—์„œ ์šด์˜๋ฉ๋‹ˆ๋‹ค.
    • K8s ๋ฆฌ์†Œ์Šค ๋ถ€ํ•˜์™€ ๊ฒฉ๋ฆฌ๋œ ํ™˜๊ฒฝ์—์„œ ์•ˆ์ •์ ์ธ ๋ฉ”์‹œ์ง€ ์ฒ˜๋ฆฌ๋ฅผ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค.

2. GitOps Workflow (ArgoCD)

  • ArgoCD๊ฐ€ Manifest ๋ฆฌํฌ์ง€ํ† ๋ฆฌ(linkfolio-manifest)๋ฅผ ๊ฐ์‹œํ•˜๋ฉฐ, ๋ณ€๊ฒฝ ์‚ฌํ•ญ ๋ฐœ์ƒ ์‹œ Kubernetes ํด๋Ÿฌ์Šคํ„ฐ์˜ ์ƒํƒœ๋ฅผ ์ž๋™์œผ๋กœ ๋™๊ธฐํ™”(Sync)ํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ’ป ์ธํ”„๋ผ ์„ค๊ณ„ ์ƒ์„ธ (Infrastructure Details)

์šด์˜ ํ™˜๊ฒฝ์— ๋Œ€ํ•œ ๊นŠ์€ ์ดํ•ด๋ฅผ ์œ„ํ•ด ๊ด€๋ฆฌํ˜• ๋„๊ตฌ(Minikube ๋“ฑ)๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ , VirtualBox VM ๊ธฐ๋ฐ˜์˜ 3-Node ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ๊ตฌ์ถ•ํ–ˆ์Šต๋‹ˆ๋‹ค.

ํ•ญ๋ชฉ ๊ตฌ์„ฑ ๋‚ด์šฉ ๋น„๊ณ 
OS / Environment Ubuntu 22.04 LTS (VirtualBox) 1 Master + 2 Worker Nodes
Provisioning Kubeadm, Kubelet, Kubectl ํด๋Ÿฌ์Šคํ„ฐ ์ˆ˜๋™ ํ”„๋กœ๋น„์ €๋‹
Container Runtime Containerd Docker Shim ์ œ๊ฑฐ ํŠธ๋ Œ๋“œ ๋ฐ˜์˜ (CRI ํ‘œ์ค€ ์ค€์ˆ˜)
Network (CNI) Calico Pod ๋„คํŠธ์›Œํฌ ํ†ต์‹  ๋ฐ ์ •์ฑ… ๊ด€๋ฆฌ
Node Spec 2GB RAM, 1 vCPU per Node Swap ๋น„ํ™œ์„ฑํ™” ๋ฐ Kernel ํŒŒ๋ผ๋ฏธํ„ฐ ํŠœ๋‹

๐Ÿ‘‰ [Blog] VirtualBox ๊ธฐ๋ฐ˜ On-Premise Kubernetes 3-Node ํด๋Ÿฌ์Šคํ„ฐ ๊ตฌ์ถ• ๊ณผ์ • ์ƒ์„ธ ๋ณด๊ธฐ

โšก๏ธ Messaging Infrastructure

๋ฐ์ดํ„ฐ ํŒŒ์ดํ”„๋ผ์ธ์˜ ์•ˆ์ •์„ฑ์„ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ปดํฌ๋„ŒํŠธ๋“ค์„ ๊ตฌ์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.

Component Role
Apache Kafka โ€ข ์ด๋ฒคํŠธ ๋ธŒ๋กœ์ปค (Topic ํŒŒํ‹ฐ์…”๋‹์„ ํ†ตํ•œ ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ)
Kafka Connect โ€ข DB์™€ Kafka ๊ฐ„์˜ ๋ฐ์ดํ„ฐ ํŒŒ์ดํ”„๋ผ์ธ ๊ตฌ์ถ• (Source Connector)
Schema Registry โ€ข Avro Serialization์„ ํ†ตํ•œ ์Šคํ‚ค๋งˆ ๊ฒ€์ฆ ๋ฐ ๋ฐ์ดํ„ฐ ํƒ€์ž… ์•ˆ์ •์„ฑ ๋ณด์žฅ
Debezium โ€ข MySQL Binlog๋ฅผ ๊ฐ์ง€ํ•˜์—ฌ ์‹ค์‹œ๊ฐ„ ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ ์‚ฌํ•ญ ์บก์ฒ˜ (CDC)

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

Category Technology
Frontend Next.js Node.js HTML5 CSS3 JavaScript
Backend Java Spring Boot Spring Cloud Spring Security QueryDSL WebSocket
Database MySQL MongoDB Redis
Messaging Apache Kafka Debezium Avro
Infra & DevOps Kubernetes Docker Ubuntu GitHub Actions ArgoCD
Monitoring Prometheus Grafana k6
Tools IntelliJ IDEA VS Code Swagger Git

๐Ÿš€ ๊ณ ๋„ํ™” ๊ตฌํ˜„ ๊ธฐ์ˆ 

๋ณธ ํ”„๋กœ์ ํŠธ์˜ ์ฃผ์š” ๊ณ ๋„ํ™” ๊ตฌํ˜„ ๊ธฐ์ˆ ์„ ์š”์•ฝํ•ฉ๋‹ˆ๋‹ค. ์ƒ์„ธ ์„ค๊ณ„ ๋ฐ ๊ตฌํ˜„ ๋‚ด์šฉ์€ ์•„๋ž˜์— ์žˆ๋Š” '์„œ๋น„์Šค ๊ตฌ์„ฑ ๋ฐ ์ƒ์„ธ ๋ฌธ์„œ'๋ฅผ ํ™•์ธํ•ด์ฃผ์„ธ์š”.

1. Kafka & Debezium ๊ธฐ๋ฐ˜์˜ Event-Driven Architecture

  • ๋ฌธ์ œ: ์„œ๋น„์Šค ๊ฐ„ ๊ฐ•ํ•œ ๊ฒฐํ•ฉ๋„์™€ ๋ฐ์ดํ„ฐ ๋ถˆ์ผ์น˜, ๊ทธ๋ฆฌ๊ณ  'Dual Write' ๋ฌธ์ œ.
  • ํ•ด๊ฒฐ: DB ํŠธ๋žœ์žญ์…˜ ๋กœ๊ทธ๋ฅผ ๊ฐ์ง€ํ•˜๋Š” Debezium(CDC) ์„ ๋„์ž…ํ•˜์—ฌ ๋ฐ์ดํ„ฐ ํŒŒ์ดํ”„๋ผ์ธ์„ ๊ตฌ์ถ•.
    • CDC Pattern (user-profile-connector): User Service์˜ ํ”„๋กœํ•„ ๋ณ€๊ฒฝ ์‚ฌํ•ญ(Update)์„ ์‹ค์‹œ๊ฐ„์œผ๋กœ ๊ฐ์ง€ํ•˜์—ฌ Chat, Portfolio ์„œ๋น„์Šค๋กœ ์ž๋™ ์ „ํŒŒ.
  • ํšจ๊ณผ: Feign Client ํ˜ธ์ถœ ์ œ๊ฑฐ๋ฅผ ํ†ตํ•œ ์žฅ์•  ๊ฒฉ๋ฆฌ ๋ฐ ์„œ๋น„์Šค ๊ฐ„ ๊ฒฐํ•ฉ๋„ ์ตœ์†Œํ™”.

2. Split Caching Strategy (Portfolio Service)

  • ๋ฌธ์ œ: ํฌํŠธํด๋ฆฌ์˜ค ์ƒ์„ธ ์กฐํšŒ ์‹œ ๋นˆ๋ฒˆํ•œ DB ๋ถ€ํ•˜ ๋ฐœ์ƒ.
  • ํ•ด๊ฒฐ: ๋ณ€๊ฒฝ ์ฃผ๊ธฐ๊ฐ€ ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ๋ฅผ ๋ถ„๋ฆฌํ•˜์—ฌ ์บ์‹ฑ.
    • ์ •์  ๋ฐ์ดํ„ฐ(๋ณธ๋ฌธ): Redis Cache-Aside ํŒจํ„ด (TTL 1์‹œ๊ฐ„)
    • ๋™์  ๋ฐ์ดํ„ฐ(์กฐํšŒ์ˆ˜/์ข‹์•„์š”): Redis Write-Back ํŒจํ„ด (์‹ค์‹œ๊ฐ„ ์ธ๋ฉ”๋ชจ๋ฆฌ ์—ฐ์‚ฐ ํ›„ ๋ฐฐ์น˜ ๋™๊ธฐํ™”)
  • ์„ฑ๊ณผ: ์ƒ์„ธ ์กฐํšŒ ์„ฑ๋Šฅ ์ตœ์ ํ™” ๋ฐ DB Write Lock ์ตœ์†Œํ™”.

3. ๋Œ€๊ทœ๋ชจ ์‹ค์‹œ๊ฐ„ ์ฑ„ํŒ… ์‹œ์Šคํ…œ (Chat Service)

  • ๊ตฌ์กฐ: WebSocket + STOMP + Redis Pub/Sub + MongoDB
  • ํŠน์ง•:
    • Gateway์—์„œ ๊ฒ€์ฆ๋œ X-User-Id๋ฅผ WebSocket Handshake ๋‹จ๊ณ„์—์„œ ๊ฐ€๋กœ์ฑ„์–ด ์„ธ์…˜์— ์ฃผ์ž…, ์™„๋ฒฝํ•œ ์ธ์ฆ ์ฒ˜๋ฆฌ.
    • Redis Pub/Sub์„ ํ†ตํ•ด Scale-out ๋œ ์„œ๋ฒ„ ํ™˜๊ฒฝ์—์„œ๋„ ๋ฉ”์‹œ์ง€ ์‹ค์‹œ๊ฐ„ ์ „์†ก ๋ณด์žฅ.
    • ์‚ฌ์šฉ์ž ํ”„๋กœํ•„์„ ๋กœ์ปฌ MongoDB(chat_user_profile)์— ์บ์‹ฑํ•˜์—ฌ ๋ชฉ๋ก ์กฐํšŒ ์‹œ N+1 ๋ฌธ์ œ ํ•ด๊ฒฐ.

4. SAGA ํŒจํ„ด์„ ์ด์šฉํ•œ ๋ถ„์‚ฐ ํŠธ๋žœ์žญ์…˜

  • ์‹œ๋‚˜๋ฆฌ์˜ค: ํšŒ์›๊ฐ€์ž… ์‹œ Auth DB(๊ณ„์ •)์™€ User DB(ํ”„๋กœํ•„)์˜ ์›์ž์„ฑ ๋ณด์žฅ ํ•„์š”.
  • ํ•ด๊ฒฐ: Transactional Outbox Pattern์„ ์ ์šฉํ•œ Orchestration ๊ธฐ๋ฐ˜ SAGA ๊ตฌํ˜„.
    1. Event Router (auth-outbox-connector): ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์—์„œ outbox ํ…Œ์ด๋ธ”์— ์ด๋ฒคํŠธ๋ฅผ ๊ธฐ๋กํ•˜๋ฉด, Debezium์ด ์ด๋ฅผ ๊ฐ์ง€ํ•˜์—ฌ outbox.event.{EventType} ํ† ํ”ฝ์œผ๋กœ ๋ผ์šฐํŒ….
    2. Flow: Auth Service(Pending) โ†’ Kafka โ†’ User Service(Create) โ†’ Kafka โ†’ Auth Service(Completed/Cancelled).
  • ํšจ๊ณผ: ๋ถ„์‚ฐ ํ™˜๊ฒฝ์—์„œ์˜ ๋ฐ์ดํ„ฐ ์ผ๊ด€์„ฑ ๋ณด์žฅ ๋ฐ ๋ณด์ƒ ํŠธ๋žœ์žญ์…˜ ์ฒ˜๋ฆฌ.

์„œ๋น„์Šค ๊ตฌ์„ฑ ๋ฐ ์ƒ์„ธ ๋ฌธ์„œ

์„œ๋น„์Šค ๋ช… ์—ญํ•  ๋ฐ ์ฃผ์š” ๊ธฐ์ˆ  ์ƒ์„ธ ๋ฌธ์„œ
API Gateway โ€ข ์ง„์ž…์  ๊ด€๋ฆฌ, ๋ผ์šฐํŒ…, JWT ์ธ์ฆ/์ธ๊ฐ€ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Auth Service โ€ข ๋กœ๊ทธ์ธ(OAuth2/Local), ํ† ํฐ ๊ด€๋ฆฌ, SAGA ์ฃผ๊ด€ ๋ฐ”๋กœ๊ฐ€๊ธฐ
User Service โ€ข ์‚ฌ์šฉ์ž ํ”„๋กœํ•„ ๊ด€๋ฆฌ, SAGA ์ฐธ์—ฌ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Portfolio Service โ€ข ํฌํŠธํด๋ฆฌ์˜ค ๊ด€๋ฆฌ, Split Caching ์ ์šฉ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Community Service โ€ข ๊ฒŒ์‹œํŒ/๋Œ“๊ธ€ ๊ด€๋ฆฌ, Redis Batch ์ฒ˜๋ฆฌ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Chat Service โ€ข ์‹ค์‹œ๊ฐ„ ์ฑ„ํŒ… (WebSocket + Redis Pub/Sub) ๋ฐ”๋กœ๊ฐ€๊ธฐ
Support Service โ€ข ๊ณต์ง€์‚ฌํ•ญ/FAQ ๊ด€๋ฆฌ (Read-Heavy ์บ์‹ฑ) ๋ฐ”๋กœ๊ฐ€๊ธฐ
Common Module โ€ข ๊ณตํ†ต DTO, ์˜ˆ์™ธ ์ฒ˜๋ฆฌ, ์œ ํ‹ธ๋ฆฌํ‹ฐ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๐Ÿ“Š ํ…Œ์ŠคํŠธ ๋ฐ ์„ฑ๋Šฅ ๊ฐœ์„ 

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

System Architecture Diagram

ํ†ตํ•ฉ ์„ฑ๋Šฅ ๊ฐœ์„  ์š”์•ฝํ‘œ

์„œ๋น„์Šค ์ง€ํ‘œ Before After ๊ฐœ์„  ํšจ๊ณผ
User Service ํ‰๊ท  ์‘๋‹ต์‹œ๊ฐ„ (ms) 2287.37 1040.11 โ–ผ 54.5% ๊ฐ์†Œ
์ฒ˜๋ฆฌ๋Ÿ‰ (TPS) 6.78 10.90 โ–ฒ 60.7% ์ฆ๊ฐ€
์˜ค๋ฅ˜์œจ (%) 0.36 0.00 โ–ผ 100% ๊ฐ์†Œ
Portfolio Service ํ‰๊ท  ์‘๋‹ต์‹œ๊ฐ„ (ms) 210.08 385.60 โ–ฒ 83.5% ์ฆ๊ฐ€
์ฒ˜๋ฆฌ๋Ÿ‰ (TPS) 15.81 14.56 โ–ผ 7.8% ๊ฐ์†Œ
์˜ค๋ฅ˜์œจ (%) 58.62 0.04 โ–ผ 99.9% ๊ฐ์†Œ
Community Service ํ‰๊ท  ์‘๋‹ต์‹œ๊ฐ„ (ms) 1796.24 656.58 โ–ผ 63.4% ๊ฐ์†Œ
์ฒ˜๋ฆฌ๋Ÿ‰ (TPS) 12.13 12.62 โ–ฒ 4.0% ์ฆ๊ฐ€
์˜ค๋ฅ˜์œจ (%) 12.13 0.00 โ–ผ 100% ๊ฐ์†Œ
Support Service ํ‰๊ท  ์‘๋‹ต์‹œ๊ฐ„ (ms) 2579.43 1043.60 โ–ผ 59.5% ๊ฐ์†Œ
์ฒ˜๋ฆฌ๋Ÿ‰ (TPS) 12.65 22.04 โ–ฒ 74.2% ์ฆ๊ฐ€
์˜ค๋ฅ˜์œจ (%) 0.00 0.00 โ–  ๋ณ€ํ™” ์—†์Œ

๐Ÿ’ก Note (Portfolio Service): ํ‰๊ท  ์‘๋‹ต ์‹œ๊ฐ„์˜ ์ฆ๊ฐ€๋Š” ์‹œ์Šคํ…œ ์•ˆ์ •ํ™”์— ๋”ฐ๋ฅธ Trade-off์ž…๋‹ˆ๋‹ค. ๊ฐœ์„  ์ „(Before)์—๋Š” 58%์˜ ์š”์ฒญ์ด ์ฆ‰์‹œ ์˜ค๋ฅ˜๋ฅผ ๋ฐ˜ํ™˜(Fail-fast)ํ•˜์—ฌ ์‹œ๊ฐ„์ด ์งง๊ฒŒ ์ธก์ •๋˜์—ˆ์œผ๋‚˜, ๊ฐœ์„  ํ›„(After)์—๋Š” ์ •์ƒ์ ์ธ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง(์บ์‹ฑ ๋ฐ DB ์กฐํšŒ)์„ ์ˆ˜ํ–‰ํ•˜๊ฒŒ ๋˜์–ด ์‹ค์ œ ์ฒ˜๋ฆฌ ์‹œ๊ฐ„์ด ๋ฐ˜์˜๋œ ๊ฒฐ๊ณผ์ž…๋‹ˆ๋‹ค.

์ƒ์„ธ ๋ถ„์„ ๋ณด๊ณ ์„œ

์ฃผ์ œ ๋ถ„์„ ๋‚ด์šฉ ์š”์•ฝ ์ƒ์„ธ ๋ฌธ์„œ
User Service โ€ข DB Lock ํ•ด์†Œ: ํ”„๋กœํ•„ ์ˆ˜์ • ํŠธ๋žœ์žญ์…˜ ์ตœ์ ํ™” ๋ฐ ์ปค๋„ฅ์…˜ ํ’€ ํŠœ๋‹ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Portfolio Service โ€ข Split Caching ํšจ๊ณผ: ์ •์ /๋™์  ๋ฐ์ดํ„ฐ ๋ถ„๋ฆฌ ์บ์‹ฑ ์ „๋žต์˜ Trade-off ๋ถ„์„ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Community Service โ€ข ์กฐํšŒ์ˆ˜ ๋™๊ธฐํ™”: Redis HyperLogLog ๋ฐ ๋ฐฐ์น˜ ์ฒ˜๋ฆฌ๋ฅผ ํ†ตํ•œ DB ๋ถ€ํ•˜ ๊ฐ์†Œ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Support Service โ€ข Read-Heavy ์ตœ์ ํ™”: @Cacheable ์ „๋žต๊ณผ ์บ์‹œ ๋งŒ๋ฃŒ ์ •์ฑ…(TTL) ํŠœ๋‹ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๐Ÿ”ฅ ํŠธ๋Ÿฌ๋ธ” ์ŠˆํŒ… (Troubleshooting)

๊ฐœ๋ฐœ ๊ณผ์ •์—์„œ ๋งˆ์ฃผ์นœ ์ฃผ์š” ๊ธฐ์ˆ ์  ๋‚œ๊ด€๊ณผ ์ด๋ฅผ ํ•ด๊ฒฐํ•œ ์ž์„ธํ•œ ๊ณผ์ •์€ ์•„๋ž˜ 'ํŠธ๋Ÿฌ๋ธ” ์ŠˆํŒ… ๋ฌธ์„œ'๋ฅผ ์ฐธ๊ณ ํ•ด์ฃผ์„ธ์š”.

ํŠธ๋Ÿฌ๋ธ” ์ŠˆํŒ… ๋ฌธ์„œ

์ฃผ์ œ ์ด์Šˆ ๋ฐ ํ•ด๊ฒฐ ์š”์•ฝ ์ƒ์„ธ ๋ฌธ์„œ
API Gateway โ€ข JWT ๋ฒ„์ „ ๋ถˆ์ผ์น˜: ์„œ๋น„์Šค ๊ฐ„ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ฒ„์ „ ์ฐจ์ด๋กœ ์ธํ•œ ์ธ์ฆ ์‹คํŒจ ํ•ด๊ฒฐ ๋ฐ”๋กœ๊ฐ€๊ธฐ
OAuth2 / Redis โ€ข ์ง๋ ฌํ™” ์ด์Šˆ: OAuth2 ์ธ์ฆ ๊ฐ์ฒด์˜ Redis ์ €์žฅ ์‹œ ์—ญ์ง๋ ฌํ™” ์‹คํŒจ ํ•ด๊ฒฐ ๋ฐ”๋กœ๊ฐ€๊ธฐ
QueryDSL โ€ข ๋ฉ€ํ‹ฐ ๋ชจ๋“ˆ ์ƒ์†: ๊ณตํ†ต ๋ชจ๋“ˆ(BaseEntity)์˜ ์ƒ์† ํ•„๋“œ ๋ฏธ์ธ์‹ ๋ฌธ์ œ ํ•ด๊ฒฐ ๋ฐ”๋กœ๊ฐ€๊ธฐ
WebSocket โ€ข ๋ณด์•ˆ ์ปจํ…์ŠคํŠธ: STOMP ์—ฐ๊ฒฐ ์‹œ ์ธ์ฆ ๊ฐ์ฒด(Principal) ์œ ์‹ค ๋ฌธ์ œ ํ•ด๊ฒฐ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Redis Cache โ€ข Page ๊ฐ์ฒด ์บ์‹ฑ: Page<T> ์ง๋ ฌํ™” ์‹œ ClassCastException ํ•ด๊ฒฐ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Dependency โ€ข ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ถฉ๋Œ: Swagger์™€ Kafka Avro Serializer ๊ฐ„ ์˜์กด์„ฑ ์ถฉ๋Œ ํ•ด๊ฒฐ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๐Ÿ‘ฅ ํŒ€์› ๊ตฌ์„ฑ ๋ฐ ์—ญํ• 


ํ—ˆ์ค€ํ˜•


๋ฐ•์„ฑํ˜„


๐Ÿ›  Architecture & DevOps
- MSA ํ™˜๊ฒฝ ๊ตฌ์ถ• ๋ฐ ์‹œ์Šคํ…œ ์•„ํ‚คํ…์ฒ˜ ์„ค๊ณ„
- On-Premise Kubernetes ํด๋Ÿฌ์Šคํ„ฐ ๊ตฌ์ถ•
- GitHub Actions & ArgoCD ๊ธฐ๋ฐ˜ GitOps ๊ตฌํ˜„

๐Ÿ’ป Backend Development
- Kafka ๊ธฐ๋ฐ˜ Event-Driven ๋ฐ์ดํ„ฐ ๋™๊ธฐํ™” ์ฒ˜๋ฆฌ
- Polyglot Persistence (MySQL, MongoDB, Redis) ์„ค๊ณ„

๐ŸŽจ Frontend Development
- Next.js ๊ธฐ๋ฐ˜ ์›น ํด๋ผ์ด์–ธํŠธ ์•„ํ‚คํ…์ฒ˜ ์„ค๊ณ„
- ์ „์—ญ ์ƒํƒœ ๊ด€๋ฆฌ ๋ฐ ๋ Œ๋”๋ง ์ตœ์ ํ™” (SSR/CSR)
- WebSocket ํด๋ผ์ด์–ธํŠธ ์—ฐ๋™ ๋ฐ ์‹ค์‹œ๊ฐ„ ์ฒ˜๋ฆฌ

โœจ UI/UX Design
- ์‚ฌ์šฉ์ž ์ค‘์‹ฌ ์„œ๋น„์Šค ํ”Œ๋กœ์šฐ ๋ฐ ์ธํ„ฐํŽ˜์ด์Šค ์„ค๊ณ„
- ๋ฐ˜์‘ํ˜• ์›น ๋””์ž์ธ ๋ฐ ์ธํ„ฐ๋ž™ํ‹ฐ๋ธŒ ์ปดํฌ๋„ŒํŠธ ๊ฐœ๋ฐœ

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors