๐ ๋ง์ดํฌ๋ก์๋น์ค ๋ณด์: API Gateway + Docker Private Networks
Source: Dev.to
๐ ์ฒซ ๋ฒ์งธ ๋ถ์ฐ ์์คํ ์ ๊ตฌ์ถํ๋ ๊ฐ๋ฐ์๋ฅผ ์ํ ์ค์ฉ ๊ฐ์ด๋
๋ง์ดํฌ๋ก์๋น์ค๋ฅผ ์ฒ์ ๋ง๋ค ๋ ๋๋ถ๋ถ์ ๊ฐ๋ฐ์๋ ๊ธฐ๋ฅ, ํ์ฅ์ฑ, ํน์ ๋ชจ๋๋ฆฌ์ค๋ฅผ ๋ถ๋ฆฌํ๋ ๋ฐ ์ง์คํ์ง๋ง ๋ณด์ ์ํคํ ์ฒ์ ๋ํด์๋ ๊ฑฐ์ ์ด์ผ๊ธฐํ์ง ์์ต๋๋ค. ๋ฐ๋ก ์ฌ๊ธฐ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค. ์ ๊ฐ ์ง์ ๋ถ์ฐ ์์คํ ์ ๊ฐ๋ฐํ๋ฉด์ ๋ด๋ถ API ๋ช ๊ฐ์ PostgreSQL ๋ฐ์ดํฐ๋ฒ ์ด์ค๊น์ง ์ค์๋ก ํผ๋ธ๋ฆญ์ ๋ ธ์ถ๋ ๊ฒ์ ๋ฐ๊ฒฌํ์ต๋๋ค. ๐ฌ
๊ทธ๋์ ์ ๋ ๊ฐ๋จํ๋ฉด์๋ ํ๋ก๋์ ์ ๋ฐ๋ก ์ ์ฉ ๊ฐ๋ฅํ ํจํด์ ๊ตฌํํ์ต๋๋ค: API Gateway + Docker Private Networks. ์ด ๊ธ์์๋ ์ ๊ฐ ์ด๋ป๊ฒ(๊ทธ๋ฆฌ๊ณ ์) ๊ตฌํํ๋์ง, ๊ทธ๋ฆฌ๊ณ ์ฌ๋ฌ๋ถ์ด ๋์ผํ ์ ๊ทผ ๋ฐฉ์์ ์์ ์ ํ๋ก์ ํธ์ ์ด๋ป๊ฒ ์ ์ฉํ ์ ์๋์ง ๋ณด์ฌ๋๋ฆฝ๋๋ค.
์ค์ ๋ฌธ์ : ๋ง์ดํฌ๋ก์๋น์ค๊ฐ ์ค์๋ก ๋ชจ๋ ๊ฒ์ ๋ ธ์ถํ๋ ๊ฒฝ์ฐ

์ด๋ณด์๋ค์ด ํํ ์ค์ ํ๋ ๋ฐฉ์์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- ๊ฐ ์๋น์ค๊ฐ ์์ฒด ํฌํธ๋ก ๋ ธ์ถ๋จ
- ํด๋ผ์ด์ธํธ๊ฐ ๋ชจ๋ ์๋น์ค์ ์ง์ ์ ๊ทผ
- ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ๋ ธ์ถ๋ ์ ์์
- ์ค์ ์ ์ด๋ ๋ผ์ฐํ ์ด ์์
์ด๋ก ์ธํด ๋ณด์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๊ณ , ๋๋ฒ๊น ์ด ๋ณต์กํด์ง๋ฉฐ, ์ํคํ ์ฒ๊ฐ ์๋ง์ด ๋ฉ๋๋ค.
Part 1 โ API Gateway: ๋จ์ผ ์ง์ ์
API Gateway๊ฐ ์ค์ํ ์ด์

