

๋์ฉ๋ ํธ๋ํฝ ํธ๋ค๋ง์ ํ๊ฒํ ํ ํฐ์ผํ ์๋งค ์์ ์ด์ปค๋จธ์ค์ ๋๋ค.
์ต๊ทผ ์จ๋ผ์ธ ์๋น์ค์ ๊ท๋ชจ๊ฐ ์ปค์ง๊ณ ์ง์์ ์ผ๋ก ์๋ฒ๊ฐ ํ์ฅ๋จ์ ๋ฐ๋ผ ์ด์ ๋น์ฉ์ ์ต์ํํ๊ณ ๋์์ ๋๊ท๋ชจ ํธ๋ํฝ์ ํจ์จ์ ์ผ๋ก ๊ด๋ฆฌํ๊ณ ์ ํ๋ ๊ธฐ์ ์ด ๋์ด๋๊ณ ์์ต๋๋ค.
์ด์ ๋ฐ๋ผ, ํ์ฌ์ ํธ๋ ๋๋ฅผ ๋ฐ๋ผ๊ฐ๊ธฐ ์ํด ์ ํ๋ ์กฐ๊ฑด์ ๊ฐ์ง๊ณ ๋์์ฑ ์ ์ด, ํ์ฅ์ฑ ๋ฐ ๊ณ ๊ฐ์ฉ์ฑ์ ์ฐ์ ์ํ๋ ์์คํ ์ ์ค๊ณํด ๋ณด๊ณ ์ ์์ฅ ์กฐ์ฌ๋ฅผ ํด๋ณธ ๊ฒฐ๊ณผ "ํฐ์ผํ ์๋น์ค" ๊ฐ ์ ํฌ๊ฐ ์๊ฐํ ํ๊ฒฝ๊ณผ ๊ฐ์ฅ ์ ์ฌํ๋ฉฐ ์ ๊ทผ์ฑ์ด ์ข์ ์ฃผ์ ์ด๊ณ , ์๊ฐ์ or ์ง์์ ์ธ ๋์ฉ๋ ํธ๋ํฝ์ ํธ๋ค๋ง ํ๊ธฐ์ ์ ํฉํ๋ค๊ณ ์๊ฐํ์ฌ ์ ํํ๊ฒ ๋์์ต๋๋ค.
FE-Repository : https://github.com/TicketNest/TicketNest-FE
Pub-Repository : https://github.com/TicketNest/TicketNest-Pub
Sub-Repository : https://github.com/TicketNest/TicketNest-sub
Notion : https://www.notion.so/7-J-o-J-e21d060e8f474805aeef6a4828b37712


