Skip to content

ktb-cpplab/cpplab-be

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

cpplab-be

๐Ÿ“ˆ ERD

๐Ÿ“˜์‚ฌ์ง„

๐Ÿ’Žย ์™œ ์ด ๊ธฐ์ˆ ์„ ์‚ฌ์šฉํ–ˆ๋Š”๊ฐ€?

๐Ÿ“˜์†Œ์…œ๋กœ๊ทธ์ธ ์ˆœ์„œ๋„

(์Šคํ”„๋ง์˜ oauth2-client ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ + JWT + Redis)๋ฅผ ๊ฒฐํ•ฉํ•˜์—ฌ ์†Œ์…œ๋กœ๊ทธ์ธ์„ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค.
ํ”„๋ก ํŠธ ์„œ๋ฒ„์—์„œ ์—‘์„ธ์Šค ํ† ํฐ์œผ๋กœ ๋กœ๊ทธ์ธ ์ƒํƒœ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•ด AccessToken๋ฅผ ์ „๋‹ฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
href์š”์ฒญ์€ ๋ฐ์ดํ„ฐ ์š”์ฒญ ์ „๋‹ฌ์ด ๋ถˆ๊ฐ€ํ•˜๊ธฐ์— useEffect๋กœ AccessToken ์žฌ์š”์ฒญํ•˜์˜€์Šต๋‹ˆ๋‹ค.
๐Ÿ“˜ํ† ํฐ ์ €์žฅ์†Œ ์„ ์ • ๋ฐฉ์‹
image
ํด๋ผ์ด์–ธํŠธ
- cookie: Refresh Token
- local stoarge: Access Token
์„œ๋ฒ„
- Redis: Refresh Token

์ด 3๊ณณ์— JWT ๋กœ๊ทธ์ธ ๋ฐฉ์‹์œผ๋กœ ํ† ํฐ์„ ์ €์žฅํ–ˆ์Šต๋‹ˆ๋‹ค.

2 ๊ฐ€์ง€ ๋ฌธ์ œ์ ๊ณผ ํ•ด๊ฒฐ๋ฐฉ๋ฒ•
์ฒซ์งธ, Refresh Token์ด ํด๋ผ์ด์–ธํŠธ์—์„œ๋งŒ ๊ด€๋ฆฌ๋˜๋ฉด ๋กœ๊ทธ์•„์›ƒ ์‹œ์ ์— ํ† ํฐ ๋ฌดํšจํ™” ๋ฐฉ๋ฒ•์ด ์—†์—ˆ์Šต๋‹ˆ๋‹ค.
์„œ๋ฒ„์—๋„ Refresh Token์„ ์ถ”๊ฐ€ํ•˜์—ฌ ๋กœ๊ทธ์•„์›ƒ ์‹œ ํ•ด๋‹น ํ† ํฐ์„ ์„œ๋ฒ„์—์„œ ์ง์ ‘ ๋งŒ๋ฃŒ ์‹œํ‚ค๋„๋ก ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค.
๋‘˜์งธ, MySQL์€ ํ† ํฐ ๋งŒ๋ฃŒ ํ›„ ์‚ญ์ œ ์ž‘์—…์ด ๋ถ€๋‹ด๋˜๋Š” ์ž‘์—…์ด๋ฏ€๋กœ Redis๋กœ ํ† ํฐ ์ €์žฅ์†Œ๋ฅผ ๋ฐ”๊พธ๊ณ  TTL ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜์—ฌ expire์„ ์ž๋™ ๋งŒ๋ฃŒํ•˜๋„๋ก ํ•˜์˜€์Šต๋‹ˆ๋‹ค.
๐Ÿ“˜๋ถ€ํ•˜ ํ…Œ์ŠคํŠธ

nGrinder

local ํ…Œ์ŠคํŠธ๋ฅผ Jmeter๋ฅผ ์ด์šฉํ•ด์„œ ํ™•์ธํ–ˆ์Šต๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ์šด์˜ํ™˜๊ฒฝ ํ…Œ์ŠคํŠธ์—์„œ ์ธ์Šคํ„ด์Šค ์ŠคํŽ™ ๋Œ€๋น„ Vuser์˜ ๋งŽ์€ ์š”์ฒญ์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด์„œ ๋ถ„์‚ฐ Agent ํ™˜๊ฒฝ์„ ๊ตฌ์ถ•ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