์๋ ๋ฐฉ์
- ํด๋ผ์ด์ธํธ๋ ๊ฒ์ดํธ์จ์ด์ ๋จ์ผ ์์ฒญ์ ๋ณด๋ ๋๋ค.
- ๊ฒ์ดํธ์จ์ด๋ ์ด๋ค ์๋น์ค๊ฐ ํด๋น ์์ฒญ์ ์ฒ๋ฆฌํ ์ง ๊ฒฐ์ ํฉ๋๋ค.
- ์์ฒญ์ ํ๋ผ์ด๋น Docker ๋คํธ์ํฌ ๋ด๋ถ๋ก ์ ๋ฌํฉ๋๋ค.
- ๋ด๋ถ URL์ ์ธ๋ถ์ ์ ๋ ๋ ธ์ถ๋์ง ์์ต๋๋ค.
๊ฒ์ดํธ์จ์ด๋ ๋จ์ํ ๋ผ์ฐํฐ๊ฐ ์๋๋ผ ์ ์ฒด ์์คํ ์ ์ ๋ฌธ ์ญํ ์ ํฉ๋๋ค.
์ ์ค์ํ๊ฐ
- ์ธ์ฆ์ ํ ๊ณณ์์ ๊ด๋ฆฌ
- ๋ผ์ฐํ ์ ํ ๊ณณ์์ ๊ด๋ฆฌ
- ๋ด๋ถ ์๋น์ค๋ ์จ๊น ์ฒ๋ฆฌ
- ์ฝ๋๊ฐ ๊น๋ํด์ง๊ณ ์ ์ด๊ฐ ์ฌ์์ง
๊ฐ ์๋น์ค๋ฅผ ์ง์ ํธ์ถํ๋ ๋์ :
http://localhost:3000/orders
http://localhost:4000/reports
ํด๋ผ์ด์ธํธ๋ ๋ค์๊ณผ ๊ฐ์ด ํธ์ถํฉ๋๋ค:
http://gateway/api/orders
๊ฒ์ดํธ์จ์ด๊ฐ ๋ด๋ถ์ ์ผ๋ก ์์ฒญ์ ์ ๋ฌํ๋ฏ๋ก ์๋น์ค ์์ฒด๋ฅผ ์ธ๋ถ์ ๋ ธ์ถํ ํ์๊ฐ ์์ต๋๋ค.
Part 2 โ Docker Private Networks (๋ฌผ๋ฆฌ์ ๋ณด์ ๋ ์ด์ด)
Docker ๋คํธ์ํฌ๊ฐ ์์คํ ์ ๋ณดํธํ๋ ๋ฐฉ๋ฒ

์ ์ค์ํ๊ฐ
ํ๋ผ์ด๋น ๋คํธ์ํฌ๊ฐ ์์ผ๋ฉด Docker๋ ์ปจํ ์ด๋๋ฅผ ํธ์คํธ ๋จธ์ ์ ๋ ธ์ถํฉ๋๋ค. ํ๋ผ์ด๋น ๋คํธ์ํฌ๋ฅผ ์ฌ์ฉํ๋ฉด:
- ์ธ๋ถ์์ ์ ๊ทผ ๊ฐ๋ฅํ ๊ฒ์ ๊ฒ์ดํธ์จ์ด๋ฟ
- ๋ชจ๋ ๋ด๋ถ ํธ๋ํฝ์ ๋คํธ์ํฌ ๋ด๋ถ์ ๋จธ๋ฌด๋ฆ
- ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ง์ ์ ๊ทผํ ์ ์์
์๋น์ค๋ฅผ ํ๋ผ์ด๋น Docker ๋คํธ์ํฌ์ ๋ฃ์ผ๋ฉด ๋ช ์์ ์ผ๋ก ๋ ธ์ถํ ๊ฒ ์ธ์๋ ์ธ๋ถ์์ ์ ๊ทผํ ์ ์๊ฒ ๋ฉ๋๋ค.
์ด์
- ๋ด๋ถ ์ ์ฉ ํต์
- ํฌํธ ์ค์ ๋ ธ์ถ ์ ๋ก
- ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์ ๊ฒฉ๋ฆฌ
- ๊น๋ํ๊ณ ์ ๋ฌธ์ ์ธ ์ํคํ ์ฒ
๊ฒ์ดํธ์จ์ด๋ฅผ ์ฐํํ๋ค ํ๋๋ผ๋(๊ทนํ ๋๋ฌผ๊ฒ) ServiceโฏA, B ํน์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ๊ทผํ ์ ์์ต๋๋ค. ์๋ํ๋ฉด ํด๋น ์ปจํ ์ด๋๋ค์ ํผ๋ธ๋ฆญ ๋คํธ์ํฌ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค.
๋ ๊ฐ์ง๋ฅผ ๊ฒฐํฉํ ๊ฐ๋จํ๊ณ ๊ฒฌ๊ณ ํ ๋ณด์ ํจํด
์ ์ฒด ์ํคํ ์ฒ๊ฐ ํจ๊ป ์๋ํ๋ ๋ฐฉ์

