Skip to content

Latest commit

ย 

History

35 Commits

Folders and files

NameName
Last commit message
Last commit date
ย 
ย 
ย 
ย 

Repository files navigation

๋ฌธ์ œ ์ค‘์‹ฌ์œผ๋กœ ์‚ฌ๊ณ ํ•˜๋Š” ๊ฐœ๋ฐœ์ž

ํ‘œ๋ฉด์  ํ•ด๊ฒฐ๋ณด๋‹ค ๊ทผ๋ณธ ์›์ธ์„ ๋จผ์ € ์ฐพ๊ณ , ์—ฌ๋Ÿฌ ๋Œ€์•ˆ์„ ๋น„๊ตํ•ด ๊ทผ๊ฑฐ ์œ„์—์„œ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค.
๋™์‹œ์„ฑ ยท ๊ฒ€์ƒ‰ ยท LLM ๋น„์šฉ์ฒ˜๋Ÿผ ์กฐ์šฉํžˆ ํ‹€๋ฆฌ๋Š” ๋ฌธ์ œ๋ฅผ ์ˆ˜์น˜๋กœ ํ™•์ธํ•˜๊ณ  ๊ตฌ์กฐ๋กœ ๋ง‰์Šต๋‹ˆ๋‹ค.


PDF ย  PPTX


ย ๐Ÿ‘คย  About

Note

๊ฐ•๋‚จ๋Œ€ํ•™๊ต ์†Œํ”„ํŠธ์›จ์–ด์ „๊ณต ์กธ์—… ยท ํ•œํ™”์‹œ์Šคํ…œ Beyond SW Camp ์ˆ˜๋ฃŒ

๐Ÿ”ฌ

๋ฌธ์ œ๋ฅผ ๋จผ์ € ์žฌํ˜„ํ•ฉ๋‹ˆ๋‹ค

๋ถ€ํ•˜ ํ…Œ์ŠคํŠธ๋กœ ์žฌํ˜„๋˜์ง€ ์•Š์€ ๋ฌธ์ œ๋Š” ๊ณ ์ณค๋Š”์ง€ ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์žฌ๊ณ  ์ค‘๋ณต ์ฐจ๊ฐ(์—๋Ÿฌ์œจ 75%)๋„ ์—ฌ๊ธฐ์„œ ๋“œ๋Ÿฌ๋‚ฌ์Šต๋‹ˆ๋‹ค.

๐Ÿงฑ

๊ณ„์ธต๋ณ„๋กœ ์ฑ…์ž„์„ ๋‚˜๋ˆ•๋‹ˆ๋‹ค

ํ•˜๋‚˜์˜ ์ˆ˜๋‹จ์œผ๋กœ ๋ง‰์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ž…๊ตฌ(Redis) ยท ์ฒ˜๋ฆฌ(Kafka) ยท ์ €์žฅ(DB Lock)์ด ๊ฐ๊ฐ ๋ฌด์—‡์„ ์ฑ…์ž„์ง€๋Š”์ง€ ๋ช…ํ™•ํžˆ ํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ—‚๏ธ

๊ธฐ๊ฐํ•œ ๋Œ€์•ˆ๊นŒ์ง€ ๋‚จ๊น๋‹ˆ๋‹ค

๋ฌด์—‡์„ ์„ ํƒํ–ˆ๋Š”์ง€๋ณด๋‹ค ๋ฌด์—‡์„ ์™œ ๋ฒ„๋ ธ๋Š”์ง€๊ฐ€ ๋‹ค์Œ ์‚ฌ๋žŒ์—๊ฒŒ ๋” ์“ธ๋ชจ ์žˆ์Šต๋‹ˆ๋‹ค.


ย  Briefly ย 

ํŒ€ ๋‹จ์œ„ AI ๋ฌธ์„œ ๋ถ„์„ ์›Œํฌ์ŠคํŽ˜์ด์Šค

๋ฌธ์„œ๋ฅผ ์—…๋กœ๋“œํ•˜๋ฉด ์š”์•ฝ ยท ์•ก์…˜ ์•„์ดํ…œ์„ ์ถ”์ถœํ•˜๊ณ , RAG๋กœ ๋ฌธ์„œ์— ์ง์ ‘ ์งˆ๋ฌธํ•ฉ๋‹ˆ๋‹ค. ํŒ€ = ํ…Œ๋„ŒํŠธ ๊ตฌ์กฐ์˜ ๋ฉ€ํ‹ฐํ…Œ๋„Œ์‹œ B2B ์„œ๋น„์Šค.

๊ธฐ๊ฐ„2026.06 โ€“ ์ง„ํ–‰ ์ค‘
์ธ์›1์ธ ยท ๊ธฐํš ยท ์„ค๊ณ„ ยท ๊ฐœ๋ฐœ ยท ์ธํ”„๋ผ
์Šคํƒ

Spring Spring AI pgvector Redis MinIO React