nGrinder๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์—ฌ๋Ÿฌ ๊ฐœ์˜ Agent๋ฅผ ์‚ฌ์šฉํ•ด ๋ถ„์‚ฐ ํ…Œ์ŠคํŠธ๋ฅผ ์‰ฝ๊ฒŒ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๊ธฐ์—,

์š”์ฒญ๋งŒ ๋ณด๋‚ด๋Š” ๊ฐ„๋‹จํ•œ ๋กœ์ง์—์„œ ์Šคํฌ๋ฆฝํŒ… ์„ค์ • ์—†์ด ์ง๊ด€์ ์ธ UI๋กœ ๋น ๋ฅด๊ฒŒ ๋ถ€ํ•˜ํ…Œ์ŠคํŠธ๋ฅผ ์ง„ํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค.


๋ฌธ์ œ์ 

ํ”„๋กœ์ ํŠธ ์ถ”์ฒœ ๊ธฐ๋Šฅ์€ ์‘๋‹ต์ด ๋А๋ฆฌ๋”๋ผ๋„ ๋‹ต๋ณ€ ํ’ˆ์งˆ ํ–ฅ์ƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

์ €ํฌ ํŒ€์€ ์ •ํ™•๋„๋ฅผ ์˜ฌ๋ฆฌ๊ธฐ ์œ„ํ•ด 2๊ฐ€์ง€๋ฅผ ํฌ๊ธฐํ–ˆ์Šต๋‹ˆ๋‹ค.

  • ๊ธˆ์ „์  ์†ํ•ด: openAI ํ˜ธ์ถœํšŸ์ˆ˜ 1โ†’3ํšŒ
  • ์‘๋‹ต ์‹œ๊ฐ„ ์ง€์—ฐ : ํ”„๋กฌํ”„ํŠธ ์„ธ๋ถ„ํ™”๋กœ 30โ†’40์ดˆ

๊ฐ€์„ค

๊ธด ์‹œ๊ฐ„๋™์•ˆ ๋ฐฑ์—”๋“œ๊ฐ€ ์ปค๋„ฅ์…˜์„ ์žก์ง€๋ง๊ณ  ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋กœ ๊ทธ ๋™์•ˆ ๋น„์ฆˆ๋‹ˆ์Šค ์ฒ˜๋ฆฌ๋ฅผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค.

  • ๋ฐฑ์—”๋“œ ์„œ๋ฒ„: ๋ฒ„์ธ„์–ด ์“ฐ๋ ˆ๋“œ๋กœ ๋น„๋™๊ธฐ์ฒ˜๋ฆฌ
  • AI์„œ๋ฒ„: async๋กœ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ

๋กœ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋ฅผ ์ง„ํ–‰ํ•˜๋ฉด TPS๊ฐ€ ์˜ฌ๋ผ๊ฐ€๊ณ  ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ์ฒ˜๋ฆฌ์— ์ง‘์ค‘ํ•  ์ˆ˜ ์žˆ๋‹ค.

ํ™˜๊ฒฝ์„ธํŒ…

  • Spring ์„œ๋ฒ„์—์„œ Virtual Thread๋กœ ๋น„๋™๊ธฐ๋ฅผ ๋‚ด๋ฆฌ๊ธฐ ์œ„ํ•ด์„œ ์ž๋ฐ”(17โ†’21)๋กœ ๋ณ€๊ฒฝํ–ˆ์Šต๋‹ˆ๋‹ค.

๋ฐฑ์—”๋“œ ๋กœ์ปฌ ํ…Œ์ŠคํŠธ

VU Loop Count Throughput Received KB/sec Sent KB/sec
Platform Thread 1000 100 207.4/sec 109.21 67.05
Platform Thread 3000 100 197.5/sec 82.76 67.33
Platform Thread 3000 100 198.5/sec 83.77 68.75
Virtual Thread 1000 100 673.4/sec 320.27 223.25
Virtual Thread 3000 100 1732.2/sec 750.68 586.53
Virtual Thread 3000 100 1806.0/sec 769.06 613.46