๋ค์ ๋ ์์๋ฅผ ๊ฒฐํฉํ๋ฉด:
- ๋ ผ๋ฆฌ์ ๋ณด์ (API Gateway)
- ๋ฌผ๋ฆฌ์ ๋ณด์ (ํ๋ผ์ด๋น ๋คํธ์ํฌ)
Kubernetes, ์๋น์ค ๋ฉ์ฌ, ๋ณต์กํ DevOps ๋๊ตฌ ์์ด๋ ๋จ์ํ๋ฉด์๋ ๊ฐ๋ ฅํ ๋ง์ดํฌ๋ก์๋น์ค ์ํคํ ์ฒ๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค.
Client
โ
API Gateway
โ
Private Docker Network
โโโ Service A
โโโ Service B
โโโ Database
๊ฒ์ดํธ์จ์ด๋ง ํผ๋ธ๋ฆญ์ ๋ ธ์ถ๋๊ณ , ๋๋จธ์ง๋ ๋ชจ๋ ์์ ํ๊ฒ ๋ค์ ์จ๊ฒจ์ง๋๋ค.
์ต์ Docker Compose ์์ (๋ณต์ฌ/๋ถ์ฌ๋ฃ๊ธฐ ๊ฐ๋ฅ)
services:
api-gateway:
build: ./gateway
ports:
- "8080:8080"
networks:
- public_net
- private_net
service-a:
build: ./service-a
expose:
- "3000"
networks:
- private_net
service-b:
build: ./service-b
expose:
- "4000"
networks:
- private_net
internal-db:
image: postgres:16
expose:
- "5432"
environment:
POSTGRES_PASSWORD: password
networks:
- private_net
networks:
public_net:
private_net:
ํต์ฌ ์ ๋ฆฌ
- ํผ๋ธ๋ฆญ ํฌํธ๋ฅผ ๊ฐ์ง ๊ฒ์ ์ค์ง ๊ฒ์ดํธ์จ์ด๋ฟ โ ์ธ๋ถ์ ๊ณต๊ฐ
- ๋ด๋ถ ์๋น์ค๋
expose์ฌ์ฉ โ ํ๋ผ์ด๋น - ๋ชจ๋ ์๋น์ค๊ฐ
private_net์์ ์กด์ฌ - ์ต์ํ์ ์ค์ ์ผ๋ก ๊น๋ํ๊ณ ์์ ํ ์ํคํ ์ฒ ๊ตฌํ
๋ฐฐ์ด ์
- ๋ด๋ถ ์๋น์ค๊ฐ ์ค์๋ก ๋ ธ์ถ๋๋ ์ผ ์ ๋ก
- ์์ ํ๊ณ ์์ธก ๊ฐ๋ฅํ ์ง์ ์ ํ๋ณด
- ๋๋ฒ๊น ์๋ ํฅ์
- ํ์ ์จ๋ณด๋ฉ์ด ์ฌ์์ง
- ํฅํ ์๋น์ค ํ์ฅ์ ์ํ ์ค์ผ์ผ๋ฌ๋ธํ ๊ธฐ๋ฐ
- ์ด๋ณด์ ์นํ์ ์ธ ๋๊ตฌ๋ง์ผ๋ก๋ ํ๋ก ์์ค ์ํคํ ์ฒ ๊ตฌํ
๋ง๋ฌด๋ฆฌ ์๊ฐ
์ด ์ํคํ ์ฒ๋ ๋งค์ฐ ๋จ์ํด ๋ณด์ด์ง๋ง, ๋ฐ๋ก ๊ทธ ์ ์ด ์๋ํ๋ ์ด์ ์ ๋๋ค. ๋ณด์๊ณผ ํ์ฅ์ฑ์ ๊ฐ์ถ ๋ถ์ฐ ์์คํ ์ ๊ตฌ์ถํ๊ธฐ ์ํด Kubernetes, ์๋น์ค ๋ฉ์ฌ, ๋ณต์กํ DevOps ์ค์ ์ด ํ์ํ์ง ์์ต๋๋ค.
์์์ ์ด๋ ๊ฒ:
- ํ๋์ API Gateway
- ํ๋์ ํ๋ผ์ด๋น Docker ๋คํธ์ํฌ
์ด ๊ธฐ๋ฐ ์์ ์์คํ ์ด ์ฑ์ฅํจ์ ๋ฐ๋ผ ์์ฐ์ค๋ฝ๊ฒ ํ์ฅ๋ฉ๋๋ค.
๋จ์ํจ. ๊น๋ํจ. ๋ณด์. ํจ์จ์ฑ.