ํ˜„ํ™ฉ์ธ์ฆ ยท ํŒ€ ์ดˆ๋Œ€ ยท ๋ฌธ์„œ ์—…๋กœ๋“œ ยท ์ธ๋ฑ์‹ฑ ํŒŒ์ดํ”„๋ผ์ธ ์™„๋ฃŒ

Tests ย  Tenancy


ย ๐Ÿ’กย  ํ•ต์‹ฌ ๋ฌธ์ œ

๐Ÿ” ๋ฒกํ„ฐ ๊ฒ€์ƒ‰์€ @Filter๊ฐ€ ๋‹ฟ์ง€ ์•Š๋Š”๋‹ค

Hibernate @Filter๋Š” JPA ๊ฒฝ๋กœ๋งŒ ๊ฑฐ๋ฆ…๋‹ˆ๋‹ค. ๋ฒกํ„ฐ ๊ฒ€์ƒ‰์€ ๋„ค์ดํ‹ฐ๋ธŒ SQL์ด๋ผ ํ•„ํ„ฐ๋ฅผ ๊ทธ๋ƒฅ ํ†ต๊ณผํ•ฉ๋‹ˆ๋‹ค. ์ด ํ”„๋กœ์ ํŠธ์˜ ์ตœ๋Œ€ ์œ ์ถœ ์ง€์ ์ž…๋‹ˆ๋‹ค.

๋ฆฌํฌ์ง€ํ† ๋ฆฌ ยท @Filter ยท SQL ์„ ํ•„ํ„ฐ

๐Ÿงช ๋ณด์•ˆ ์žฅ์น˜๋Š” ๊บผ๋ด์•ผ ์ผœ์ง„ ๊ฑธ ์•ˆ๋‹ค

ํ†ต๊ณผํ•˜๋Š” ํ…Œ์ŠคํŠธ๋งŒ์œผ๋กœ๋Š” ๊ฑธ๋ฆฐ ๊ฒƒ๊ณผ ์กฐ์šฉํžˆ ๊บผ์ง„ ๊ฒƒ์ด ๊ตฌ๋ถ„๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์˜ต์…˜์„ ํ•˜๋‚˜์”ฉ ์ œ๊ฑฐํ•ด๋ดค์Šต๋‹ˆ๋‹ค.

๋ณ€์ด ํ…Œ์ŠคํŠธ๋กœ ์‹ค์ œ ์œ ์ถœ ์žฌํ˜„

ย ์ƒ์„ธ ย โ€”ย  ํ…Œ๋„ŒํŠธ ๊ฒฉ๋ฆฌ๋ฅผ ๊ณ„์ธต๋งˆ๋‹ค ๋‹ค๋ฅธ ์ˆ˜๋‹จ์œผ๋กœ ๋ง‰์€ ์ด์œ 

๋‹จ์ผ DB ยท ๋‹จ์ผ ์Šคํ‚ค๋งˆ์— team_id๋กœ ํ…Œ๋„ŒํŠธ๋ฅผ ๋‚˜๋ˆ„๋Š” ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค. ๋ฌธ์ œ๋Š” ๊ฒฝ๋กœ๋งˆ๋‹ค ํ•„ํ„ฐ๊ฐ€ ๋‹ฟ๋Š” ๋ฒ”์œ„๊ฐ€ ๋‹ค๋ฅด๋‹ค๋Š” ๊ฒƒ์ด์—ˆ์Šต๋‹ˆ๋‹ค.

๋ฐฉ์–ด์„  ๋ง‰๋Š” ๊ฒƒ ํ•œ๊ณ„
findByIdAndTeamId ๋ช…์‹œ์  ์กฐ๊ฑด ๊ฐœ๋ฐœ์ž๊ฐ€ ์žŠ์œผ๋ฉด ๋ฌด๋ ฅ
Hibernate @Filter JPA ์ฟผ๋ฆฌ ๊ฒฝ๋กœ ๋„ค์ดํ‹ฐ๋ธŒ SQL์—” ์•ˆ ๋‹ฟ์Œ
SQL ์„ (ๅ…ˆ)ํ•„ํ„ฐ ๋ฒกํ„ฐ ๊ฒ€์ƒ‰ ์ง์ ‘ ์จ์•ผ ํ•จ
PostgreSQL RLS DB ๋ ˆ๋ฒจ ์ ์šฉ ์˜ˆ์ •

ย ์ƒ์„ธ ย โ€”ย  ๋ณ€์ด ํ…Œ์ŠคํŠธ๋กœ ์ดˆ๋ก๋ถˆ์„ ๊ฒ€์ฆํ•œ ๊ธฐ๋ก

ํ•„ํ„ฐ ์˜ต์…˜์„ ํ•˜๋‚˜์”ฉ ๋„๊ณ  ํ…Œ์ŠคํŠธ๊ฐ€ ์‹ค์ œ๋กœ ์‹คํŒจํ•˜๋Š”์ง€ ํ™•์ธํ–ˆ์Šต๋‹ˆ๋‹ค.

