๐์์ ๋ก๊ทธ์ธ ์์๋

(์คํ๋ง์ oauth2-client ๋ผ์ด๋ธ๋ฌ๋ฆฌ + JWT + Redis)๋ฅผ ๊ฒฐํฉํ์ฌ ์์ ๋ก๊ทธ์ธ์ ๊ตฌํํ์ต๋๋ค.
ํ๋ก ํธ ์๋ฒ์์ ์์ธ์ค ํ ํฐ์ผ๋ก ๋ก๊ทธ์ธ ์ํ์ฒ๋ฆฌ๋ฅผ ์ํด AccessToken๋ฅผ ์ ๋ฌํด์ผ ํฉ๋๋ค.
href์์ฒญ์ ๋ฐ์ดํฐ ์์ฒญ ์ ๋ฌ์ด ๋ถ๊ฐํ๊ธฐ์ useEffect๋ก AccessToken ์ฌ์์ฒญํ์์ต๋๋ค.
๐ํ ํฐ ์ ์ฅ์ ์ ์ ๋ฐฉ์

ํด๋ผ์ด์ธํธ
- cookie: Refresh Token
- local stoarge: Access Token
์๋ฒ
- Redis: Refresh Token
์ด 3๊ณณ์ JWT ๋ก๊ทธ์ธ ๋ฐฉ์์ผ๋ก ํ ํฐ์ ์ ์ฅํ์ต๋๋ค.
2 ๊ฐ์ง ๋ฌธ์ ์ ๊ณผ ํด๊ฒฐ๋ฐฉ๋ฒ
์ฒซ์งธ, Refresh Token์ด ํด๋ผ์ด์ธํธ์์๋ง ๊ด๋ฆฌ๋๋ฉด ๋ก๊ทธ์์ ์์ ์ ํ ํฐ ๋ฌดํจํ ๋ฐฉ๋ฒ์ด ์์์ต๋๋ค.
์๋ฒ์๋ Refresh Token์ ์ถ๊ฐํ์ฌ ๋ก๊ทธ์์ ์ ํด๋น ํ ํฐ์ ์๋ฒ์์ ์ง์ ๋ง๋ฃ ์ํค๋๋ก ๊ตฌํํ์ต๋๋ค.
๋์งธ, MySQL์ ํ ํฐ ๋ง๋ฃ ํ ์ญ์ ์์ ์ด ๋ถ๋ด๋๋ ์์ ์ด๋ฏ๋ก Redis๋ก ํ ํฐ ์ ์ฅ์๋ฅผ ๋ฐ๊พธ๊ณ TTL ๊ธฐ๋ฅ์ ์ฌ์ฉํ์ฌ expire์ ์๋ ๋ง๋ฃํ๋๋ก ํ์์ต๋๋ค.
๐๋ถํ ํ ์คํธ

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> |
![]() <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๋ฅผ ๋ฒํฐ๋ ๊ฒ์ ํ์ธํ์ต๋๋ค.

์ธ์คํด์ค t2.small์ agent ์คํ์ ์ฌ์ฉํ๋๋ฐ vUser๊ฐ 1500์ผ ๋ ์ธ์คํด์ค๊ฐ lack of free memory๋ก ์ฃฝ์ด์ ์ธ์คํด์ค์ ์คํ์ t3a.large๋ก ์ฌ๋ ค์ MEM 20%๋ก ์์ ์ ์ผ๋ก Vuser ํ๊ฒฝ์ ๋ง๋ค์์ต๋๋ค.
๐์ถ๊ฐ์์ฑ ์์
- ๋ชจ๋ํฐ๋ง
AOP๋ฅผ ์ฌ์ฉํด์ ๋ง์ดํฌ๋ก๋ฏธํฐ์์ @Counted ๋ก ๋งคํธ๋ฆญ์ ํ๋ก๋ฉํ ์ฐ์ค์๊ฒ ์๋ต
์์คํ ๋ฉํธ๋ฆญ(CPU, ๋ฉ๋ชจ๋ฆฌ)
์ ํ๋ฆฌ์ผ์ด์ ๋ฉํธ๋ฆญ(ํฐ์บฃ ์ฐ๋ ๋ ํ, DB ์ปค๋ฅ์ ํ, ์ ํ๋ฆฌ์ผ์ด์ ํธ์ถ ์)
๋น์ฆ๋์ค ๋ฉํธ๋ฆญ(์ฃผ๋ฌธ์, ์ทจ์์)
์ฒ๋ผ ํด์ ๋ด๋ ธ๋ค ๊ทธ๋ฆผ~~~
- ์๋
๊ฒฝ๊ณ ์ ์ฌ๊ฐ์ ๊ตฌ๋ถํด์ ์๋์ ๋ด๋ ธ๋ค
๋์คํฌ ์ฌ์ฉ๋ 70% ๊ฒฝ๊ณ
๋์คํฌ ์ฌ์ฉ๋ 80% ์ฌ๊ฐ
CPU ์ฌ์ฉ๋ 40% ๊ฒฝ๊ณ
CPU ์ฌ์ฉ๋ 50% ์ฌ๊ฐ