ย ํ๋กํ ์ค์ Gateway์ API Gateway
1. ํ๋กํ ์ค ๊ฒ์ดํธ์จ์ด๋?
โข
์คํํฌ๋ํํธ์์ ๊ฒ์ดํธ์จ์ด(Gateway)๋
ํ๋กํ ์ค์ ๊ธฐ๋ณธ ๋ณ๋ ฅ(์ง๋ฟ, ๋๋ผ๊ตฐ, ํ
ํ๋ฌ ๋ฑ)์ ์์ฐํ๋ ํต์ฌ ๊ฑด๋ฌผ์ด๋ค.
โข
ํ๋กํ ์ค ๋ณ๋ ฅ์ ๊ฒ์ดํธ์จ์ด๋ฅผ ํตํด ์ธ๋ถ(์ ์ฅ)์ ๋ฑ์ฅํ๋ค(์์ด์ด๋ฅผ ์ํ์ฌ~!).
โข
์ฆ, ๋ชจ๋ ๋ณ๋ ฅ ์์ฐ์ ๋จ์ผ ์ง์
์ (Entry Point) ์ญํ ์ ํ๋ ๊ฑด๋ฌผ์ด๋ค.
[ Nexus (๋ณธ์ง) ]
โ
โผ
[ Gateway ] โ [ Zealot / Dragoon / High Templar ... ]
Plain Text
๋ณต์ฌ
2. API Gateway์์ ๋น์
โข
API Gateway = ํ๋กํ ์ค ๊ฒ์ดํธ์จ์ด
โฆ
๋ง์ดํฌ๋ก์๋น์ค(MSA)์ ๋ชจ๋ ์์ฒญ์ด API Gateway๋ฅผ ํตํด์๋ง ์ธ๋ถ๋ก ๋
ธ์ถ๋๋ค.
โฆ
ํ๋กํ ์ค๊ฐ ๋ณ๋ ฅ์ ์๋ฌด๋ฐ์๋ ์ํํ ์ ์๋ ๊ฒ์ฒ๋ผ, MSA๋ ์๋น์ค๊ฐ ์ธ๋ถ์ ์ง์ ๋
ธ์ถ๋์ง ์๋๋ค.
โข
๋ง์ดํฌ๋ก์๋น์ค = ํ๋กํ ์ค ๋ณ๋ ฅ
โฆ
User Service, Order Service, Payment Service ๊ฐ์ ๊ฐ๋ณ ๋ง์ดํฌ๋ก์๋น์ค๋ ๊ฐ๊ฐ์ ๋ณ๋ ฅ ์ ๋๊ณผ ๊ฐ๋ค.
โข
ํด๋ผ์ด์ธํธ = ์ ์ฅ
โฆ
์ค์ ์ฌ์ฉ์๋ ์ ์ฅ์์ ์ ๋(์๋น์ค)์ ๊ธฐ๋ฅ์ ํ์ฉํ์ง๋ง, ๊ทธ ์ ๋์ ์์ฐํ๋ ๊ณผ์ ์ ๊ฒ์ดํธ์จ์ด๋ฅผ
ํตํด์๋ง ๊ฐ๋ฅํ๋ค.
[ Client (์ ์ฅ) ]
โ
โผ
[ API Gateway (ํ๋กํ ์ค ๊ฒ์ดํธ์จ์ด) ]
โโโ> [ User Service (Zealot) ]
โโโ> [ Order Service (Dragoon) ]
โโโ> [ Payment Service (Dark Templar) ]
Plain Text
๋ณต์ฌ
3. ๊ฒ์ดํธ์จ์ด์ ์ญํ ๋น๊ต
์ญํ | ํ๋กํ ์ค ๊ฒ์ดํธ์จ์ด | API Gateway |
์์ฐ/๋ถ๋ฐฐ | ์ ๋ ์์ฐ | ์์ฒญ์ ๊ฐ ์๋น์ค๋ก ๋ผ์ฐํ
|
ํ์ฅ | ๋ค์ ๊ฒ์ดํธ์จ์ด ๊ฑด์ค๋ก
๋ณ๋ ฅ ์์ฐ๋ ์ฆ๊ฐ | ๋ค์ ์ธ์คํด์ค๋ก ๋ถํ ๋ถ์ฐ
(๋ก๋ ๋ฐธ๋ฐ์ฑ) |
๋ณด์ | ์ฌ์ด์ค๋ ์คํฐ, ์บ๋
ผ๊ณผ ํจ๊ป
๊ธฐ์ง ๋ฐฉ์ด | JWT ์ธ์ฆ, ๋ณด์ ํํฐ |
์ค์ ๊ด๋ฆฌ | ์ ๋ ํ๋ จ ์ค์ํ | ์๋น์ค ์๋ํฌ์ธํธ ์ค์ ๊ด๋ฆฌ |
์ ํ | ๊ฒ์ดํธ์จ์ด ์์ผ๋ฉด ๋ณ๋ ฅ ์์ฐ ๋ถ๊ฐ | API Gateway ์์ผ๋ฉด
์๋น์ค ์ ๊ทผ ๋ถ๊ฐ |
4. Spring Boot API Gateway ์์
spring:
application:
name: api-gateway
cloud:
gateway:
routes:
- id: zealot-service # ์ง๋ฟ ์ ๋ = User Service
uri: lb://USER-SERVICE
predicates:
- Path=/users/**
- id: dragoon-service # ๋๋ผ๊ตฐ ์ ๋ = Order Service
uri: lb://ORDER-SERVICE
predicates:
- Path=/orders/**
YAML
๋ณต์ฌ
๋ง์น ๊ฒ์ดํธ์จ์ด ๊ฑด๋ฌผ์์ ์ง๋ฟ ๋๋ ๋๋ผ๊ตฐ ์ ๋ฝ๋ฏ์ด,
API Gateway๋ /users/** ์์ฒญ์ User Service๋ก,
/orders/** ์์ฒญ์ Order Service๋ก ์ ๋ฌํ๋ค.
5. ์ ๋ฆฌ
โข
API Gateway๋ ๋ง์ดํฌ๋ก์๋น์ค์ โ์์ฐ ๊ฑด๋ฌผโ์ด๋ค.
โข
ํด๋ผ์ด์ธํธ๋ ์ง์ ๋ณ๋ ฅ(์๋น์ค)์๊ฒ ๊ฐ์ง ์๊ณ , ๊ฒ์ดํธ์จ์ด(์์ฐ ๊ฑด๋ฌผ)๋ฅผ ํตํด ํ์ํ ์ ๋์ ์ป๋๋ค.
โข
๊ฒ์ดํธ์จ์ด๊ฐ ๋ง์์ง์๋ก โ ํธ๋ํฝ ์ฒ๋ฆฌ๋(๋ณ๋ ฅ ์์ฐ๋)์ด ์ฆ๊ฐํ๋ค.
โข
๊ฒ์ดํธ์จ์ด๊ฐ ๋ฌด๋์ง๋ฉด โ ์ ์ฅ์ ๋ ์ด์ ์ ๋์ด ํฌ์
๋์ง ๋ชปํ๋ค(SPOF ์ํ).
โฆ
SPOF(๋จ์ผ ์ฅ์ ์ง์ , Single Point of Failure):ย ์์คํ
์ ํน์ ๊ตฌ์ฑ ์์ ์ค ํ๋๊ฐ ๊ณ ์ฅ๋๋ฉด ์ ์ฒด ์์คํ
์ด ์ค๋จ๋๋ ์ทจ์ฝ์ ์ ์๋ฏธ
โฆ
๊ฒ์ดํธ์จ์ด๊ฐ ํ์ผ๋ฐ์ด ์์ด์ Unpowered ์ํ๊ฐ ๋๋ ๊ฑธ ์๊ฐํ๋ฉด ๋จ
โข
์ฝ๊ฒ ์ ๋ฆฌ:
โฆ
API Gateway๋ ํ๋กํ ์ค์ ๊ฒ์ดํธ์จ์ด๋ค.
โฆ
ํด๋ผ์ด์ธํธ๋ ๊ฒ์ดํธ์จ์ด๋ฅผ ํตํด ํ์ํ ๋ณ๋ ฅ(์๋น์ค)์ ๊ณต๊ธ๋ฐ๋๋ค.
โฆ
์ค ํ๋ก ์๋ ์ ๋ผํด
API Gateway์ MSA, ๊ทธ๋ฆฌ๊ณ Spring Boot ์ ์ฉ
1. ๋ณธ๊ฒฉ์ ์ผ๋ก ๋ค์ด๊ฐ๋ฉฐ
โข
์์ ์ค๋ช
ํ ํ๋กํ ์ค ๊ฒ์ดํธ์จ์ด์ ๋น์ ํ์ฌ API Gateway์ ๋ํด ์ข ๋ ์์ธํ ์์๋ณธ๋ค.
โข
API Gateway๊ฐ MSA(Microservice Architecture)์์ ์ด๋ค ์ญํ ์ ํ๊ณ , ์ ์ค์ํ์ง, ๊ทธ๋ฆฌ๊ณ Java + Spring Boot๋ฅผ ํ์ฉํด ์ด๋ป๊ฒ ์ ์ฉํ ์ ์๋์ง ์ ๋ฆฌํด๋ณธ๋ค.
โข
MSA ํ๊ฒฝ์์ API Gateway๋ ๋จ์ํ ์์ฒญ ๋ถ๋ฐฐ๋ฅผ ๋์ด ๋ณด์, ๋ผ์ฐํ
, ๋ชจ๋ํฐ๋ง๊น์ง ๋ด๋นํ๋ ํต์ฌ ์ปดํฌ๋ํธ์ด๋ค.
2. MSA(Microservice Architecture)๋?
โข
์ ์: ํ๋์ ๊ฑฐ๋ํ ์ ํ๋ฆฌ์ผ์ด์
์ ์์ ์๋น์ค ๋จ์๋ก ๋๋์ด ๋
๋ฆฝ์ ์ผ๋ก ๊ฐ๋ฐ/๋ฐฐํฌ/์ด์ํ ์ ์๋๋ก ํ๋ ์ํคํ
์ฒ
โข
ํน์ง
โฆ
๊ฐ ์๋น์ค๋ ๋
๋ฆฝ์ ์ธ ๋ฐฐํฌ ๊ฐ๋ฅ
โฆ
์๋ก ๋ค๋ฅธ ๊ธฐ์ ์คํ ์ฌ์ฉ ๊ฐ๋ฅ
โฆ
์๋น์ค ๊ฐ ํต์ ์ ์ฃผ๋ก REST API ๋๋ gRPC ํ์ฉ
โฆ
ํ์ฅ์ฑ(Scalability) ๋ฐ ์ ์ฐ์ฑ(Flexibility) ๊ฐํ
ํ์ง๋ง ์๋น์ค๊ฐ ๋ง์์ง์๋ก ํด๋ผ์ด์ธํธ์ ์ง์ ์ฐ๊ฒฐ๋๋ฉด ๋ณต์ก์ฑ์ด ์ฆ๊ฐํ๋ค.
์ด๋ฅผ ํด๊ฒฐํ๋ ๊ฒ์ด ๋ฐ๋ก API Gateway์ด๋ค.
3. API GateWay๋?
โข
์ ์: ํด๋ผ์ด์ธํธ ์์ฒญ์ ๋ฐ์ ์ ์ ํ ๋ง์ดํฌ๋ก์๋น์ค๋ก ์ ๋ฌํ๊ณ ,
์๋ต์ ๋ค์ ํด๋ผ์ด์ธํธ์ ๋ฐํํ๋ ๋จ์ผ ์ง์
์ (Entry Point)
โข
์ฃผ์ ์ญํ
1.
๋ผ์ฐํ
: ์์ฒญ์ ํด๋น ์๋น์ค๋ก ์ ๋ฌ
2.
๋ก๋ ๋ฐธ๋ฐ์ฑ: ์ฌ๋ฌ ์ธ์คํด์ค ๊ฐ ํธ๋ํฝ ๋ถ์ฐ
3.
๋ณด์: ์ธ์ฆ/์ธ๊ฐ, JWT ํ ํฐ ๊ฒ์ฆ
4.
API ๊ด๋ฆฌ: ์์ฒญ/์๋ต ๋ก๊น
, ๋ชจ๋ํฐ๋ง
5.
๋ณํ: REST
gRPC, ๋ฐ์ดํฐ ํฌ๋งท ๋ณํ
6.
์๋ ์ ํ/์บ์ฑ: Rate Limiting, Response Caching
4. MSA์ API Gateway์ ์ฐ๊ณ ๊ตฌ์กฐ
[ Client ]
โ
โผ
[ API Gateway ]
โโโ> [ Auth Service ]
โโโ> [ User Service ]
โโโ> [ Order Service ]
โโโ> [ Payment Service ]
Markdown
๋ณต์ฌ
โข
ํด๋ผ์ด์ธํธ๋ Gateway๋ง ๋ฐ๋ผ๋ด
โข
์๋น์ค๋ณ Endpoint๋ ์ธ๋ถ์ ๋
ธ์ถ๋์ง ์์
โข
API Gateway๊ฐ ํธ๋ํฝ ์กฐ์จ์ ์ญํ ์ํ
5. Spring Boot ๊ธฐ๋ฐ API Gateway ๊ตฌํ
โข
Spring Boot์์ API Gateway๋ฅผ ๊ตฌํํ ๋๋ ๋ณดํต Spring Cloud Gateway๋ฅผ ์ฌ์ฉํ๋ค,.
Gradle ์์กด์ฑ ์ถ๊ฐ
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-webflux'
implementation 'org.springframework.cloud:spring-cloud-starter-gateway'
implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client' // ์๋น์ค ๋์ค์ปค๋ฒ๋ฆฌ
}
Groovy
๋ณต์ฌ
application.yml ์์
spring:
application:
name: api-gateway
cloud:
gateway:
routes:
- id: user-service
uri: lb://USER-SERVICE
predicates:
- Path=/users/**
- id: order-service
uri: lb://ORDER-SERVICE
predicates:
- Path=/orders/**
YAML
๋ณต์ฌ
โข
lb:// : Eureka(์๋น์ค ๋์ค์ปค๋ฒ๋ฆฌ)์ ์ฐ๋ ์ ์ฌ์ฉ
โข
/users/** ์์ฒญ์ User Service๋ก ์ ๋ฌ
โข
/orders/** ์์ฒญ์ Order Service๋ก ์ ๋ฌ
@Component
public class JwtAuthenticationFilter implements GatewayFilter {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
String token = exchange.getRequest().getHeaders().getFirst("Authorization");
if (token == null || !token.startsWith("Bearer ")) {
exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
return exchange.getResponse().setComplete();
}
// JWT ๊ฒ์ฆ ๋ก์ง (๊ฐ๋จ ์์)
try {
String jwt = token.substring(7);
// ๊ฒ์ฆ ๋ก์ง (์: Jwts.parser().setSigningKey(...).parseClaimsJws(jwt))
} catch (Exception e) {
exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
return exchange.getResponse().setComplete();
}
return chain.filter(exchange);
}
}
Java
๋ณต์ฌ
6. API Gateway ๋์ ์ฅ์
โข
ํด๋ผ์ด์ธํธ ๋จ์ํ: ์ฌ๋ฌ ์๋น์ค ํธ์ถ์ Gateway๊ฐ ๋์ ์ฒ๋ฆฌ
โข
๋ณด์ ๊ฐํ: ๋ชจ๋ ์์ฒญ์ ์ค์์์ ์ ์ด
โข
์ด์ ํธ์์ฑ: ๋ชจ๋ํฐ๋ง, ๋ก๊น
์ผ์ํ
โข
ํ์ฅ์ฑ: ํธ๋ํฝ ์ฆ๊ฐ ์ Gateway ๋จ์์ ๋ถ์ฐ ์ฒ๋ฆฌ ๊ฐ๋ฅ
7. ๊ณ ๋ คํด์ผ ํ ๋จ์
โข
๋จ์ผ ์ฅ์ ์ง์ (SPOF, Single Point of Failure)
โข
์ถ๊ฐ Latency ๋ฐ์ ๊ฐ๋ฅ์ฑ
โข
Gateway ์์ฒด์ ์ฑ๋ฅ/ํ์ฅ์ฑ ๊ด๋ฆฌ ํ์
๋ฐ๋ผ์ Kubernetes + Service Mesh(Istio, Linkerd)์ ์ฐ๊ณํ๋ ๋ฐฉ์๋ ๊ณ ๋ ค๋๋ค.