๋ˆ ๊ฒƒ findById ๊ต์ฐจ ์กฐํšŒ findAll
์ •์ƒ ๐ŸŸข ๋ง‰ํž˜ ๐ŸŸข ๋ง‰ํž˜
applyToLoadByKey = false ๐Ÿ”ด ์œ ์ถœ ๐ŸŸข ๋ง‰ํž˜
autoEnabled = false ๐Ÿ”ด ์œ ์ถœ ๐Ÿ”ด ์œ ์ถœ

๋ฌธ์„œ๋กœ๋งŒ ์•Œ๋˜ "@Filter๋Š” PK ์กฐํšŒ๋ฅผ ์•ˆ ๊ฑฐ๋ฅธ๋‹ค"๊ฐ€ ์ด ์ฝ”๋“œ๋ฒ ์ด์Šค์—์„œ ๊ทธ๋Œ€๋กœ ์žฌํ˜„๋์Šต๋‹ˆ๋‹ค. findAll์€ ์—ฌ์ „ํžˆ ํ†ต๊ณผํ•œ๋‹ค๋Š” ์ ์ด ์œ„ํ—˜ํ•ฉ๋‹ˆ๋‹ค โ€” ํ…Œ์ŠคํŠธ๋ฅผ ํ•˜๋‚˜๋งŒ ๋ดค๋‹ค๋ฉด ๋†“์ณค์„ ๊ฒ๋‹ˆ๋‹ค.


ย ์ƒ์„ธ ย โ€”ย  Refresh Token ํšŒ์ „๊ณผ ํƒˆ์ทจ ์žฌ์‚ฌ์šฉ ํƒ์ง€

AT๋Š” ๋ฉ”๋ชจ๋ฆฌ + Authorization: Bearer, RT๋Š” httpOnly ์ฟ ํ‚ค์— ๋‘ก๋‹ˆ๋‹ค. ์žฌ๋ฐœ๊ธ‰ ์‹œ RT๋ฅผ ํšŒ์ „์‹œํ‚ค๊ณ , ์ด๋ฏธ ํšŒ์ „๋œ ํ† ํฐ์ด ๋‹ค์‹œ ๋“ค์–ด์˜ค๋ฉด ํƒˆ์ทจ๋กœ ๊ฐ„์ฃผํ•ด ํ•ด๋‹น ๋””๋ฐ”์ด์Šค ์„ธ์…˜์„ ํ†ต์งธ๋กœ ํ๊ธฐํ•ฉ๋‹ˆ๋‹ค. ๊ณต๊ฒฉ์ž์™€ ํ”ผํ•ด์ž๋ฅผ ํ•จ๊ป˜ ๋ฌดํšจํ™”ํ•˜๋Š” ์ชฝ์„ ํƒํ–ˆ์Šต๋‹ˆ๋‹ค.

AT์™€ RT๊ฐ€ ๊ฐ™์€ ํ‚ค๋กœ ์„œ๋ช…๋˜๋ฏ€๋กœ typ ํด๋ ˆ์ž„์œผ๋กœ ๊ตฌ๋ถ„ํ•ด, RT๋ฅผ Bearer ์ž๋ฆฌ์— ๋„ฃ์–ด API๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฒฝ๋กœ๋ฅผ ์ฐจ๋‹จํ–ˆ์Šต๋‹ˆ๋‹ค.



ย  PeopleCore

HR SaaS ERP

์ธ์‚ฌ ยท ๊ทผํƒœ ยท ๊ธ‰์—ฌ ยท ์„ฑ๊ณผ ยท ์ „์ž๊ฒฐ์žฌ ยท ํ˜‘์—… ยท AI Copilot์„ ํ•˜๋‚˜๋กœ ๋ฌถ์€ ์›Œํฌํ”Œ๋กœ์šฐ ๊ธฐ๋ฐ˜ ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ SaaS. ํšŒ์‚ฌ๋ณ„ ๊ฒฐ์žฌ์„  ยท ๊ทผ๋ฌด ์ •์ฑ… ยท ๊ธ‰์—ฌ ํ•ญ๋ชฉ ยท ํ‰๊ฐ€ ๋“ฑ๊ธ‰ ๋ถ„ํฌ๋ฅผ ์ฝ”๋“œ ์ˆ˜์ • ์—†์ด ์šด์˜ ๋ฐ์ดํ„ฐ๋งŒ์œผ๋กœ ์ปค์Šคํ„ฐ๋งˆ์ด์ง•ํ•ฉ๋‹ˆ๋‹ค.

๊ธฐ๊ฐ„2026.03 โ€“ 2026.05 ย (3๊ฐœ์›”)
์ธ์›4์ธ ยท ๋ฐฑ์—”๋“œ / AI ยท ์ธํ”„๋ผ
๋‹ด๋‹น๋กœ๊ทธ์ธ(ID/PW ยท ์•ˆ๋ฉด์ธ์‹) ยท ์กฐ์ง๋„ ๊ด€๋ฆฌ ยท ํ†ตํ•ฉ๊ฒ€์ƒ‰ ยท ํŒŒ์ผํ•จ ยท AI Copilot
์Šคํƒ