๋ฐฑ์—”๋“œ ๋จผ์ € ๋กœ์ปฌํ…Œ์ŠคํŠธ๋ฅผ ํ†ตํ•ด์„œ Vuser 3000๋ช…์ผ ๋•Œ Throughput 9๋ฐฐ๊ฐ€ ์ฆ๊ฐ€๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ–ˆ์Šต๋‹ˆ๋‹ค.

Platform Thread TPS
<Platform Thread TPS>
Virtual Thread TPS
<Virtual Thread TPS>

์šด์˜ํ™˜๊ฒฝ ํ…Œ์ŠคํŠธ

๋ถ€ํ•˜ํ…Œ์ŠคํŠธ ์š”๊ธˆ์„ ์•„๋ผ๊ธฐ ์œ„ํ•ด 2๊ฐ€์ง€ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.

์ฒซ์งธ, openAI์˜ 1ํšŒ ์š”์ฒญ์€ 0.002$์ด๊ธฐ์— ์ด 90,000๋ฒˆ์˜ ๋ถ€ํ•˜ํ…Œ์ŠคํŠธ ์š”์ฒญ์€ ๋ถ€๋‹ด๋ฉ๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ Mock Data์™€ time.sleep()์„ ํ†ตํ•ด ์‹ค์ œ์™€ ๋น„์Šทํ•œ ์šด์˜ํ™˜๊ฒฝ์„ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.

๋‘˜์งธ, On-Demand ๋Œ€์‹  Spot ์ธ์Šคํ„ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ „๋žต์„ ์ ์šฉํ•˜์—ฌ ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ์—์„œ ๋™์ผํ•œ ์„ฑ๋Šฅ์„ ์œ ์ง€ํ•˜๋ฉด์„œ๋„ ๋น„์šฉ์„ ์ ˆ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค.

ํ…Œ์ŠคํŠธ๋Š” ๋ชจ๋‘ ap-northeast-2a์—์„œ ์ง„ํ–‰๋˜์—ˆ์œผ๋ฉฐ, t2.micro, t3.small, t3a.large ์ธ์Šคํ„ด์Šค ์œ ํ˜•์„ ์‚ฌ์šฉํ•˜์—ฌ ๋น„์šฉ ์ ˆ๊ฐ ํšจ๊ณผ๋ฅผ ํ™•์ธํ–ˆ์Šต๋‹ˆ๋‹ค.

Spot ์ธ์Šคํ„ด์Šค์˜ ํ‰๊ท  ๋น„์šฉ์€ On-Demand ๋น„์šฉ ๋Œ€๋น„ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ ˆ๊ฐ ํšจ๊ณผ๋ฅผ ๋ณด์˜€์Šต๋‹ˆ๋‹ค.

  • t2.micro: On-Demand ๋น„์šฉ $0.0144์—์„œ Spot ๋น„์šฉ $0.0050์œผ๋กœ 65.13% ์ ˆ๊ฐ
  • t3.small: On-Demand ๋น„์šฉ $0.0260์—์„œ Spot ๋น„์šฉ $0.0079๋กœ 69.69% ์ ˆ๊ฐ
  • t3a.large: On-Demand ๋น„์šฉ $0.0936์—์„œ Spot ๋น„์šฉ $0.0264๋กœ 71.75% ์ ˆ๊ฐ

ํ…Œ์ŠคํŠธ ์ง„ํ–‰

๋น„๋™๊ธฐ์™€ ๋™๊ธฐ๋ฅผ ๊ธฐ์ค€์œผ๋กœ 4๊ฐ€์ง€๋ฅผ ํ…Œ์ŠคํŠธํ–ˆ์Šต๋‹ˆ๋‹ค.

BE AI vUser TPS ์‹คํ–‰ํšŸ์ˆ˜ ์„ฑ๊ณต๋น„์œจ
๋™๊ธฐ ๋™๊ธฐ 10 0.2 66 94%
40 1 250 98%
100 0.9 100 45% ์‹คํŒจ: timeout
๋น„๋™๊ธฐ ๋™๊ธฐ 40 1 252 97%
100 0.8 100 43% ์‹คํŒจ: Too many errors
๋™๊ธฐ ๋น„๋™๊ธฐ 40 0.9 244 98%
100 2.4 628 98%
300 2.6 1,291 52% ๊ฒฝ๊ณ : 30% ์ด์ƒ ์‹คํŒจ
๋น„๋™๊ธฐ ๋น„๋™๊ธฐ 100 2.5 632 98%
300 6.8 1830 98%
1000 22.6 5,626 98%
1500 31.4 7,823 98%
2000 14.5 6,602 35% ์‹คํŒจ: ๋ฐฑ์—”๋“œ ์ข…๋ฃŒ

ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ

