๐พ Backend ๊ธฐ์ ๋ฌธ์
์ด์์ฒด์ ์บก์คํค ์ธํฐ๋ทฐ ๊ณผ์ ๊ด๋ จ ์ ๋ฆฌ ๋ฌธ์
์ด์์ฒด์ ๊ณผ๋ชฉ์์ ์บก์คํค ์ธํฐ๋ทฐ๋ฅผ ํ๋ ๊ณผ์ ๊ฐ ์๋๋ฐ, ์ด๋ฅผ ๋๋นํด์ ์ธ๊ตญ๋ฏผ ํ์์ ํด๋น ๋ด์ฉ์ ์์ธํ ์ ๋ฆฌํ ๋ฌธ์๊ฐ ์๋ค. ๊ด์ฌ์๋ค๋ฉด ์๋ ๋ฌธ์๋ฅผ ์ฐธ๊ณ ํด์ฃผ๊ธธ ๋ฐ๋๋ค.
๊ธฐ๋ฅ์ ๊ณ ๋ ค ์ฌํญ
์ฑํ ๊ตฌํ
์ฑํ ์๋ฒ๋ ํฌ๊ฒ Polling, Long Polling, Steaming, Websocket ๋ฐฉ์์ผ๋ก ๊ตฌํํ ์ ์๋ค. ์์ 3๊ฐ์ง ๋ฐฉ๋ฒ์ ์ผ๋ฐ์ ์ธ RESTFUL API๋ฅผ ์ด์ฉํ ๊ตฌํ ๋ฐฉ๋ฒ์ด๋ค. ๊ทธ๋์ ๋น๊ต์ ๊ตฌํ์ด ์ฝ๋ค. ํ์ง๋ง, ์ด๋ค์ ํน์ฑ์ ํด๋ผ์ด์ธํธ โ ์๋ฒ๋ก ๋ฐ์ดํฐ ์ ์ก์ด ๊ฐ๋ฅํ์ง๋ง, ์๋ฒ โ ํด๋ผ์ด์ธํธ๋ก ์ ์ก์ ๋ถ๊ฐ๋ฅํ๋ค. ๋ํ, 100% ์ค์๊ฐ์ฑ์ ๋ณด์ฅํ์ง ์๋๋ค. ์ด๋ฅผ ๊ทน๋ณตํ๊ธฐ ์ํด์ ๋์จ ๋ฐฉ๋ฒ์ด ๋ฐ๋ก 4๋ฒ WebSocket ๋ฐฉ์์ด๋ค. ๊ทธ๋ฐ๋ฐ ์ฑํ ์ websocket์ผ๋ก ๊ตฌํํ๋ฉด, ๊ต์ฅํ ๋ฆฌ์์ค๋ฅผ ๋ง์ด ์ก์๋จน๊ณ ๊ตฌํ์ด ๊น๋ค๋กญ๋ค.
๊ทธ๋์ ์ฐ๋ฆฌ ์๋น์ค๋ Long Polling์ ์ด์ฉํ์ฌ ์ฑํ ์ ๊ฐ๋ฐํ๊ธฐ๋ก ๊ฒฐ์ ํ๋ค. ์ฐ๋ฆฌ ์๋น์ค์ ์ฑํ ์ 100% ์ค์๊ฐ์ฑ์ ๋ณด์ฅํ ํ์ ์์ ๋ฟ๋๋ฌ, ์ฑํ ์ด ๋ฉ์ธ ๋น์ฆ๋์ค ๊ธฐ๋ฅ์ด ์๋๊ณ , ํ๋ก์ ํธ ๋ง๊ฐ๊ธฐํ์ด ์๋ฐํ์ฌ ๋น ๋ฅด๊ฒ ๊ฐ๋ฐํด์ผ๋๊ธฐ ๋๋ฌธ์ Long Polling์ ์ด์ฉํ์ฌ ์ฑํ ์ ๊ฐ๋ฐํ๊ธฐ๋ก ๊ฒฐ์ ํ๋ค.
์ฑํ ์์คํ ์ค๊ณ ๋ฐ ์๋๋ฆฌ์ค์ ๊ดํ ๋ ์์ธํ ๋ด์ฉ์ ์ฑํ ๊ตฌํ์ ๋ํ ๊ณ ์ฐฐ ํ์์ ๋ธ๋ก๊ทธ์ ์์ ํด๋์๋ค.
ํฌ๋กค๋ง
ํ์ฌ ํฌ๋กค๋ง์ ํ์๊ณผ ๊ณต์ง์ฌํญ ๋ถ์ผ์์ ์ค์๋๊ณ ์๋ค. ํฌ๋กค๋ง ํ ๋๋ ๋ช๊ฐ์ง ๊ณ ๋ คํ ์ฌํญ์ด ์กด์ฌํ๋ค.
์ฒซ๋ฒ์งธ, ์ ์ ํฌ๋กค๋ง๊ณผ ๋์ ํฌ๋กค๋ง ์ด๋ค ๊ฒ์ด ํ์ํ๊ฐ ๊ณ ๋ คํด๋ด์ผ ํ๋ค. ๊ณต์ง์ฌํญ๊ณผ ํ์์ ๊ตณ์ด ๋ก๊ทธ์ธ์ ํ์ง ์์๋ ๋๊ตฌ๋ ์ ๊ทผํ ์ ์๊ธฐ ๋๋ฌธ์ ๊ตณ์ด ๋์ ํฌ๋กค๋ง์ด ํ์ํ์ง ์์๋ค. ๋ํ, ๋์ ํฌ๋กค๋ง์ Selenium ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ด์ฉํ๊ณ , Chrome Driver๋ฅผ ์ค์นํ๋ ๋ฑ ์ถ๊ฐ์ ์ธ ์ค์ ์ด ๋งค์ฐ ๋ณต์กํ๋ค. ๋ฐ๋ผ์, ์ฌ์ฉ์ด ๊ฐ๋จํ Jsoup์ ์ด์ฉํด์ ์ ์ ํฌ๋กค๋ง์ ์งํํ๊ธฐ๋ก ๊ฒฐ์ ํ๋ค.
๋๋ฒ์งธ, ํฌ๋กค๋ง์ ์ธ๋ถ ๋คํธ์ํฌ์ ํต์ ํ์ฌ ์ด๋ฃจ์ด์ง๋ค. ๊ทธ๋์ ๋คํธ์ํฌ I/O ๋ณ๋ชฉ์ง์ ์ ์ด๋ป๊ฒ ํด๊ฒฐํ ๊ฒ์ด๊ณ ์ด ๋ ์์์ ์ต๋ํ ์๋ ์ ์๋์ง ๊ณ ๋ คํด๋ด์ผ ํ๋ค. ๋ฐ๋ผ์, ํฌ๋กค๋ง์ Async๋ฅผ ์ด์ฉํ์ฌ ๋น๋๊ธฐ์ ์ผ๋ก ์ฒ๋ฆฌ๋๋๋ก ํ์ฌ ๋ณ๋ชฉ ํ์์ ์ค์ด๋๋ก ํ์๋ค.
์ธ๋ฒ์งธ, ๊ณต๊ฒฉ์ ์ธ ํฌ๋กค๋ฌ๋ ์๋ ์๋ฒ์๊ฒ ๋ฌด๋ฆฌ๋ฅผ ์ค ์ ์๋ค. ๋ฐ๋ผ์, ํฌ๋กค๋ง์ ์งํํ ๋ ์๋ ์๋ฒ์ ๋ถ๋ด์ ์ค์ผ ์ ์๋๋ก ๊ณ ๋ คํด์ผํ๋ค. ๊ทธ๋์, ํ์๊ฐ์ ๊ฒฝ์ฐ๋ ๊ตญ๋ฏผ๋ ํ์ API๊ฐ ์กด์ฌํ์ฌ ์ด๋ฅผ ์ด์ฉํ์ฌ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์๋ค. ํ์ง๋ง, ๊ณต์ง์ฌํญ์ ์ด๋ฐ API๊ฐ ์๊ธฐ ๋๋ฌธ์ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ ๊ณ ๋ คํด์ผ๋๋ค. ๋ฐ๋ผ์ ํฌ๋กค๋ง ํ์๋ฅผ ํ๋ฃจ์ 2๋ฒ์ผ๋ก ์ค์๊ณ , ๋๋๋ก ์ฌ๋์ด ์ ๊ฒ ๋ชฐ๋ฆฌ๋ ์๋ฒฝ ๋๋ ์์ฌ ์๊ฐ๋์ ํฌ๋กค๋ง์ ์งํํ๋๋ก ๊ตฌ์ฑํ๋ค. ๋ํ, ์น์ฌ์ดํธ์ robots.txt์ ์ค์ํ์ฌ ํฌ๋กค๋ง์ด ํ์ฉ๋์ง ์์ ์์ญ์ ์งํํ์ง ์์๋ค.
๋ค๋ฒ์งธ, Jsoup๋ฅผ ์ด์ฉํ์ฌ ํฌ๋กค๋ง์ ์งํํ์๋๋ฐ, Jsoup์ ์ ์ ๋ฉ์๋๋ง ์ ๊ณตํด์ ํ ์คํธ๊ฐ ์ด๋ ต๋ค๋ ์ ์ ๊ณ ๋ คํด์ผ ํ๋ค. ๊ทธ๋์ ์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๋จ์ํ ์คํธ์ Mockito๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ด์ฉํ์ฌ ํ ์คํธ๋ฅผ ์งํํ๋ฉด ๋๋ค. ํ์ง๋ง, ์ด ๋ถ๋ถ์ ์๊ฐ์ด ๋ถ์กฑํ์ฌ ๊ณ ๋ ค๋งํ๊ณ ์งํํ์ง ๋ชปํ์๋ค. ์ถํ, ๋ค๋ฅธ ํ๋ก์ ํธ๋ฅผ ์งํํ ๋๋ ์ด ์ ์ ๊ณ ๋ คํ์ฌ ํ ์คํธ๋ฅผ ์งํํ ์์ ์ด๋ค.
๋ฐ์ ์ฐ์ต
๋ฐ์ ์ฐ์ต ๊ตฌํ์ ์ํด์ Azure์์ ์ ๊ณตํ๋ Speech Service๋ฅผ ์ฌ์ฉํ์๋ค.
๊ทธ๋ฐ๋ฐ, ๋ฐ์ ์ฐ์ต์ด ๋ถ๋ช ํ Local์์๋ ์๋์์๋ ๋ถ๊ตฌํ๊ณ , Docker๋ก Containerํ ํ, ํด๋ผ์ฐ๋ ์๋ฒ์ ์ฌ๋ฆฌ๋
Could not initialize class com.microsoft.cognitiveservices.speech.SpeechConfig
์์ ๊ฐ์ ์ค๋ฅ๊ฐ ๋ฐ์ํ์๋ค.
์ด์ ๋ Spring Docker๋ฅผ ์ํด, JDK ๊ฒฝ๋ํ ์ด๋ฏธ์ง์ธ alpine์ ์ฌ์ฉํ๋๋ฐ, SDK ์ค์น ์ค๋ช ์๋ฅผ ํ์ธํด๋ณด๋ฉด Debian ๋๋ Ubuntu ํ๊ฒฝ์์๋ง ์๋ํ๋ค๊ณ ๋ช ์๋์ด ์๋ค. ๊ทธ๋์ alpine์ด ์๋ ubuntu ๊ธฐ๋ฐ์ JDK Image๋ฅผ ์ฌ์ฉํด์ Build๋ฅผ ํ์๋ค.
ํ์ง๋ง, ๋๋ค๋ฅธ ์ค๋ฅ๊ฐ ๋ฐ์ํ์๋ค. ๋ชจ๋ ์ ์๊ฐ 0์ ์ด ๋์ค๋ ์ค๋ฅ์๋ค. ์ด์ ๋ ์ญ์ ์ค๋ช ์์ ๋ช ์๋์ด ์์๋ค.
์ค๋ช ์๋ฅผ ์ ๋ณด๋ฉด, Ubuntu 22.04๋ ๊ธฐ๋ณธ๊ฐ์ด OpenSSL 3.0์ธ๋ฐ, ์ด๋ ์ง์ํ์ง ์๋๋ค๊ณ ํ๋ค. ๊ทธ๋ฆฌ๊ณ , Docker Build๋ฅผ ์ํด ์ฌ์ฉํ eclipse-temurin:17-jdk๋ Ubuntu 22.04์ด๋ค. ๋ฐ๋ผ์ ๊ธฐ์กด 3.0๋ฒ์ ์ Open SSL์ ์ง์ฐ๊ณ , 1.1 ๋ฒ์ ์ ์ค์นํ๋ ๊ณผ์ ์ด ํ์ํ๋ค. ๊ทธ๋์ Speech SDK Github Issue์ ์ฌ๋ผ์์๋ OpenSSL ๋ค์ด๊ทธ๋ ์ด๋ ํ๋ ๋ฐฉ๋ฒ์ ์ฐธ๊ณ ํ์ฌ ์๋ก Dockerfile์ ์์ฑํ์ฌ ๊ณ ์ณค๋ค.
์์ธํ Dockerfile์ ํ์ ๋ธ๋ก๊ทธ์ Azure ๋ฐ์ํ๊ฐ ํด๊ฒฐ๊ณผ์ ํฌ์คํ ์ ์ฐธ๊ณ ํด์ฃผ๋ฉด ๊ฐ์ฌํ๊ฒ ๋ค.
API Gateway
JWT ํ์ธ ๋ก์ง๊ณผ API Rate Limiter๋ ์ฑํ ์๋ฒ, ์ฑ๋ด์๋ฒ, ๋ฉ์ธ ์๋ฒ ๋ชจ๋ ํ์ํ ๋ก์ง์ด๋ค. ํ์ง๋ง, ์ด๋ฅผ ๊ฐ๊ฐ ์๋ฒ๋ง๋ค ๊ตฌํํ๋ ๊ฒ์ ๋งค์ฐ ๋นํจ์จ์ ์ด๊ณ ์ฝ๋ ์ค๋ณต์ด ๋ง์์ง๋ค. ๋ฐ๋ผ์, API Gateway๋ฅผ ๊ตฌ์ถํ์ฌ ๋ชจ๋ ์์ฒญ์ด ์ด๋ฅผ ํต๊ณผํ๋๋ก ๊ตฌ์ฑํ๋ฉด ๋งค์ฐ ํจ์จ์ ์ด๋ค.
ํ์ง๋ง, API Gateway๋ฅผ SpringMVC๋ก ๊ตฌํํ๋ ๊ฒ์ ๋งค์ฐ ๋นํจ์จ์ ์ด๋ค. SpringMVC์ WAS๋ Tomcat์ธ๋ฐ, Tomcat์ ์์ฒญ์ด ๋ค์ด์ค๋ฉด ThreadPool์์ Thread๋ฅผ ํ๋ ๋ฐฐ์ ํด์ค๋ค. ๋ํ, ๊ฐ ์์ฒญ์ ๋๊ธฐ์ ์ผ๋ก ์ฒ๋ฆฌํ๊ณ , ๋๊ธฐ์ ์ผ๋ก ์ฒ๋ฆฌํ๋ ๋์ ํด๋น ์ค๋ ๋๋ ๋ธ๋กํน ๋๋ค. (๋น๋๊ธฐ ์ฒ๋ฆฌ๊ฐ ๋ถ๊ฐ๋ฅํ ๊ฒ์ ์๋. ํ์ง๋ง ๋น๋๊ธฐ ์ฒ๋ฆฌ๋ฅผ ํ๋๋ผ๋ ์ด์ฐ๋๋ ๊ฐ์ ThreadPool์ ์๋ชจํ๋๊น, ThreadPool ๊ณ ๊ฐ ๋ฌธ์ ๋ ์ฌ์ ) ๊ทธ๋์ ๋์์ ๋ง์ ์์ฒญ์ด ๋ค์ด์ฌ ๊ฒฝ์ฐ ์ค๋ ๋ํ์ด ๊ณ ๊ฐ๋์ด, ์ฑ๋ฅ์ด ์ ํ๋ ์ ์๋ค. ๋ฐ๋ผ์, API Gateway๋ก ์ ํฉํ์ง ์๋ค. ๊ทธ๋์ ํํ ๊ฒ์ด Spring Cloud Gateway์ด๋ค.
Spring Cloud Gateway๋ Netty ๊ธฐ๋ฐ์ด๋ค. Netty๋ ๋ ผ๋ธ๋กํน ๋น๋๊ธฐ Event-driven ๊ตฌ์กฐ์ด๋ค. ๊ทธ๋์ ๋น ๋ฅด๊ฒ ๋๊ท๋ชจ ํธ๋ํฝ์ ์ฒ๋ฆฌํด์ค์ผํ๋ API Gateway ๊ตฌ์กฐ์์ Netty๊ฐ ์ ํฉํ๋ค. ์ด๋ฅผ ํตํด ์ ์ ์์ ์ค๋ ๋์ ์ต์ํ์ ์์์ผ๋ก ํจ์จ์ ์ผ๋ก ์์ฒญ์ ์ฒ๋ฆฌํ ์ ์์๋ค.
๋ค๋ง, Spring Cloud Gateway๋ง๊ณ ๋, AWS์์ ์ ๊ณตํ๋ API Gateway๋ฅผ ์ด์ฉํ๋ ๋ฐฉ๋ฒ๋ ์์ ๊ฒ์ผ๋ก ๋ณด์ธ๋ค. (ํ์ง๋ง, ์ด๋ ์ฝ๋ ๋ ๋ฒจ ๊ด๋ฆฌ๊ฐ ์๋๋ผ ์ธํ๋ผ ๋ ๋ฒจ์์์ ๊ด๋ฆฌ๋ผ์ ์ด์ง ์ฐจ์ด๊ฐ ์์)
๋ก๊น
๋ก๊น ์ ์ฐ์ ํ ์ ์๋ ๋งํผ ์ต๋ํ ๋ง์ด, ๊ทธ ๋ค์์ ํ์ ์๋ ๋ก๊ทธ๋ ์ง์ฐ๊ฑฐ๋ ๋ ๋ฒจ์ ๋ฎ์ถ๋ ์์ผ๋ก ์ด์ํ๋๊ฒ ์ข๋ค. ๊ทธ๋์, ๋ก๊น ์ ๋๊ฐ์ง ๋ถ๋ถ์์ ์ฒ๋ฆฌ๋ฅผ ํ์๋ค.
์ฒซ๋ฒ์งธ, API Gateway๋จ์์ ๋ชจ๋ Request๋ฅผ Loggingํ๋ค. ์ด๊ณณ์์ ์์ฒญํ url, method, request body, Authorization Header๋ฅผ Logging ํ์๋ค. ์ด๋ก์จ, ํ ๊ณณ์์ ๊ณตํต์ ์ผ๋ก Logging์ ์ฒ๋ฆฌํ ์ ์๊ฒ ๋์๋ค.
๋๋ฒ์งธ, Spring์์ AOP๋ฅผ ์ด์ฉํ์ฌ ๋ฉ์๋๋ณ ์คํ ์๊ฐ ๊ธฐ๋ก์ ์งํํ์๋ค.
์์ ๊ฐ์ด Spring ์๋ฒ์์ ๊ตฌ์ฑ์ ํ์ฌ, ๋ฉ์๋๋ณ ์คํ ์๊ฐ์ ์ฝ๊ฒ ์ธก์ ํ ์ ์๋ค.
API ์๋ต ๋ฐ ๋ฌธ์
Response๋ก ๋ฐ๋ Json ํ์์ด ์ ํด์ ธ์์ง ์๋ค๋ฉด, ํ๋ก ํธ ๊ฐ๋ฐ์๋ค์ ๋งค๋ฒ API ๋ฌธ์๋ฅผ ์ฐธ๊ณ ํ์ฌ ๋งค๋ฒ ๊ทธ์ ๋ง์ถฐ ์์ ํด์ผ๋ ๊ฒ์ด๋ค. ๋ฐ๋ผ์, ํ๋ก ํธ์๋์์ ๋ชจ๋ํํ์ฌ ์ ์ฐํ๊ฒ Response๋ฅผ ๋ฐ์ ์ ์๊ฒ ํ๊ธฐ ์ํด API ๊ณตํต ์๋ต์ ์ค๊ณํ๋ค. ๊ณตํต API ์๋ต ์ค๊ณ๋ ์นด์นด์ค์ API ๊ณตํต์๋ต ๊ธฐ์ ๋ฌธ์๋ฅผ ์ฐธ๊ณ ํ์๋ค.
์ฑ๊ณตํ์ ๋๋ ์์ ๊ฐ์ด ์ฑ๊ณต ์ฌ๋ถ๋ฅผ ์๋ ค์ฃผ๋ success, ๊ทธ์ ๋ํ message, ๊ทธ๋ฆฌ๊ณ ์๋ต์ ๋ํ ๊ฒฐ๊ณผ๊ฐ์ธ response๋ก ๊ตฌ์ฑ๋๋ค. response์์ ์ด์ ํ๋ก ํธ ์ธก์์ ์ํ๋ ๊ฒฐ๊ณผ๊ฐ ๋ด๊ฒจ์๋ค.
์คํจํ์ ๋๋ success๊ฐ false, ์คํจ์ ๋ํ message, ๊ทธ๋ฆฌ๊ณ ์ค๋ฅ ์ฝ๋๋ฅผ ์๋ ค์ฃผ๋ code๋ก ๊ตฌ์ฑ๋๋ค. ํด๋น ์ค๋ฅ ์ฝ๋๋ ์๋ฒ ์ธก์์ Enum์ผ๋ก ์ ์๋์ด ์์ผ๋ฉฐ, ํ ์คํธ๋ฅผ ์ฉ์ดํ๊ฒ ์ํด์ ๋ง๋ค์๋ค.
API ๋ฌธ์๋ Swagger๋ฅผ ์ฌ์ฉํ์๋ค. ์ํํธ์จ์ด๊ณตํ์์ Agile Process์ ๋ํด์ ๊ณผ๋ํ ๋ฌธ์ํ๋ฅผ ํ์ง ๋ง๋ผ๊ณ ์ธ๊ธํ์๋ค. ํนํ, API ๋ฌธ์ํ ๊ฐ์ ๊ฒฝ์ฐ๋ ๊ณ์ํด์ ์๋ต ํ์์ด๋ ํ๋ผ๋ฏธํฐ ๋ฑ์ด ๋ณํ ์ ์๋๋ฐ, ๋งค๋ฒ API ๋ฌธ์๋ฅผ ์ต์ ํ ํ๋ ๊ฒ๋ ์ด๋ ต๊ณ , ์๋ฒ์ ๋ฌธ์๊ฐ ์๋ก ์๋ง๋ ์ ํฉ์ฑ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์๋ ์๋ค. ๊ทธ๋ฌ๋ฉด, ์คํ๋ ค ๋ฌธ์๋ฅผ ์ ์ง๋ณด์ํ๊ฑฐ๋ ์ค๋ฅ๋ฅผ ํด๊ฒฐํ๋๋ฐ Cost์ Time์ ์ฆ๊ฐ์ํจ๋ค.
๋ฐ๋ผ์, Swagger๋ฅผ ์ด์ฉํ์ฌ API๊ฐ ๋ณ๊ฒฝ๋๋๋ผ๋ ์๋์ผ๋ก API ๋ฌธ์๋ฅผ ์ต์ ํ ํด๋๋ก ๊ตฌ์ฑํ์๋ค. ์ด๋ก์จ, API ๋ฌธ์๋ฅผ ์ ์ง ๋ณด์ํ๋๋ฐ ์๊ฐ์ ํฌ๊ฒ ์ค์ผ ์ ์์๋ค. ๋ํ, Swagger๋ฅผ ํตํด API ๋ฌธ์์์ ๋ฐ๋ก ํ ์คํธ๋ฅผ ์งํํด๋ณผ ์๋ ์์ด์ ํ์ ์ ๋ฅ๋ฅ ์ ํฅ์์์ผฐ๋ค.
๋ฐฐํฌ
AWS EC2 ์ธ์คํด์ค์ ๋ฐฐํฌํ๋ค๋์ง, ์ปดํจํฐ์ ๋ ธํธ๋ถ์ ๋ฒ๊ฐ์๊ฐ๋ฉฐ ๊ฐ๋ฐํ๋ค๋์ง, ์ด๋ฌ๋ฉด ๊ฐ๊ฐ ๊ฐ๋ฐ ํ๊ฒฝ์ด ํ๋ ค ๋งค๋ฒ ์ค์ ์ ํด์ฃผ์ด์ผ ํ๋ค. ํ์ง๋ง Docker๊ฐ ์๋ค๋ฉด? ๊ท์ฐฎ๊ฒ ๊ทธ๋ด ํ์ ์์ด ์ฝ๊ฒ ๋ฐฐํฌ๋ฅผ ์งํํ ์ ์๋ค. ๋ฐ๋ผ์, ์คํํ๋ OS ํ๊ฒฝ์ ์๊ด์์ด, ์ธ์ ๋ ๊ฐ์ ํ๊ฒฝ์์ ๊ฒฐ๊ณผ๋ฅผ ๋ผ ์ ์๋๋ก Docker Containerํ๋ฅผ ์งํํ๋ค. Ruby On Rails๋ AI์๋ฒ์ Docker Containerํ๋ ๋ค๋ฅธ ๊ฒ๊ณผ ๋ณ๋ฐ ๋ค๋ฅผ๊ฒ ์๋๋ฐ, Spring Containerํ๋ฅผ ์ข ํน์ดํ๊ฒ ์งํํ์๋ค. ์ผ๋ฐ์ ์ธ Docker ๋ฐฐํฌ ๋ฐฉ์์ผ๋ก Spring ์๋ฒ๋ฅผ ๋ฐฐํฌํ๋ค๋ฉด, jar ํ์ผ์ด ๋ฌด๊ฑฐ์์ง์๋ก docker image๋ฅผ ๋ง๋๋ ๊ณผ์ ์ด ๋นํจ์จ์ ์ผ๋ก ๋๋ค. ๊ทธ๋ฐ๋ฐ, Docker์ ์ฅ์ ์ด ๋ ์ด์ด๋ง๋ค ์บ์ฌ๋ฅผ ์ฌ์ฉํ๊ณ , ์ด๋ฅผ ํตํด ๋น ๋ฅด๊ฒ ์ด๋ฏธ์ง๋ฅผ ๋ง๋ค ์ ์๋ค๋ ๊ฒ์ด๋ค. ํ์ง๋ง, ํด๋น ๋ฐฉ์์ผ๋ก ์งํํ๋ฉด ์์ค ์ฝ๋๋ฅผ ํ์ค๋ง ๋ฐ๊ฟ๋ ์บ์ฌ๊ฐ ๊นจ์ง๊ธฐ ๋๋ฌธ์ ๋ค์ ์ฐ์ฐ์ ํด์ผ๋์, Docker๋ฅผ ์ฌ์ฉํ๋ ์ฅ์ ์ด ์์ด์ง๋ค. ์๋ํ๋ฉด, Spring์ ๋ชจ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ฝ๋์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ Single layer์ ๋ฐฐ์น๋๊ธฐ ๋๋ฌธ์ด๋ค. ๊ฒฐ๊ตญ ์ปจํ ์ด๋ ํ๊ฒฝ์์์ ์์ ์๊ฐ์๋ ์ํฅ์ ๋ฏธ์น๋ค.
๊ทธ๋์ Multistage Build์ Jar ํ์ผ์ ํน์ฑ ๋๊ฐ์ง๋ฅผ ๊ณ ๋ คํด์ Dockerfile์ ์์ฑํ๋ค. ์ฐ์ , ์ผ๋ฐ์ ์ธ ๋ฐฉ์์ผ๋ก Docker Image๋ฅผ ์์ฑ์, ์ฐ๋ฆฌ๋ jar ํ์ผ๋ง ํ์ํ๋ฐ ์ธ๋ฐ์๋ ์์ค ์ฝ๋๊น์ง ๋ค ํฌํจํ๊ฒ ๋์ด์ ์ฉ๋์ด ์ง๋์น๊ฒ ์ปค์ง๊ณ , ์ ๋ก๋ํ๋๋ฐ๋ ์ค๋ ๊ฑธ๋ฆฌ๊ฒ ๋๋ค. ๋ฐ๋ผ์, MultiStage Build๋ฅผ ์ด์ฉํ์ฌ Buildํ ๋๋ง ํ์์ ์ธ ์ฝ๋๋ก jar ํ์ผ์ ์์ฑํ๊ณ , ์ต์ข Docker image์๋ ์ด๊ฒ๋ค์ด ํฌํจ๋์ง ์๋๋ก ์ค์ ํ๋ค.
๋ํ, Spring ๊ณต์ Docs๋ฅผ ๋ค์ด๊ฐ๋ณด๋ฉด Spring์ Jar ํ์ผ์ ์ ์ฌ์ง๊ณผ ๊ฐ์ด 4๊ฐ์ง Layer๋ก ๋๋๋ค๊ณ ํ๋ค. ํด๋น ๋ฌธ์์์, application layer๊ฐ ๊ฐ์ฅ ์์ฃผ ๋ฐ๋๊ณ , ๊ทธ๋ค์์ snatphot, ๊ทธ๋ค์์ spring-boot-loader, dependencies ์์ผ๋ก ์์ฃผ ๋ฐ๋์ง ์๋๋ค๊ณ ํ๋ค. ์ฆ, Dependencies๊ฐ ๊ฐ์ฅ ๋ฐ๋์ง ์๋๋ค๋ ๊ฒ์ด๋ค. ๊ทธ๋ฌ๋ฉด Dockerfile์ ์์ฑํ ๋, Docker File์ ์ ์ผ ์์ฃผ ๋ฐ๋์ง ์๋ ๊ฒ๋ถํฐ ์ฐจ๋ก๋ก ์์ฑํด์ฃผ๋ ๊ฒ์ด ์ข๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ ์ญ์์ผ๋ก Docker File์ ์์ฑํ์๋ค.
CI/CD๋ก ๋ํ์ ์ธ ๊ฒ์ Jenkins์ Git Actions๊ฐ ์๋๋ฐ, ์ฐ๋ฆฌ๋ Git Actions์ ํํ๋ค. ๊ทธ ์ด์ ๋ Github์์ ๊ด๋ฆฌํ๋ ๊ฒ์ด๋ค ๋ณด๋๊น, ์ฝ๋ ์ ์ฅ์๋ ๋ฐ๋ก๋ฐ๋ก ์ฐ๊ฒฐ์ด ๋๊ณ , PR์ ์์ฑํ๊ฒ ๋๋ฉด GitHub Actions๋ฅผ ํตํด ํด๋น ์ฝ๋ ๋ณ๊ฒฝ ๋ถ๋ถ์ ๋ฌธ์ ๊ฐ ์๋์ง ๊ฐ์ข ๊ฒ์ฌ๋ฅผ ์งํํ ์๋ ์๊ธฐ ๋๋ฌธ์ด๋ค.
์์ ๊ฐ์ ํ๋ก์ฐ๋ก Github์์ ์๋์ผ๋ก ์๋ฒ๋ค์ด ๋ฐฐํฌ๋ ์ ์๋๋ก Git Actions ์ค์ ์ ํด๋จ๋ค.
setup-env์์ git actions secret์ผ๋ก๋ถํฐ ๋ฐ์ .env๋ฅผ ์์ฑํ๋ค. ๊ทธ๋ฆฌ๊ณ ์ด๊ฑธ ์ฐ๋ฆฌ ec2์ scp ํ๋กํ ์ฝ์ ์ด์ฉํด์ ์ ์กํ๋ค. ๋ํ, ์ค์ง์ ์ธ ์๋ฒ ๋ฐฐํฌ๋ฅผ ๋ด๋นํ docker-compose.yml๋ scp ํ๋กํ ์ฝ์ ํตํด์ ์ ์กํ๋ค.
๊ทธ ๋ค์, ์ฐ๋ฆฌ์ spring, ruby, spring gateway, nginx ๋ฑ์ docker image๋ก buildํ๋ค. ๊ทธ๋ฐ๋ฐ ์ฌ๊ธฐ์ ๋ฌธ์ ๊ฐ ์๋ค. Git Actions๋ ๋งค๋ฒ ์๋ก์ด RunTime ํ๊ฒฝ์์ ์คํ๋๊ธฐ ๋๋ฌธ์, docker์ ์ด์ ์ธ docker cache๋ฅผ ์ ์ฉํ์ง ๋ชปํ๋ค. ๊ทธ๋์ Build ํ ๋ ๊ต์ฅํ ์๊ฐ์ด ์ค๋๊ฑธ๋ฆฐ๋ค. ๋ฐ๋ผ์, cache๋ฅผ ์ ์ฉํ๊ธฐ ์ํด์ docker์์ ๊ณต์์ ์ผ๋ก ์ ๊ณตํด์ฃผ๋ docker buildX๋ฅผ ์ด์ฉํ๋ค. BuildX๋ฅผ ์ฌ์ฉํ๋ฉด, Git Actions ๋ด๋ถ์ ์ธ Cache ์ ์ฅ์๋ฅผ ํ์ฉํ์ฌ Docker Cache๋ฅผ ์ ์ฅํ ์ ์๋ค. ์ค์ ๋ก, BuildX๋ฅผ ์ ์ฉํ๊ธฐ ์ ์๋ Spring Container ๋น๋ ์๊ฐ์ด 13 ~ 15๋ถ ์ ๋ ๊ฑธ๋ ธ๋ค. ํ์ง๋ง, ์บ์๋ฅผ ์ ์ฉํ ์ดํ๋ก๋ ์ ์ฌ์ง์์ ๋ณด์ด๋ ๊ฒ ์ฒ๋ผ 5๋ถ์ผ๋ก Build ์๊ฐ์ด 10๋ถ ๊ฐ๊น์ด ์ค์ด๋ค์๋ค.
๋ง์ง๋ง์ผ๋ก, ์ฐ๋ฆฌ ec2์ ssh๋ก ์ ์ํด์ ์ด๋ฏธ์ง๋ฅผ ๋ด๋ ค๋ฐ๊ณ docker-compose๋ฅผ ์คํํ์ฌ ๋ฐฐํฌ๋ฅผ ์๋ฃํ๋๋ก ๊ตฌ์ฑํ๋ค.
์ฑ๋ฅ์ ๊ณ ๋ ค ์ฌํญ
์บ์ฑ
์ ์ ๋ค์ด ์์ฃผ ์ ๊ทผํ๋ ๋ฐ์ดํฐ๋ ์บ์ฑํ๋ ๊ฒ์ด ์ข๋ค. ์๋ฅผ ๋ค์ด์, ๊ณต์ง์ฌํญ ๋ชฉ๋ก์ด๋ Q&A ๋ชฉ๋ก์ธ ๊ฒฝ์ฐ, ์์ฃผ ๋ฐ๋์ง๋ ์์ํ ๋ฐ ์ ์ ๋ค์ด ํด๋น ๊ฒ์ํ์ ์ ์ํ ๋๋ง๋ค ๋งค๋ฒ RDB์์ ๋ชฉ๋ก์ ์ฝ์ด์ค๋ ๊ฒ์ ๋นํจ์จ์ ์ด๋ค. ๋ฐ๋ผ์, Redis๊ฐ์ ๊ณณ์ ์บ์ฑํด๋๊ณ , ๋๊ฐ์ ์์ฒญ์ด ๋ค์ด์ค๋ฉด ๋น ๋ฅด๊ฒ Redis์์ ๋ฝ์๊ฐ๋๋ก ๊ตฌ์ฑํ๋ค. ์บ์ฑ ์ ๋ต์ ๋ค์๊ณผ ๊ฐ๋ค.
์บ์ฑ ์ ๋ต์ Look Aside์ Write Around ์ ๋ต์ ์กฐํฉ์ ํํ์๋ค. Read ์ ๋ต์ Look Aside ์ ๋ต์ ํ์ฉํ๋ค. ์ฐ์ ์ ์ผ๋ก Redis์์ ์ฝ์ด์ค๊ณ , cache miss๊ฐ ๋ฐ์ํ์ ๋๋ง, RDS์์ ์ฝ์ด์ค๊ณ ๋ค์ redis์ ์ ์ฅํ๋ ๋ฐฉ์์ด๋ค. Write ์ ๋ต์ Write Around ์ ๋ต์ ํ์ฉํ๋ค. ๋ฐ์ดํฐ๋ฅผ ์ธ ๋, Redis์ ์ ์ฅํ์ง ์๊ณ , ๋ฐ๋์ RDB์ ์ ์ฅํ๊ณ ๊ธฐ์กด ์บ์๋ ๋ฌดํจํํ๋ ์ ๋ต์ด๋ค.
์ค์ ์บ์ฑ์ ์ ์ฉํ๊ธฐ ์ ๊ณผ ํ์ ์๊ฐ์ ์ธก์ ํด๋ณด์๋ค.
์บ์ฑ ์ ์๋ ๋ฉ์๋๋ฅผ ์คํํ๋๋ฐ 414ms๊ฐ ๊ฑธ๋ ธ๋ค.
ํ์ง๋ง ์บ์ฑ ํ์๋ 12ms๋ก ๋จ์ถ๋์๋ค. ์คํ์๊ฐ์ด 1/40 ๋จ์ถ๋ ๊ฒ์ด๋ค.
๊ทธ๋ฐ๋ฐ ์บ์ฑ๋ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์ผ๋ฉด, class ์ ๋ณด์ ๋ํ field๊ฐ json์ ์ถ๊ฐ๋๋ ํ์์ด ์์ด์ ์ถ๊ฐ ๋ณด๋ฅ๋ฅผ ํ์๋ค.
๋ํ, ์ด๋ฏธ์ง๋ฅผ ๋ฐ์์ค๋ S3๋ ์บ์ฑ์ ๋ฌด์กฐ๊ฑด ํด์ผํ๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด S3 ๋น์ฉ์ด ๊ต์ฅํ ๋ง์์ง ๊ฒ์ด๊ณ ์๋ต์๊ฐ์ด ๊ธธ์ด์ง๋ค. ๊ทธ๋์ AWS CloudFront๋ฅผ S3 ์๋จ์ ๋์ด ์บ์ฑ๋ ์ ์๋๋ก ๊ตฌ์ฑํ๋ค.
๋น๋๊ธฐ ์ฒ๋ฆฌ
๋ชจ๋ ์์ฒญ์ ๋๊ธฐ์ ์ผ๋ก ์ฒ๋ฆฌํ๋ ๊ฒ์ ๋งค์ฐ ๋นํจ์จ์ ์ด๋ค. ํนํ, ์ด๋ฏธ์ง๋ฅผ ์ ๋ก๋ํ๊ฑฐ๋, ๋ฒ์ญ API ๊ฐ์ ๋ค๋ฅธ API์ ์์ฒญ์ ๋ณด๋ด๊ฑฐ๋, ํฌ๋กค๋ง ๋ฑ์ ๋งค์ฐ ์ค๋๊ฑธ๋ฆฌ๋ ์์ ์ด๋ค. ์ด ๋ชจ๋ ์์ ์ ๋๊ธฐ์ ์ผ๋ก ์ฒ๋ฆฌํ๋ฉด, ์ฑ๋ฅ์ ๋งค์ฐ ์น๋ช ์ ์ผ ๊ฒ์ด๋ค. ๊ทธ๋์, ํด๋น ๊ธฐ๋ฅ๋ค์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ์๋ Async๋ฅผ ํตํ ๋น๋๊ธฐ ์ฒ๋ฆฌ๋ฅผ ์ค์ํ์๋ค.
์ด ๋น๋๊ธฐ์ฒ๋ฆฌ๋ฅผ ์ํด์ Spring์์ ThreadExecutor๋ฅผ ์ด์ฉํ๋ค. ๊ทธ๋ฐ๋ฐ, ๊ธฐ๋ณธ Async Executor SimpleAsyncTaskExecutor์ธ๋ฐ, ์ด๋ ๋น๋๊ธฐ ์์ ๋ง๋ค ์๋ก์ด ์ค๋ ๋๋ฅผ ์์ฑํ๋ค. ์ด๋ก ์ธํด ๋ฆฌ์์ค ๋ญ๋น, ์ฑ๋ฅ ์ ํ, ์ค์ผ์ผ๋ง ๋ฌธ์ ๋ฑ์ด ๋ฐ์ํ ์ ์๋ค. ์๋ํ๋ฉด Thread Pool ๋ฐฉ์ Executor๊ฐ ์๋๋ผ์ ์ค๋ ๋ ์ฌ์ฌ์ฉ์ ํ์ง ์๊ธฐ ๋๋ฌธ์ด๋ค. ๊ทธ๋์ ์คํ์๊ฐ์ด ์งง์ ๋ง์ ์์ Task๋ฅผ ์ฒ๋ฆฌํ ๋ ๋ถ๋ฆฌํ๋ค. ๋ฆฌ์์ค ์ธก๋ฉด์์๋ ๊ฐ ๋น๋๊ธฐ ์์ ๋ง๋ค ์๋ก์ด ์ค๋ ๋๋ฅผ ์์ฑํ๋ฏ๋ก, ๋์์ ๋ง์ ๋น๋๊ธฐ ์์ ์ด ์์ฒญ๋๋ฉด ๋งค๋ฒ ๋ง์ ์ค๋ ๋๊ฐ ์์ฑ๋๋ค. ๋ฐ๋ผ์ CPU์ ๋ฉ๋ชจ๋ฆฌ ๋ฆฌ์์ค์ ์ฌ์ฉ๋์ด ๊ณผ๋ํ๊ฒ ์ฆ๊ฐํ๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์๋ค. ์ฑ๋ฅ ์ ํ ๋ฉด์์๋ ์ค๋ ๋๋ฅผ ์์ฑํ๊ณ ์๋ฉธ์ํค๋ ๋ฐ๋ ๋ง์ ์๊ฐ๊ณผ ๋ฆฌ์์ค๊ฐ ์์๋๋ค. ๊ฐ ์์ ๋ง๋ค ์ค๋ ๋๋ฅผ ์์ฑํ๋ฉด ์ด๋ฐ ์ค๋ฒํค๋๊ฐ ๊ณ์ ๋ฐ์ํ๊ฒ ๋๊ณ , ์ ์ฒด์ ์ธ ์์คํ ์ฑ๋ฅ์ ์ํฅ์ ๋ผ์น ์ ์๋ค. ๋ํ, SimpleAsyncTaskExecutor๋ ์ค๋ ๋ ์์ ๋ํ ์ ํ์ด ์๋ค. ๋ฐ๋ผ์ ๋์์ ๋ง์ ์์ฒญ์ด ๋ค์ด์ฌ ๊ฒฝ์ฐ ์ค๋ ๋ ์๊ฐ ๋ฌดํ์ ์ผ๋ก ์ ์ดํ ์ ์๋ ์์ค์ผ๋ก ์ฆ๊ฐํ ์ ์์ผ๋ฉฐ, ์ด๋ ๊ณง OutOfMemoryError ๋ฑ์ ๋ฌธ์ ๋ฅผ ์ผ์ผํฌ ์ ์๋ค.
๊ทธ๋์, ์ ์ฌ์ง๊ณผ ๊ฐ์ด Async์ Executor๋ฅผ ThreadPool๋ฐฉ์์ Executor๋ก ์ค์ ํ๋ค. ์ด๋, ์ฌ์ฉํ ์ค๋ ๋ ํ์ ์ํ ๊ธฐ๋ณธ ์ค๋ ๋ ์์ธ corepoolsize, corepoolsize๊ฐ ๊ฐ๋ ์ฐฌ ์ํ์์ ๋์ด์ ์ถ๊ฐ ์ฒ๋ฆฌ๊ฐ ๋ถ๊ฐ๋ฅ ํ ๋, ๋๊ธฐํ๋ ์ฅ์ ํฌ๊ธฐ์ธ queuecapacity, ์ค๋ ๋ ํ์ด ํ์ฅ๋ ์ ์๋ ์ค๋ ๋์ ์ํ์ , ์ฆ ์ค๋ ๋ ์์ ์ํ์ ์ธ maxpoolsize๋ฅผ ์กฐ์ ํ์ฌ ThreadPool๋ฐฉ์์ Async Executor๋ฅผ ๊ตฌ์ฑํ๋ค.
Race Condition ํด๊ฒฐ
ํ๋ก์ ํธ์์ ๋ต๋ณ์ ์ถ์ฒ๊ธฐ๋ฅ์ ๊ตฌํํ๋ฉด์ ์ถ์ฒ / ์ถ์ฒ ํด์ ๊ธฐ๋ฅ์ ๋ง๋ค์๋ค. ๋ฌธ์ ๊ฐ ์๋ค๋ฉด ์ถ์ฒ์, ์กฐํ์์ ๊ฐ์ ๊ธฐ๋ฅ์ ํ๋์ ํ๋์ ๋ํด ์๋ง์ ํธ๋์ ์ ์์ฒญ์ด ์ค๊ฐ๋ ๊ธฐ๋ฅ์ด๊ธฐ ๋๋ฌธ์ ์ด๊ฒฝ์ฐ ์์์ ์ ๊ทผํ๋ ๊ฒ์ ๋ํ Race Condition, ๋์์ฑ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๊ฒ ๋๋ค. ์ด๋ฌํ ๊ฒฝ์ฐ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด์ Redis๋ฅผ ์ฌ์ฉํ์๋ค. Redis๋ ์ฑ๊ธ ์ค๋ ๋๋ก ์์์ ๋ํ Race Condition ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค. ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด Cache Write ์ ๋ต์ค์์ Write Back ์ ๋ต์ ์์ฉํ์๋ค. Redis์ ์์ฒญ์ ๋ณด๋ผ countTemplate๋ฅผ ์ ์ธํ๊ณ ์ด๋ฅผ ํตํด์ Redis์ ๊ฐ์ฒด์ ๋ต๋ณ์ ์ถ์ฒ์๋ฅผ ์ ์ฅํ๊ณ ์ผ์ ์๊ฐ๋ง๋ค ์ด๋ ๊ฒ Cache์ ์ ์ฅ๋ ๋ด์ฉ์ DB์ ๋ฐ์์ํค๋๋ก ํ์๋ค. ์ด๋ ๊ฒ Redis์ ์ ์ฅ๋ ๋ณ๊ฒฝ ์ฌํญ์ 30์ด ๊ฐ๊ฒฉ์ผ๋ก DB์ ๋ฐ์๋๋ ๋ฐฉ์์ผ๋ก ๊ตฌํํ์๋ค.
ํ์ง๋ง, Redis๋ฅผ ์ด์ฉํ๋๋ผ๋ ๊ฒฐ๊ตญ์๋ Redis์์ ๊ฐ์ ์ฝ๊ณ ๋น๊ตํ๊ณ ์ฐ๋ ์ด ์ผ๋ จ์ ํ์๋ Spring ์ฝ๋์์ Lock์ด ๊ฑธ๋ฆฌ์ง ์๊ณ ์คํ๋๊ธฐ ๋๋ฌธ์ Atomicํ๊ฒ ์คํ๋์ง ์๋๋ค. ๊ทธ๋์ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด Redis Lock์ ๊ฑธ์ด์ฃผ์ด Atomicํ๊ฒ ์คํ๋๋๋ก ๋ณด์ฅํ์๋ค. ๋ฌผ๋ก , ์ฐ๋ฆฌ๋ Redis Lock์ ์ด์ฉํ์์ง๋ง, ์ด์ธ์๋ Redis Transaction ์ด์ฉ, Redis ๋ด๋ถ์์ Lua Script๋ฅผ ์ด์ฉํ์ฌ Atomicํ๊ฒ ์คํ, DB Lock, DB์ Isolation Level ์กฐ์ ๋ฑ์ ๋ฐฉ๋ฒ์ด ์์ ๊ฒ์ด๋ค.
ํ์ฌ ๋ฐฉ๋ฒ๋ ๋์์ฑ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ์ด์ง๋ง ๋ด๊ฐ ์ถ์ฒํ ๋ต๋ณ์ ์ถ์ฒ์๊ฐ ์ฆ์ ๋ฐ์๋์ด ๋ณด์ฌ์ง์ง๋ ์๋๋ค. ์ด๋ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ด์ฌ๋๋ ์บ์์์ ์ฐพ๋ ๋ฐฉ์์ด ์๋๊ธฐ ๋๋ฌธ์ด๋ค. ์ถํ์๋ ์บ์์์ ๊ฐ์ ์ฐพ๋๋ก ๊ตฌํํ ํ์๊ฐ ์๋ค.
์ถ๊ฐ์ ์ผ๋ก, ์ด์์ฒด์ ๊ณผ๋ชฉ์์ ์บก์คํค ์ธํฐ๋ทฐ ๊ณผ์ ๋ฌธ์์ Race Condition ์๋ฐฉ์ ๊ด๋ จ๋ ๋ฌธ์๋ฅผ ํ๋ ๋ง๋ค์์๋ค. ํน์๋ผ๋ ๋์์ฑ ์ฒ๋ฆฌ์ ๊ด์ฌ์ด ์๋ค๋ฉด ํด๋น ๋ฌธ์์ 2๋ฒ์ ์ฐธ์กฐํด์ฃผ๊ธธ ๋ฐ๋๋ค.
N+1 ๋ฌธ์
์ฌ๋ฌ ์ฐธ์กฐ๊ด๊ณ๋ฅผ ๊ฐ์ง ํ ์ด๋ธ์ด ์กด์ฌํ๊ณ ๋น์ฆ๋์ค ๋ก์ง์์ ์ด๋ค์ Joinํ์ฌ ํธ์ถํ๋ ์ํฉ์ด ๋ง์ด ์์์ผ๋ฉฐ ์ด๋ N+1๋ฌธ์ ๊ฐ ๋ฐ์ํ์๋ค. ์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด Fetch Join์ ์ฌ์ฉํ๊ฑฐ๋ Projection ์ฃผ์ ์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ์ Inner Join๊ณผ ๊ฐ์ด ์ฌ๋ฌ ๊ฒฝ์ฐ์ N+1์ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ๋ชจ์ํ์ฌ ์ ์ฉํ์๋ค. ์ด๋ก ์ธํด ์๋ฒ ๋น์ฆ๋์ค ๋ก์ง์ ์ฑ๋ฅํฅ์์ด ์ด๋ฃจ์ด์ง ์ ์์๋ค. ์ด ๊ณผ์ ์์ ์ฌ๋ฌ ์ํ ์ฐฉ์ค๊ฐ ์์๋ค. ๊ธฐ์กด์ ๋ฐฉ์์ Projection์ ์ฌ์ฉํ์ฌ DTO๋ฅผ ๋ฐํ์ผ๋ก JPA ๊ฒ์์ ์ฌ์ฉํ๋ ๋ฐฉ์์ด์๋๋ฐ ์ด ๊ฒฝ์ฐ Fetch Join์ด๋ EntityGraph๋ก๋ ํด๊ฒฐ์ด ๋ถ๊ฐ๋ฅํ๋ค. @Projection์ ์ฌ์ฉํ ํด๊ฒฐ ๋ฐฉ์๋ ์์ผ๋ ์ข ๋ ๊ณ ๋ฏผํด๋ณธ ๊ฒฐ๊ณผ Join์ ๋ชฉ์ ์์ N+1๋ฌธ์ ๋ฅผ ์ผ๊ธฐํ ํ๋๊ฐ์ด ํฐ ๋ฌธ์ ๊ฐ ์์ด InnerJoin์ผ๋ก๋ ์ถฉ๋ถํ ํด๊ฒฐ๋๋ ๋ฒ์ฃผ์๋ค๋ ๊ฒ์ ๊นจ๋ฌ์๋ค.
๋ํ, batch size๋ฅผ ์กฐ์ ํด์ N+1 ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์๋ ์๋ค. ํ์ง๋ง, ์ฐ๋ฆฌ๋ ํ์ฌ ์๋น์ค ์ด๊ธฐ๋ผ์ batch size๋ก ์ํฅ์ด ๊ฐ ๋งํผ์ ๋ฐ์ดํฐ๊ฐ ์กด์ฌํ์ง ์๊ธฐ ๋๋ฌธ์ ์ด ์ ์ ๋ณด๋ฅํ์๋ค.
์์ ์ฑ ๊ณ ๋ ค ์ฌํญ
์ฌ์ฉ์ ํธ๋ํฝ ์ ํ
A๋ผ๋ ์ฌ๋์ด ์ ์์ ์ผ๋ก ์ฐ๋ฆฌ AI ๋ชจ๋ธ์๊ฒ 1๋ถ์ 100๋ง๋ฒ์ ์์ฒญ์ ๋ณด๋ผ ์ ์๋ค. ๊ทธ๋ฌ๋ฉด ์ฐ๋ฆฌ AI Token์ ๋ชจ๋ ์ฌ๋ผ์ง๋ค. B๋ผ๋ ์ฌ๋์ Spring ๋น์ฆ๋์ค ์๋ฒ์ 1์ด์ 1000๋ง๋ฒ ์์ฒญ์ ๋ ๋ฆฐ๋ค. ๊ทธ๋ฌ๋ฉด, ์ญ์ ์๋ฒ๊ฐ ํฐ์ง ๊ฒ์ด๋ค. ๋ฐ๋ผ์, ์๋ฒ์ ํด๋ผ์ด์ธํธ ์ฌ์ด์์ ๋ฏธ๋ค์จ์ด ์ญํ ์ ํ์ฌ ๋ถ๋น API ์ฌ์ฉ๋์ ์ ํํ ํ์๊ฐ ์๋ค. ๊ทธ๋์ API Rate Limiter๋ฅผ ์ ์ฉํ๋ค.
์ฌ์ฉ์๊ฐ ์ต๋ ๊ฐ์ง ์ ์๋ Token Bucket Capacity๊ฐ ์ ํด์ ธ ์๋ค. ๊ทธ๋ฆฌ๊ณ ๊ณ์, ์ง์์ ์ผ๋ก ์ผ์ ์๊ฐ๋ง๋ค Token์ด ๋ฆฌํ์ด ๋๋ค. ์ด Token ๋ฆฌํ์ Bucket Size๊ฐ ๊ฝ์ฐผ์๋๋ ๋์ง ์๋๋ค. ๊ทธ๋ฆฌ๊ณ , ์ฌ์ฉ์๊ฐ API ์์ฒญ์ ๋ณด๋ผ ๋ ๋ง๋ค Bucket์์ Token์ ๊บผ๋ด๊ฐ๋ค. ๋ง์ฝ, ๊บผ๋ผ Token์ด ์๋ค๋ฉด, Status 429๋ฅผ ๋ณด๋ด์ค๋ค. (Too Many Requests) ์ด์ธ์๋ ๋์ถ ๋ฒํท ์๊ณ ๋ฆฌ์ฆ, ๊ณ ์ ์๋ ์นด์ดํฐ ์๊ณ ๋ฆฌ์ฆ, ์ด๋ ์๋ ๋ก๊น ์๊ณ ๋ฆฌ์ฆ, ์ด๋ ์๋ ์นด์ดํฐ ์๊ณ ๋ฆฌ์ฆ ๋ฑ์ด ์กด์ฌํ๋ค. ํ์ง๋ง, ์ผ๋ฐ์ ์ผ๋ก Token Bucket Algorithm์ ๋ง์ด ์ฐ๊ธฐ ๋๋ฌธ์ ์ด๋ฅผ ์ฌ์ฉํ๋ค.
Redis๋ ์ธ๋ฉ๋ชจ๋ฆฌ DB์ด๊ธฐ ๋๋ฌธ์ ๋งค์ฐ ๋นจ๋ผ์ ์ ํฉํ๋ค. ๋ํ, Redis์ ๋ ๋ค๋ฅธ ํน์ง์ ์ฑ๊ธ ์ค๋ ๋์์ ์คํ๋ ์ ์๋ค๋ ๊ฒ์ด๋ค. ๊ทธ๋์, ๋ค์ค ์ฌ์ฉ์์ ์์ฒญ์๋ ์ผ๊ด๋๊ฒ ์ฒ๋ฆฌํ ์ ์๋ค. ์ด๋ฅผ ์ด์ฉํ์ฌ ์ด๋น ์ฌ์ฉ์๊ฐ 6~7๋ฒ์ ์์ฒญ๊น์ง๋ง ๋ณด๋ด๊ณ , ์๋๊ฒฝ์ฐ 429 Error๋ฅผ ๋ณด๋ด๋๋ก ์ค์ ํด์ ํธ๋ํฝ ์ ํ์ ๊ฑธ์๋ค.
์ค์ ๋ก ์์ ์ฌ์ง์ฒ๋ผ Apache Jmeter๋ก ์๋ฎฌ๋ ์ด์ ์ ๋๋ ค๋ณด๋ฉด, 429 Error๋ฅผ ๋ฐํํ๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
์ฌ์ฉ์ ์ ๋ก๋ ํ์ผ ์ฉ๋ ์ ํ
์ธ๊ตญ๋ฏผ ์๋น์ค์๋ ๋ฐ์ํ๊ฐ์ ๊ฒ์ํ์์ ์ด๋ฏธ์ง๋ฅผ ์ ๋ก๋ ํ๋ ๊ธฐ๋ฅ์ด ์กด์ฌํ๋ค. ์ด ์ํฉ์์, Client๋ Server์ ํ์ผ์ ์ ๋ก๋ ํ ํ ๋ฐ, ๋ง์ฝ์ ๋๋ฌด ํฌ๊ธฐ๊ฐ ํฐ ํ์ผ์ ๋ณด๋ธ๋ค๋ฉด ์๋ฒ์ ํฐ ๋ถ๋ด์ ์ค ๊ฒ์ด๋ค. ๊ทธ๋์, Nginx๋ฅผ ์ด์ฉํ์ฌ ์ ์ผ ์ต์ ๋ฐฉ์์ ๋น ๋ฅด๊ฒ ์ฉ๋์ด ๋๋ฌด ํฐ ํ์ผ์ ์ฌ๋ฆฌ์ง ๋ชปํ๋๋ก ์ฐจ๋จํ์๋ค.
๋ณด์์ ๊ณ ๋ ค ์ฌํญ
์ฌ์ฉ์ ๋น๋ฐ๋ฒํธ ์ํธํ
์ฌ์ฉ์์ ๋น๋ฐ๋ฒํธ๋ฅผ ๊ทธ๋๋ก DB์ ๋ณด๊ดํ๋ ๊ฒ์ ์๋ชป๋ ์ผ์ด๋ค. ๋น๋ฐ๋ฒํธ๋ฅผ ์ํธํํ์ง ์๊ณ ์ ์ฅํ๋ฉด, DB๊ฐ ํดํน๋นํ์ ๊ฒฝ์ฐ ํฐ ํผํด๊ฐ ๋ฐ์ํ๋ค. ์ค์ ๋ก, ๋น๋ฐ๋ฒํธ ์ํธํ๋ ์ ค ๊ธฐ์ด์ ์ธ ์์ ์์๋ ๋ถ๊ตฌํ๊ณ ํ์ง์์ ๊ฐ์ธ์ ๋ณด์ ์ถ์์ ํฐ ํผํด๋ฅผ ๋ณธ ๊ธฐ์ ๋ค์ด ๋ง์ด ์๋ค.
๊ทธ๋์, โ์ธ๊ตญ๋ฏผโ ์๋น์ค๋ Firebase๋ฅผ ์ด์ฉํ์ฌ ์ฌ์ฉ์์ ID์ ๋น๋ฐ๋ฒํธ๋ฅผ ๊ด๋ฆฌํ๋ค. Firebase๋ ๋น๋ฐ๋ฒํธ๋ฅผ ์ํธํํด์ ์์ ํ๊ฒ ์ ๋ณด๊ดํด์ฃผ๊ธฐ ๋๋ฌธ์ด๋ค.
JWT๋ฅผ ํตํ Authentication
Token์ ์๋ฒ๊ฐ ๊ฐ๊ฐ์ ํด๋ผ์ด์ธํธ๊ฐ ๋๊ตฌ์ธ์ง ๊ตฌ๋ณํ ์ ์๋๋ก ์ฌ์ฉ์์ ์ ๋ํฌํ ์ ๋ณด๋ฅผ ๋ด์ ์ํธํ๋ ๋ฐ์ดํฐ์ด๋ค. ์ฐ๋ฆฌ ์๋น์ค์ ์ฌ๋ฌ ๊ธฐ๋ฅ๋ค์ ์ธ์ฆ๋ ์ฌ์ฉ์๋ง ์ ๊ทผ ํ ์ ์๋๋ก ํ๋ ๊ฒ์ด ์ ์์ผ ๊ฒ์ด๋ค. ๋ฐ๋ผ์, ๋ก๊ทธ์ธ์ Main Business Server์์ Access ๋ฐ Refresh Token์ ๋ฐ๊ธํด์ฃผ๊ณ , ๋งค ์์ฒญ๋ง๋ค Header๋ก AccessToken์ ๋ณด๋ด์ผ ํ๋ค. ๊ทธ๋ฌ๋ฉด API Gateway์๋ฒ์์ ํด๋น ํ ํฐ์ ํ์ธํด๋ณด๊ณ , Invalidํ JWT Token์ผ ๊ฒฝ์ฐ 403 ์๋ฌ๋ฅผ ๋ณด๋ด์ค๋ค. ์ ์์ ์ธ Token์ผ ๊ฒฝ์ฐ, ํด๋น ์๋ฒ๋ก ๋ผ์ฐํ ์ ํด์ฃผ์ด ์์ฒญ์ ์ฒ๋ฆฌํ๋๋ก ๊ตฌ์ฑํ๋ค.
Token ํ์ทจ ์ํฉ ์๋ฐฉ
JWTํ ํฐ์ ํ์ทจ์ ์ํ์ฑ์ด ์๋ค. JWT๊ธฐ๋ฐ ์ธ์ฆ ๋ฐฉ์์์๋ ์ธ์ ๊ณผ ๋ค๋ฅด๊ฒ Statelessํ๋ค๋ ํน์ง์ด ์๊ธฐ ๋๋ฌธ์, Token์ด ํ์ทจ๋นํด๋ ์ฐ๋ฆฌ ์๋ฒ๊ฐ ๊ทธ๊ฑธ ์์์ฐจ๋ฆฌ๊ณ ํด๋น Token์ ์ค์ง์ํฌ ์ ์๋ ๋ฐฉ๋ฒ์ ์กด์ฌํ์ง ์๋๋ค. ๋ฐ๋ผ์, accessToken์ ์ ํจ๊ธฐ๊ฐ์ด ์งง์ ๋จ์์ ํ ํฐ์ผ๋ก ๊ตฌ์ฑํด์ผ ํ๋ค. ์ฃผ๋ก 15๋ถ ์ ๋๋ก ๊ตฌ์ฑํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง๋ค. ํ์ง๋ง, ์ด๋ ๊ฒ ์งง์ ์๊ฐ์ผ๋ก ์ค์ ํ๋ค๋ฉด, ์ฌ์ฉ์๋ ๊ณ์ํด์ ์ฌ๋ก๊ทธ์ธ์ ํด์ผ๋๋ค๋ ๋ฒ๊ฑฐ๋ก์์ด ์๋ค. ๊ทธ๋์ ๋ฑ์ฅํ ๊ฒ์ด Refresh Token์ด๋ค.
Refresh Token์ AccessToken๊ณผ ๋ค๋ฅด๊ฒ ๋งค์ฐ ๊ธด ์ ํจ๊ธฐ๊ฐ์ ๊ฐ์ง๊ณ ์๋ค. Access Token๊ณผ Refresh Token์ ์ฌ์ฉํ ๋, ํ๋ก์ฐ๋ ์๋์ ๊ฐ์ด ํ๋ฌ๊ฐ๋ค.
- ํด๋ผ์ด์ธํธ๊ฐ ํ์๊ฐ์ ํน์ ๋ก๊ทธ์ธ์ ์ฑ๊ณตํ๋ฉด ์๋ฒ๋ ์๋ต๊ฐ์ผ๋ก Access Token๊ณผ Refresh Token์ ํจ๊ป ์ ๊ณตํ๋ค.
- ํด๋ผ์ด์ธํธ๋ API๋ฅผ ํธ์ถํ ๋ Access Token ๋ด์ ๋ณด๋ด๊ณ , ์๋ฒ์์ Access Token์ ํตํด ์ ์ ๋ฅผ ์ธ์ฆํ๋ค.
- ๋ง์ฝ Access Token์ ์ ํจ ๊ธฐ๊ฐ์ด ๋ง๋ฃ๋์๋ค๋ฉด, ํด๋ผ์ด์ธํธ๋ Refresh Token์ ์๋ฒ์ ์ ๋ฌํ์ฌ ์๋ก์ด Access Token์ ๋ฐ๊ธ๋ฐ๋๋ค.
์ฆ, Access Token๊ณผ Refresh Token์ผ๋ก ๋๋๊ณ , Access Token์ ํตํด ํต์ ํจ์ผ๋ก์จ, ์ ์์ ์ด์ฉ์์ ์ํด Access Token์ด ํ์ทจ๋นํ๋๋ผ๋ ์ ํจ๊ธฐ๊ฐ์ด ์งง๊ธฐ์ ํฌ๊ฒ ๋ถ๋ด์ด ๋์ง ์๊ณ , ์ฃผ ํต์ ์ Access Token์ผ๋ก ์ด๋ฃจ์ด์ง๊ธฐ ๋๋ฌธ์ Refresh Token์ด ํ์ทจ๋นํ ๊ฐ๋ฅ์ฑ์ ํฌ๊ฒ ์ค์ผ ์ ์๋ค.
๊ทธ๋ฐ๋ฐ RefreshToken๋ ํ์ทจ๋นํ๋ฉด ์ด๋ป๊ฒํ์ง?๋ผ๋ ์๊ฐ์ด ๋ค ์ ์๋ค. ๊ทธ๋์ ๋ง์ด ์ฐ๋ ๋ฐฉ๋ฒ์ด Refresh Token Rotation(RTR) ๋ฐฉ๋ฒ์ด๋ค.
Refresh Token Ratation(RTR)์ด๋ Access Token์ด ๋ง๋ฃ๋๊ณ Refresh Token์ผ๋ก ์๋ก์ด Access Token์ ๋ฐ์์ฌ ๋, ์๋ก์ด Refresh Token๋ ๋ฐ์์ค๋๋ก ํ๋ ๋ฐฉ๋ฒ์ด๋ค. ์ฆ. Refresh Token์ด ์ฌ์ฉ๋ ๋๋ง๋ค ์๋ก์ด Access Token๊ณผ Refresh Token์ ๋ฐ๊ธํ์ฌ ์ด์ ์ ๋ฐ๊ธ๋ Token๋ค์ ์ฌ์ฉ์ด ๋ถ๊ฐ๋ฅํ๋๋ก ํ๋ค.
AccessToken Ban
๋ง์ฝ์ ์ฌ์ฉ์๊ฐ ๋ก๊ทธ์์์ ํ๋ค๊ณ ํด๋ณด์. AccessToken์ ๊ธฐ๊ฐ์ด ๋ง์ฝ์ 30๋ถ์ธ๋ฐ, 5๋ถ๋ง์ ๋ก๊ทธ์์์ ํ๋๋ฐ๋, ๊ทธ Token๊ฐ์ง๊ณ ์์ฒญ์ ๋ณด๋ผ ์๋ ์๋ค. ๋ฐ๋ผ์, ๋ก๊ทธ์์์ ํ ๊ฒฝ์ฐ, Redis์ ํด๋น AccessToken์ Ban์ ํด๋์ด์ ์์ฒญ์ ๋ณด๋ด์ง ๋ชปํ๋๋ก ์ค์ ํ๋ค.
HMAC
์ฐ๋ฆฌ ์๋น์ค์ ๋๋ถ๋ถ์ AccessToken์ ์๊ตฌํ๋๋ผ๋, ๋ก๊ทธ์ธ ๋ฐ ํ์๊ฐ์ ๊ฐ์ ๊ฒฝ์ฐ๋ Token์ด ์๋ ์ํฉ์์ ๋ฐ์ํ๋ ์์ฒญ์ด๋ค. ํ์ง๋ง, ๋๊ตฐ๊ฐ ์ฐ๋ฆฌ Endpoint๋ฅผ ์์๋ด๊ณ , Flutter ์ฑ์ด ์๋ ๋ค๋ฅธ ๊ณณ์์ ์์ฒญ์ ๋ณด๋ธ๋ค๋ฉด ์ด๋ ๋น์ ์์ ์ธ ์์ฒญ์ผ ๊ฒ์ด๋ค.
๋ฐ๋ผ์, ํ์๊ฐ์ ๋ฐ ๋ก๊ทธ์ธ ์์๋ HMAC์ ํฌํจํ์ฌ ์์ฒญ์ ๋ณด๋ด๋๋ก ๊ตฌ์ฑํ๋ค. ์ฐ๋ฆฌ Flutter ์ฑ๊ณผ ์๋ฒ ๋ชจ๋ ๊ณตํต๋ Secret๋ฅผ ๊ฐ์ง๊ณ ์์ผ๋ฉฐ, ์ด Secret์ ๊ฐ์ง๊ณ ์ฐ๋ฆฌ Request์ HMAC์ ๊ฐ์ด ๋ณด๋ด๋๋ก ๊ตฌ์ฑํ๋ค. ๊ทธ๋ฌ๋ฉด, ์ฐ๋ฆฌ ์ฑ์์ ๋ณด๋ด์ง ์์ ์์ฒญ๋ค์ ๋ชจ๋ ๋ง์ ์ ์์ ๊ฒ์ด๋ค.
ํ๊ฒฝ๋ณ์ ์ ์ฉ
JWT Secret, HMAC Secret, API Key ๋ฑ๋ฑ์ ์ฐ๋ฆฌ Code์ Hard Codingํด์๋ ์ ๋ ์๋๋ค. ๋ฐ๋ผ์, env ํ์ผ๋ก ํ๊ฒฝ๋ณ์๋ฅผ ๋ถ๋ฆฌํ์ฌ ๋ ธ์ถ๋์ง ์๋๋ก ์ค์ ํ๋ค.
ํ ์คํธ ๊ณ ๋ ค ์ฌํญ
Test Container๋ฅผ ์ด์ฉํ ๊ฐ์ ํ ์คํธ ํ๊ฒฝ ๊ตฌ์ถ
๋ํ, ์ฐ๋ฆฌ๊ฐ ์ค์ ์๋น์คํ๋ RDS๋ฅผ ๊ฐ์ง๊ณ ํ ์คํธ๋ฅผ ์งํํ๋ค๋ฉด, ๋งค์ฐ ์ํํ ๊ฒ์ด๋ค. ํ์ง๋ง, ํตํฉ ํ ์คํธ ์งํ์ ์ํด์ ๋ถ๋ช ํ DB์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ณ ํ ์คํธ ํด๋ด์ผ๋๋ ์๊ฐ์ด ์กด์ฌํ๋ค. ๋ฐ๋ผ์, ์ฐ๋ฆฌ ์๋น์ค๋ Test Container๋ฅผ ์ด์ฉํ์ฌ MySQL, Redis ํ ์คํธ ์ปจํ ์ด๋๋ฅผ ๋ง๋ ๋ค, ๋ ๋ฆฝ๋ ํ๊ฒฝ์์ ์์ ํ๊ฒ ํ ์คํธ๋ฅผ ์งํํ๋๋ก ํ์๋ค.
Apache Jmeter๋ฅผ ์ด์ฉํ ๋ถํ ํ ์คํธ
ํ๋ก์ ํธ์์ ๋์์ฑ ๋ฌธ์ ํ ์คํธ์ ๊ฐ์ด ๋๊ท๋ชจ ๋ถํ ํ ์คํธ๋ฅผ ์ํด์ ์ฌ์ฉํ๊ฒ ๋์๋ค. ์ด๋ฅผ ์ด์ฉํ์ฌ, ์ฝ๊ฒ ๋๊ท๋ชจ ํธ๋ํฝ์ ์์ฑํ์ฌ ์์ฒญ์ ๋ณด๋ด๋ณผ ์ ์์ผ๋ฉฐ, ์ธ๋ถ ํ๋ฌ๊ทธ์ธ์ ์ด์ฉํ์ฌ ์ฝ๊ฒ TPS๋ฅผ ์ธก์ ํ ์๋ ์์๋ค.
์ค์ ๋ก ๊ณต์ง์ฌํญ ๋ฆฌ์คํธ๋ฅผ ๋ฐ์์ค๋ API์ ๋ํ์ฌ RPS๋ฅผ ์ธก์ ํด๋ณด๋ 2000 RPS ์ ๋๊น์ง๋ ๋ฌด๋ฆฌ ์์ด ์ ์ฒ๋ฆฌํ๋ค. ์ด ์ด์์ผ๋ก๋ ๋ถํ ํ ์คํธ๋ฅผ ์งํํด๋ณด์ง ์์์ง๋ง, ๋ ๊ฐ๋ฅํ ๊ฒ์ผ๋ก ๋ณด์ธ๋ค.
์ํคํ ์ฒ ์ค๊ณ
๊ธฐ์กด ์ํคํ ์ฒ๋ ์์ ๊ฐ์ด ๊ตฌ์ฑํ๋ค. ํ์ง๋ง, ์์ ์ํคํ ์ฒ๋ ์ฌ๋ฌ๊ฐ์ง ๋ฌธ์ ์ ์ด ์์๋ค. ์ฐ์ , ์ฐ๋ฆฌ ๋ฉ์ธ Spring ๋น์ฆ๋์ค ์๋ฒ๋ ๋ค๋ฅธ๊ฑฐ ์ฒ๋ฆฌํ๊ธฐ๋ ๋ฐ์๋ค. ๊ฒ๋ค๊ฐ, ์ฑํ ์ Long Polling์ผ๋ก ๊ฐ๋ฐํ์๋๋ฐ, ์ฌ๋ฌ ์ฌ์ฉ์๊ฐ ๋์ ๋ค๋ฐ์ ์ผ๋ก ์์ฒญ์ ๋ณด๋ธ๋ค? ๊ทธ๋ผ ๋ฉ์ธ ๋น์ฆ๋์ค ์๋ฒ์ ์ฑ๋ฅ์ ๋งค์ฐ ๋จ์ด์ง ๊ฒ์ด๋ฉฐ, ์๋ต์๊ฐ์ ๊ธธ์ด์ง ๊ฒ์ด๋ค. ๊ฒฐ๊ตญ Software Quality๊ฐ ๋จ์ด์ง ๊ฒ์ด๋ค. ๋ฐ๋ผ์ ์ฑํ ์๋ฒ๋ฅผ ๋ถ๋ฆฌํ ํ์๊ฐ ์๋ค.
๋ฟ๋ง ์๋๋ผ, api ์์ฒญ์ ๋ณด๋ผ๋ https๊ฐ ์๋ http๋ก ๋ณด๋ด๊ธฐ ๋๋ฌธ์ ๋ฐ์ดํฐ์ Integrity๋ฅผ ๋ณด์ฅํ ์ ์๋ค. ๊ทธ๋์ ์์ฒญ์ https๋ก ์ํธํํด์ ๋ณด๋ผ ํ์๊ฐ ์๋ค.
๋ง์ง๋ง์ผ๋ก, ์ฑ๋ด, ๋ฉ์ธ ๋น์ฆ๋์ค ์๋ฒ, ์ฑํ ์๋ฒ ๋ชจ๋ JWT Token์ ํ์ธํ๋ ๊ณผ์ ์ด ํ์ํ๋ค. ํ์ง๋ง, ์์ ๊ฐ์ด ๋์์ธํ๋ฉด, ๊ฐ๊ฐ ์๋ฒ์์ JWT Token์ ํ์ธํ๋ ๋ก์ง์ ์ง์ผ๋๋ฏ๋ก ๋นํจ์จ์ ์ด๋ค. ๋ํ, API ์ฌ์ฉ๋ ์ ํ์ ๊ฑธ๊ธฐ ์ํด์ ๊ฐ๊ฐ API Rate Limiter๋ฅผ ๊ตฌํํด์ผํ๋ค. ๋ฐ๋ผ์, API Gateway๋ฅผ ๊ตฌ์ถํด ์ด๋ฅผ ์ฒ๋ฆฌํ๋ ๊ฒ์ด ์ข๋ค.
๊ทธ๋์ ์์ ๊ฐ์ ์ํคํ ์ฒ๋ก ๋ณ๊ฒฝํ๋ค.
์ฐ์ , ์ฑํ ์๋ฒ ๋ถ๋ฆฌ๋ฅผ ์งํํ์๋ค. ์ฑํ ์๋ฒ๋ Ruby On Rails๋ก ๊ฐ๋ฐํ์๋ค. ๊ทธ ์ด์ ๋ ์ฌ๋ฌ๊ฐ์ง์ด๋ค. ์ฒซ๋ฒ์งธ, Ruby๋ผ๋ ์ธ์ด๋ ๋งค์ฐ ์ฝ๋ค. ํ์ด์ฌ์ฒ๋ผ ํ๋ก๊ทธ๋๋ฐ ํด๋ณด์ง ์์ ์ฌ๋๋ค์๊ฒ ์ ๋ฌธ์ฉ์ผ๋ก ์ถ์ฒ์ด ๊ฐ๋ฅํ ์ ๋๋ก ๊ต์ฅํ ๊ฐ๋จํ๋ค. ๊ฒ๋ค๊ฐ ํ์๋ ์ด๋ฆด ๋ RPG VX ACE๋ผ๋ ๊ฒ์ ๋ง๋ค๊ธฐ ํด์์, ์คํฌ๋ฆฝํธ ์ธ์ด๋ก Ruby๋ฅผ ์ฌ์ฉํ๋ฉด์ ์ด๋์ ๋ ์กฐ๊ธ์ ์๋ ์ํ์๋ค. ๋๋ฒ์งธ, ํ ์คํธ ์ฝ๋๊ฐ ์์ฑํ๊ธฐ๊ฐ ๋งค์ฐ๋งค์ฐ ์ฝ๋ค. Spring์ Test Code๋ฅผ ์์ฑํ๋ ค๋ฉด ๊ต์ฅํ ์ฌ๋ฌ๊ณผ์ ์ ๊ฑฐ์ณ์ผํ๋ฉฐ ๋ณต์กํ๋ค. ๋ฐ๋ฉด์ Ruby On Rails์ ๊ต์ฅํ ๊ฐ๋จํ๊ฒ ๊ตฌ์ฑ๋์๋ค. ์ธ๋ฒ์งธ, Ruby On Rails๋ ๋น ๋ฅธ ๊ฐ๋ฐ์ ์งํฅํ๋ค. COC์์น์ ์ค์์ํด์, ์ค์ ์ด ๊ฑฐ์ ์๋ค. Spring์ผ๋ก ์๋ฒ ํ๋ ๋ง๋ค๋ ค๋ฉด ํ๋๋ถํฐ ์ด๊น์ง ์ค์ ํ ๊ฒ ๋ง์์ ๋งค์ฐ ๋ณต์กํ๋ค. ํ๋ก์ ํธ ๋ง๊ฐ ๊ธฐํ์ด ์ผ๋ง ์๋จ์ ์ง๊ธ, Ruby On Rails ๋๋ Express๋งํผ ์ข์๊ฒ ์๋ค๊ณ ์๊ฐํ๋ค. ํนํ, ์ธ์ด์ ํน์ฑ์ด ์ ์์ผ์ ์ด์ ์ด ๋ง์ถฐ์ ธ ์๊ธฐ ๋๋ฌธ์ ์์ฐ์ฑ์ด ๋๋ค. ์ด๋ฌํ ์ด์ ๋ก ์ฑํ ์๋ฒ ๊ฐ๋ฐ์ Ruby On Rails๋ฅผ ์ฑํํ๋ค.
๋๋ฒ์งธ, ์๋์ผ๋ก CI/CD๊ฐ ๋ ์ ์๋๋ก ๋ฉ์ธ ๋น์ฆ๋์ค ์๋ฒ, ์ฑํ ์๋ฒ, AI ์๋ฒ์ Git Actions๋ฅผ ์ ์ฉํ๋ค. ์ด๋ก์จ, ๊ตณ์ด ์ฐ๋ฆฌ EC2์ ์ ์ํ ํ์ ์์ด ์๋์ผ๋ก ํ ์คํธ ๋ฐ ๋ฐฐํฌ๊ฐ ์งํ๋ ์ ์๊ฒ ๋์๋ค.
์ธ๋ฒ์งธ, Route53์ ์ด์ฉํด ๋๋ฉ์ธ์ ์ ์ฉํ๋ค. ๊ฐ๋น์ ๋๋ฉ์ธ์์ capstone30.shop์ด๋ผ๋ ๋๋ฉ์ธ์ ๊ตฌ๋งคํ๋ค. ์ฐ๋ฆฌ ํ์ API ๋ฌธ์๋ฅผ Swagger๋ฅผ ์ด์ฉํด์ ๊ณต์ ํ๋๋ฐ, ์ ๊ทผํ๊ธฐ ์ํด์ ์ฐ๋ฆฌ ์๋ฒ ๋๋ฉ์ธ์ ์ณ์ผํ๋ค. ํ์ง๋ง, ๊ธฐ์กด AWS EC2 ๊ธฐ๋ณธ ๋๋ฉ์ธ์ ๊ธฐ์ตํ๊ธฐ๊ฐ ๋ถ๊ฐ๋ฅํด์, ์ธ์ฐ๊ธฐ ์ฌ์ด ๋๋ฉ์ธ์ผ๋ก ๋ณ๊ฒฝํ์๋ค. ๋ํ, Https๋ฅผ ์ ์ฉํ๊ธฐ ์ํด DV SSL ์ธ์ฆ์๋ฅผ ๋ฐ๊ธ ๋ฐ์์ด์ผ ํ๋๋ฐ, AWS EC2 ๊ธฐ๋ณธ ๋๋ฉ์ธ์ผ๋ก๋ ์ธ์ฆ์ ๋ฐ๊ธ์ด ๋ถ๊ฐ๋ฅํ๋ค. ๊ทธ๋์ ๋ฐ๋ก ๋๋ฉ์ธ์ ๊ตฌ๋งคํด์ ์ ์ฉํ๋ค.
๋ค๋ฒ์งธ, Nginx์ Certbot์ ์ด์ฉํ์ฌ Https๋ฅผ ์ ์ฉํ๋ค. ์ด๋ฅผ ์ด์ฉํ์ฌ Letโs Encrypt๋ผ๋ ๋ฌด๋ฃ๋ก DV ์ธ์ฆ์๋ฅผ ๋ฐ๊ธ๋ฐ์ ์ ์๋ CA๋ก๋ถํฐ SSL์ธ์ฆ์๋ฅผ ๋ฐ๊ธ๋ฐ์ Https๋ฅผ ์ ์ฉํ๋ค. ์ด๋ก์จ, ๋ฐ์ดํฐ์ Integrity๋ฅผ ๋ณด์ฅํ ์ ์๋ค. ์ด๋, Letโs Encrypt ์ธ์ฆ์๋ 90์ผ๋ง๋ค ์๋ก ๋ฐ๊ธ ๋ฐ์์ผํ๋๋ฐ, Docker Compose์ ์ฃผ๊ธฐ์ ์ผ๋ก ์ธ์ฆ์๋ฅผ ๊ฐฑ์ ํ๋ command๋ฅผ ์ถ๊ฐํจ์ผ๋ก์จ ์ด ๊ณผ์ ์ด ์๋์ผ๋ก ์คํ๋ ์ ์๋๋ก ๊ตฌ์ฑํ๋ค. ๋ํ, Spring Cloud Gateway ์๋จ์, Nginx๊ฐ ๋จผ์ ์์ฒญ์ ๊ฐ๋ก์ฑ https์ ๋ด๋ถ์ ์ผ๋ก http๋ก ์ ๋ฌํจ์ผ๋ก์จ, ๋ก์ปฌ ์๋ฒ ๋ด์์๋ ์ํธํํ๋๋ฐ ๋ฆฌ์์ค๋ฅผ ์ค์ผ ์ ์๊ฒ ๋์๋ค.
๋ค์ฏ๋ฒ์งธ, Spring ๋ฉ์ธ ๋น์ฆ๋์ค ์๋ฒ, Ruby ์ฑํ ์๋ฒ, AI ์๋ฒ ์๋จ์์ JWT ํ ํฐ Authentication์ ์ฒ๋ฆฌํ๊ณ , ์์ฒญ์ ์ ๋ฌํ๋ Gateway๋ฅผ ๋ง๋ค์๋ค. ์ด๋ก์จ, ๊ฐ๊ฐ ์๋ฒ์์ ํ ํฐ ํ์ธ ๋ก์ง์ ๋ง๋ค ํ์ ์์ด ๊ฒ์ดํธ์จ์ด์์ ์ผ๊ด์ ์ผ๋ก ์ฒ๋ฆฌํ ์ ์๊ฒ ๋์๋ค. ๋ํ, Gateway์์ Redis๋ฅผ ์ด์ฉํ์ฌ Token Bucket Algorithm์ ๊ตฌํํ์ฌ API Rate Limiter๋ ์ ์ฉํ ์ ์๊ฒ ๋์๋ค. ์ด๋ก์จ, ๋ฌด๋ถ๋ณํ๊ฒ ํ๋ฒ์ ๋ง์ ์์ฒญ์ ์ฐ๋ฆฌ ์๋ฒ์ ๋ณด๋ด๋ ๊ฒ์ ๋ง์ ์ ์๊ฒ ๋์๋ค.
๋ง์ง๋ง์ผ๋ก, Spring ๋ฉ์ธ ๋น์ฆ๋์ค ์๋ฒ์ Redis๋ฅผ ์ ์ฉํ์๋ค. ์ด๋ Redis๋ฅผ ์ด์ฉํ์ฌ Refresh Token์ ์ ์ฅํ๊ณ , ๋ก๊ทธ์์์ Access Token์ Banํ ์ ์๋ ๊ธฐ๋ฅ์ ๊ตฌํํ ์ ์๊ฒ ๋์๋ค. ๋ํ, ๊ธ์ ์ถ์ฒ์๋ ์กฐํ์ ๋ฑ์์ Race Condition์ ์๋ฐฉํ๋ ์ฉ๋๋ก๋ ์ฌ์ฉํ์๋ค. ์๋ ๊ณง๋ฐ๋ก ์ฐ๋ฆฌ RDB์ ์ ์ฅํ๋ฉด ๋์์ ๋ง์ ์ฌ์ฉ์ ์์ฒญ์ด ๋ค์ด์์ ๋ Race Condition์ด ๋ฐ์ํ ๊ฐ๋ฅ์ฑ์ด ๋งค์ฐ ๋์๋ค. ํ์ง๋ง, Redis๋ ์ฑ๊ธ์ค๋ ๋์ด๊ธฐ ๋๋ฌธ์, Redis์ ์์๋ก ์กฐํ์๋ฅผ ์ ์ฅํ๊ณ , ์ฃผ๊ธฐ์ ์ผ๋ก Scheduler๋ฅผ ์ด์ฉํด ์ง์ง ์ฐ๋ฆฌ ์๋น์ค RDB์ ๋ฐ์ํ๋๋ก ๊ตฌ์ฑํ๋ค. ๋ฟ๋ง ์๋๋ผ, Redis๋ฅผ ์ด์ฉํด Cache๋ฅผ ๊ตฌํํ ์ ์๊ฒ ๋์๋ค. ๋งค๋ฒ ๋๊ฐ์ ์ ๋ณด๋ฅผ RDB์ ์ ๊ทผํ์ฌ ๋ฐ์์ค๋ ๊ฒ์ ์ค๋ฒํค๋๊ฐ ํฌ๋ฏ๋ก Redis์ Caching์ ํจ์ผ๋ก์จ Response Time์ ์ค์ผ ์ ์์๋ค.
ํ์ค์ ์ ํ ๋ฐ ๊ฐ์ ํ์ ์ฌํญ
Admin ํ์ด์ง์ ๋ถ์ฌ
ํ์ฌ admin์ด ๊ธ์ ๊ด๋ฆฌํ๊ณ , ์ ์ ๋ฅผ ๊ด๋ฆฌํ๊ณ , ์ ๊ณ ๋ฐ์ ๊ฒ์ ๊ด๋ฆฌํ ์ ์๋ ๊ธฐ๋ฅ์ด ์๋ค. ๋ฐ๋ผ์, ์์ผ๋ก ์์ดํฐ ์ถ์๋ฅผ ์ํด์๋ผ๋ admin ํ์ด์ง๋ ํ์์ด๋ค. ํ์ฌ๋ ์๊ฐ ๋ถ์กฑ์ผ๋ก ๋ง๋ค์ง ์์ ์ํ์ด๋, ์ถํ ์ ์ํ ์์ ์ด๋ค.
์ ํ์คํ ์ด ์ถ์
ํ์ฌ ์ธ๊ตญ๋ฏผ์ ํ๋ ์ด์คํ ์ด์๋ง ์ถ์๋ ์ํ์ด๋ค. ์ ํ์คํ ์ด์ ์ถ์ํ๊ธฐ ์ํด์๋ ์ฑํ ์ํธํ ์์ ๋ฐ ์ ๊ณ ํ๊ธฐ ๊ธฐ๋ฅ์ ์ถ๊ฐํด์ผ๋๋ค. admin ํ์ด์ง ์์ ๊ณผ ํจ๊ป ์ด ์์ ์ ์งํํ ์์ ์ด๋ค. ๋ฟ๋ง ์๋๋ผ ๋ฒ์ญ API๋ DeepL์์ ํํ๊ณ ๋ก ๋ณ๊ฒฝํ์ฌ ๋ฒ์ญ์ ํ์ง๋ ์ฌ๋ฆด ํ์๊ฐ ์๋ค.
๊ฒ์ ๊ธฐ๋ฅ ๊ฐ์
ํ์ฌ ๊ฒ์๋ฌผ ๋ฐ ๊ณต์ง์ฌํญ ๊ฒ์์ ์ ๋ชฉ์ผ๋ก๋ง ๊ฒ์๋๋ค. ํ์ง๋ง, ์ด๋ณด๋ค ์ ๋ชฉ + ๋ด์ฉ์ผ๋ก ๊ฒ์์ด ๊ฐ๋ฅํ ๊ฒ์ด ๋ ์ข์ ๊ฒ์ด๋ค. ์ด๋ฅผ ์ํด์ SQL Like ์ฐ์ฐ์๋ก ๋ด์ฉ๊น์ง ๊ฒ์์ด ๊ฐ๋ฅํ๊ธด ํ๋, Like ์ฐ์ฐ์๋ ์ ํ ์ฐ์ฐ์์ด๊ธฐ ๋๋ฌธ์ ์ฑ๋ฅ์ ๋งค์ฐ ์น๋ช ์ ์ด๋ค. ๋ฐ๋ผ์, ElasticSearch๋ฅผ ์ด์ฉํด์ ๋น ๋ฅด๊ฒ ๊ฒ์ํ๋ ๊ฒ์ด ๋ ์ข์ ๊ฒ์ด๋ค. ElasticSearch๋ ๋ถ์ฐ ๊ฒ์ ๋ฐ ๋ถ์ ์์ง์ผ๋ก, ๋๊ท๋ชจ ๋ฐ์ดํฐ์์ ๋น ๋ฅธ ์ ์ฒด ํ ์คํธ ๊ฒ์์ ์ง์ํ๋ค. ์ถํ, ElasticSearch๋ฅผ ํตํด ์ฐ๋ฆฌ RDB์ ์ ์ฅ๋ ๊ธ๋ค์ ์ญ์์ธํ์ฌ ๊ฑฐ์ ์ค์๊ฐ์ ๊ฐ๊น๊ฒ ๊ฒ์ํ๋๋ก ๊ฐ์ ํ ๊ฒ์ด๋ค.
ํ ์คํธ ์งํ ๊ฐํ
ํ์ฌ ์๊ฐ ๋ถ์กฑ์ผ๋ก ํ ์คํธ ์ฝ๋๋ ์ผ๋ถ ์๋๋ฆฌ์ค์ ๋ํด์๋ง ํตํฉ ํ ์คํธ๊ฐ ์งํ๋๊ณ ์๋ค. ํ์ง๋ง, ํตํฉ ํ ์คํธ ๋ฟ๋ง ์๋๋ผ ๊ฐ๊ฐ Domain์ ๋ํ์ฌ ๋จ์ ํ ์คํธ๊ฐ ์งํ๋ ํ์์ฑ์ด ์๋ค. ๋ฐ๋ผ์, ๋์ฑ ์ด์์ ์ธ CI/CD ํ์ดํ๋ผ์ธ์ด ์งํ๋๊ธฐ ์ํด์ ํ ์คํธ ์ฝ๋๋ฅผ ๊ฐํํ ํ์๊ฐ ์๋ค.
๋ํ, ํ์ฌ๋ ์ฐ๋ฆฌ ํ ์คํธ ์ฝ๋์ Code Coverage๋ฅผ ์๊ฐ์ ์ผ๋ก ์ธก์ ํ ์ ์๋ ๋ฐฉ๋ฒ์ด ์๋ค. ๊ทธ๋์, ์ฐ๋ฆฌ๊ฐ ๋ฏธ์ณ ์๊ฐํ์ง ๋ชปํ ์๋๋ฆฌ์ค๋ Domain์ ๋ํ์ฌ ๋๋ฝ๋ ๊ฐ๋ฅ์ฑ๋ ์๋ค. ๊ทธ๋์ ์ถํ ์ ์ฌ์ง๊ณผ ๊ฐ์ด Jacoco๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ด์ฉํ์ฌ ์ฐ๋ฆฌ ํ ์คํธ ์ฝ๋์ Code Coverage๋ฅผ ์ธก์ ํ๊ณ , html๋ก ๋ฆฌํฌํธ๋ฅผ ์์ฑํ์ฌ ํ์๋ค์ด ์ฝ๊ฒ ๋ณผ ์ ์๋๋ก ์ถ์ถํ ๊ฒ์ด๋ค.
์ธ์คํด์ค ์ฑ๋ฅ์ ํ๊ณ
ํ์ฌ ์ฐ๋ฆฌ์๋ฒ๋ Free Tier๋ฅผ ์ฌ์ฉํ์ฌ ๊ฒฌ๋ ์ ์๋ ํธ๋ํฝ์ ํ๊ณ๊ฐ ์๋ ์ํฉ์ด๋ค. ์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด์ ์์ง์ ํ์ฅ ๋๋ ์ํ์ ํ์ฅ์ ๊ณ ๋ คํ ์ ์๋ค. ํ์ฌ Free Tier ์ฑ๋ฅ์ด ์๋ ๋ ์ข์ EC2 ์ธ์คํด์ค๋ฅผ ์ฌ์ฉํ๊ฑฐ๋, ์ฌ๋ฌ๊ฐ์ EC2๋ฅผ ๋ง๋ค์ด Load Balancing์ ์ ์ฉํ์ฌ Scale Out์ ์ธ ํ์ฅ์ ํ ์๋ ์๋ค. ํ์ง๋ง, ํ์ฌ๋ ๋น์ฉ์ ์ธ ๋ฌธ์ ๋ก ๋ถ๊ฐ๋ฅํ ์ํฉ์ด๋ค.
๋ฌด์ค๋จ ๋ฐฐํฌ
ํ์ฌ ์ฐ๋ฆฌ ์๋น์ค๋ Git Actions๋ฅผ ์ด์ฉํ CI/CD๋ฅผ ์ ์ฉํ๊ณ ์๋ค. ํ์ง๋ง, ํ์ฌ ๋ฐฉ์์ ์ ๋ฒ์ ์ผ๋ก ์๋ฒ๊ฐ ๋ฐฐํฌ๋ ๋ ๋ฐ๋์ 1~2๋ถ์ ๋ ์๋ฒ๊ฐ ์ค๋จ๋ ์ ๋ฐ์ ์๋ค. ์ด๋, ์ค์ ์๋น์คํ ๋ ๋งค์ฐ ์น๋ช ์ ์ด๋ค. ๋ฐ๋ผ์, ๋ฌด์ค๋จ ๋ฐฐํฌ๊ฐ ๋ฐ๋์ ํ์ํ๋ค.
๋ฌด์ค๋จ ๋ฐฐํฌ ๋ฐฉ์์ผ๋ก๋ Rolling, Canary, Blue-Green ๋ฐฐํฌ ๋ฐฉ์ ๋ฑ ์ฌ๋ฌ๊ฐ์ง ๋ฐฉ๋ฒ์ด ์์ง๋ง, ๋ง์ฝ ์ฐ๋ฆฌ๊ฐ ๋ฌด์ค๋จ ๋ฐฐํฌ๋ฅผ ๊ตฌ์ถํ๋ค๋ฉด Blue-Green ๋ฐฐํฌ ๋ฐฉ์์ ์ ์ฉํ ๊ฒ์ด๋ค. Blue-Green์ด๋ ๋ ๊ฐ์ ๋์ผํ ํ๊ฒฝ์ธ โ๋ธ๋ฃจโ์ โ๊ทธ๋ฆฐโ์ ์ฌ์ฉํ์ฌ ์๋ก์ด ๋ฒ์ ์ ์ํํธ์จ์ด๋ฅผ ๋ฐฐํฌํ๊ณ ๋กค๋ฐฑํ๋ ๋ฐฉ์์ด๋ค. ๋ธ๋ฃจ ๊ทธ๋ฆฐ ๋ฐฐํฌ ๋ฐฉ์์ ๊ฐ์ฅ ๋ง์ด ์ฐ์ด๋ ๋ฌด์ค๋จ ๋ฐฐํฌ ๋ฐฉ์์ด๋ฉฐ, ์นด๋๋ฆฌ์ ๋นํด์ ๊ตฌํ๋ ๊ฐ๋จํ๊ณ , Rolling ๋ฐฉ์๋ณด๋ค ํจ์ฌ ์์ ์ ์ด๋ค. ๋ฐ๋ผ์, ์ถํ Blue-Green ๋ฌด์ค๋จ ๋ฐฐํฌ ํ๊ฒฝ์ ๊ตฌ์ถํ ๊ณํ์ด๋ค.
๋ก๋ ๋ฐธ๋ฐ์ฑ
์๋ฒ๋ฅผ ๋จ์ผ๋ก ๊ตฌ์ฑํ๋ฉด, ๋ง์ ํธ๋ํฝ์ด ๋ชฐ๋ ธ์ ๋ ๊ฐ๋นํ๊ธฐ ํ๋ค ๊ฒ์ด๋ค. ๋ฐ๋ผ์, ์๋ฒ๋ฅผ ์ฌ๋ฌ๊ฐ ๋ง๋ค๊ณ , Load Balacningํ๋๊ฒ ์ข์ ์ ํ์ง์ผ ๊ฒ์ด๋ค. ํ์ง๋ง, ๋ก๋ ๋ฐธ๋ฐ์ฑ์ ํ๊ธฐ์ ๋น์ฉ์ ์ธ ๋ฌธ์ ๋๋ฌธ์ ํ๊ฒฝ ๊ตฌ์ถ์ด ์ด๋ ต๋ค. ์๋ํ๋ฉด, ์ฌ๋ฌ๊ฐ์ EC2๋ฅผ ๋์์ผ๋๊ธฐ ๋๋ฌธ์ด๋ค. ๊ทธ๋์, ์ด์ฉ ์ ์์ด ๋จ์ผ ์๋ฒ๋ก ์ด์ํ๊ฒ ๋์์ง๋ง, ์ถํ ์ฌ์ฉ์๊ฐ ๋์ด๋๋ฉด ๋ก๋ ๋ฐธ๋ฐ์ฑ์ ์ ์ฉํ ๊ณํ์ด๋ค.
๋ชจ๋ํฐ๋ง ๋ฐ ๋ก๊น ๊ฐํ
์ฐ๋ฆฌ ์๋น์ค์ ์ ๋ฐ์ ์ธ ๋ก๊น ์ ํ๋ ๊ฒ๋ ์ค์ํ๋ค. ํ์ฌ ๋ก๊น ์ Nginx ๋จ์์ ํ์ผ ์ ์ฅ์ผ๋ก ํ๋ฒ, API Gateway๋จ์์ ์์ฒญ url, body, Authorization์ผ๋ก ํ๋ฒ, ๊ฐ MSA ์๋ฒ ๋จ์์ ํ๋ฒ ์ด๋ฃจ์ด์ง๋ค. ํ์ง๋ง, ์ ํ๋ฆฌ์ผ์ด์ ๋จ์์์ ๋ก๊ทธ๋ ํ์ผ๋ก ์ ์ฅํ๊ณ ์์ง ์์ ์ฐ๋ฆฌ๊ฐ ์ง์ ์ปจํ ์ด๋์ ์ ๊ทผํด์ ํ๋ํ๋ ์ฐพ์๋ด์ผํ๋ค. ๋ํ, MSA ๊ตฌ์กฐ๋ค ๋ณด๋๊น, ๊ฐ๊ฐ ์ปจํ ์ด๋์ ์ง์ ์ ๊ทผํด์ ๋ด์ผํ๋ค๋ ๋ฌธ์ ์ ์ด ์๋ค. ํ์ง๋ง, ์ด๋ฐ์์ผ๋ก ์งํํ๋ฉด ์ ํ๋ฆฌ์ผ์ด์ ๋ก๊ทธ๋ฅผ ๊ฒ์ํ๊ณ ํ์ ํ๋๋ฐ ์๊ฐ์ ๋ ์จ์ ์๋น์ค์ ๋งค์ฐ ์น๋ช ์ ์ด๋ค. ๋ฐ๋ผ์, Kafka + ELK Stack์ ํตํ์ฌ ๋น๋๊ธฐ์ ์ผ๋ก ๋ก๊ทธ ๋ฐ์ดํฐ๋ฅผ ELK Stack์ผ๋ก ์ ์กํ๊ณ , ์ด๋ฅผ ๋ถ์ํ ํ, ๋์๋ณด๋ ํํ์ ์๊ฐ์ ์ธ ๋ฐ์ดํฐ๋ก ๋ฐ๊ฟ์ฃผ๋ ์์คํ ์ด ๊ตฌ์ถ๋์ด์ผ ํ ๊ฒ์ด๋ค.
๋ํ, ์๋น์ค๋ฅผ ์ด์ํ ๋ ๋ชจ๋ํฐ๋ง ๋ฐ ์ฑ๋ฅ ๊ด๋ฆฌ๋ ๋งค์ฐ ์ค์ํ๋ค. ์ฐ๋ฆฌ๊ฐ 24์๊ฐ 365์ผ ์ปดํจํฐ ์์ ์์ฃผํ์ฌ ์๋ฒ ๋ชจ๋ํฐ๋ง์ ํ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค. ๋ฐ๋ผ์, Prometheus + Grafana๋ Datadog ๋ฑ์ ์ด์ฉํ์ฌ ์ฐ๋ฆฌ ์๋น์ค๋ฅผ ๋ชจ๋ํฐ๋ง ํ๋ ํ๊ฒฝ์ ํ์์ ์ด๋ค. ์ด๋ฐ ํ๊ฒฝ์ ๊ตฌ์ถํด๋๋ฉด ์๋ฒ์ CPU๋ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ด ๊ธ์ฆ ํ์ ๋, ์ฐ๋ฆฌ ํ Slack์ผ๋ก ๊ฒฐ๊ณผ๋ฅผ ์ ์กํ๊ณ ๋์๋ณด๋๋ก ํํฉ์ ์ฝ๊ฒ ํํฉ์ ํ์ ํ ์ ์์ ๊ฒ์ด๋ค.
์ปจํ ์ด๋ ์ค์ผ์คํธ๋ผ์ ์ด์
ํ์ฌ ์ฐ๋ฆฌ ์๋น์ค๋ MSA ๊ตฌ์กฐ์ ๊ฐ๊น์ด ํํ์ฌ์ ์๋ง์ Container๋ค์ด ๋์๊ฐ๊ณ ์๋ค. ๋์๊ฐ๋ Container๋ง ์ธ๋ณด๋๋ผ๋, Redis, Spring, Spring Cloud Gateway, Ruby On Rails, Nginx, Certbot, FastAPI ๋ฒ์จ 7๊ฐ์ง๊ฐ ์๋ค. ๊ทธ๋ฐ๋ฐ ์ฌ๊ธฐ์ ์์ ์ธ๊ธํ Kafka, Grafana, Prometheus, DB Replication, ELK Stack ๋ฑ ๊น์ง ์ ์ฉํ๋ฉด ์๋ง์ ์ปจํ ์ด๋๊ฐ ๋์๊ฐ ๊ฒ์ด๋ค. ๊ฑฐ๊ธฐ์ ๋ก๋ ๋ฐธ๋ฆฐ์ฑ๊น์ง ์ ์ฉํ๋ค๋ฉด ์ฐ๋ฆฌ๊ฐ ์ด ์ปจํ ์ด๋๋ค์ ํ๋ฒ์ ๊ด๋ฆฌํ๋ ๊ฒ์ ๋ฌด๋ฆฌ์ผ ๊ฒ์ด๋ค. ๊ทธ๋์, EKS, Docker Swarm, Kubernetes๊ฐ์ ์๋์ผ๋ก ์ปจํ ์ด๋ ์ฅ์ ๋ณต๊ตฌ๋ฅผ ๋์์ฃผ๋ ์ปจํ ์ด๋ ์ค์ผ์คํธ๋ผ์ ์ด์ ์ด ํ์ํ๋ค.