Spring Kafka ES FastAPI EKS Vue

Recall ย  Cost ย  Face ย  Event



PeopleCore ์‹œ์Šคํ…œ ์•„ํ‚คํ…์ฒ˜

ย ๐Ÿ’กย  ํ•ต์‹ฌ ๋ฌธ์ œ

๐Ÿ”’ ์‚ฌ๋‚ด ๋ฐ์ดํ„ฐ๋ฅผ ์™ธ๋ถ€ LLM์— ๋ชป ๋ณด๋‚ธ๋‹ค

์ธ์‚ฌ ยท ๊ธ‰์—ฌ๋ฅผ ์™ธ๋ถ€ API๋กœ ๋ณด๋‚ด๋Š” ์ˆœ๊ฐ„ ์œ ์ถœ ์œ„ํ—˜์ด ์ƒ๊น๋‹ˆ๋‹ค. ๊ธฐ๋Šฅ์„ ํฌ๊ธฐํ•˜๋Š” ๋Œ€์‹  ๋ฏผ๊ฐ๋„๋กœ ๋ชจ๋ธ์„ ๋ถ„๊ธฐํ–ˆ์Šต๋‹ˆ๋‹ค.

EXAONE โ†” Claude

๐Ÿ” ํ˜•ํƒœ์†Œ ๋ถ„์„๋งŒ์œผ๋ก  ๋ถ€๋ถ„ ๊ฒ€์ƒ‰์ด ์‹คํŒจํ•œ๋‹ค

Nori๋กœ๋Š” "๊ฒฐ์žฌ๋ฌธ" ๊ฐ™์€ ๋ณตํ•ฉ์–ด๊ฐ€ ์žกํžˆ์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. BM25 + kNN์„ RRF๋กœ ๊ฒฐํ•ฉํ–ˆ์Šต๋‹ˆ๋‹ค.

Recall@5 95%

โšก ์•ฑ์ด ๋ฐœํ–‰ํ•˜๋Š” ์ด๋ฒคํŠธ๋Š” ๋ˆ„๋ฝ๋œ๋‹ค

ํŠธ๋žœ์žญ์…˜ ์ปค๋ฐ‹๊ณผ ๋ฐœํ–‰์ด ๋ถ„๋ฆฌ๋˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋ฐœํ–‰ ์ฃผ์ฒด๋ฅผ DB๋กœ ์˜ฎ๊ฒผ์Šต๋‹ˆ๋‹ค.

Debezium CDC

ย ์ƒ์„ธ ย โ€”ย  EXAONE์ด Tool Use๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š๋Š” ๋ฌธ์ œ

EXAONE 3.5๋Š” ๋„ค์ดํ‹ฐ๋ธŒ ํ•จ์ˆ˜ ํ˜ธ์ถœ์„ ์ง€์›ํ•˜์ง€ ์•Š์•„ ๋„๊ตฌ ํ˜ธ์ถœํ˜• Copilot ๊ตฌํ˜„์ด ๋ง‰ํ˜”์Šต๋‹ˆ๋‹ค. ๋ชจ๋ธ์„ ๋ฐ”๊พธ๋ฉด PIPA ๋กœ์ปฌ ์ถ”๋ก  ์š”๊ฑด๊ณผ ์ถฉ๋Œํ•˜๋ฏ€๋กœ, ๋ชจ๋ธ์ด ์•„๋‹ˆ๋ผ ๊ตฌ์กฐ๋ฅผ ๋ฐ”๊ฟ”์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค.

[[CALL]] ๋งˆ์ปค ๊ธฐ๋ฐ˜ Manual Prompting ํ”„๋กœํ† ์ฝœ์„ ์ง์ ‘ ์„ค๊ณ„ํ•˜๊ณ  ์‘๋‹ต์„ ํŒŒ์‹ฑํ•ด ๋„ค์ดํ‹ฐ๋ธŒ์™€ ๋™๋“ฑํ•œ ๋„๊ตฌ ํ˜ธ์ถœ์„ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค.

์ œ์•ฝ์„ ๋งŒ๋‚ฌ์„ ๋•Œ ๋„๊ตฌ๋ฅผ ๋ฐ”๊พธ๋Š” ๋Œ€์‹ , ๊ตฌ์กฐ๋กœ ๊ฐ™์€ ๊ฒฐ๊ณผ๋ฅผ ๋‚ด๋Š” ๋ฐฉ๋ฒ•์„ ํƒํ–ˆ์Šต๋‹ˆ๋‹ค.


ย ์ƒ์„ธ ย โ€”ย  ์ •ํ™• ๋งค์นญ๊ณผ ์˜๋ฏธ ๊ฒ€์ƒ‰์„ ํ•จ๊ป˜ ์žก์€ ๋ฐฉ๋ฒ•