์ดˆ๊ธฐ ์„ค๊ณ„์ธ ๋™๊ธฐ-๋™๊ธฐ ์•„ํ‚คํ…์ฒ˜๋Š” 100๋ช…์˜ vUSer๋ฅผ ๋ฒ„ํ‹ฐ์ง€ ๋ชปํ•˜๊ณ  ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํŒจํ–ˆ์Šต๋‹ˆ๋‹ค.

๋ฐ˜๋ฉด ๋น„๋™๊ธฐ-๋น„๋™๊ธฐ ์•„ํ‚คํ…์ฒ˜๋Š” ๋™์ผ ์ŠคํŽ™์ž„์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  1500๋ช…์˜ vUSer๋ฅผ ๋ฒ„ํ‹ฐ๋Š” ๊ฒƒ์„ ํ™•์ธํ–ˆ์Šต๋‹ˆ๋‹ค.


ํ…Œ์ŠคํŠธ ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ…

image (3)

์ธ์Šคํ„ด์Šค t2.small์˜ agent ์ŠคํŽ™์„ ์‚ฌ์šฉํ–ˆ๋Š”๋ฐ vUser๊ฐ€ 1500์ผ ๋•Œ ์ธ์Šคํ„ด์Šค๊ฐ€ lack of free memory๋กœ ์ฃฝ์–ด์„œ ์ธ์Šคํ„ด์Šค์˜ ์ŠคํŽ™์„ t3a.large๋กœ ์˜ฌ๋ ค์„œ MEM 20%๋กœ ์•ˆ์ •์ ์œผ๋กœ Vuser ํ™˜๊ฒฝ์„ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ“˜์ถ”๊ฐ€์ž‘์„ฑ ์˜ˆ์ •
  1. ๋ชจ๋‹ˆํ„ฐ๋ง

AOP๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋งˆ์ดํฌ๋กœ๋ฏธํ„ฐ์—์„œ @Counted ๋กœ ๋งคํŠธ๋ฆญ์„ ํ”„๋กœ๋ฉ”ํ…Œ์šฐ์Šค์—๊ฒŒ ์‘๋‹ต

์‹œ์Šคํ…œ ๋ฉ”ํŠธ๋ฆญ(CPU, ๋ฉ”๋ชจ๋ฆฌ)

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฉ”ํŠธ๋ฆญ(ํ†ฐ์บฃ ์“ฐ๋ ˆ๋“œ ํ’€, DB ์ปค๋„ฅ์…˜ ํ’€, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํ˜ธ์ถœ ์ˆ˜)

๋น„์ฆˆ๋‹ˆ์Šค ๋ฉ”ํŠธ๋ฆญ(์ฃผ๋ฌธ์ˆ˜, ์ทจ์†Œ์ˆ˜)

์ฒ˜๋Ÿผ ํ•ด์„œ ๋‚ด๋ ธ๋‹ค ๊ทธ๋ฆผ~~~

  1. ์•Œ๋žŒ

๊ฒฝ๊ณ ์™€ ์‹ฌ๊ฐ์„ ๊ตฌ๋ถ„ํ•ด์„œ ์•Œ๋žŒ์„ ๋‚ด๋ ธ๋‹ค

๋””์Šคํฌ ์‚ฌ์šฉ๋Ÿ‰ 70% ๊ฒฝ๊ณ 

๋””์Šคํฌ ์‚ฌ์šฉ๋Ÿ‰ 80% ์‹ฌ๊ฐ

CPU ์‚ฌ์šฉ๋Ÿ‰ 40% ๊ฒฝ๊ณ 

CPU ์‚ฌ์šฉ๋Ÿ‰ 50% ์‹ฌ๊ฐ

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Contributors 4

  •  
  •  
  •  
  •