-
๊ธฐ๊ฐ : 2023๋ 10์ 2์ผ ~ 2024๋ 4์ (6 ๊ฐ์)
-
๊ธฐ์ ์คํ : Java, SpringBoot, Spring Cloud Gateway, Spring Security, Gradle, JUnit5, Mockito, queryDsl, Docker, Kubernetes, GitHub, Jenkins, MySQL, MySQLOpretor, Prometheus, Grafana, Elastic, Kibana, Fluentd, GCP, Redis, ArgoCD, Slack, nGrinder
-
๊ฐ์ : WaveForm์ ์ค๋ฌธ ์์ฑยท๊ด๋ฆฌ์ ์๋ต ์์ง ๋ฐ ๋ถ์์ ์ ๊ณตํ๋ MSA ๊ธฐ๋ฐ ์๋น์ค๋ก, ์ฌ์ฉ์๊ฐ ๋น ๋ฅด๊ฒ ์ค๋ฌธ ๋ฆฌ์คํธ๋ฅผ ์กฐํํ๊ณ ์ง๋ฌธ์ ํ์ํ ์ ์์ด์ผ ํ์ต๋๋ค.
ํ์ง๋ง nGrinder๋ก ํต์ฌ ์ค๋ฌธ ์กฐํ API์ ๋ํด 3,000 Vuser ๋ถํ ํ ์คํธ๋ฅผ ์ํํด ๋ณธ ๊ฒฐ๊ณผ, TPS๊ฐ ๋จ 64.4์ ๋ถ๊ณผํด ์ค์๋น์ค ์ด์ ๊ธฐ์ค(>500 TPS)์ ํฌ๊ฒ ๋ชป ๋ฏธ์น๋ ๊ฒ์ผ๋ก ํ์ธ๋์ต๋๋ค.
์ด์ ๋ฐ๋ผ ํ์๋ค๊ณผ ์งํํ๋ WaveForm ํ๋ก์ ํธ๋ฅผ ๊ฐ์ ํ๋ ํ๋ก์ ํธ๋ฅผ ํผ์์ ์์ํ๊ฒ ๋์์ต๋๋ค. ์ต์ข ์ ์ผ๋ก TPS๋ฅผ 14๋ฐฐ (60.4 -> 841.4) ํฅ์ ์์ผฐ์ผ๋ฉฐ ํ ์คํธ ์ปค๋ฒ๋ฆฌ์ง 100%๋ฅผ ๋ชฉํ๋ก 147๊ฐ ์ด์์ ํ ์คํธ ์ฝ๋๋ฅผ ์์ฑํ๊ณ ๊ฐ์ฒด์งํฅ์ ๋ฆฌํฉํ ๋ง์ ๋ฌ์ฑํ์์ต๋๋ค.
๋ฌธ์ ์ํฉ ๋ฐ ๋ถ์
์๋น์ค์ ํต์ฌ์ธ ์ค๋ฌธ ์กฐํ API์ ๋ํด nGrinder๋ก ์ฑ๋ฅ ํ ์คํธ ์ Spring Cloud Gateway ์ธ์คํด์ค(replica=1)๊ฐ ๋ฐ๋ณต์ ์ผ๋ก ๋ค์ด๋๋ ํ์์ด ๋ฐ์ํ์ต๋๋ค.
Prometheus์ Grafana๋ฅผ ํตํด Gateway Pod์ ํด๋ฌ์คํฐ ๋ ธ๋์ CPUยท๋ฉ๋ชจ๋ฆฌยท๋คํธ์ํฌ I/O๋ฅผ 1๋ถ ๋จ์๋ก ๋ชจ๋ํฐ๋งํ๊ณ , ๋ถํ ํ ์คํธ๊ฐ ์์๋์๋ง์ ์ธ์คํด์ค ํ๋๊ฐ CPU 70% ์ด์์ ์ง์์ ์ผ๋ก ์ฌ์ฉํ๋ค ์ต๋ ๋ถํ ์ 95%๋ฅผ ๋ํํ์ผ๋ฉฐ, HTTP 5xx ์ค๋ฅ์จ๋ 15%๊น์ง ๊ธ๋ฑํ๋ ํ์์ ์ค์๊ฐ์ผ๋ก ํ์ธํ์ต๋๋ค.
ํ์ง๋ง ๋จ์ํ Gateway์ replica ์๋ง ๋๋ ค์๋ ์ง์ง ๋ณ๋ชฉ์ ํด๊ฒฐํ ์ ์๋ค๊ณ ํ๋จํ์ต๋๋ค. ํธ๋ํฝ์ด Gateway๋ฅผ ๊ฑฐ์ณ ๋ฐฑ์๋๊น์ง ์ ๋ฌ๋๋ ๊ณผ์ ์ด๋๊ฐ์ ๊ทผ๋ณธ ๋ณ๋ชฉ์ด ์จ์ด ์์ ๊ฒ์ด๋ผ ํ๋จํ์ต๋๋ค.
์ฑ๋ฅ ๊ฐ์ ๊ณผ์
-
DB ์ต์ ํ
๋จผ์ ์ค๋ฌธ ์กฐํ ์ฟผ๋ฆฌ๋ฅผ ๋ถ์ํด๋ณด๋, N+1 ๋ฌธ์ ๊ฐ ๋ฐ์ํ๊ณ ์์์ต๋๋ค. ์ค์ ๋ก ๊ฐ๋จํ ์ค๋ฌธ ํ๋๋ฅผ ์กฐํํ ๋๋ง ํด๋ 6ํ ์ด์์ ์ฟผ๋ฆฌ๊ฐ ์คํ๋๊ณ ์์์ต๋๋ค.
์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์ค๋ฌธ ์กฐํ ๋ก์ง์ ๋ ๋จ๊ณ๋ก ์ฌ๊ตฌ์ฑํ์ต๋๋ค.
๋จผ์ QueryDSL์ fetch join์ ์ ์ฉํ์ฌ, ์ค๋ฌธ์ ์กฐํํ ๋ ์ผ๋์ผ ๊ด๊ณ์ธ ๊ฒ๋ค ๋ฟ๋ง ์๋๋ผ ์ผ๋๋ค ๊ด๊ณ์ธ ์ง๋ฌธ ๋ฆฌ์คํธ๊น์ง ํ ๋ฒ์ ์กฐ์ธ์ผ๋ก ์ฒ๋ฆฌํ๋๋ก ์ฟผ๋ฆฌ๋ฅผ ์์ ํ์ต๋๋ค.
๊ทธ ๋ค์ ์ง๋ฌธ๊ณผ ์ผ๋๋ค ๊ด๊ณ์ธ ์ ํ์ง ๋ฆฌ์คํธ๋ ๋ณ๋ fetch join์ผ๋ก ํ ๋ฒ์ ์กฐํํ๊ณ , ๊ทธ ์ธ ์ผ๋๋ค ๊ด๊ณ๋ default_batch_fetch_size ์ค์ ์ ๋ฐ๋ผ IN์ ๋ก ๋ฌถ์ด ๋ก๋ฉํ๋๋ก ํ์ต๋๋ค.
๊ทธ ๊ฒฐ๊ณผ, ์๋๋ ์ค๋ฌธ ์กฐํ 1ํ, ์ง๋ฌธ ์กฐํ 1ํ, ์ ํ์ง ์กฐํ 2ํ(2๊ฐ์ ์ ํ์ง๊ฐ ์๋ ์์), ๊ทธ ์ธ ์ผ๋๋ค ๊ด๊ณ ์กฐํ 2ํ๋ก ์ด 6ํ ์คํ๋๋ ์ฟผ๋ฆฌ๊ฐ ์ค๋ฌธ+์ผ๋์ผ+์ง๋ฌธ ์กฐํ 1ํ, ์ ํ์ง ์กฐํ 1ํ, ๊ทธ ์ธ ์ผ๋๋ค ๊ด๊ณ ์กฐํ 1ํ๋ก ์ด 6ํ โ 3ํ๋ก ์ค์ด๋ค์์ต๋๋ค.
๋ค์์ผ๋ก ์๋น์ค์ ์๊ตฌ์ฌํญ์ธ is_deleted ํ๋๊ทธ๋ฅผ ํตํด ์ญ์ ๋ฐ์ดํฐ๋ฅผ ๊ด๋ฆฌํ๊ณ ์์์ต๋๋ค. ์ด์ ๋ฐ๋ผ ์ง๋ฌธ ํ ์ด๋ธ์์ survey_document_id์ is_deleted์ ๊ฐ๊ฐ ๋จ์ผ ์ธ๋ฑ์ค๋ฅผ ์ค์ ํด๋์์ผ๋, ์ค์ MySQL ์ตํฐ๋ง์ด์ ๋ survey_document_id ์ธ๋ฑ์ค๋ง ์ฌ์ฉํ๊ณ is_deleted๋ ํ์ฒ๋ฆฌ๋ก๋ง ์ ์ฉํด ์๋ฐฑ ๊ฑด์ ์ค์บํ๋ ๋นํจ์จ์ด ๋๋ฌ๋ฌ์ต๋๋ค.
์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๋ ์ปฌ๋ผ์ ํ ๋ฒ์ ์ฒ๋ฆฌํ๋ ๋ณตํฉ ์ธ๋ฑ์ค (survey_document_id, is_deleted)๋ฅผ ์ค๊ณยท์ ์ฉํ๊ณ , ์คํ ๊ณํ ์ฌ๊ฒ์ฆ ๊ฒฐ๊ณผ ์ค์บ ๋์์ด 300๊ฑด์์ 52๊ฑด์ผ๋ก ์ค์ด๋ค๋ฉฐ ํ๊ท ์๋ต ์๋๊ฐ ์ฝ 0.15ms์์ 0.05ms๋ก 3๋ฐฐ ์ด์ ๊ฐ์ ๋์์ต๋๋ค. ๋ํ ๋๋จธ์ง ํ ์ด๋ธ์ ๋ํด์๋ ๋ณตํฉ ์ธ๋ฑ์ค๋ฅผ ์ ์ฉํ์์ต๋๋ค.
์ด ๊ฐ์ ๋ง์ผ๋ก ์๋น์ค ์ ์ฒด TPS๋ 64.4์์ ์ฝ 200๊น์ง ์์นํ์ต๋๋ค.
-
Redis ๊ธ๋ก๋ฒ ์บ์ ๋์
์์ฃผ ์กฐํ๋๋ ์ค๋ฌธ ๋ฐ์ดํฐ๋ฅผ Redis์ ์บ์ฑํด DB ์กฐํ ํ์๋ฅผ ๋ํญ ์ค์์ต๋๋ค. ์บ์ฑ ์ ์ฉ ํ TPS๋ 200์์ 500๊น์ง ์ถ๊ฐ๋ก ๋์์ก์ต๋๋ค.
-
Gateway ํ์ฅ ๋ฐ ์คํ ์ค์ผ์ผ๋ง
Kubernetes์์ Gateway replica๋ฅผ 1โ3์ผ๋ก ํ์ฅํ๊ณ , CPU ์ฌ์ฉ๋ฅ 70% ์ด๊ณผ ์ ์๋์ผ๋ก Pod๋ฅผ ์ฆ์คํ๋ Horizontal Pod Autoscaler(HPA)๋ฅผ ๋์ ํ์ต๋๋ค.
๊ทธ ๊ฒฐ๊ณผ TPS๋ 500โ800 ์ด์์ผ๋ก ํฌ๊ฒ ์ฆ๊ฐํ๊ณ , ํ์์ ์ต๋ 5๊ฐ๊น์ง ์๋ ํ์ฅ๋๋๋ก ์ค์ ํด ์์ ์ฑ์ ๊ฐํํ์ต๋๋ค.
-
MySQL InnoDB Cluster๋ฅผ ํตํ ์ฝ๊ธฐ ์ฒ๋ฆฌ๋ ํ๋ ๋ฐ ๊ณ ๊ฐ์ฉ์ฑ
์ค๋ฌธ ์กฐํยท์๋ต ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ MySQL ๋จ์ผ ์ธ์คํด์ค๋ ๋ ธ๋ ์ฅ์ ์ ์ ์ฒด ์๋น์ค ๊ฐ์ฉ์ฑ์ ์น๋ช ์ ์ด๊ธฐ ๋๋ฌธ์, MySQL Operator๋ฅผ ํ์ฉํด Kubernetes ์์ InnoDB Cluster๋ฅผ ๊ตฌ์ถํ์ต๋๋ค.
MySQL Router๋ฅผ ํตํด ์ค๋ฌธ ์กฐํ์ ๊ฐ์ ๋น๋ฒํ ์ฝ๊ธฐ ์์ฒญ์ ์ฌ๋ฌ ๋ฆฌ๋ ๋ ธ๋๋ก ์๋ ๋ผ์ฐํ ํจ์ผ๋ก์จ ์ฝ๊ธฐ ์ฒ๋ฆฌ๋์ ๋๋ ธ์ต๋๋ค.
์ถ๊ฐ ๊ณ ๋ ค
ํ์ฌ ๋ฐ์ดํฐ ํ ์ด๋ธ ๊ตฌ์กฐ๊ฐ ์ผ๋๋ค ๊ด๊ณ๊ฐ ์ค์ฒฉ๋์ด ์์ด ์กฐํ ์ ์ฌ๋ฌ ๋ฒ์ ์กฐ์ธ๊ณผ batch_fetch๊ฐ ๋ฐ์ํ๋ ๊ตฌ์กฐ์ ํ๊ณ๊ฐ ๋จ์ ์์ต๋๋ค.
์ด๋ฅผ ์ํํ๊ธฐ ์ํด ์ญ์ ๊ทํ๋ฅผ ์ ์ฉํ์ฌ ์ต์ํ์ ์กฐ์ธ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์กฐํํ๋ ๋ฐฉ๋ฒ๋ ๊ณ ๋ คํด๋ณด๊ณ ์์ต๋๋ค. ๋ํ, ์ฐ๊ธฐ ๋ชจ๋ธ๊ณผ ์ฝ๊ธฐ ๋ชจ๋ธ์ ๋ถ๋ฆฌํ์ฌ ์ฝ๊ธฐ ์ ์ฉ ์ต์ ํ๋ ์คํค๋ง๋ ํ ์ด๋ธ์ ๋ถ๋ฆฌํ๋ ๋ฐฉ๋ฒ๋ ๋์ ํ ์์ ์ ๋๋ค.
๊ธฐ๋ฅ ๋จ์๋ก๋ ControllerโServiceโRepository๊น์ง ๊ฐ ๊ณ์ธต๋ณ๋ก ๋จ์ ํ ์คํธ๋ฅผ ์ธ๋ถํํ๊ณ , WebClient๋ ์ธ๋ถ API ์ฐ๋ ๋ถ๋ถ์ MockWebServer๋ฅผ ํ์ฉํด ์ค์ HTTP ํธ์ถ ์๋๋ฆฌ์ค๋ฅผ ๊ทธ๋๋ก ์ฌํํ์ต๋๋ค.
@WebMvcTest, @DataJpaTest, @SpringBootTest ๋ฑ์ ์ํฉ์ ๋ง๊ฒ ์กฐํฉํ๋ฉด์ โ์ด ํ ์คํธ๊ฐ ์ง์ง ๊ฒ์ฆํด์ผ ํ ํ๋์ด ๋ฌด์์ธ๊ฐโ๋ฅผ ๋งค๋ฒ ๊ณ ๋ฏผํ๊ณ , Mockito์ when/thenReturnโฏvs. ์ค์ ๋ ํฌ์งํ ๋ฆฌ ์ฌ์ฉ ์ฌ๋ถ๋ฅผ ์ฒ ์ ํ ๊ธฐ์คํํด ํ ์คํธ์ ์ ๋ขฐ์ฑ๊ณผ ์ ์ง๋ณด์์ฑ์ ๋ชจ๋ ํ๋ณดํ์ต๋๋ค.
๋์ผ ์ค๋ฌธ์ ๋ํ ์ค๋ณต ์๋ต ์์ฒญ์ด ๋๋์ผ๋ก ๋ค์ด์ฌ ๋ DB ํธ๋์ญ์ ๋ง์ผ๋ก๋ ์ฑ๋ฅ ์ ํ์ ์ ์ฌ์ ๋ฐ๋๋ฝ ์ํ์ ์์ ํ ํด์ํ ์ ์๋ค๋ ๊ฒ์ ํ์ธํ์ต๋๋ค.
์ฒ์์๋ ๋๊ด์ ๋ฝ(๋ฒ์ ์ปฌ๋ผ)์ด๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋น๊ด์ ๋ฝ(SELECTย โฆย FORย UPDATE)์ ๊ณ ๋ คํ์ง๋ง, ์ด๋ค์ ์์ฒญ ์ง์ฐ์ด ๊ธธ์ด์ง์๋ก DB ์ปค๋ฅ์ ์ ์ฅ์๊ฐ ์ ์ ํ๊ฒ ๋์ด ํ์ฅ์ฑ ์ธก๋ฉด์์ ํ๊ณ๊ฐ ์์์ต๋๋ค.
๋ฐ๋ฉด Redis ๋ถ์ฐ๋ฝ์ ๊ฐ๋ฒผ์ด I/O, ์ ์ฐํ ๋ง๋ฃ ์ค์ , ํด๋ฌ์คํฐยทSentinel ๋ชจ๋ ์ง์ ๋ฑ MSA ํ๊ฒฝ์ ์ต์ ํ๋ ํน์ฑ์ ์ง๋๊ณ ์์๊ธฐ์, โ๋ฝ ํ๋ ๋๊ธฐโ์ โ์๋ ๋ง๋ฃโ๋ฅผ ํตํด ํ ๋ฒ์ ์ค์ง ํ๋์ ์ธ์คํด์ค๋ง ํต์ฌ ๋ก์ง์ ์คํํ๊ฒ๋ ์ค๊ณํ์ต๋๋ค.
Redis ํด๋ผ์ด์ธํธ๋ฅผ ์ ํํ ๋๋ ๋จ์ RedisTemplate ๋์ RedissonClient๋ฅผ ๋์
ํ ์ด์ ๋, tryLock(waitTime, leaseTime) API๊ฐ ์ ๊ณตํ๋ ๋ช
์์ ๋๊ธฐยท๋ง๋ฃ ํ์ด๋ฐ ์ ์ด์ auto-renewal ๊ธฐ๋ฅ ๋๋ถ์ โ์๋น์ค๊ฐ ์๊ธฐ์น ์๊ฒ ์ค๋จ๋๋๋ผ๋ ๋ฝ์ด ์๋ ํด์ ๋๋คโ๋ ๋ณด์ฅ์ด ์์๊ธฐ ๋๋ฌธ์
๋๋ค. ๋ํ Spring AOP๋ก ๋ฝ ๋ก์ง์ @DistributedLock(key = "survey:#{#dto.id}") ํ ์ค๋ก ์ถ์ํํ๋ฉด์, ๋น์ฆ๋์ค ์ฝ๋๋ ๋ฝ ํ๋ยทํด์ ์ค๋ ๋ ์์ ์ฑ์ ๋ํด ์ ํ ์ ๊ฒฝ ์ฐ์ง ์์๋ ๋๋๋ก ๋ถ๋ฆฌํ์ต๋๋ค.
JWT ์ธ์ฆ ๋ก์ง์ Spring MVC์ ์ธํฐ์ ํฐ๊ฐ ์๋๋ผ ์๋ธ๋ฆฟ ์ปจํ ์ด๋ ๋จ๊ณ์์ ์คํ๋๋ Filter๋ก ๊ตฌํํ ๊ฒ์, โ๋ชจ๋ ์์ฒญ์ ๋ํด ์ธ์ฆ์ด ๊ฐ์ฅ ๋จผ์ , ๊ทธ๋ฆฌ๊ณ ์ผ๊ด๋๊ฒ ์ฒ๋ฆฌ๋์ด์ผ ํ๋คโ๋ ๋ณธ์ง์ ์ธ ์๊ตฌ์์ ์ถ๋ฐํ์ต๋๋ค.
์ฒ์์๋ Spring MVC ์ธํฐ์ ํฐ๋ AOP ๊ธฐ๋ฐ ์ด๋ ธํ ์ด์ ๋ฐฉ์๋ ๊ณ ๋ คํ์ต๋๋ค. ์ธํฐ์ ํฐ๋ ์ปจํธ๋กค๋ฌ ํธ์ถ ์ ํ์ ๋ก์ง์ ์ฝ์ ํ ์ ์์ง๋ง, DispatcherServlet ๋ฐ๊นฅ์ ์ ์ ๋ฆฌ์์ค๋ ํ๋ก์๋ ์๋ํฌ์ธํธ ์์ฒญ์ ๋ณดํธํ์ง ๋ชปํ๋ค๋ ํ๊ณ๊ฐ ์์์ต๋๋ค.
AOP ์ด๋ ธํ ์ด์ ์ ๋น์ฆ๋์ค ์ฝ๋์ ๋ถ๋ฆฌ๋ ๊ด์ฌ์ฌ ๋ถ๋ฆฌ์ ์ ๋ฆฌํ์ง๋ง, HTTP ์์ฒญ ์ฒ๋ฆฌ ํ๋ฆ์ ๊ฐ์ฅ ์ด๊ธฐ ๋จ๊ณ์์ ์คํ๋๋ค๋ ๋ณด์ฅ์ ์์์ต๋๋ค.
๋ฐ๋ฉด ํํฐ๋ โ์๋ธ๋ฆฟ ๋ ๋ฒจ์์ ๋ฌด์กฐ๊ฑด ์คํโ๋๊ณ , Spring Security๊ฐ ์ ๊ณตํ๋ ๋ณด์ ์ฒด์ธ๊ณผ ์ผ์ฒดํ๋์ด ์๊ธฐ ๋๋ฌธ์, ์ธ์ฆ ๋ก์ง์ ๊ฐ์ฅ ๋ช ํํ๊ณ ์์ ํ๊ฒ ๋ฐฐ์นํ ์ ์์์ต๋๋ค.
์ด์ฒ๋ผ โ์ด๋ค ์์ฒญ์, ์ธ์ , ์ด๋ป๊ฒ ๊ฒ์ฆํด์ผ ํ๋์งโ๋ถํฐ โ์คํจ ์ ์์ธ๋ฅผ ์ด๋ป๊ฒ ์ผ๊ด๋๊ฒ ์ฒ๋ฆฌํ ์งโ๊น์ง ์น๋ฐํ๊ฒ ๊ณ ๋ฏผํ ๋์, ํํฐ ๊ธฐ๋ฐ JWT ์ธ์ฆ์ด ์ต์ ์ ์ ํ์์ ํ์ ํ ์ ์์์ต๋๋ค.
OAuth ํตํฉ ๋ก์ง์ ๋ฆฌํฉํ ๋งํ๋ฉด์ ๊ฐ์ฅ ๋จผ์ ๊ณ ๋ฏผํ ๊ฒ์ โ์๋ก์ด OAuth ๊ณต๊ธ์๊ฐ ์ถ๊ฐ๋ ๋๋ง๋ค if/switch๋ Enum ๊ฐ์ ์์ ํด์ผ ํ๋ ๋นํจ์จโ์ด์์ต๋๋ค.
์ฒ์์ ์ ๋ ธํ ์ด์ ์ด๋ ๋ฆฌํ๋ ์ ์ ํ์ฉํ ๋์ ๋งคํ๋ ๊ณ ๋ คํ์ง๋ง, ์ด ๋ฐฉ๋ฒ์ ๋ณต์ก๋๋ฅผ ๋์ด๊ณ ๋๋ฒ๊น ์ด ์ด๋ ค์์ง๋ ๋จ์ ์ด ์์์ต๋๋ค. ๊ฒฐ๊ตญ โ๊ณต๊ธ์๋ณ ํ ํฐ ํ์ฑยทํ๋กํ ๋งคํ ์ฑ ์์ Provider ์ธํฐํ์ด์ค ๊ตฌํ์ฒด์ ์์ํ๊ณ , ProviderList๋ผ๋ ์ผ์ข ์ ๋ ์ง์คํธ๋ฆฌ์์ ํ์ํ ๊ตฌํ์ฒด๋ฅผ ์ฐพ์ ์ฐ๋ ๋ฐฉ์โ์ ์ ํํ์ต๋๋ค.
์ด ์ค๊ณ๋ ๋ค์ ์ธ ๊ฐ์ง๋ฅผ ๋ณด์ฅํฉ๋๋ค.
์ฒซ์งธ, ๋จ์ผ ์ฑ ์ ์์น(SRP)์ ์ง์ผ OAuthService๋ ์ค์ง HTTP ํธ์ถ๊ณผ ํ๋ฆ ์ ์ด๋ง ๋ด๋นํ๋ฉฐ, ํ ํฐ ๋ฌธ์์ด ๋ณํยทJSON ํ์ฑยทProfile ํด๋์ค ์ ํ์ ๊ฐ ๊ตฌํ์ฒด๊ฐ ์์์ ์ฒ๋ฆฌํฉ๋๋ค.
๋์งธ, ๊ฐ๋ฐฉโํ์ ์์น(OCP)์ ์ถฉ์กฑํด ์๋ก์ด ๊ณต๊ธ์ ์ถ๊ฐ ์ ์ฝ๋ ์์ ์์ด ๊ตฌํ์ฒด์ ๋ฑ๋ก๋ง์ผ๋ก ๋ฐ๋ก ์ง์๋ฉ๋๋ค.
์ ์งธ, ์์กด์ฑ ์ญ์ ์์น(DIP)์ ๋ฐ๋ฅด๋ฉด์ ํ ์คํธ๋ ํจ์ฌ ๊ฐ๋จํด์ก์ต๋๋ค.
์ด ๊ณผ์ ์ ํตํด โ๋จ์ํ ๊ธฐ๋ฅ์ด ๋์ํ๊ฒ ํ๋ ์์ค์ ๋์ด, ํ์ฅ์ฑ๊ณผ ์ ์ง๋ณด์์ฑ์ ๋ฏธ๋ฆฌ ์์ธกํด ์ํคํ ์ฒ๋ฅผ ์ค๊ณํ๋ ๋ฅ๋ ฅโ์ ๊ธธ๋ ์ผ๋ฉฐ, ์ง๊ธ ๋ค์ ๋ง๋ ๋ค๋ฉด Spring์ DI ์ปจํ ์ด๋๋ฅผ ํ์ฉํด Provider ๊ตฌํ์ฒด๋ค์ ์๋ ํ์ํ๊ณ , ๋ ์ง์คํธ๋ฆฌ ํด๋์ค๋ฅผ ์์ ํ ์ ๊ฑฐํด ๋์ฑ ๊ฐ๋ณ๊ณ ์ ์ธ์ ์ธ ๊ตฌ์กฐ๋ก ์งํ์ํฌ ๊ฒ ๊ฐ์ต๋๋ค.
์ฑ๋ฅ ํ๋์ ํตํด, TPS๋ฅผ 64.4์์ 841.4๋ก 14๋ฐฐ ์ด์ ํฅ์ ์ํค๊ณ , Redis ์บ์์ InnoDB Cluster๋ฅผ ํ์ฉํด ์ฝ๊ธฐ ์ฒ๋ฆฌ๋์ ํ์ฅํ๋ฉด์๋ ์ผ๊ด์ฑ์ ์งํฌ ์ ์์์ต๋๋ค.
๋ํ ์ฝ๋ ๋ ๋ฒจ์์๋ QueryDSL fetch join, Hibernate batch_fetch, ๋ณตํฉ ์ธ๋ฑ์ค ์ ์ฉ ๋ฑ ๋ค์ํ ์ต์ ํ ๊ธฐ๋ฒ์ ์ ์ฉํ๊ณ , ํ ์คํธ ์ปค๋ฒ๋ฆฌ์ง๋ฅผ 100% ๋ฌ์ฑํ๊ธฐ ์ํด 147๊ฑด์ ๋จ์ยทํตํฉ ํ ์คํธ๋ฅผ ์์ฑํ๋ฉฐ ๊ฐ์ฒด ์งํฅ์ ๋ฆฌํฉํ ๋ง์ ์์ฑํ์ต๋๋ค.
์ด ๊ณผ์ ์์ โํ๋ฉด์ ์ธ ์ค์ผ์ผ ์์์ด ์๋, ์ด๋์ ์ง์ง ๋ณ๋ชฉ์ด ์๋์ง ์ฐพ์๋ด๊ณ ํด๊ฒฐํ๋คโ๋ ๊ฒฝํ์ ์์๊ณ , MSA ํ๊ฒฝ์์ ์์ ์ฑ๊ณผ ์ฑ๋ฅ์ ๋์์ ๋ง์กฑ์ํค๋ ์ค๊ณยท๊ตฌํ ์ญ๋์ ํฌ๊ฒ ๊ฐํํ ์ ์์์ต๋๋ค.
- [Spring + Redis] Redis cache๋ฅผ ์ด์ฉํ ์กฐํ ์ฑ๋ฅ ๊ฐ์
- ๋ณตํฉ ์ธ๋ฑ์ค ์ค๊ณ๋ก ์ค๋ฌธ ์กฐํ ์ฑ๋ฅ ๊ฐ์ ํ๊ธฐ
- [Spring + QueryDsl] DB ์ฟผ๋ฆฌ ์ ๋ฐ์ํ๋ N+1 ๋ฌธ์ ํด๊ฒฐ ๋ฐ ์ฑ๋ฅ ๊ฐ์
- [Spring] MSA ์ํคํ ์ฒ์์ Redis๋ฅผ ํ์ฉํ ๋ถ์ฐ๋ฝ ์ ์ฉ์ Spring AOP๋ฅผ ํ์ฉํด ์ฌ์ฌ์ฉ์ฑ ๋๊ฒ ์ ์ฉํ๋ ๋ฐฉ๋ฒ
- [Spring] ํ ์คํธ ์ปค๋ฒ๋ฆฌ์ง 100%๋ฅผ ๋ชฉํ๋ก MSA ์ํคํ ์ฒ์ ๋ฐฑ์๋ ํ๋ก์ ํธ ํ ์คํธ ๋ฐฉ๋ฒ
- [Spring] OAuth Kakao, Git, Google ๋ก๊ทธ์ธ ๋คํ์ฑ์ ํ์ฉํ์ฌ ๊ฐ์ฒด ์งํฅ์ ์ผ๋ก ๋ฆฌํฉํ ๋ง ํ๊ธฐ
- [Spring] ์ Filter์์ JWT ์ธ์ฆ์ ์ฒ๋ฆฌํ๋๊ฐ?
- [Spring] REST API ํต์ ์ ์ฌ์ฉํด์ผ ํ HTTP ํด๋ผ์ด์ธํธ RestTemplate vs WebClient