๋ฒกํ„ฐ(kNN) ์˜๋ฏธ ๊ฒ€์ƒ‰๋งŒ์œผ๋กœ๋Š” ์‚ฌ๋ฒˆ ยท ๋ถ€์„œ๋ช… ๊ฐ™์€ ์ •ํ™• ํ‚ค์›Œ๋“œ ๋งค์นญ์ด ์•ฝํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ฐ˜๋Œ€๋กœ BM25๋งŒ์œผ๋กœ๋Š” ์ž์—ฐ์–ด ์˜๋„๋ฅผ ๋ชป ์žก์Šต๋‹ˆ๋‹ค. ๋‘˜์€ ์ƒํ˜ธ ๋ณด์™„ ๊ด€๊ณ„์˜€์Šต๋‹ˆ๋‹ค.

  • ngram ํ† ํฌ๋‚˜์ด์ €๋ฅผ ๋ฉ€ํ‹ฐ ํ•„๋“œ๋กœ ์ถ”๊ฐ€ โ†’ ๋ณตํ•ฉ์–ด ยท ๋ถ€๋ถ„ ๋ฌธ์ž์—ด ๋Œ€์‘
  • BM25 + kNN ๋ฒกํ„ฐ ๊ฒ€์ƒ‰์„ RRF๋กœ ๊ฒฐํ•ฉ โ†’ Elasticsearch ์œ„์— Hybrid Search ๊ตฌํ˜„

ย ์ƒ์„ธ ย โ€”ย  LLM ๋น„์šฉ์„ 83% ์ค„์ธ ๋ฐฉ๋ฒ•

๋งค ์š”์ฒญ๋งˆ๋‹ค ๋™์ผํ•œ ์‹œ์Šคํ…œ ํ”„๋กฌํ”„ํŠธ์™€ ๋Œ€ํ™” ์ด๋ ฅ์„ ๋ฐ˜๋ณต ์ „์†กํ•˜๊ณ  ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. Prompt Caching์œผ๋กœ ๊ณ ์ • ์ปจํ…์ŠคํŠธ๋ฅผ ์บ์‹œ ํ‚ค๋กœ ์žฌ์‚ฌ์šฉํ•˜๊ณ  ๋™์  ์ž…๋ ฅ๋งŒ ์ „์†กํ–ˆ์Šต๋‹ˆ๋‹ค.

ํ˜ธ์ถœ๋‹น ๋น„์šฉ
์ ์šฉ ์ „ $0.006202
์ ์šฉ ํ›„ $0.001075

5,697 ํ† ํฐ ๊ณ ์ • ์ปจํ…์ŠคํŠธ ยท Claude Haiku ๊ธฐ์ค€


ย ์ƒ์„ธ ย โ€”ย  ๋กœ๊ทธ์ธ์— 27์ดˆ๊ฐ€ ๊ฑธ๋ฆฌ๋˜ ๋ฌธ์ œ

DeepFace๋Š” ์ •ํ™•๋„๋Š” ๋†’์•˜์ง€๋งŒ ์‘๋‹ต์ด 27์ดˆ์˜€์Šต๋‹ˆ๋‹ค. ๋กœ๊ทธ์ธ ํ”Œ๋กœ์šฐ์— ์“ธ ์ˆ˜ ์—†๋Š” ์ˆ˜์น˜์ž…๋‹ˆ๋‹ค. face_recognition์œผ๋กœ ๊ต์ฒดํ•ด **3์ดˆ(9๋ฐฐ ๋‹จ์ถ•)**๋กœ ์ค„์ด๊ณ , ์ •ํ™•๋„ ์†์‹ค์€ ์ž„๊ณ„๊ฐ’ ์‹ค์ธก ํŠœ๋‹์œผ๋กœ ์ƒ์‡„ํ–ˆ์Šต๋‹ˆ๋‹ค.

๋ฒค์น˜๋งˆํฌ ์ˆ˜์น˜๊ฐ€ ์•„๋‹ˆ๋ผ ์šฐ๋ฆฌ ๋ฐ์ดํ„ฐ๋กœ ์ง์ ‘ ์žฌ๋ดค๊ธฐ ๋•Œ๋ฌธ์— ๊ต์ฒด๋ฅผ ๊ฒฐ์ •ํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.


ย ์ƒ์„ธ ย โ€”ย  ๋ฉ€ํ‹ฐํ…Œ๋„Œ์‹œ ยท ํŒŒ์ผ ๊ถŒํ•œ ๋ชจ๋ธ
  • company_id ๊ธฐ๋ฐ˜ ๋™์ผ DB ๊ฒฉ๋ฆฌ โ€” ๊ณ ๊ฐ์‚ฌ๋ณ„ ๋ฐ์ดํ„ฐ๊ฐ€ ๊ฐ™์€ ํ…Œ์ด๋ธ”์— ๊ณต์กดํ•˜๋˜ ์„œ๋กœ ๋ณด์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค
  • MinIO Presigned URL ์ง์ ‘ ์—…๋กœ๋“œ โ€” ํŒŒ์ผ ๋ฐ”์ดํŠธ๊ฐ€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„œ๋ฒ„๋ฅผ ๊ฑฐ์น˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค
  • 2-Tier ๊ถŒํ•œ โ€” ํŒŒ์ผํ•จ ์ ‘๊ทผ๊ณผ ๊ฐœ๋ณ„ ํŒŒ์ผ ์ ‘๊ทผ์„ ๋ถ„๋ฆฌํ•ด ๊ฒ€์‚ฌํ•ฉ๋‹ˆ๋‹ค