NestJS
- ๋ชฐ๋ ๋ฐ ํ์ผ ๊ตฌ์กฐ๋ฅผ ์ก์์ค
- ์ปดํ์ผ ๋จ๊ณ์์ ์๋ฌ๋ฅผ ๋ฏธ๋ฆฌ ๋ฐ๊ฒฌํ ์ ์์ด ์์ฐ์ฑ ํฅ์
- ๋ฐ์ดํฐ ํ์
์ ์ง์ ํ ์ ์์ด ๊ฐ๋ฐ์๊ฐ ๊ธฐ๋ํ ๊ฒฐ๊ด๊ฐ๊ณผ ๋ค๋ฅธ ๊ฐ์ด ๋ฐํ๋๋ ํ์ ๋ฐฉ์ง
PostgreSQL
- ์คํ์์ค ๊ธฐ๋ฐ ๋ฐ ๋ค์ํ ๋ ํผ๋ฐ์ค
- ํ๋ก์ ํธ ์ฃผ์ ์ ํน์ฑ์ ์ฝ๊ธฐ ์์ ๋ชป์ง์์ ๋๋์ ์ฐ๊ธฐ ์์
- ์ถํ ํ๋ก์ ํธ ํ์ฅ ๋ฐ ํ
์ด๋ธ ๊ด๊ณ์ ๋ณต์ก์ฑ์ ๋ํ ์ฑ๋ฅ ๋ณด์ฅ
TypeORM
- ์ฟผ๋ฆฌ์ ๋ณต์ก๋๊ฐ ์์นํจ์ ๋ฐ๋ฅธ ๊ฐ๋ ์ฑ ๋ฐ ์ฑ๋ฅ ๊ณ ๋ ค
- ๋ฐ์ดํฐ ๋ฌด๊ฒฐ์ฑ์ ์ํด ํ๋ฆ ์ ์ด์ ํ์ํ ACID ์์ฑ ์ง์
- NestJS์ ๊ณต์ ORM์ผ๋ก์จ ์์ ์ ์ธ ์ง์๊ณผ ์ค์ํ ์ฑ๋ฅ
Redis
- ๋ฉ์ธ์ง๋ฅผ ๊ธฐ๋กํ์ง ์๋ ๋์ ๋์ ์ฒ๋ฆฌ ์๋ ๋ณด์ฅ
- ๋ค์ํ ๋ ํผ๋ฐ์ค์ Learning Curve
- Pub/Sub๊ณผ ์ธ๋ฉ๋ชจ๋ง ์บ์ฑ ๊ธฐ์ ์ ํ๋๋ก ์ฌ์ฉํจ์ ๋ฐ๋ผ ์ด์ฉ ๋ฒ์ ์ถ์
nGrinder
- ๋น๊ต์ ์ฌ์ด ์ค์น ๋ฐ ๊ตฌ์ฑ
- ๊ตญ๋ด ์ปค๋ฎค๋ํฐ ๋ฐ ๋ค์ํ ๋ ํผ๋ฐ์ค ์กด์ฌ
- ์ฌ๋ฌ ๋์ Agent๋ฅผ ์ฌ์ฉํ์ฌ ๋๊ท๋ชจ ๋ถํ ํ
์คํธ ์งํ ๊ฐ๋ฅ
Elastic APM
- ์์ ์ฒ๋ฆฌ ์์ ์๊ฐ์ ๋ํ ์์ธํ ๊ฐ์ํ ๋ฐ์ดํฐ
- ๋ณ๋ชฉ ํ์ ์ง์ ํ์ ์ฉ์ด
- Transaction์ ์์๋๋ ์๊ฐ ์ฒดํฌ
HAPROXY
- ๊ฐ๋จํ ์ค์น ๋ฐ ์ค์
- L4/L7 ์ง์์ด ๊ฐ๋ฅํด ์ํคํ ์ณ ํ์ฅ์ ๋ํ ์ ์ฐ์ฑ ๋ณด์ฅ
- ์ค์๊ฐ ๋ชจ๋ํฐ๋ง์ผ๋ก ์๋ฒ๋ณ ์ํ ์ง์ ํ์ ๊ฐ๋ฅ
Pgpool-II
- PostgreSQL์ ํนํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก ์ต์ ์ ์ฑ๋ฅ๊ณผ ๊ธฐ๋ฅ ์ ๊ณต
- ํ๋์ ์ฟผ๋ฆฌ๋ฅผ ์ฌ๋ฌ ์๋ฒ์ ๋์ ๋ถ์ฐํ์ฌ ์๋ต ์๊ฐ ๋จ์ถ

