๐ ์คํ ๊ฐ์
Webflux๋ ์ ์ ๋ฆฌ์์ค์์ MVC์ ๋นํด ๋ง์ ์์ฒญ์ ์ฒ๋ฆฌํ ์ ์๊ณ , Coroutine์ ์ค๋ ๋๋ฅผ ์ฌ์ฉํ๋ ๊ฒ๋ณด๋ค ๋ฉ๋ชจ๋ฆฌ ์์์ ํจ์จ์ ์ผ๋ก ๊ด๋ฆฌํ ์ ์๋ค๊ณ ํ๋ค.
์ธํฐ๋ท์ Webflux vs MVC๋ฅผ ๋น๊ตํ ๊ธ์ ๋ง์๋, Webflux + Coroutine vs MVC๋ฅผ ๋น๊ตํ๋ ๊ธ์ ์๋ ๊ฒ ๊ฐ๋ค.
์ด์ ์ ๋ ํ๊ฒฝ์ ๋ง๋ค์ด์ ์์ ์ธ๊ธํ ๋ถ๋ถ์ ๋ํด ์ฆ๋ช ํ๊ณ ์ ํ๋ค.
์์์์ Reactive Stack์ ์ฌ์ฉํ๋๋ฐ, Webflux + Coroutine + JPA ์กฐํฉ์ ์ฌ์ฉํ๋ค.
์ด์ ํํ ์ฌ์ฉํ๋ MVC + JPA ์กฐํฉ์ ๋น๊ตํ๊ณ ์ ํ๋ค.
๐ ์คํ ๋ด์ฉ
๐ต ์คํ ๋ชฉํ
์ด ์คํ์ ํตํด ์์๋ณด๊ณ ์ถ์ ์ ์ ์๋์ ๊ฐ๋ค.
- MVC์ ๋น๊ตํ์ ๋ Webflux์ ์์ฒญ ์ฒ๋ฆฌ ๋ฅ๋ ฅ
- Coroutine์ ๋ฉ๋ชจ๋ฆฌ ํจ์จ์ฑ
- index๋ฅผ ํตํ ์กฐํ์, index๋ฅผ ์ฌ์ฉํ์ง ์์ ์กฐํ์ ์ฐจ์ด
- index๋ฅผ ์ด์ฉํ ์กฐ์ธ๊ณผ, ๊ทธ๋ ์ง ์์ ์กฐ์ธ์ ์๋ ์ฐจ์ด
๐ต ์คํ ํ๊ฒฝ
์คํ ํ๊ฒฝ์ ์ด๋ฌํ๋ค.
AWS EC2 t3.micro
AWS RDS t3.xlarge
์๋ฒ์ ๋นํด DB๋ฅผ ์์ฒญ ์ข์ ๊ฒ์ผ๋ก ์ค์ ํ๋ค.
DB์์ ๋ณ๋ชฉ์ด ๋๋ ๊ฒ์ ์ต๋ํ ๋ฐฉ์งํ๊ธฐ ์ํด์์ด๋ค.
๐ต ํ ์คํธ ์ฝ๋
์๋ฒ๊ฐ DB์์ ๊ฐ์ ์กฐํํ์ฌ ๋ฐํํ๋ ๊ฐ๋จํ ๋ก์ง์ ์ด์ฉํด ํ ์คํธ๋ฅผ ์งํํ๋ค.
์์ธํ ์ฝ๋๋ ์๋ ๋ ํฌ๋ฅผ ์ฐธ๊ณ ํ๋ฉด ๋๋ค.
Spring_study/webfluxCoroutineJPA at main · wjdtkdgns/Spring_study
์คํ๋ง ๊ณต๋ถ์ค๐ฑ. Contribute to wjdtkdgns/Spring_study development by creating an account on GitHub.
github.com
Spring_study/mvcJPA at main · wjdtkdgns/Spring_study
์คํ๋ง ๊ณต๋ถ์ค๐ฑ. Contribute to wjdtkdgns/Spring_study development by creating an account on GitHub.
github.com
์๋ webflux์ด๊ณ ์๋๋ mvc์ด๋ค.
์ํฐํฐ๋ A, B, C 3๊ฐ๊ฐ ์กด์ฌํ๋ค.
B, C๋ ๊ฐ๊ฐ A์ ์ฐ๊ด๊ด๊ณ๋ฅผ ๋งบ์ผ๋ฉฐ, B, C์ column์ผ๋ก A์ id๋ฅผ ๊ฐ์ง๋ค.
DDL์ ์๋์ ๊ฐ๋ค.
CREATE TABLE `a`
(
`id` bigint NOT NULL AUTO_INCREMENT,
`varchar256` varchar(256) NOT NULL,
`varchar512` varchar(512) NOT NULL,
`intt` int NOT NULL,
`bigintt` bigint NOT NULL,
`created_at` datetime DEFAULT CURRENT_TIMESTAMP,
`modified_at` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='a';
CREATE TABLE `b`
(
`id` bigint NOT NULL AUTO_INCREMENT,
`aid` bigint NOT NULL,
`varchar256` varchar(256) NOT NULL,
`varchar512` varchar(512) NOT NULL,
`intt` int NOT NULL,
`bigintt` bigint NOT NULL,
`created_at` datetime DEFAULT CURRENT_TIMESTAMP,
`modified_at` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='b';
CREATE TABLE `c`
(
`id` bigint NOT NULL AUTO_INCREMENT,
`aid` bigint NOT NULL,
`varchar256` varchar(256) NOT NULL,
`varchar512` varchar(512) NOT NULL,
`intt` int NOT NULL,
`bigintt` bigint NOT NULL,
`created_at` datetime DEFAULT CURRENT_TIMESTAMP,
`modified_at` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='c';
CREATE INDEX idx__aid ON c (aid);
B, C๋ ๋ด์ฉ์ ๋ชจ๋ ๊ฐ์ง๋ง, ์ธ๋ฑ์ค๊ฐ ๋ค๋ฅด๋ค.
B๋ ์ธ๋ฑ์ค๋ฅผ ์ถ๊ฐ์ ์ผ๋ก ์ค์ ํ์ง ์์๊ณ , C๋ aid์ ์ธ๋ฑ์ค๋ฅผ ์ถ๊ฐํ๋ค.
๊ฐ ํ ์ด๋ธ์ row ์๋ ์๋์ ๊ฐ๋ค.
A : 2000
B, C : 10000
์คํ ์ด์ ์ ๋ฏธ๋ฆฌ ๋ฃ์ด๋๊ณ ์ฌ์ฉํ๋ค.
๊ฐ ์ฃผ์ ์ ๋ํ ์ฝ๋๋ ์๋์์ ํ์ธํ๋ฉด ๋๋ค.
Spring_study/webfluxCoroutineJPA/src/main/kotlin/com/example/webfluxCoroutineJPA/application/AService.kt at main · wjdtkdgns/Sp
์คํ๋ง ๊ณต๋ถ์ค๐ฑ. Contribute to wjdtkdgns/Spring_study development by creating an account on GitHub.
github.com
์คํ์ํค๋ ํจ์๋ ์ด 6๊ฐ์ง์ด๋ค.
- id๋ก A ์กฐํ
- A์ id๋ก A, B๋ฅผ ์กฐ์ธํ์ฌ ์กฐํ
- A์ id๋ก A, C๋ฅผ ์กฐ์ธํ์ฌ ์กฐํ
- intt๋ก A ์กฐํ
- A์ intt๋ก A, B๋ฅผ ์กฐ์ธํ์ฌ ์กฐํ
- A์ intt๋ก A, C๋ฅผ ์กฐ์ธํ์ฌ ์กฐํ
๐ต ํ ์คํธ ํด ๋ฐ ์ค์
๋ถํ ํ ์คํธ๋ฅผ ์ํด jmeter๋ฅผ ์ฌ์ฉํ๋ค.
์์ ๊ฐ์ด ๊ตฌ์ฑํ์ผ๋ฉฐ, ์ค๋ ๋ ๊ทธ๋ฃน์ ์ฌ์ฉ์ ์์ ์์ฒญ ํ์๋ฅผ ์กฐ์ ํ๋ฉฐ ์คํํ๋ค.
ramp-up ์๊ฐ์ 0.1๋ก ํด๋ ์ด์ ๋ ์ค์ ์๋ฒ์์ด 1์ด๋ง๋ค ๋ค์ด์ค๋ ๊ฒ์ ๋ง์ด ์ ๋๋ค๊ณ ์๊ฐํ๊ธฐ ๋๋ฌธ์ด๋ค.
์ค์ ์ ๊ฐ์ ์ํฉ์ ์ต๋ํ ๊ตฌํํ๊ณ ์ 0.1๋ก ์ค์ ํ๋ค.
์๋๋ ์คํํ๋ ์ฌ์ฉ์ ์์ ์์ฒญ ํ์์ด๋ค.
- ์ฌ์ฉ์ ์ : 1 / ์์ฒญ ํ์ : 100
- ์ฌ์ฉ์ ์ : 10 / ์์ฒญ ํ์ : 100
- ์ฌ์ฉ์ ์ : 30 / ์์ฒญ ํ์ : 100
- ์ฌ์ฉ์ ์ : 50 / ์์ฒญ ํ์ : 100
- ์ฌ์ฉ์ ์ : 70 / ์์ฒญ ํ์ : 100
- ์ฌ์ฉ์ ์ : 100 / ์์ฒญ ํ์ : 100
- ์ฌ์ฉ์ ์ : 120 / ์์ฒญ ํ์ : 50
- ์ฌ์ฉ์ ์ : 140 / ์์ฒญ ํ์ : 50
- ์ฌ์ฉ์ ์ : 160 / ์์ฒญ ํ์ : 50
- ์ฌ์ฉ์ ์ : 180 / ์์ฒญ ํ์ : 50
- ์ฌ์ฉ์ ์ : 200 / ์์ฒญ ํ์ : 50
- ์ฌ์ฉ์ ์ : 300 / ์์ฒญ ํ์ : 10
- ์ฌ์ฉ์ ์ : 400 / ์์ฒญ ํ์ : 10
- ์ฌ์ฉ์ ์ : 500 / ์์ฒญ ํ์ : 10
- ์ฌ์ฉ์ ์ : 600 / ์์ฒญ ํ์ : 10
- ์ฌ์ฉ์ ์ : 700 / ์์ฒญ ํ์ : 10
- ์ฌ์ฉ์ ์ : 800 / ์์ฒญ ํ์ : 10
- ์ฌ์ฉ์ ์ : 900 / ์์ฒญ ํ์ : 10
- ์ฌ์ฉ์ ์ : 1000 / ์์ฒญ ํ์ : 10
๐ ์คํ ๊ฒฐ๊ณผ
์ฌ์ง์ด ๋๋ฌด ๋ง์์ ์๋ ๋ ธ์ ๋งํฌ์ ์ ๋ฆฌํด ๋๋ค
Webflux + Coroutine vs MVC | Notion
์ฌ์ฉ์ ์ : 1 / ์์ฒญ ํ์ : 100
shjeong1026.notion.site
์์ ์ธ๊ธํ ์ด ์คํ์ ๋ชฉํ๋ฅผ ์ฌ์ฐจ ์์ ํ๊ฒ ๋ค
- MVC์ ๋น๊ตํ์ ๋ Webflux์ ์์ฒญ ์ฒ๋ฆฌ ๋ฅ๋ ฅ
- Coroutine์ ๋ฉ๋ชจ๋ฆฌ ํจ์จ์ฑ
- index๋ฅผ ํตํ ์กฐํ์, index๋ฅผ ์ฌ์ฉํ์ง ์์ ์กฐํ์ ์ฐจ์ด
- index๋ฅผ ์ด์ฉํ ์กฐ์ธ๊ณผ, ๊ทธ๋ ์ง ์์ ์กฐ์ธ์ ์๋ ์ฐจ์ด
๐ต MVC์ ๋น๊ตํ์ ๋ Webflux์ ์์ฒญ ์ฒ๋ฆฌ ๋ฅ๋ ฅ
์ด๋ ์๋ ๊ทธ๋ํ๋ฅผ ์ฐธ๊ณ ํ๋ฉด ๋๋ค.
ํ์์ ์ฒ์ฐธํ ์์ ์ค๋ ฅ์ ์ดํดํด ์ฃผ๊ธธ ๋ฐ๋๋ค.
MVC์ ๋นํด Webflux + Coroutine์ด 2๋ฐฐ๊ฐ๋ ์ข์ ์ฑ๋ฅ์ ๋ณด์ธ๋ค.
๋์ ์์ฒญ ์๊ฐ ๋์ด๋ ์๋ก ์ด ๋์ ๊ฒฉ์ฐจ๋ ๋ ์ปค์ง๋ค.
์ด๋ ์๋์ ์ํฅ์ด ์กด์ฌํ๋ค๊ณ ์๊ฐํ๋ค.
์ฐ์ CPU ์ฌ์ฉ๋ฅ ์ด๋ค.
์์ ๋ค์ ์ฒ๋ฆฌํ๋๋ฐ CPU๋ฅผ ๋ ๋ง์ ์๊ฐ ์ด์ฉํ ์ ์๋ค๋ฉด, ๋ ๋ง์ ์์ ์ ์ฒ๋ฆฌํ ์ ์์ ๊ฒ์ด๋ค.
์ด ๋ถ๋ถ์ ์์ด์ Webflux + Coroutine์ด ์๋ฑํ ์ข์ ์์น๋ฅผ ๊ฐ์ง๋ค.
์ด๋ non-blocking ํ๊ฒ ์๋ํ๋ ์์คํ ๊ณผ Context Switching ์ต์ํ๊ฐ ์ด์ ์ค์ํ ์ญํ ์ ํ๋ค๊ณ ์๊ฐํ๋ค.
Netty์ ์ด๋ฒคํธ ๋ฃจํ๋ ์ฝ์ด ์๋งํผ ์๋ํ๋ฉฐ Context Switching์ ์ต์ํํ๊ณ , non-blocking ํ๊ฒ ๋์ํ๋ค.
๋ํ Coroutine์ suspend ๊ธฐ๋ฅ์ ํตํด non-blocking ํ๊ฒ ์๋ํ๋ค.
์ด๋ ์๋ก์ด ์ค๋ ๋๋ฅผ ๋ง๋ค์ด์ ์ฒ๋ฆฌํ์ฌ Context Switching์ด ๋ฐ์ํ๋ค
ํ์ง๋ง non-blocking ํ๊ฒ ์๋ํ๊ธฐ ๋๋ฌธ์ ๊ฐ์ ์์ ์ ์ ์ ์์ ์ค๋ ๋๋ฅผ ํตํด ์ฒ๋ฆฌํ ์ ์์ผ๋ฏ๋ก, Context Switching ํ์๋ฅผ ์ค์ผ ์ ์๋ค.
์ด ๋ ๋ถ๋ถ์ด ํฉ์ณ์ ธ์ ๋ ๋์ CPU ์ฌ์ฉ๋ฅ ๋ก ๋ํ๋ฌ๋ค๊ณ ์๊ฐํ๋ค.
ํ์ง๋ง MVC๋ Thread Per Request๋ก ์๋ํ๋ฉฐ, ํ์ ๋ CPU๋ฅผ ์ค๋ ๋๋ผ๋ฆฌ ๊ณต์ ํ๋ฉฐ ์๋ํ๋ค.
์ด ๊ณผ์ ์์ Request๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํด ๋ง๋ค์ด์ง ์๋ง์ ์ค๋ ๋์ ๋์์ ์ํด Context Switching์ ๋ถ๊ฐํผํ๋ค.
๋ํ ์ค๋ ๋๊ฐ blocking ํ๊ฒ ์๋ํ๋ฏ๋ก ์ค๋ ๋๊ฐ ์๋ํ์ง ๋ชปํ๋ ์๊ฐ์ด ์๊ธด๋ค.
๋ํ RDB CPU ์ฌ์ฉ๋ฅ ์ด ์ํฅ์ ๋ฏธ์ณค๋ค๊ณ ์๊ฐํ๋ค.
Webflux ํ ์คํธ ์์ ๋ฌ๋ฆฌ MVC ํ ์คํธ ์ 99%๋ฅผ ์ฐ์๋ค.
CPU ์ฌ์ฉ๋ฅ ์ด ๋์์ง ๋, ์ฑ๋ฅ์ด ๋จ์ด์ง๋ค๊ณ ์๊ณ ์๋ค.
์ด๋ IO ๋๊ธฐ ์๊ฐ ์ฆ๊ฐ๋ก ์ธํด blocking ์๊ฐ์ ์ฆ๊ฐ๋ก ์ด์ด์ง๊ณ , ์ด๋ CPU ์ฌ์ฉ์๊ฐ์ ๊ฐ์๋ก ์ด์ด์ง๋ค.
๊ทธ๋์ CPU ์ฌ์ฉ๋ฅ ์ ๊ฐ์ํ๊ฒ ๋๋ค.
์ด๋ฌํ ์ ๋๋ฌธ์ CPU ์ฌ์ฉ๋ฅ ์ด ๋น๊ต์ ๋ฎ๊ฒ ๋์๋ค๊ณ ์๊ฐํ๋ค.
๐ต Coroutine์ ๋ฉ๋ชจ๋ฆฌ ํจ์จ์ฑ
Coroutine์ ์ค๋ ๋๋ฅผ ๋ ํจ์จ์ ์ผ๋ก ์ฌ์ฉํ ๋ฟ ๊ฒฐ๊ตญ ์ค๋ ๋๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด๋ค.
์ค๋ ๋ํ์ ์ฌ์ฉํ๋ฉฐ, ์ด๋ Dispatcher์ ๋ฐ๋ผ ๋ค๋ฅด๊ฒ ์ค์ ๋๋ค.
์ ํ ์คํธ์์ ์ฌ์ฉํ Dispatcher.IO์ ๊ฒฝ์ฐ ๊ธฐ๋ณธ๊ฐ์ผ๋ก 64๊ฐ๊ฐ max์ด๋ค.
์ฆ, ์์ฒญ์ด ๋ง์ผ๋ฉด 64๊ฐ์ ์๋ก์ด ์ค๋ ๋๊ฐ ์์ฑ๋๋ค๋ ๊ฒ์ด๋ค.
๊ทธ๋ฌ๋ฏ๋ก ์ค๋ ๋ ์์ฑ์ ๋ฐ๋ผ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ด ์ฆ๊ฐํ๊ฒ ๋๋ค.
ํ์ง๋ง ์์ฑ๋ ์ค๋ ๋๋ฅผ ๋ ํจ์จ์ ์ผ๋ก ์ฌ์ฉํ ์ ์๊ธฐ ๋๋ฌธ์, ๋ ์ ์ ์ค๋ ๋๊ฐ ์ฌ์ฉ๋์ด ๋ ์ ์ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ ๊ฐ์ง๋ค.
์๋๋ ์ด์ ๊ด๋ จ๋ ๊ทธ๋ํ์ด๋ค.
Webflux + Coroutine์ ๊ฒฝ์ฐ 64~65% ๋ถ๊ทผ์ ๋๋ฌํ์ ๋, ์ฆ๊ฐ๋์ด ๊ฐ์๋จ์ ๋ณผ ์ ์๋ค.
์ ํํ ์ด๋ค ์์ ์ ์ค๋ ๋๊ฐ ๋ช ๊ฐ ์์ฑ๋์ด ์ฌ์ฉํ๊ณ ์๋์ง ํ์ ํ์ง ๋ชปํ์ผ๋, ๊ทธ๋ํ ๋ชจ์์ ๋ณด์ ์ ์ ์๊ฐ 100๋ช ์ด์์ผ ๋ 64๊ฐ์ ์ค๋ ๋๊ฐ ์์ฑ๋์๋ค๊ณ ํ๋จ๋๋ค.
๊ทธ ์ดํ๋ ์์ฒญ์ ์ฆ๊ฐ์ ๋ฐ๋ฅธ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ์ ์ฆ๊ฐ๋ผ ํ๋จ๋๋ค.
MVC๋ ์ฒ์๋ถํฐ ๋๊น์ง ์ผ๊ด๋ ๊ธฐ์ธ๊ธฐ๋ก ์ฆ๊ฐํ๋ค.
tomcat์ default max pool size๋ก 200์ ์ฌ์ฉํ๋ ๊ฒ์ผ๋ก ์๊ณ ์๋ค.
์์ฒญ์ ์ฒ๋ฆฌํจ์ ๋ฐ๋ผ ์ค๋ ๋ ์๊ฐ ๊ณ์ ์ฆ๊ฐํ๋ฏ๋ก, ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋ ๋ํ ๊ณ์ ์ฆ๊ฐํ๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
๋ ๊ทธ๋ํ์ ์ถ์ธ๋ฅผ ๋ณผ ๋, ์์ฒญ์ด ์ฆ๊ฐํ ์๋ก ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋ฅ ์ฐจ์ด๋ ๋ ํฌ๊ฒ ๋ฒ์ด์ง ๊ฒ์ด๋ผ๊ณ ์๊ฐํ๋ค.
๋ํ ๊ฐ ์ฌ์ฉ์ ์์ ๋ฐ๋ฅธ ํ ์คํธ ์ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ ๋ดค์ ๋, Coroutine์ ์ฌ์ฉํ ์ชฝ์ด ๋ ์ ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฌ์ฉํจ์ ์ ์ ์๋ค.
๊ทธ๋ฌ๋ฏ๋ก Coroutine์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ ํจ์จ์ ์ผ๋ก ์ฌ์ฉํ๋ค ํ ์ ์๋ค.
๐ต index๋ฅผ ํตํ ์กฐํ์, index๋ฅผ ์ฌ์ฉํ์ง ์์ ์กฐํ์ ์ฐจ์ด
์๋ MVC์์ ์ฌ์ฉ์ ์ 100, ์์ฒญ ํ์ 100์ ํด๋นํ๋ ํ ์คํธ์ ๊ฒฐ๊ณผ์ด๋ค.
3๋ฒ์ ๋ํ ๋ต์ randomAById์ randomAByIntt๋ฅผ ๋น๊ตํ๋ฉด ๋๋ค.
id๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ธ๋ฑ์ค๊ฐ ์ค์ ๋๊ณ , intt๋ ์ผ๋ฐ์ ์ธ ์นผ๋ผ ์ค ํ๋์ด๋ค.
๊ทธ๋ฌ๋ฏ๋ก id๋ฅผ ํตํด ์กฐํํ๋ฉด ์ธ๋ฑ์ค๋ฅผ ์ด์ฉํ๊ณ , intt๋ฅผ ํตํด ์กฐํํ๋ฉด ์ธ๋ฑ์ค๋ฅผ ์ด์ฉํ์ง ์๋๋ค.
์๋ randomAById ์คํ ์ ๋ฐ์ํ๋ ์ฟผ๋ฆฌ์ด๊ณ , ์๋๋ randomAByIntt ์คํ ์ ๋ฐ์ํ๋ ์ฟผ๋ฆฌ์ด๋ค.
์์์ type ๋ถ๋ถ์ด ์ตํฐ๋ง์ด์ ๊ฐ ์ด๋ค ํค๋ฅผ ์ด์ฉํ๋๋ฅผ ๋ํ๋ด๋ ๋ถ๋ถ์ด๋ค.
ref์ ๊ฒฝ์ฐ index, ALL์ ๊ฒฝ์ฐ ์ ์ฒด ํ์์ ๋งํ๋ค.
์ฆ randomAById๋ ์ธ๋ฑ์ค๋ฅผ ์ด์ฉํ๊ณ , ๊ทธ ํค๋ PRIMARY key ์์ ์ ์ ์๋ค.
์ธ๋ฑ์ค ์ด์ฉ ์ฌ๋ถ๋ ์กฐํ ์๋์ ์ฐจ์ด๋ก ๋ํ๋๋ค.
randomAById๋ 245ms, randomAByIntt๋ 250ms๋ผ๋ ๊ฐ์ ๋ณด์ธ๋ค.
์ฆ, ์ธ๋ฑ์ค๋ฅผ ํตํ ์กฐํ๊ฐ ๋ ๋น ๋ฅด๋ค
๐ต index๋ฅผ ์ด์ฉํ ์กฐ์ธ๊ณผ, ๊ทธ๋ ์ง ์์ ์กฐ์ธ์ ์๋ ์ฐจ์ด
4๋ฒ์ ๋ํ ๋ต์ randomAById-withB์ randomAById-withC๋ฅผ ๋น๊ตํ๋ฉด ๋๋ค.
์ด ๋์ ๊ฐ๊ฐ A, B ๊ทธ๋ฆฌ๊ณ A, C ํ ์ด๋ธ์ ์กฐ์ธํด์ ๋ฐํํ๋ ์ฟผ๋ฆฌ๋ฅผ ๋ฐ์ํ๋ค.
์กฐ์ธ์ ๊ธฐ์ค์ A.id == B.aid / A.id == C.aid์ด๋ค.
์ DDL์์ ๋ณผ ์ ์๋ฏ์ด, C์ aid์๋ ์ธ๋ฑ์ค๊ฐ ๊ฑธ๋ ค์๋ค.
์ด๋ฅผ ํด์ํด ๋ณด๋ฉด, A, B ํ ์ด๋ธ์์ ๊ฐ๊ฐ ์กฐ๊ฑด์ ๋ง๋ ์กฐํ๋ฅผ ํ์ฌ ์กฐ์ธํ๋ค.
A์ ๊ฒฝ์ฐ ๊ธฐ๋ณธํค๋ฅผ ์ด์ฉํ์ผ๋ฉฐ, B๋ where์ ์ด์ฉํ๋ค.
์ฆ, ์ธ๋ฑ์ค๋ฅผ ์ด์ฉํ์ง ์๊ณ , ์ ์ฒด ํ์์ ํตํด where์ ์๋ง์ B๋ฅผ ์ฐพ์๋๋ค.
์ด ๋ํ A, C์์ ๊ฐ๊ฐ ์กฐํ๋ฅผ ํ์ฌ ์กฐ์ธํ๋ค.
A๋ ํค๋ณธํค๋ฅผ ์ด์ฉํ๊ณ , C๋ idx__aid๋ผ๋ ์ด๋ฆ์ ๊ฐ์ง ์ธ๋ฑ์ค๋ฅผ ์ด์ฉํ๋ค.
์ฆ, ์๋ ์กฐ์ธ ์ฐ์ฐ์ ์ํด ์ธ๋ฑ์ค๋ฅผ ์ด์ฉํ์ง ์์์ผ๋ฉฐ, ์๋๋ ์ธ๋ฑ์ค๋ฅผ ์ด์ฉํ๋ค.
์ด ์ฐจ์ด ๋ํ ์กฐํ ์๊ฐ ์ฐจ์ด๋ก ๋ํ๋๋ค.
randomAById-withB : 279 ms
randomAById-withC : 248 ms
31ms์ ์ฐจ์ด๊ฐ ๋ฐ์ํ๋ค.
์ด๋ฅผ ํตํด ์ธ๋ฑ์ค๋ฅผ ์ด์ฉํ ์กฐ์ธ์ด ๋ ๋น ๋ฆ์ ์ ์ ์๋ค.
๊ทธ๋ฌ๋ฏ๋ก ์ธ๋ฑ์ค๋ฅผ ํ๋ ๊ฒ์ด ์กฐํ ์๊ฐ์ ์์ด์ ํฐ ์ด์ ์ผ๋ก ์์ฉํ๋ค.
๐ ์๋ฌธ์
1. MVC์ randomAById์์ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค.
MVC์์ ์์ฒญ ์๊ฐ ๋ง์์ก์ ๊ฒฝ์ฐ์๋ง ๋ฐ์ํ๋ค.
tomcat์์ max-connection ์ ๋๋ฌธ์ ์ ๋ฐ์ ๊ฑด๊ฐ ์ถ์๋ฐ, ์ api์์๋ง ๋ฐ์ํ๋๊น ๊ทธ๊ฑด ๋ ์๋ ๊ฒ ๊ฐ๋ค.
์๋์ ๊ฐ์ ํ ์คํธ๋ฅผ ์ถ๊ฐ๋ก ๋ง๋ค์ด์ ํ ์คํธํด ๋ดค๋ค
๊ทธ ๊ฒฐ๊ณผ๋ ์ด๋ฌํ๋ค.
์์ฒญ์ ๋ง์ด ๋ณด๋์ ๋, ์๋ฌด๋ฆฌ ๊ธฐ๋ค๋ ค๋ response๊ฐ ๋์์ค์ง ์๋ ์ํฉ์ด ๋ช๋ช ์์๋ค.
์ด๋ฅผ ๊ฐ์ํ์ฌ ๋ด์ฃผ๊ธธ ๋ฐ๋๋ค.
๋ํ ํ ์คํธ ์ค MVC, Webflux + Coroutine ๋ชจ๋์์ ์ด๋ฐ ์๋ฌ๋ฅผ ๋ฐ๊ฒฌํ๋ค.
java.net.SocketException: Connection reset
at java.base/sun.nio.ch.NioSocketImpl.implRead(NioSocketImpl.java:318)
at java.base/sun.nio.ch.NioSocketImpl.read(NioSocketImpl.java:346)
at java.base/sun.nio.ch.NioSocketImpl$1.read(NioSocketImpl.java:796)
at java.base/java.net.Socket$SocketInputStream.read(Socket.java:1099)
at org.apache.http.impl.io.SessionInputBufferImpl.streamRead(SessionInputBufferImpl.java:137)
at org.apache.http.impl.io.SessionInputBufferImpl.fillBuffer(SessionInputBufferImpl.java:153)
at org.apache.http.impl.io.SessionInputBufferImpl.readLine(SessionInputBufferImpl.java:280)
...
org.apache.http.conn.HttpHostConnectException: Connect to .... [....] failed: Operation timed out
at org.apache.http.impl.conn.DefaultHttpClientConnectionOperator.connect(DefaultHttpClientConnectionOperator.java:156)
at org.apache.jmeter.protocol.http.sampler.HTTPHC4Impl$JMeterDefaultHttpClientConnectionOperator.connect(HTTPHC4Impl.java:409)
at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.connect(PoolingHttpClientConnectionManager.java:376)
at org.apache.http.impl.execchain.MainClientExec.establishRoute(MainClientExec.java:393)
at org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:236)
at org.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.java:186)
...
Caused by: java.net.ConnectException: Operation timed out
at java.base/sun.nio.ch.Net.connect0(Native Method)
at java.base/sun.nio.ch.Net.connect(Net.java:589)
at java.base/sun.nio.ch.Net.connect(Net.java:578)
at java.base/sun.nio.ch.NioSocketImpl.connect(NioSocketImpl.java:583)
at java.base/java.net.SocksSocketImpl.connect(SocksSocketImpl.java:327)
at java.base/java.net.Socket.connect(Socket.java:751)
at org.apache.http.conn.socket.PlainConnectionSocketFactory.connectSocket(PlainConnectionSocketFactory.java:75)
at org.apache.http.impl.conn.DefaultHttpClientConnectionOperator.connect(DefaultHttpClientConnectionOperator.java:142)
... 19 more
connection reset์ ๋ํ ์์ธ์ ๋ค์ํ๋ค๊ณ ํ๋ค.
๊ทธ์ค ์๋ฒ ๊ณผ๋ถํ, tcp connection ์ ํ, ์๊ฐ ์ด๊ณผ๊ฐ ๋ฌธ์ ์ธ ๊ฒ ๊ฐ๋ค.
๋์์ ๋ง์ ์์ฒญ์ ํ๊ธฐ ๋๋ฌธ์ ๊ทธ๋ ๋ค๊ณ ์๊ฐํ๋ค.
์ค์ ๋ก ๋น์ทํ ํ ์คํธ ์ผ์ด์ค๋ฅผ ๋ง๋ค์ด์ ํ์ ๋, ์งํ๊ฐ ๋๊ธฐ๋ ๋ถ๋ถ์ด ๋ฐ์ํ๋ค.
์๋ฒ ๊ณผ๋ถํ๋ก ์ธํด ์งํ ์ ๋ฌ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ฌ ๊ทธ๋ ๋ค๊ณ ์ถ์ ๋๋ค.
์์ ์๋ฌธ์ ๊ฐ์ก๋ ๋ถ๋ถ๋ ์ด์ ๋น์ทํ ์ํฉ์ด์ง ์์์๊น ์๊ฐํ๋ค.
2. ์ธ๋ฑ์ค๋ฅผ ํ๋๋ก ๋ง๋ค์ด๋์ api๊ฐ ์ธ๋ฑ์ค๋ฅผ ์ํ๋ ๊ฒ๋ณด๋ค ๋ ๋๋ฆฐ ๊ฒฝ์ฐ๊ฐ ์๋ค.
์ด ํ์์ ๋์ ์์ฒญ ์ฌ์ฉ์ ์๊ฐ ๋ง์ ๋๋ง ๋ฐ์ํ๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
์์ฒญ์ด ๋ง์ ๊ฒฝ์ฐ, ์๋ฒ๊ฐ ์์ ์์ฒญ์ ์ฒ๋ฆฌํ๋๋ผ ๋์ฐฉํ ์์ฒญ์ ๋ฐ๋ก ์ฒ๋ฆฌ ๋ชปํ๋ ๊ฒฝ์ฐ๊ฐ ๋ฐ์ํ ์ ์๋ค.
๊ทธ๋ฌ๋ฏ๋ก ์์ฒญ์ ๋ฐ์์ง๋ง ์์ฒญ์ ์ฒ๋ฆฌํ์ง ๋ชปํ๊ณ ๋๊ธฐํ๋ ์๊ฐ์ด ์ํฅ์ ๋ฏธ์น ๊ฒ ๊ฐ๋ค.
3. ๋ ๋ชจ๋ hikari cp max connection์ 25๋ก ๋์ผํ๋ค. ๊ทผ๋ฐ MVC๋ง RDB CPU ์ฌ์ฉ๋ฅ ์ด 99%๊ฐ ๋์๋ค.
์ด ๋ถ๋ถ์ ์ง์ง ๋ชจ๋ฅด๊ฒ ๋ค.
๊ฐ์ JPA์ ๊ฐ์ ์ฟผ๋ฆฌ๋ฅผ ์์ฒญํ๋๋ฐ, CPU ์ฌ์ฉ๋ฅ ์ ์ ๋ ๋ค.
DB๋ฅผ ๊ป๋ค๊ฐ ๋ค์ ์ผ์ ์คํํด๋ ์ด๋ ๋ค.
ํ ์คํธ ํผ๋๋ฐฑ ๋ํ์์ ๋๋ค!!
'Backend' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
<Spring> Coroutine Actor ์ด์ฉํด์ ๋จ์ผ ์๋ฒ ๋ฝ ๊ตฌํํ๊ธฐ (0) | 2024.08.20 |
---|---|
<Spring> Slack ๋ฉ์ธ์ง ์ ์ก ์๋ฌ ์ฒ๋ฆฌ (0) | 2024.08.04 |
<Spring> SUSU์ Coroutine (0) | 2024.05.11 |
<Spring> Webflux + Coroutine + MDC (0) | 2024.05.10 |
<Spring> WARN ๋ ๋ฒจ ์ด์ ๋ก๊ทธ Slack ์๋ฆผ ๋ณด๋ด๊ธฐ (0) | 2024.03.17 |