Backend Frontend API Figma


ย  PochaON

์š”์‹์—… ํ…Œ์ด๋ธ”์˜ค๋” ํ”Œ๋žซํผ

์†๋‹˜์ด ํ…Œ์ด๋ธ”์—์„œ ์ง์ ‘ ์ฃผ๋ฌธํ•˜๊ณ , ์‚ฌ์žฅ๋‹˜์€ ์ฃผ๋ฌธ ยท ์žฌ๊ณ  ยท ์‘๋Œ€๋ฅผ ํ•œ ํ™”๋ฉด์—์„œ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ๋™์‹œ ์ฃผ๋ฌธ์ด ๋ชฐ๋ฆฌ๋Š” ํ™˜๊ฒฝ์„ ์ „์ œ๋กœ ์žฌ๊ณ  ์ •ํ•ฉ์„ฑ์„ ์„ค๊ณ„ํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ธฐ๊ฐ„2026.01 โ€“ 2026.03 ย (2๊ฐœ์›”)
์ธ์›4์ธ ยท ๋ฐฑ์—”๋“œ ยท ์ธํ”„๋ผ
๋‹ด๋‹น๋กœ๊ทธ์ธ ยท ํ…Œ์ด๋ธ” ๊ฐ„ ์ฑ„ํŒ… ยท ์žฌ๊ณ  ๊ด€๋ฆฌ ยท ๋ ˆ์‹œํ”ผ ๊ด€๋ฆฌ
์Šคํƒ

Spring STOMP Kafka Redis MySQL EKS JMeter

Error ย  Consistency ย  TPS



PochaON ๋ฐฐํฌ ์•„ํ‚คํ…์ฒ˜

ย ๐Ÿ’กย  ํ•ต์‹ฌ ๋ฌธ์ œ

๐Ÿ”’ ๋™์‹œ ์ฃผ๋ฌธ ์‹œ ์žฌ๊ณ ๊ฐ€ ์ค‘๋ณต ์ฐจ๊ฐ๋œ๋‹ค

์ •์ƒ์˜ **284%**๊ฐ€ ์ฐจ๊ฐ๋˜๊ณ  ์„œ๋ฒ„๊ฐ€ ๋‹ค์šด๋์Šต๋‹ˆ๋‹ค. ๋ฝ ํ•˜๋‚˜๋กœ๋Š” ๋‹ค์ค‘ Pod์„ ๋ชป ๋ง‰์Šต๋‹ˆ๋‹ค. ๊ณ„์ธต๋ณ„ 3์ค‘ ๋ฐฉ์–ด๋กœ ๋‚˜๋ˆด์Šต๋‹ˆ๋‹ค.

์—๋Ÿฌ์œจ 75% โ†’ 0%

๐Ÿ“ก Pod์„ ๋Š˜๋ฆฌ๋ฉด ๋ฉ”์‹œ์ง€๊ฐ€ ์œ ์‹ค๋œ๋‹ค

STOMP ์„ธ์…˜์ด Pod ๋ฉ”๋ชจ๋ฆฌ์— ๋ฌถ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. fan-out ์ฃผ์ฒด๋ฅผ Kafka๋กœ ์˜ฎ๊ฒผ์Šต๋‹ˆ๋‹ค.

Pod ์ˆ˜์™€ ๋ฌด๊ด€ํ•˜๊ฒŒ ๋™์ž‘

๐Ÿ”— Cascade๋งŒ์œผ๋ก  ์‚ญ์ œ ์ˆœ์„œ๊ฐ€ ์•ˆ ์žกํžŒ๋‹ค

์˜ต์…˜ ๋ ˆ์‹œํ”ผ๊ฐ€ Cascade ๋Œ€์ƒ์—์„œ ๋ˆ„๋ฝ๋ผ FK ์ œ์•ฝ์— ๊ฑธ๋ ธ์Šต๋‹ˆ๋‹ค. 2๋‹จ๊ณ„ ์‚ญ์ œ ์ „๋žต์„ ์„ธ์› ์Šต๋‹ˆ๋‹ค.

FK ์œ„๋ฐ˜ ์—†์ด ์ผ๊ด„ ์‚ญ์ œ

ย ์ƒ์„ธ ย โ€”ย  ์žฌ๊ณ  ์ค‘๋ณต ์ฐจ๊ฐ์„ ๋ง‰์€ ๊ณ„์ธต๋ณ„ 3์ค‘ ๋ฐฉ์–ด

