๋จ์ถ URL ์์ฑ ๋ฐ ๋ฆฌ๋ค์ด๋ ์ ์๋น์ค์ ๋๋ค.
- ์ฌ์ฉ ๊ธฐ์
- ์ฃผ์ ๊ธฐ๋ฅ
- ์ํคํ ์ฒ
- ์์ฒญ ํ๋ฆ
- ์คํ,๋ฐฐํฌ ๋ฐฉ๋ฒ
- tl;pr(Too Long;Please Read)
| ํญ๋ชฉ | ๋น๊ณ |
|---|---|
| ์ธ์คํด์ค | |
| CPU | 1/8 OCPU (8์ธ์คํด์ค๊ฐ ๊ณต์ ํ๋ 1์ฝ์ด) |
| RAM | 1GB |
| Swap | 2GiB |
-
๋จ์ถ URL ์์ฑ: URL์ ์ ๋ ฅํ๋ฉด ๊ฐ์ ๋ชฉ์ ์ง๋ฅผ ํฅํ๋ ์งง์ URL์ ๋ง๋ค์ด์ค๋๋ค. ๊ฐ์ URL์ ๋ํด ์ฌ๋ฌ ๋จ์ถ URL์ ์์ฑํ ์ ์์ต๋๋ค.
-
URL ๋ฆฌ๋ค์ด๋ ์ : ๋จ์ถ URL๋ก ๋ค์ด์ค๋ GET ์์ฒญ์ ์๋ณธ URL๋ก ๋ฆฌ๋ค์ด๋ ํธํฉ๋๋ค.
-
๋จ์ถ URL ๋ชจ์๋ณด๊ธฐ: Google/Naver OAuth2๋ฅผ ํตํด ํ์์ผ๋ก ๋ก๊ทธ์ธํ๋ฉด ์์ฑํ๋ ๋จ์ถ URL์ ๋ชจ์๋ณผ ์ ์์ต๋๋ค.
- ๋ฆฌ๋ฒ์ค ํ๋ก์ ์๋ฒ: ๋ธ๋ผ์ฐ์ ์ HTTPS ์์ฒญ์ ๋ณตํธํํ์ฌ ๊ฒ์ดํธ์จ์ด ์๋ฒ๋ก ํ๋ก์ํฉ๋๋ค. ์์ค๋ ๋ณ๋์ reposiory ์ ์์ต๋๋ค.
- ๊ฒ์ดํธ์จ์ด ์๋ฒ: ์์ฒญ ๊ฒฝ๋ก์ ๋ฐ๋ผ ์์ฒญ์ ๋ด๋ถ ์๋ฒ๋ก ํ๋ก์ํฉ๋๋ค.
- ํ๋ก ํธ์๋ ์๋ฒ: React๋ก ๊ตฌ์ฑ๋ ๋ธ๋ผ์ฐ์ ์๊ฒ ์ ์ ํ์ผ์ ์ ๊ณตํฉ๋๋ค.
- ๋ฐฑ์๋ ์๋ฒ: ๊ฒ์ดํธ์จ์ด ์๋ฒ๋ก๋ถํฐ ์์ฒญ์ ํ๋ก์๋ฐ๊ณ ์ด๋ฅผ ์ฒ๋ฆฌํฉ๋๋ค.
- ๋ธ๋ผ์ฐ์ ๋ ๊ฒ์ดํธ์จ์ด๋ฅผ ํตํด ํ๋ก ํธ์๋์ ์์ฒญํ์ฌ ์๋ต์ ๋ฐ๊ณ ํ๋ฉด์ ๋ ๋๋งํฉ๋๋ค.
- ๋ธ๋ผ์ฐ์ ๋ ์ฌ์ฉ์ ์
๋ ฅ๊ฐ์ ๋ฐ์
{frontendUrl}/api๋กPOST /api/shorten์์ฒญ์ ๋ณด๋ด๊ณ , ์ด๋ ๊ฒ์ดํธ์จ์ด์ ์ํด ๋ฐฑ์๋๋ก ํ๋ก์๋ฉ๋๋ค. - ๋ฐฑ์๋๋ ์์ฒญ์ ์ ๋ฌ๋ฐ๊ณ ๋จ์ถURL์ ๊ฒฝ๋ก๊ฐ ๋ ID๋ฅผ ์์ฑํ๊ณ ๊ทธ ID๋ฅผ Unique Key๋ก ํ์ฌ DB์ ์ ์ฅ์ ์๋ํฉ๋๋ค.
- ์ ์ฅ์ ์ฑ๊ณตํ๋ฉด ์์ฑ๋ ID ์์ baseUrl์ ๋ถ์ฌ ๋จ์ถURL์ ์์ฑํ๊ณ ์๋ต์ ๋ณด๋ ๋๋ค.
- ๋ธ๋ผ์ฐ์ ๋ ์๋ต ๋ฐ์
shortenedUrl์ ์ฌ์ฉ์์๊ฒ ๋ณด์ฌ์ค๋๋ค.
- ์ฌ์ฉ์๊ฐ ๋ธ๋ผ์ฐ์ ์์ ๋จ์ถ URL๋ก ์ ์ํจ์ผ๋ก์จ ๊ฒ์ดํธ์จ์ด๋ฅผ ๊ฑฐ์ณ Backend๋ก
GET /{Base62EncodedKey}์์ฒญ์ ๋ณด๋ ๋๋ค. - Backend์์๋ ๋จผ์ Redis ์บ์์์ ํด๋น ๊ฐ์ ์ฐพ๊ณ , Cache Miss์ ๊ฒฝ์ฐ DB๋ฅผ ์กฐํํฉ๋๋ค.
- ๋ง์ฝ DB์์ ๊ฐ์ ์ฐพ์๋ค๋ฉด ํด๋น ๊ฐ์ Redis์ ์บ์ฑํ๊ณ , ์๋ณธ URL์ ํฅํด
302 Found์ํ ์ฝ๋๋ก ๋ฆฌ๋ค์ด๋ ํธํฉ๋๋ค. - ๋ง์ฝ DB์๋ ์ฐพ๋ ๊ฐ์ด ์๋ค๋ฉด
404 Not Found์ํ ์ฝ๋๋ก ์๋ตํฉ๋๋ค. - ๋ธ๋ผ์ฐ์ ๋ ์๋ต์ ๋ฐ๋ผ ์๋ณธ URL๋ก ์ ์ํ๊ฑฐ๋ 404 ํ์ด์ง๋ฅผ ๋์๋๋ค.
ํธ์คํธ๋ฅผ ํฅํ๋ ๋๋ฉ์ธ์ด ์์ ๊ฒ์ ์ ์ ๋ก ํ๋ก์ ํธ๊ฐ ๊ตฌ์ฑ๋์ด ์์ต๋๋ค. hosts ํ์ผ์ ์ ์ ํ ์์ ํ์๋ ๊ฒ์ ๊ถ์ฅํฉ๋๋ค.
compose.dev.yml์ ํด๋น ๋ด์ฉ์ด ์์ต๋๋ค.
.env.example์ ์ฐธ๊ณ ํ์ฌ .env.development๋ฅผ ์์ฑํ ํ ๋ค์ ๋ช
๋ น์ ์คํํฉ๋๋ค.
docker compose -f compose.yml -f compose.dev.yml --env-file .env.development up -d --build
backend๋ recompile์ ํซ๋ฆฌ๋ก๋๋ฉ๋๋ค. (๋ฐ์ธ๋๋ง์ดํธ+springBootDevtools+bootRun)
frontend๋ ํ์ผ ์ ์ฅ์ ํซ๋ฆฌ๋ก๋๋ฉ๋๋ค. (๋ฐ์ธ๋๋ง์ดํธ+next dev)
์ด repository์๋ ๋ฆฌ๋ฒ์คํ๋ก์ ์๋ฒ๊ฐ ํฌํจ๋์ด์์ง ์์ต๋๋ค. ์ด๊ฑธ ๋ฐฐํฌํ๋ ค๋ฉด
gateway์ ์ค์ ์ ์ ์ ํ ๋ณ๊ฒฝํ๊ฑฐ๋ ๋ฆฌ๋ฒ์คํ๋ก์ ์๋ฒ๋ฅผ ๊ตฌ์ฑํ์ฌ์ผ ํฉ๋๋ค.
์ด์ ํ๊ฒฝ๊ฐ์ .env.production ํ์ผ๋ก ๋ฐฐํฌํ์ง ์์ต๋๋ค. GitHub Actions์ Variables์ Secrets์ ๋ฑ๋กํ๊ณ , Compose๋ ๋ฐฐํฌ ์์ ์ ํ๊ฒฝ๋ณ์์์ ๊ฐ์ ์ฝ์ต๋๋ค.
GitHub Actions Variables์ ๋ฑ๋กํ ๊ฐ:
SPRING_PROFILES_ACTIVESPRING_KAFKA_BOOTSTRAP_SERVERSAPP_SHORTEN_BASE_URLAPP_FRONTEND_URLAPP_ROOT_DOMAINAPP_COOKIE_DOMAINAPP_LOG_LEVELTOSS_PAYMENTS_CLIENT_KEYTOSS_PAYMENTS_WEBHOOK_PAYMENT_VERIFICATION_ENABLEDBILLING_PRO_FREE_START_ENABLEDBILLING_PRO_FREE_START_DURATION_DAYSBILLING_RECURRING_ENABLEDBILLING_RECURRING_CRONNGINX_BACKEND_HOSTNGINX_FRONTEND_HOSTNEXT_PUBLIC_SITE_URLTZ
GitHub Actions Secrets์ ๋ฑ๋กํ ๊ฐ:
SPRING_DATASOURCE_URLSPRING_DATASOURCE_USERNAMESPRING_DATASOURCE_PASSWORDJWT_SECRETVISITOR_KEY_SECRETSPRING_OAUTH_GOOGLE_CLIENT_IDSPRING_OAUTH_GOOGLE_CLIENT_SECRETSPRING_OAUTH_NAVER_CLIENT_IDSPRING_OAUTH_NAVER_CLIENT_SECRETTOSS_PAYMENTS_SECRET_KEYTOSS_PAYMENTS_WEBHOOK_SECRETBILLING_ENCRYPTION_KEYHOST_ARM1HOST_AMD1SSH_KEY
DB ์๋น์ค๋ฅผ ํฌํจํด ์ด์ Compose๋ฅผ ์คํํ ๋๋ ๋ค์ ๊ฐ๋ ํ์ํฉ๋๋ค. compose.arm2.yml๋ก DB ์๋ฒ๋ฅผ ๋ณ๋ ๋ฐฐํฌํ๋ ๊ฒฝ์ฐ์๋ ๋์ผํ๊ฒ ๋ฑ๋กํฉ๋๋ค.
POSTGRES_USERPOSTGRES_PASSWORDPOSTGRES_DBHOST_ARM2
์๋์ผ๋ก ์ด์ Compose๋ฅผ ์คํํด์ผ ํ๋ ๊ฒฝ์ฐ์๋ .env.production ํ์ผ์ ๋ง๋ค์ง ์๊ณ , ์ ๋ชฉ๋ก์ ํ์ ๊ฐ์ ์ ํ๊ฒฝ๋ณ์๋ก ์ฃผ์
ํ ๋ค ์คํํฉ๋๋ค. ํ์ ๊ฐ์ด ๋น ์ง๋ฉด Compose๊ฐ ์์ ์ ์ ์คํจํฉ๋๋ค.
local > export SPRING_DATASOURCE_URL=...
local > export SPRING_DATASOURCE_USERNAME=...
local > export SPRING_DATASOURCE_PASSWORD=...
local > export NEXT_PUBLIC_SITE_URL=https://linkpado.com
local > export NGINX_BACKEND_HOST=pado.cc
local > export NGINX_FRONTEND_HOST=linkpado.com
local > export ...
local > docker compose -f compose.yml -f compose.prod.yml build
local > docker compose -f compose.yml -f compose.prod.yml push
remote > export SPRING_DATASOURCE_URL=...
remote > export SPRING_DATASOURCE_USERNAME=...
remote > export SPRING_DATASOURCE_PASSWORD=...
remote > export NEXT_PUBLIC_SITE_URL=https://linkpado.com
remote > export NGINX_BACKEND_HOST=pado.cc
remote > export NGINX_FRONTEND_HOST=linkpado.com
remote > export ...
remote > docker compose -f compose.yml -f compose.prod.yml pull
remote > docker compose -f compose.yml -f compose.prod.yml up -d --no-build
| ์์ญ | ์ฌ์ฉ ๊ธฐ์ | ์ฑ๊ณผ ๋ฐ ๊ฒฝํ |
|---|---|---|
| ์ ํ๋ฆฌ์ผ์ด์ | Spring Boot 3 | Java 21์ ํ์ฉํ ๋ฐฑ์๋ ํ๊ฒฝ ๊ตฌ์ถ @Transactional์ ํ๋ก์ ๋์ ์๋ฆฌ๋ฅผ ์ดํดํ๊ณ ๋๊ด์ ๋ฝ์ ์ฌ์๋ ์ ์ฐจ ๊ตฌํ |
| ์ธ์ฆ/์ธ๊ฐ | Spring Security, JWT, OAuth2 | Google/Naver OAuth2๋ฅผ ์ด์ฉํ ์์
๋ก๊ทธ์ธ ๊ตฌํ JWT ๋์ ์ ํตํ Statelessํ ์ธ์ฆ ์์คํ ๊ตฌ์ถ |
| ์ธํ๋ผ/๋คํธ์ํฌ | Docker, Nginx, OCI | ๊ณ์ธตํ ๋คํธ์ํฌ ๊ตฌ์กฐ ์ค๊ณ๋ก ๋ณด์์ฑ ๋์ ์ธํ๋ผ ๊ตฌ์ถ Rate limit์ ์ ์ฉํ์ฌ ํธ๋ํฝ ์์ ์ฑ ํ๋ฆฝ |
| ์บ์ | Redis | ์๋น์ค ํน์ฑ์ ๊ณ ๋ คํ ์ ๋ต์ ์บ์ ๋์ ์ผ๋ก ์ฑ๋ฅ ํฅ์ |
| ํ ์คํธ | JUnit | ๊ฒฐํจ์ ์กฐ๊ธฐ๋ฐ๊ฒฌํ๊ณ ์์ ์ ๋ฆฌํฉํ ๋ง ํ๊ฒฝ ์กฐ์ฑ |
์ปจ๋ฒค์ ์ ๋ํด backend/README.md์ ์์ธํ ๋ด์ฉ์ด ์์ต๋๋ค.
๋จ์ถ URL์ ๊ฒฝ๋ก๋ 123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ์ ๋ฌธ์์ด ์ค SecureRandom์ผ๋ก ๋ฌด์์ ์๋ฆฟ์๋ฅผ ๋ฝ์ ๋ฌธ์ 7๊ฐ๋ก ๊ตฌ์ฑ๋ ๋ฌธ์์ด์
๋๋ค.
์ด ๋ฐฉ์์ ์ ํํจ์ผ๋ก์จ ์๋ ๋ฌธ์ ๋ค์ ํด๊ฒฐํ์ต๋๋ค.
-
์ฝ๊ณ ์งง์ผ๋ฉด์, ๋ง์์ผ ํ๋ค.
- ๋จ์ถ URL์ ์ฌ๋์ด ์ง์ ํ์ดํํ๊ธฐ ์ฌ์์ผํฉ๋๋ค. ๋น์ทํ๊ฒ ์๊ธด
O์0,I์L, ํ์ดํํ๊ธฐ ๋ถํธํ ํน์๋ฌธ์๊ฐ ํฌํจ๋์ง ์์ Base58 ๋ฌธ์์ ์ ์ฌ์ฉํ์ต๋๋ค. - ์ฃผ์๋ฅผ ์งง๊ฒ ํ๊ธฐ ์ํด 7์๋ฆฌ๋ง ์ฌ์ฉํ๋๋ผ๋ 58์ง๋ฒ์ผ๋ก ์ถฉ๋ถํ ๋ง์ ๊ฒฝ์ฐ์ ์๋ฅผ ๊ฐ์ง ์ ์์ต๋๋ค. /
- ๋จ์ถ URL์ ์ฌ๋์ด ์ง์ ํ์ดํํ๊ธฐ ์ฌ์์ผํฉ๋๋ค. ๋น์ทํ๊ฒ ์๊ธด
-
์์ธกํ ์ ์์ด์ผ ํ๋ค.
- ์์ฐจ๊ฐ ์๋ ๋๋ค์ด๊ธฐ์ ์์ธกํ๊ธฐ ๋งค์ฐ ์ด๋ ค์ ๋ณด์์ ์ ๋ฆฌํฉ๋๋ค.
-
๋์์ฑ ๋ฌธ์
- ๋๋คํ ๊ฐ์ ์์ฑ ํ ์ผ๋จ ์ ์ฅ์ ์๋ํ๊ณ , ์ค๋ณต์ด๋ฉด
@Retryable์ ํตํด 5ํ๊น์ง ์ฌ์๋ํ๋ ๋๊ด์ ๋ฐฉ์์ด๊ธฐ ๋๋ฌธ์, Race Condition์ด๋ Deadlock์์ ๋น๊ต์ ์์ ๋กญ์ต๋๋ค. - ๋ถ์ฐํ๊ฒฝ์์๋ ๊ฐ ์๋ฒ๊ฐ์ ๋ณต์กํ ๋๊ธฐํ ๊ณผ์ ์ด ํ์์์ด ๋ถ์ฐํ๊ฒฝ ์นํ์ ์ ๋๋ค.
- ๋๋คํ ๊ฐ์ ์์ฑ ํ ์ผ๋จ ์ ์ฅ์ ์๋ํ๊ณ , ์ค๋ณต์ด๋ฉด
-
ํ์ฅ์ฑ
๊ทธ๋ด ์ผ์ด ์๊ฒ ์ง๋ง, ๊ฒฝ๋ก์ ์ธ id๊ฐ ๊ณ ๊ฐ๋๋ ๊ฒฝ์ฐ id๋ฅผ ๋จ ํ ์๋ฆฌ๋ง ๋ ๋๋ ค๋ ์์ฒญ๋ ํ์ฅ์ฑ์ ๊ฐ์ง๋๋ค.
๋จ์ถ URL ์๋น์ค๋ ์ฐ๊ธฐ ์์ ๋ณด๋ค ์ฝ๊ธฐ ์์ ์ด ํจ์ฌ ๋ง์ต๋๋ค. ๋ํ ์ต๊ทผ์ ์์ฑ ๋๋ ์กฐํ๋ URL์ผ ์๋ก ๋ค์ ์กฐํ๋ ํ๋ฅ ์ด ๋์ต๋๋ค. ๋ฐ๋ผ์ ๋งค๋ฒ RDB์์ ๋ฐ์ดํฐ๋ฅผ ์ฟผ๋ฆฌํด์ค๋ ๊ฒ๋ณด๋ค, ๋ฉ๋ชจ๋ฆฌ ๊ธฐ๋ฐ ์บ์ฑ์ ํ์ฉํด ์๋ต ์๋๋ฅผ ๋ฎ์ถ๊ณ DB์ IO ๋ณ๋ชฉ์ ๋ฐฉ์งํ๋ ค๋ ๋ชฉ์ ์ผ๋ก redis ์บ์๋ฅผ ๊ตฌ์ฑํ์์ต๋๋ค.
| 30RPS ์๋ต์๊ฐ | ์บ์ ์์ | ์บ์ ๊ตฌ์ถ ํ | ๊ฐ์ ์จ |
|---|---|---|---|
| p(95) | 262.51ms | 44.04ms | ์ฝ 83% ๊ฐ์ |
| p(99) | 1.05s | 68.07ms | ์ฝ 93% ๊ฐ์ |
| ํ๊ท | 65.92ms | 8.32ms | ์ฝ 87% ๊ฐ์ |
๋ถํํ ์คํธ๋
k6์ผ๋ก ์งํํ์์ผ๋ฉฐ, RPS๋ ์์ฒญ ์คํจ์จ 0%๋ฅผ ์ ์งํ๋ ์ต๊ณ ๋ถํ๋ฅผ ๊ธฐ์ค์ผ๋ก ํ์ต๋๋ค.
-
๋จ์ถURL์ ์บ์์์ ์ฝ์ ๋๋ Look aside ์ ๋ต์ ์ฌ์ฉํฉ๋๋ค. ๋จผ์ Redis๋ฅผ ์กฐํ ํ, ์ฐพ์ง ๋ชปํ๋ค๋ฉด DB์์ ์ฝ์ด Redis์ ๊ฐฑ์ ํฉ๋๋ค.
-
๋จ์ถURL์ ์บ์์ ์ธ ๋๋ Write around ์ ๋ต์ ์ฌ์ฉํฉ๋๋ค. ์ฒซ ๋จ์ถURL ์กฐํ์์ ์บ์์ ์ฌ๋ฆฝ๋๋ค. ์์ฑ๋ง ํด๋๊ณ ์ฌ์ฉํ์ง ์๋ ๋จ์ถURL์ด ์บ์๋ฅผ ๋ญ๋น์ํค๋ ๊ฒ์ ๋ฐฉ์งํฉ๋๋ค.
-
๋จ์ถURL์ ์บ์์์ ์ ๊ฑฐํ ๋๋ TTL(Time To Live) + LRU(Least Recently Used) ์ ๋ต์ ์ฌ์ฉํฉ๋๋ค. ์บ์์ ๊ธฐ๋ณธ์ ์ธ ์๋ช ์ ์ก๊ณ , ์กฐํ๋ ๋๋ง๋ค ์๋ช ์ ๊ฐฑ์ ํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์บ์๊ฐ ๊ฐ๋ ์ฐผ์ ๋๋ ๋ง์ง๋ง ์กฐํ๊ฐ ์ค๋๋ ์์ผ๋ก ์บ์์์ ์ ๊ฑฐํฉ๋๋ค.
301 Moved Permanently๋ก ๋ฆฌ๋ค์ด๋ ํธํ๋ฉด ๋ธ๋ผ์ฐ์ ๊ฐ ๊ทธ ๋ฆฌ๋ค์ด๋ ์
์ ์บ์ฑํฉ๋๋ค. ์ดํ์๋ ๊ฐ์ ์์ฒญ์ ๋ฐ๋ณตํ ๋, ์๋ฒ๋ฅผ ๊ฑฐ์น์ง ์๊ณ ์บ์ฑ๋ ๋ฆฌ๋ค์ด๋ ์
๋ชฉ์ ์ง๋ก ๊ฐ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ด๊ฑด ์กฐํ์๋ ์ง์ญ ๋ฑ ๋ฐฉ๋ฌธ ๋ฐ์ดํฐ ์ง๊ณ์ ์ฐจ์ง์ ์ค๋๋ค.
302 Found๋ก ๋ฆฌ๋ค์ด๋ ํธํ๋ฉด ๋ธ๋ผ์ฐ์ ๋ ์บ์ฑ์์ด ํญ์ ์ด ์๋ฒ์ ์์ฒญ์ ๋ณด๋
๋๋ค. 301๊ณผ ๊ฐ์ ๋ฌธ์ ๊ฐ ์๊ธฐ์ง ์์ต๋๋ค. ์ด ์๋น์ค๋ ์ถํ ํ์์๊ฒ ๋ฐฉ๋ฌธ ๋ฐ์ดํฐ๋ฅผ ์ ๊ณตํ ์์ ์ด๊ธฐ์ 301์ด ์๋ 302๋ฅผ ์ฌ์ฉํฉ๋๋ค.
์ฌ์ฉ์์ ์์ฒญ์ด ๋ฐฑ์๋ ์๋ฒ๋ก ๋๋ฌํ๊ธฐ๊น์ง ๋ฆฌ๋ฒ์คํ๋ก์-๊ฒ์ดํธ์จ์ด-๋ฐฑ์๋์๋ฒ ๋ฅผ ๊ฑฐ์น๋ ๊ณ์ธตํ ๊ตฌ์กฐ๋ฅผ ์ค๊ณํ์์ต๋๋ค. ์ด ๊ตฌ์กฐ๋ ์๋์ ๊ฐ์ ํน์ง์ ์ง๋๋๋ค.
- ๊ณต๊ฒฉํ๋ฉด ์ต์ํ: ์ธ๋ถ ๋คํธ์ํฌ์ ๋ง๋ฟ๋ ์ง์ ์ ์ต์ ๋ฐฉ์ ๋ฆฌ๋ฒ์ค ํ๋ก์ ์๋ฒ๋ง์ผ๋ก ์ต์ํํฉ๋๋ค. WAS์ DB ๋ฑ์ ํ๋ผ์ด๋น ๋คํธ์ํฌ์ ๊ฒฉ๋ฆฌํ์ฌ ๋ณด์ ์ํ์ ์ต์ํํ์ต๋๋ค.
- ์ธํ๋ผ ํ์ฅ์ฑยท์ ์ฐ์ฑ: ์๋ฒ๋ฅผ ์ํํ์ฅํ๋ ค ํ ๊ฒฝ์ฐ,
weight๋ฑ ๊ฒ์ดํธ์จ์ด ์ค์ ๋ง์ผ๋ก ๋ก๋๋ฐธ๋ฐ์ฑ์ ํ ์ ์๊ฒ ๋ฉ๋๋ค.split_clients๋ฑ ์ค์ ์ ํตํด ์นด๋๋ฆฌ ๋ฐฐํฌ ๋ฑ ์ ์ฐํ ํ์ฉ์ด ๊ฐ๋ฅํด์ง๋๋ค. - SSL ์ข ๋จ์ ์ผ์ํ: SSL ์ธ์ฆ์ ๊ด๋ฆฌ์ HTTPS ๋ณตํธํ๋ฅผ ์ต์ ๋ฐฉ์ ๋ฆฌ๋ฒ์ค ํ๋ก์ ์๋ฒ๊ฐ ์ ๋ดํ๊ฒ ํจ์ผ๋ก์จ ๋ด๋ถ ์๋ฒ๋ค์ SSL ์ค์ ๊ณผ ๋ณตํธํ ์ฐ์ฐ์ด ๋ถํ์ํด์ง๋๋ค.
- CORS ํด๊ฒฐ: ๋ธ๋ผ์ฐ์ ์ ์ฅ์์ ๋ชจ๋ ์์ฒญ๊ณผ ์๋ต์ด ๋์ผํ origin๊ณผ ์ด๋ฃจ์ด์ง๋๋ก ๋ง๋ญ๋๋ค.