์ด๊ธฐ๋จ๊ณ | SQL ๋ก๊ทธ ์ ๊ฑฐ | ์ฟผ๋ฆฌ ์ต์ ํ | Redis Cache | Redis Pub/Sub | |
---|---|---|---|---|---|
TPS | 110.3 | 172.9 | 175.4 | 657.7 | 1040.7 |
MTT | 421.78ms | 286.45ms | 278.36ms | 73.59ms | 48.33ms |
Terminal ์์ SQL Log ์ ๊ฑฐ
EC2 Instance CPU ์ฌ์ฉ๋ ์ฝ 90% ๊ณผ๋ถํ ์ํ ํ์
DB์ CPU์ I/O ๋ถํ ๋ฑ ์ํ๋ฅผ ํ์ธํด ๋ดค์ผ๋, ์ฝ๊ธฐ/์ฐ๊ธฐ ๋ชจ๋ ์ผ์ ํ ํจํด
์๋ฒ๋ฅผ Scale Up ํด๋ดค์ง๋ง, CPU ์ฌ์ฉ๋ 80%๋ก ์ฌ์ ํ ๋์ ํ์
DB์ ๋ฐ์ดํฐ๋ฅผ ๋ฃ๊ธฐ ์์ํ๋ฉด ๋ฐ์ํ๋ ๋ก๊ทธ๊ฐ Instance์ ์๋นํ ๋ถํ๋ฅผ ์ฃผ๋ ๊ฒ์ ํ์ธํ์ฌ ๋ก๊ทธ๊ฐ ์๋์ผ๋ก ์์ฑ๋์ง ์๋๋ก ์์
ํญ๋ชฉ | ์ ์ฉ ์ | ์ ์ฉ ํ | ๋ณํ๋ |
---|---|---|---|
TPS | 110.3 | 172.9 | ์ฝ 57% ์์น |
Mean Time | 421.78ms | 286.45ms | ์ฝ 68% ๊ฐ์ |
CPU ์ฌ์ฉ๋ | 80% | 40% | 40% ๊ฐ์ |
์ฟผ๋ฆฌ ์ต์ ํ(Dynamic Query)
CreateBooking API ํธ์ถ ์ Latency๊ฐ ๋ฎ์ ํ์
goods entity์ BookingCount Update ์ TypeORM์ Save Method๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ, Select ๋ฌธ์ ํตํด ํด๋นํ๋ id Column์ ์ ์ฒด ์กฐํ ํ Update๋ฅผ ์งํํ๋ ํํ์ ์ฟผ๋ฆฌ๋ฅผ ํ์ธํ์ฌ ์ต์ ํ ์๋
TypeORM์ QueryBuilder๋ฅผ ํตํด ๋์ ์ฟผ๋ฆฌ๋ฅผ ๊ตฌํํ์ฌ TPS ๋ฐ MTT ๊ฐ์
ํญ๋ชฉ | ์ ์ฉ ์ | ์ ์ฉ ํ | ๋ณํ๋ |
---|---|---|---|
TPS | 138.4 | 175.4 | ์ฝ 21% ์์น |
Mean Time | 357.67ms | 275.05ms | ์ฝ 22% ๊ฐ์ |
Redis Cache
QueryBuilder๋ฅผ ํตํด ๋์ ์ฟผ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ Latency, TPS ๋ฑ ์ฑ๋ฅ ํฅ์์ ํ์ง๋ง ์ฌ์ ํ ์ ๋๊ฐ์ ํฌ์ง ์์ ํ์
๋คํธ์ํฌ ํผํฌ ๊ฐ์ด ๋ฐ์ํ์ง ์๊ณ , ์์คํ ๋ถํ๋ ๋ฎ์ ์ํ์์ ๋์คํฌ I/O ๊ฐ๋ง ๋์ ์ํ์ฌ์ DB์ ๊ตฌ์กฐ์ ํ๊ณ๋ก ํ๋จํ์ฌ Redis Cache ์ ์ฉ ์๋
Redis Cache๋ฅผ ํตํด DB์ ๋ถํ๋ฅผ ์ค์ฌ์ CPU ์ฌ์ฉ๋์ ๊ฐ์ ํ๊ณ , Cache๋ฅผ ํตํด ๋ฐ์ดํฐ์ ์ ๊ทผํ๊ธฐ ๋๋ฌธ์ TPS ๋ฐ Mean Time๊น์ง ๊ฐ์
ํญ๋ชฉ | ์ ์ฉ ์ | ์ ์ฉ ํ | ๋ณํ๋ |
---|---|---|---|
TPS | 215.4 | 657.7 | ์ฝ 205% ์์น |
Mean Time | 226.05ms | 73.59ms | ์ฝ 67% ๊ฐ์ |
CPU ์ฌ์ฉ๋ | 40~50% | 80% | 30~40% ์์น |
Redis Pub/Sub
In-memory ๊ธฐ๋ฐ์ Redis Cache๋ฅผ ์ฌ์ฉํ์ฌ ์ ๋ฐ์ ์ธ ์ฑ๋ฅ์ ๊ฐ์ ํ์ง๋ง, ๋์์ฑ ์ ์ด์ ์คํจ
Redis ๋ถ์ฐ๋ฝ์ ํตํ ๋์์ฑ ์ ์ด ์๋ ์คํจ
-
์ฌ๋ฌ ๊ฐ์ Pub์์ Message๋ฅผ ๋น๋๊ธฐ์ ์ผ๋ก ๋ฐํํ๊ธฐ ๋๋ฌธ์ ์ฑ๋ฅ์ด ๊ฐ์ ๋จ๊ณผ ๋์์ Queue๋ ์์ฐจ์ ์ผ๋ก Message๋ฅผ ์ ์ฅํ๊ธฐ ๋๋ฌธ์ ๋์์ฑ ์ ์ด ๋ํ ํด๊ฒฐ
-
Queue๋ก ์ธํด ์์ฐจ์ ์ผ๋ก ์ ์ฅ๋๊ธฐ ๋๋ฌธ์ Transaction์ ํ์์ฑ์ด ์ฌ๋ผ์ง๋ฉฐ ๋ก์ง์ ๊ฐ์ํ
ํญ๋ชฉ | ์ ์ฉ ์ | ์ ์ฉ ํ | ๋ณํ๋ |
---|---|---|---|
TPS | 657.7 | 1,040.7 | ์ฝ 585% ์์น |
Mean Time | 73.59ms | 48.33ms | ์ฝ 34% ๊ฐ์ |
CPU ์ฌ์ฉ๋ | 80% | 65% | 15% ๊ฐ์ |
Scale Out
์ฑ๋ฅ ๊ฐ์ ๋ฐ ๋์์ฑ ์ ์ด์ ์ ์๋ฏธํ ๊ฒฐ๊ณผ๋ฅผ ์ป์์ง๋ง, ์ฌ์ฉ์ ์๋ฅผ ์ฆ๊ฐ์์ผ๋ ๋ ์ด์ TPS ๊ฐ ์์นํ์ง ์๋ ํ์
๋ค์์ ์๋ฒ๋ฅผ ๋ก๋ ๋ฐธ๋ฐ์๋ฅผ ํตํด ์ฐ๊ฒฐ ๋ฐ ๋ถ์ฐํ์ฌ ์ถ๊ฐ์ ์ธ TPS ์์น
ํญ๋ชฉ | ์ ์ฉ ์ | ์ ์ฉ ํ | ๋ณํ๋ |
---|---|---|---|
TPS | 1,252 | 3,066 | ์ฝ 245% ์์น |
Mean Time | 1,588ms | 604.58ms | ์ฝ 40% ๊ฐ์ |
CPU ์ฌ์ฉ๋ | 100% | ์ฝ 80% | 20% ๊ฐ์ |
Run Time | 13m 46s | 5m 54s | ์ฝ 57% ๊ฐ์ |
-
TPS : 110.3 -> 1040.7 (์ฝ 845% ์์น)
-
Mean Time : 421.78ms -> 48.33ms (์ฝ 89% ๊ฐ์)
EC2 ์ธ์คํด์ค ๊ฐ ์ฐ๊ฒฐ
โ Issue
- ์ ํ๋ฆฌ์ผ์ด์ Instance -> PostgreSQL Instance ์ฐ๊ฒฐ ์คํจ
๐ก Solution
-
Public IPv4 / Private IPv4 ์ฐจ์ด์ ์ ํ์ฉ
-
๋์ปค ์ปจํ ์ด๋์ -p ์ต์ ์ ํตํด ํธ์คํธ์ ๋ณ๋์ ๋คํธ์ํฌ ์ฐ๊ฒฐ ์ฒ๋ฆฌ
-
์ธ๋ฐ์ด๋ ๊ท์น์ ํตํด Instance์ ์ ๊ทผ ๊ถํ์ ์ค ๊ฒ์ ipv4 ์ด๋ค.
-
-p ์ต์ ์ ํตํด ํธ์คํธ IP ์ฃผ์๋ฅผ ์ฐ๊ฒฐํ๊ณ ์ ํ๋ Instance์ public ipv4๋ก ์ค์ ํ์๋ค.
-
ํธ์คํธ IP ์ฃผ์๋ฅผ ์ค์ ํ ๋, Public๊ณผ Private ์ค ๋ฌด์์ ์ค์ ํด์ผ ํ ์ง ์ ์๊ฐํด ๋ด์ผ ํ๋ค.
- Public IPv4: ์ธ๋ถ ๋คํธ์ํฌ์์ ์ธ์คํด์ค๋ก์ ์ฐ๊ฒฐ์ ๋์์ฃผ๋ ์ฃผ์๋ก์จ. ์ธ์คํด์ค๋ฅผ ์ค์งํ๊ณ ์ฌ์์ํ ๊ฒฝ์ฐ IPv4 ๊ฐ์ด ๋ณ๊ฒฝ๋ ์ ์๋ค.
- Private IPv4: VPC ๋๋ ๋ก์ปฌ ๋คํธ์ํฌ ๋ด์์๋ง ์ธ์คํด์ค์ ์ฐ๊ฒฐํ ์ ์๋๋ก ๋์์ฃผ๋ ์ฃผ์์ด๋ค.
๋ฐ์ดํฐ ๋์์ฑ ์ ์ด
โ Issue
- ๋ค์์ User๊ฐ ๋์ ์ ์ ์ ๋ฐ์ดํฐ ์ผ๊ด์ฑ์ด ์ง์ผ์ง์ง ์๋ ์ํ ๋ฐ์
๐ก Solution
-
goods_entity ํ ์ด๋ธ์ BookingCount๋ผ๋ ์๋ก์ด Column์ ์์ฑํ์ฌ Write Lock์ ๊ฑธ์ด Row ์์ค์์์ Lock ์งํ
-
์ด๋ฅผ ํตํด API์ ๋ค์์ ์ฌ์ฉ์๊ฐ ๋์์ ์ ๊ทผํ์ ๋ ์์ฐจ์ ์ผ๋ก ์๋งคํ ์ ์๋๋ก ์ค์
-
Transaction์ Read COMMITED๋ก ์ค์ ํ๊ณ , Find Method์ Write Lock์ ๊ฑธ์ด ๋์์ฑ์ ์ ์ดํ๋ค.
- ๋ ๋์ Isolate Level์ด๋, Read Lock(๊ณต์ ๋ฝ)์ ์ค์ ์ DeadLock ํ์์ด ๋ฐ์ํ๋ ๋ฌธ์ ์
-
Count Method๋ Row ์์ค์ Lock์ด ๊ฑธ๋ฆฌ์ง ์๋ ๋ถ๋ถ์ ํ์ธํ์๋ค
- Table ์ ์ฒด๋ฅผ ์กฐํํ์ฌ ํด๋นํ๋ Row์ ๊ฐฏ์๋ฅผ Count ํ๊ธฐ ๋๋ฌธ์ Row ์์ค์ Lock์ ๊ฑธ๋ฆฌ์ง ์๋๋ค.
-
๋ฐ๋ผ์, Goods Table์ BookingCount Column์ ์ถ๊ฐํ ๋ค, ํด๋น Row์ Write Lock์ ์ ์ฉํ์๋ค.
-
Transaction์ ์ค์ ํ ๋, Transaction์ ์๋ฆฌ, Lock์ ์ข ๋ฅ ๋ฑ์ ์ ์๊ฐํ์ฌ ์ ์ฉํด์ผ ํ๋ค ํนํ, ๋ค์์ Transaction์ ๋์ํํ๋ฉด์ ๋ถ์ํ๋ฉด, ๋์ฑ ๋น ๋ฅด๊ฒ ํด๋ฒ์ ์ฐพ์ ์ ์๋ค.
504 Gateway Time-out Error
โ Issue
- ์ฝ VUser 3500 / Run Count 1000 ์ด์์ ๋ถํ ์กฐ๊ฑด์์ 504 Gateway Time-Out Error ๋ฐ์
๐ก Solution
- ํ ์๋ฒ๊ฐ ๋ค๋ฅธ ์๋ฒ๋ก๋ถํฐ ์ ๋ ์๋ต์ ๋ฐ์ง ๋ชปํ๊ธฐ ๋๋ฌธ์ ๋ก๋ ๋ฐธ๋ฐ์์ timeout ๊ฐ ์ค์ ์ ํตํด ์์ฒด ๋๊ธฐ ์๊ฐ ๋ฐ ๋ฆฌ์์ค ์ ํ ํด๊ฒฐ
๋ถ๋ฅ | ๊ธฐ์ |
---|---|
Language | |
FrameWork | |
DB & ORM | |
Caching | |
Monitor | |
Test | |
Cloud & OS | |
Load Balance | |
Etc |
์ญํ | ์ด๋ฆ | ๊นํ๋ธ |
---|---|---|
BE(ํ์ฅ) | ์ค๋ฌธ์ด | https://github.com/munyeol-Yoon |
BE | ๋ฐํ์ฃผ | https://github.com/Hangju0610 |
BE | ์ ์ฑ์ค | https://github.com/since1630 |
BE | ์ด์ํ | https://github.com/tkdgks7036 |