๋ถ€ํ•˜ ํ…Œ์ŠคํŠธ์—์„œ ๋™์‹œ ์ฃผ๋ฌธ 100๊ฑด ์ฒ˜๋ฆฌ ์‹œ ์—๋Ÿฌ์œจ 75%, ์‹ค์ œ ์ฐจ๊ฐ๋Ÿ‰์ด ์ •์ƒ์˜ **284%**์— ๋‹ฌํ•˜๋Š” ์ค‘๋ณต ์ฐจ๊ฐ์„ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ฝ ํ•˜๋‚˜๋กœ๋Š” ๋‹ค์ค‘ Pod ํ™˜๊ฒฝ์˜ ๋™์‹œ ์ ‘๊ทผ์„ ๋ง‰์„ ์ˆ˜ ์—†๋‹ค๊ณ  ํŒ๋‹จํ•ด, ์ž…๊ตฌ๋ถ€ํ„ฐ DB๊นŒ์ง€ ๊ฐ ๊ณ„์ธต์ด ๋ฌด์—‡์„ ์ฑ…์ž„์ง€๋Š”์ง€ ๋‚˜๋ˆด์Šต๋‹ˆ๋‹ค.

๊ณ„์ธต ์ˆ˜๋‹จ ์ฑ…์ž„
๐Ÿšช ์ž…๊ตฌ Redis ๋ฉฑ๋“ฑ์„ฑ ํ‚ค ์ค‘๋ณต ์š”์ฒญ ์ฐจ๋‹จ
โš™๏ธ ์ฒ˜๋ฆฌ Kafka concurrency=1 ์ฒ˜๋ฆฌ ์ˆœ์„œ ์ง๋ ฌํ™”
๐Ÿ’พ ์ €์žฅ ๋น„๊ด€์  ๋ฝ DB ๋ฌด๊ฒฐ์„ฑ ์ตœ์ข… ๋ณด์žฅ

[!TIP] ํ•œ ๋ฒˆ์— ๋ง‰์œผ๋ ค ํ•˜์ง€ ์•Š๊ณ  ๊ฐ ๊ณ„์ธต์ด ๋ฌด์—‡์„ ์ฑ…์ž„์ง€๋Š”์ง€ ๋‚˜๋ˆˆ ๊ฒƒ์ด ํ•ต์‹ฌ์ด์—ˆ์Šต๋‹ˆ๋‹ค.

๊ฐ™์€ ๋ถ€ํ•˜ ํ…Œ์ŠคํŠธ์—์„œ ๋“œ๋Ÿฌ๋‚œ ์ปค๋„ฅ์…˜ ํ’€ ๋ณ‘๋ชฉ๋„ ํ•จ๊ป˜ ํ•ด์†Œํ–ˆ์Šต๋‹ˆ๋‹ค. ์Šค๋ ˆ๋“œ๊ฐ€ ์ปค๋„ฅ์…˜์„ ๋ชป ์–ป์–ด ๋Œ€๊ธฐ ยท ํƒ€์ž„์•„์›ƒ๋˜๊ณ  ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. (HikariCP 2 โ†’ 10 ยท TPS 23.3 โ†’ 27.7)


ย ์ƒ์„ธ ย โ€”ย  ๋ถ„์‚ฐ Pod์—์„œ STOMP ๋ฉ”์‹œ์ง€๊ฐ€ ์œ ์‹ค๋œ ๋ฌธ์ œ

SimpleBroker๋Š” STOMP ์„ธ์…˜์„ ์„œ๋ฒ„ ๋ฉ”๋ชจ๋ฆฌ์— ๋ฌถ์–ด๋‘ก๋‹ˆ๋‹ค. Pod 1์— ๋ถ™์€ ์†๋‹˜์ด Pod 2์—์„œ ๋ฐœํ–‰๋œ ์ฃผ๋ฌธ ์•Œ๋ฆผ์„ ๋ฐ›์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค. ์ฝ”๋“œ ๋ฒ„๊ทธ๊ฐ€ ์•„๋‹ˆ๋ผ ์ˆ˜ํ‰ ํ™•์žฅ์˜ ๊ตฌ์กฐ์  ํ•œ๊ณ„์˜€์Šต๋‹ˆ๋‹ค.

๋ชจ๋“  Pod์ด Kafka Consumer๋กœ ์ˆ˜์‹ ํ•œ ๋’ค ๊ฐ์ž์˜ STOMP ์„ธ์…˜์— fan-out ํ•˜๋„๋ก ๋ฐ”๊ฟ” Pod ์ˆ˜์™€ ๋ฌด๊ด€ํ•˜๊ฒŒ ๋™์ž‘ํ•˜๋„๋ก ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.


ย ์ƒ์„ธ ย โ€”ย  Cascade ์—ฐ๊ด€๊ด€๊ณ„ ์ •ํ•ฉ์„ฑ

์‹์ž์žฌ๋ฅผ ์‚ญ์ œํ•˜๋ฉด ๋ ˆ์‹œํ”ผ(๋ฉ”๋‰ด ยท ์˜ต์…˜)์— ์—ฐ๊ฒฐ๋ผ ์žˆ์–ด FK ์ œ์•ฝ ์œ„๋ฐ˜์œผ๋กœ ์‹คํŒจํ–ˆ์Šต๋‹ˆ๋‹ค. CascadeType.ALL์„ ๊ฑฐ๋Š” ๊ฑด ์˜๋„์น˜ ์•Š์€ ๋ฒ”์œ„๊นŒ์ง€ ์ง€์šธ ์œ„ํ—˜์ด ์žˆ์–ด ๊ธฐ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค.

์›์ธ์€ ์˜ต์…˜ ๋ ˆ์‹œํ”ผ(IngredientMenuOptionDetail)๊ฐ€ ๋ณ„๋„ ์—”ํ‹ฐํ‹ฐ๋ผ Cascade ๋Œ€์ƒ์—์„œ ๋ˆ„๋ฝ๋˜๋Š” ๊ฒƒ์ด์—ˆ์Šต๋‹ˆ๋‹ค.

  1. Cascade ๋ฐ– ์˜ต์…˜ ๋ ˆ์‹œํ”ผ๋ฅผ ๋จผ์ € ์ˆ˜๋™ ์‚ญ์ œํ•ด FK ์ฐธ์กฐ๋ฅผ ๋Š๋Š”๋‹ค
  2. Ingredient ์‚ญ์ œ ์‹œ ์ž…๊ณ  ๋ฐฐ์น˜ ยท ๋ฉ”๋‰ด ๋ ˆ์‹œํ”ผ๋Š” Cascade๊ฐ€ ์ž๋™ ์ •๋ฆฌํ•œ๋‹ค

์ˆœ์„œ๋ฅผ ๋ณด์žฅํ•ด FK ์œ„๋ฐ˜ ์—†์ด ์ผ๊ด„ ์‚ญ์ œํ–ˆ์Šต๋‹ˆ๋‹ค.


ย ์ƒ์„ธ ย โ€”ย  JWT 3-Stage ํ† ํฐ ยท ํ…Œ์ด๋ธ” ์ด๋™/ํ•ฉ์น˜๊ธฐ

JWT 3-Stage ํ† ํฐ

๋งค์žฅ ยท ํ…Œ์ด๋ธ” ์ง„์ž…๋งˆ๋‹ค ๊ถŒํ•œ์ด ๋‹ฌ๋ผ์ง€๋Š” ๋น„ํšŒ์› ์ฃผ๋ฌธ ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ์œ„ํ•ด BASE โ†’ STORE โ†’ TABLE ๋‹จ๊ณ„๋ณ„๋กœ ํ† ํฐ์„ ์žฌ๋ฐœ๊ธ‰ํ•˜๊ณ  ์ด์ „ ํ† ํฐ์„ ํ๊ธฐํ–ˆ์Šต๋‹ˆ๋‹ค. AT/RT ์‹œํฌ๋ฆฟ์„ ๋ถ„๋ฆฌํ•˜๊ณ  Redis ํ™”์ดํŠธ๋ฆฌ์ŠคํŠธ๋กœ ํƒˆ์ทจ ํ† ํฐ์„ ์ฆ‰์‹œ ๋ฌดํšจํ™”ํ•ฉ๋‹ˆ๋‹ค.

ํ…Œ์ด๋ธ” ์ด๋™ ยท ํ•ฉ์น˜๊ธฐ (MOVE / MERGE)

๋‘ ํ…Œ์ด๋ธ”์„ ๋น„๊ด€์  ๋ฝ์œผ๋กœ ๋™์‹œ ์กฐํšŒํ•ด ์ถฉ๋Œ์„ ์ฐจ๋‹จํ•˜๊ณ , ์ฃผ๋ฌธ ์ผ๊ด„ ์ด์ „๊ณผ groupId ์ด๊ด€์„ ์›์ž์ ์œผ๋กœ ์ฒ˜๋ฆฌํ–ˆ์Šต๋‹ˆ๋‹ค. ์ƒˆ JWT ์žฌ๋ฐœ๊ธ‰ + Kafka โ†’ WebSocket์œผ๋กœ ์ ์ฃผ ยท ์ฃผ๋ฐฉ ยท ํ…Œ์ด๋ธ” ํ™”๋ฉด์„ ์‹ค์‹œ๊ฐ„ ๋™๊ธฐํ™”ํ•˜๊ณ , 30์ดˆ ํ”Œ๋ž˜๊ทธ๋กœ ๋น„์ •์ƒ ๋กค๋ฐฑ์„ ์ฐจ๋‹จํ–ˆ์Šต๋‹ˆ๋‹ค.



Backend


Repository



ย ๐Ÿ“ฎย  Contact

Email Blog


์ฝ์–ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

About

๐Ÿ› ๏ธ ๋ฌธ์ œ ์ค‘์‹ฌ์œผ๋กœ ์‚ฌ๊ณ ํ•˜๋Š” ๊ฐœ๋ฐœ์ž ํ™ฉ์ฃผ์™„์˜ ํฌํŠธํด๋ฆฌ์˜ค์ž…๋‹ˆ๋‹ค

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors